MySQLのインストールとデーター移行

はじめに

WordPressのデーター保存用としてMySQLのインストールが前提条件とされており,そのインストール方法についてMySQLをzipファイルから手動設定でインストールする方法をメモる。
手動インストールの利点は,OSインストールドライブ以外のドライブにMySQLをインストールすることでMySQLの複数バージョンの同時使用や,レジストリーを変更しないのでOS変更等でCドライブの内容が変わった時でも,サービス起動やPath以外は影響を受けない。
また,データーベースをOSドライブ以外に保存するため,Windows障害時のCドライブ復元に影響されない。

前提条件

MySQLは Microsoft Visual C++ がインストールされている必要がある。

MySQLダウンロード

MySQLのダウンロード
zipファイル(mysql-8.0.34-winx64.zip) をダウンロード
サインアップ画面では下部の「No thanks, just start my download.」をクリックしてサインアップしない。

MySQLインストール

MySQL インストール
適当なフォルダーに展開する。アップグレードの場合は,上書きでも良いみたい。
他システムへの移行等を考慮してOSのCドライブは避ける。例:D:\Program Files\mysql

環境変数「Path」設定

環境変数Path追加 「D:\Program Files\mysql\bin」

サブフォルダ作成

MySQLで使用するフォルダの作成
データーベースやログを保存するフォルダーはMySQL本体とは別で保存する。
データー移行やアップグレード等を考慮して「D:\ProgramData\mysql」に保存。
D:\ProgramData\mysqlにdata、logs、temp、Uploadsフォルダを作成
例:D:\ProgramData\mysql\data
  D:\ProgramData\mysql\logs
  D:\ProgramData\mysql\temp
  D:\ProgramData\mysql\Uploads

初期設定ファイル(my.ini)

データーベース保存場所等を設定するオプションファイルの作成
下記の「my.ini」ファイルを作成   例:D:\ProgramData\mysql\my.ini
パスの区切り文字はバックスラッシュ(\)またはスラッシュ(/)のどちらでも利用できるが,my.iniはエスケープシーケンス文字と区別するため「\\」の使用に統一する。
エスケープシーケンス文字
\b バックスペース
\t タブ
\n 改行
\r 復帰改行
\ バックスラッシュ
\s スペース文字

インストーラー使用時のサンプルとネット検索の情報を元にカスタマイズした。将来的に変更・廃止されるパラメーターでワーニングメッセージが出たので推奨の記述に書き換えた。
各値については,インストーラーの提案値(推奨値)のまま変更していない。通常使用では問題ないと思う。が詳細は調べていない。

[client]
# pipe=
# socket=MYSQL
port=3306

[mysql]
no-beep
# default-character-set= cp932

[mysqld]
# character-set-server= utf8mb4
# collation-server= utf8mb4_0900_ai_ci
port=3306
basedir = "D:\\Program Files\\mysql"
datadir = "D:\\ProgramData\\mysql\\data"
tmpdir = "D:\\ProgramData\\mysql\\temp"

default_authentication_plugin=caching_sha2_password
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"

## logging
log-output=FILE
general_log = 0
general_log_file = "D:\\ProgramData\\mysql\\logs\\general.log"
slow_query_log = 1
slow_query_log_file = "D:\\ProgramData\\mysql\\logs\\slow_query.log"
long_query_time=10
log_error = "D:\\ProgramData\\mysql\\logs\\error.log"
log-bin="binlog"
# error messages
lc_messages_dir ="D:\\Program Files\\mysql\\share"
log_timestamps = SYSTEM

server-id=1
lower_case_table_names=1
secure-file-priv="D:\\ProgramData\\mysql\\Uploads"
max_connections=151
table_open_cache=2000
tmp_table_size=241M
thread_cache_size=10
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=469M
key_buffer_size=8M
read_buffer_size=64K
read_rnd_buffer_size=256K
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=8M
innodb_redo_log_capacity=48M
innodb_thread_concurrency=17
innodb_autoextend_increment=64
innodb_buffer_pool_instances=8
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=300
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
back_log=80
flush_time=0
join_buffer_size=256K
max_allowed_packet=4M
max_connect_errors=100
open_files_limit=4161
sort_buffer_size=256K
table_definition_cache=1400
binlog_row_event_max_size=8K
sync_source_info=10000
sync_relay_log=10000
loose_mysqlx_port=33060

# タイムゾーン名、オフセットどちらでも反映可能
#default-time-zone = 'Asia/Tokyo'
default-time-zone='+9:00'

[Warning]による変更箇所

[Warning] [MY-010915] [Server] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
# sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"   変更前
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"   変更後

[Warning] [MY-013907] [InnoDB] Deprecated configuration parameters innodb_log_file_size and/or innodb_log_files_in_group have been used to compute innodb_redo_log_capacity=100663296. Please use innodb_redo_log_capacity instead.
# innodb_log_file_size=48M   変更前
innodb_redo_log_capacity=48M  変更後

[Warning] [MY-011068] [Server] The syntax 'sync_master_info' is deprecated and will be removed in a future release. Please use sync_source_info instead.
# sync_master_info=10000   変更前
sync_source_info=10000    変更後

[Warning] [MY-011070] [Server] '--sync-relay-log-info' is deprecated and will be removed in a future release.
# sync_relay_log_info=10000   廃止のため削除

[Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
未対策

 

ファイルコピー

OpenSSL や cURL関数使用時は、以下の 4 つのファイルを Apacheの bin フォルダへコピーするらしい。がバージョン8.0.22の時は存在したが,8.0.34では該当ファイルは見当たらない。
コピーしなくても問題ないと思う。

libcrypto-1_1-x64.dll
libssh2.dll
libssl-1_1-x64.dll
nghttp2.dll   <<<< Apacheの bin にあり

 

MySQLの初期化

MySQLを初期化してデーターベース等の器を作成。アップグレード時は不要。
MySQLのインストールディレクトリ「D:\Program Files\mysql」でコマンドプロンプトを開き、以下のコマンドを実行

bin\mysqld --defaults-file="D:\ProgramData\mysql\my.ini" --initialize-insecure  --console

蛇足 WordPressの記事投稿でマイナス”” を連続指定 「--defaults-file」のようにするとWordPressで「defaults-file」に変換される。
対策として上記のようにcode block内に記述するか又はHTMLで下記のcodeタグで指定する。

<code>--</code>defaults-file
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

D:\Program Files\mysql>bin\mysqld --defaults-file="D:\ProgramData\mysql\my.ini" --initialize-insecure  --console
2023-09-04T11:16:55.229132+09:00 0 [System] [MY-013169] [Server] D:\Program Files\mysql\bin\mysqld.exe (mysqld 8.0.34) initializing of server in progress as process 2720
2023-09-04T11:16:55.308958+09:00 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2023-09-04T11:17:03.726427+09:00 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2023-09-04T11:17:08.420264+09:00 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

D:\Program Files\mysql>

8行目の[Warning]はパスワード設定なしの警告メッセージで問題なし。後でパスワードを設定する。「-insecure」を指定しなければ仮パスワードが発効される。

MySQLをテスト起動

下記コマンドでMySQLを起動

bin\mysqld --defaults-file="D:\ProgramData\mysql\my.ini" --console
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

D:\Program Files\mysql>bin\mysqld --defaults-file="D:\ProgramData\mysql\my.ini" --console
2023-09-04T11:21:30.475606+09:00 0 [System] [MY-010116] [Server] D:\Program Files\mysql\bin\mysqld.exe (mysqld 8.0.34) starting as process 944
2023-09-04T11:21:30.563415+09:00 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2023-09-04T11:21:35.150859+09:00 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2023-09-04T11:21:36.000454+09:00 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2023-09-04T11:21:36.008179+09:00 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for thischannel.
2023-09-04T11:21:36.091560+09:00 0 [System] [MY-011323] [Server] X Plugin readyfor connections. Bind-address: '::' port: 33060
2023-09-04T11:21:36.091742+09:00 0 [System] [MY-010931] [Server] D:\Program Files\mysql\bin\mysqld.exe: ready for connections. Version: '8.0.34'  socket: ''  port: 3306  MySQL Community Server - GPL.

サービスに登録

 MySQLを下記コマンドでWindowsサービスに登録

mysqld --install MYSQL --defaults-file="D:\ProgramData\mysql\my.ini"


登録後のサービス実行ファイルパス
“D:\Program Files\mysql\bin\mysqld” --defaults-file=”D:\ProgramData\mysql\my.ini” MYSQL

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

D:\Program Files\mysql\bin>mysqld --install MYSQL --defaults-file="D:\ProgramData\mysql\my.ini"
Service successfully installed.

D:\Program Files\mysql\bin>


MySQL 起動
D:\Program Files\mysql\bin>NET START MYSQL

MySQL のサービスを削除
D:\Program Files\mysql\bin>mysqld --remove MYSQL

サービスのログオンアカウント

Windows ServerではMySQLのサービスの実行ユーザはLocal SystemではなくNetwork Serviceが標準となっている。
サービスのログオンアカウントは「Network Service」,パスワードは適当(管理していない為無視される)で登録し,フォルダー「D:\ProgramData\mysql\」にフルコントロールを設定する。インストーラー使用時は自動設定されるが,手動インストール時は設定しない場合はadmin動作する。

不具合「サービス起動しない」

サービスを登録後,GUIから開始したが直ぐに停止する。
コマンドで開始したら「システム エラー 193」
MySQLの起動コマンドでは上手くいっているのでサービス起動で問題が発生している。

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Windows\system32>NET START MYSQL
システム エラー 193 が発生しました。

*** は有効な Win32 アプリケーションではありません。

####### 競合ファイル「mysqld」を削除

C:\Windows\system32>NET START MYSQL
MYSQL サービスを開始します...
MYSQL サービスは正常に開始されました。


C:\Windows\system32>

ネット検索したらどうも競合ファイルが存在する為,サービス起動を阻害しているようだ。
サービスで起動するファイル名と同様のファイル名が存在すると競合するようだ。
エクスプローラーでインストールフォルダーを閲覧したらすぐに怪しいファイルが見つかった。「D:\Program Files\mysql\bin」に「mysqld」なる拡張子のない0バイトのファイルがインストール後に作成されていたので,削除したらサービスが開始できた。
当初エラーが出ていたのでmy.iniファイルをゴチャゴチャして起動停止を繰り返していたのでそれが原因かな。

パスワード登録

初期化コマンドで --initialize-insecure 指定だったのでパスワードが設定されていない。
下記コマンドでrootのパスワードを設定する。
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘rootのパスワード’;

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

D:\Program Files\mysql>mysql -u root --skip-password
mysql: [Warning] Using a password on the command line interface can be insecure.

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.34 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootのパスワード';
Query OK, 0 rows affected (0.07 sec)

mysql> quit
Bye

########## 設定したパスワードでログイン確認

D:\Program Files\mysql>mysql -u root -p
Enter password: **************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.34 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

テーブルのチェックとアップグレード

プログラムのみアップグレードしてデータは以前のものを使用する場合は,MySQL 8.0.16 より前は、管理者として mysql_upgrade を実行する。今回は8.0.34でもあり自動実行されるので不要。フォルダー作成や初期化,パスワード設定は以前のデータを使用するのでこれも不要。「D:\ProgramData\mysql\」はmy.iniファイルを含めてそのまま使用して「D:\Program Files\mysql\」は新規に作成する。

MySQL の管理ツール

MySQLは「phpMyAdmin」で管理するほうがコマンド入力不要で効率的。
インストール方法については,別途記載する。

データー移行

旧サーバーのMySQLで一部WordPressのデータ保存先にMySQL内のデーターベース名がmysqlを指定していた。このmysqlはシステムで使用するものであるが,当初は新規に専用dbを作成しないで安易にWordPressインストール時に指定していた。Wordpressのデータをこのdbから分離させるべく四苦八苦した。このmysqlはパックアップ出来ないのでテーブル単位でエクスポートさせたが,特定のテーブルでエラーが発生した。データー量の多いテーブルなのでタイムオーバー(180秒)となった。移行中のみphpのスクリプト時間を長め(3時間)に設定するように変更。php.iniの「max_execution_time = 10800」10800=3時間

ついでに下記のアップロード最大ファイルサイズも100Gに変更。100GB
「memory_limit」「post_max_size」「upload_max_filesize」
この相関関係は「memory_limit >= post_max_size >= upload_max_filesize」

ちなみにデーターベースまるごとコピーは一部のテーブルがコピーされなかった。
また,画面下の複数テーブルをまとめてコピーの場合もWordPressの最近1年の記事がコピーされていない。たぶんwp_postsテーブルの処理で上記のタイムオーバーが関係しているのかもしれないが一括処理の場合はエラー表示されないので不明。ちなみにwp_postsテーブルは177MBの容量がある一番大きいテーブルだった。
この方法についてのあるサイトの記載

致命的なことにテーブルのインデックスやAUTO_INCREMENT(自動的に連番を降ってくれる設定)がコピーされないので、この機能は使わない方が良いかと思います。

データーベースやテーブルをまとめて一括コピーは今回の場合は出来ないので,地道に1テーブル毎に個別コピーしていく方法が良いみたい。時間は掛かるが(-_-;)汗
全く同じ環境を構築するのであれば,MySQLのデータフォルダー(D:\ProgramData\mysql)をエクスプローラーでコピーしても問題ない。WordPress本体のファイル(ブログルートのフォルダー)も同時にコピーする。MySQLをエクスプローラーでのコピー時にMySQLサービスを停止してから新規に全ファイルをコピーする。追加コピーや新しいファイルのみのコピー時はMySQLサービスが途中で停止してしまい「データーベースに接続できない」といったエラーが出た。

WordPressで使用するMySQLデーターベースのテーブルについて
wp_posts   ブログの投稿を保存 (一番データ量が大きい)
wp_users   ユーザー情報を保存
上記以外にWordPressのデフォルトで10テーブルが作成され
合計 12テーブルを使用している。
他にプラクインでも新たなテーブルを作成する。

WordPressで使用するテーブル名にはインストール時に指定した
テーブル接頭辞 デフォルト値「wp_」がついてそのあとに
プラクイン等の識別名が続く。