Windows ServerにMySQLを入れてちょっとハマった事

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。 小ネタですが、最近RDSを使用せずMySQL on Windows Serverを構築した時にハマった事があったので記事を書いてみます。

前提環境

前提の環境は、以下になります。

項目
OS Windows Server 2012 R2
MySQLバージョン 5.6.25
MySQLインストーラファイル mysql-installer-community-5.6.25.0.msi
32 / 64 bit 64 bit
インストール先 C:¥Program Files¥MySQL¥MySQL Server 5.6

やろうとしていた事

データをDドライブに移動しようとしました。

ハマった事

ハマり1 設定が効かない

普通にMySQLのインストール先であるC:¥Program Files¥MySQL¥MySQL Server 5.6の直下を確認するとmy-default.iniがあるのでmy.iniに変更して、以下の設定を追加しました。

datadir=D:/MySQL/Data

データの移行は、サービスを止めてから以下のコマンドを実行しました。

mkdir D:¥MySQL¥Data
xcopy /s /e "C:¥Program Files¥MySQL¥MySQL Server 5.6¥data" "D:¥MySQL¥Data"

サービスを起動してからMySQLへログインしてD:¥MySQL¥Dataのファイルを確認しますがタイムスタンプが変わりません。 ログインしてdatadirを確認すると

mysql> show variables like 'datadir' ;
+---------------+---------------------------------------------+
| Variable_name | Value                                       |
+---------------+---------------------------------------------+
| datadir       | C:¥ProgramData¥MySQL¥MySQL Server 5.6¥Data¥ |
+---------------+---------------------------------------------+
1 row in set (0.00 sec)

隠しフォルダのC:¥ProgramDataに保存されてました。 Explorerで表示するためにフォルダオプションで隠しファイル、隠しフォルダ、および隠しドライブを表示するをチェックします。 blog-MySQL これでmy.iniとデータフォルダが表示されました。 blog-MySQL C:¥ProgramData¥MySQL¥MySQL Server 5.6¥my.iniの中身を書き換えます。 一番最初にログインして確認しろという話でした。

MySQLのサービスは以下のように登録されているので、登録情報を確認すれば直ぐ気がつきますね。設定内容を確認しましょう。

>sc qc mysql56
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: mysql56
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 2   AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : "C:¥Program Files¥MySQL¥MySQL Server 5.6¥bin¥mysqld.exe" --defaults-file="C:¥ProgramData¥MySQL¥MySQL Server 5.6¥my.ini" MySQL56
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : MySQL56
        DEPENDENCIES       :
        SERVICE_START_NAME : NT AUTHORITY¥NetworkService

ハマり2 サービスが上がらない

無事設定ファイルを特定できたので、datadirを変更し、以下のコマンドでデータの移行を実施しました。 一旦間違ったファイルをコピーしているので、サービスを止めてから以下のコマンドを実行しました。

del /S /Q D:¥MySQL¥Data
mkdir D:¥MySQL¥Data
xcopy /s /e "C:¥ProgramData¥MySQL¥MySQL Server 5.6¥Data" "D:¥MySQL¥Data"

MySQLのサービスを起動しますが、エラーが出力されて起動できません。

>net start MySQL56
MySQL56 サービスを開始します...
MySQL56 サービスを開始できませんでした。

システム エラーが発生しました。

システム エラー 1067 が発生しました。

プロセスを途中で強制終了しました。

調べるとMySQL 5.6 リファレンスマニュアルの1.6 Troubleshooting a Microsoft Windows MySQL Server Installationシステム エラー 1067の記載があるのですが、どれにも該当しませんでした。 最終的に、原因はD:¥MySQL¥Dataのアクセス権が不足していることが判明しました。 権限は以下の状態になっています。 blog-MySQL

MySQLのサービスの実行ユーザはLocal SystemではなくNetwork Serviceになっています。そのためNetwork Serviceに権限を付与します。 Local Systemが実行する場合は権限を付与せずに実行可能(Local SystemはAdministratorと同等の権限があるため)でしたが、Network Serviceの場合は権限を付与する必要があります。

再度サービスを実行すると正常に起動できました。

>net start MySQL56
MySQL56 サービスを開始します.
MySQL56 サービスは正常に開始されました。

さいごに

たまにWindows Serverを触ると昔のバージョンと大きく異なっており戸惑います。現在のWindowsの作法を意識し無いとちょっとした事にハマってしまいますね。