はじめに (対象読者・この記事でわかること)

この記事は、MySQLを使用していて、mysql_config_editorとmysqldump、crontabを利用している開発者やシステム管理者を対象にしています。特に、手動では正常に動作するmysqldumpが、crontab経由で実行すると0バイトのファイルしか生成されない問題に直面している方に向けた内容です。

この記事を読むことで、mysql_config_editorで設定したMySQLパスワードがcrontab経由で機能しない原因と、その解決法を理解できるようになります。具体的には、環境変数の設定、パーミッションの確認、シェルスクリプトの修正といった実践的な解決策を学べます。最近、mysqldumpのバックアップがcrontab経由で正常に実行されず、原因調査に時間を費やした経験から、この問題の解決策を共有したいと考えました。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • MySQLの基本的な操作と理解
  • mysqldumpコマンドの基本的な使い方
  • mysql_config_editorの基本的な使い方
  • crontabの基本的な設定方法
  • Linux/Unix環境でのシェルスクリプトの基本的な知識

mysql_config_editorとcrontabの問題点

MySQLのパスワードをmysql_config_editorで設定している環境で、mysqldumpが正常に動作しない問題は、特にcrontab経由で実行した際に顕著に現れます。手動でコマンドを実行すれば正常にバックアップファイルが生成されるのに、crontabから実行するとファイルサイズが0バイトになるという現象は、多くの開発者やシステム管理者が遭遇する典型的な問題です。

mysql_config_editorは、MySQLのクライアントツールであるmysql、mysqladmin、mysqldumpなどが使用するパスワードを暗号化して保存するためのツールです。これにより、パスワードを平文でシェルスクリプトやコマンドラインに記述する必要がなく、セキュリティが向上します。

しかし、このmysql_config_editorで設定したパスワード情報は、ユーザーのホームディレクトリにある.mylogin.cnfファイルに保存されます。crontab経由で実行されるプロセスは、通常のユーザーシェルとは異なる環境で実行されるため、この設定ファイルが正しく読み込まれないことがあります。

この問題の主な原因として考えられるのは、以下の3点です。

  1. 環境変数の違い:crontabの実行環境では、通常のシェル環境と異なる環境変数が設定されている可能性があります。
  2. パーミッションの問題:.mylogin.cnfファイルのパーミッションが、crontabで実行されるユーザーから読み取れない可能性があります。
  3. シェルの違い:crontabで指定されたシェルと、通常のシェルが異なる場合、mysql_config_editorの動作に影響を与える可能性があります。

次のセクションでは、これらの原因を特定し、解決するための具体的な手順を解説します。

問題の調査と解決策

ステップ1:問題の再現と確認

まず、問題を再現し、mysqldumpが正常に動作しないことを確認します。以下の手順で調査を進めます。

  1. 手動でmysqldumpを実行し、正常にバックアップファイルが生成されることを確認します。 bash mysqldump -u [ユーザー名] -p[データベース名] > /tmp/manual_backup.sql ls -l /tmp/manual_backup.sql

  2. crontab経由でmysqldumpを実行し、ファイルサイズが0バイトになることを確認します。 bash crontab -e 以下の行を追加して保存します(例:毎分実行): * * * * * /path/to/your/script.sh

  3. スクリプト内でmysqldumpを実行します。 bash #!/bin/bash mysqldump -u [ユーザー名] -p[データベース名] > /tmp/crontab_backup.sql

  4. 数分後にファイルサイズを確認します。 bash ls -l /tmp/crontab_backup.sql

手動実行では正常にファイルが生成されるのに、crontab経由では0バイトのファイルしか生成されない場合、mysql_config_editorの設定がcrontab環境で機能していない可能性が高いです。

ステップ2:mysql_config_editorの設定確認

mysql_config_editorで設定されている情報を確認します。

Bash
mysql_config_editor print --login-path=client

このコマンドで設定されているユーザー名、ホスト、パスワードの情報が表示されます。情報が正しく設定されていることを確認してください。

また、設定ファイルのパスとパーミッションも確認します。

Bash
ls -la ~/.mylogin.cnf

通常、このファイルのパーミッションは600(所有者のみ読み書き可能)である必要があります。crontabで実行されるユーザーがこのファイルにアクセスできない場合、mysql_config_editorの設定が読み込まれません。

ステップ3:crontabの実行環境調査

crontabの実行環境と通常のシェル環境の違いを調査します。

まず、crontabの実行ログを確認します。システムによっては、以下のようなファイルにログが出力されます。

Bash
tail -f /var/log/cron

ログにmysqldumpの実行に関するエラーメッセージがないか確認します。

次に、crontabの実行環境で環境変数を確認します。以下のようなスクリプトを作成してcrontabから実行し、環境変数を確認します。

Bash
#!/bin/bash echo "Environment variables:" > /tmp/crontab_env.txt env >> /tmp/crontab_env.txt

通常のシェル環境での環境変数と比較し、特にHOMEやPATHなどの重要な環境変数に違いがないか確認します。

ステップ4:環境変数の比較と修正

crontabの実行環境と通常のシェル環境で環境変数に違いがある場合、それが原因である可能性が高いです。特に、HOME環境変数が正しく設定されていないと、.mylogin.cnfファイルが見つからないことがあります。

crontabの設定ファイル内で環境変数を明示的に指定する方法があります。以下のようにcrontabの設定を修正します。

# 環境変数の設定
HOME=/home/[ユーザー名]
PATH=/usr/local/bin:/usr/bin:/bin

# バックアップスクリプトの実行
* * * * * /path/to/your/script.sh

このように、HOME環境変数を明示的に指定することで、.mylogin.cnfファイルが正しく読み込まれる可能性が高まります。

ステップ5:パーミッションの確認と修正

.mylogin.cnfファイルのパーミッションが正しく設定されているか確認します。

Bash
ls -la ~/.mylogin.cnf

パーミッションが600でない場合、以下のコマンドで修正します。

Bash
chmod 600 ~/.mylogin.cnf

また、crontabで実行されるユーザーがこのファイルにアクセスできることも確認してください。ユーザーが変更されている場合、適切なユーザーでファイルを作成し直す必要があります。

ステップ6:シェルの違いによる影響調査

crontabで指定されたシェルと、通常のシェルが異なる場合、mysql_config_editorの動作に影響を与える可能性があります。

crontabの設定ファイル内で、使用するシェルを明示的に指定することができます。

SHELL=/bin/bash
* * * * * /path/to/your/script.sh

通常のシェル環境と同じシェル(例:/bin/bash)を指定することで、mysql_config_editorの動作が安定する可能性があります。

解決策

上記の調査に基づき、以下の解決策が考えられます。

  1. 環境変数の設定: crontabの設定ファイル内で、HOME環境変数を明示的に指定します。 HOME=/home/[ユーザー名] PATH=/usr/local/bin:/usr/bin:/bin

  2. パーミッションの修正: .mylogin.cnfファイルのパーミッションを600に設定します。 bash chmod 600 ~/.mylogin.cnf

  3. シェルの指定: crontabの設定ファイル内で、使用するシェルを明示的に指定します。 SHELL=/bin/bash

  4. スクリプトの修正: mysqldumpを実行するスクリプト内で、明示的にmysql_config_editorの設定ファイルを指定します。 bash #!/bin/bash export MYSQL_TEST_LOGIN_FILE=/home/[ユーザー名]/.mylogin.cnf mysqldump --login-path=client [データベース名] > /tmp/crontab_backup.sql

これらの解決策を組み合わせることで、mysql_config_editorで設定したパスワードがcrontab経由でも正しく機能するようになります。

検証結果

上記の解決策を適用した後、mysqldumpがcrontab経由で正常に実行されることを確認します。バックアップファイルが正しいサイズで生成され、中身も正しいデータが含まれていることを確認してください。

まとめ

本記事では、mysql_config_editorで設定したMySQLパスワードがcrontab経由で機能しない問題の原因と解決法について解説しました。

  • 環境変数の違いが原因となることが多く、特にHOME環境変数が正しく設定されていない場合、.mylogin.cnfファイルが見つからないことがあります。
  • パーミッションの問題も原因となり得ます。.mylogin.cnfファイルのパーミッションは600である必要があります。
  • シェルの違いも影響を与える可能性があります。crontabで使用するシェルを明示的に指定することで、問題が解決することがあります。

これらの解決策を適用することで、mysql_config_editorで設定したパスワードがcrontab経由でも正しく機能するようになります。mysqldumpのバックアップを自動化する際には、これらの点に注意してください。

今後は、MySQLのセキュリティ設定や、より高度なバックアップ自動化の方法についても記事にする予定です。

参考資料