序章

データベースは時間の経過とともに大きくなり、ファイルシステムのスペースを超えることもあります。 また、オペレーティングシステムの他の部分と同じパーティションにある場合、I/Oの競合が発生する可能性があります。 RAID、ネットワークブロックストレージ、およびその他のデバイスは、冗長性およびその他の望ましい機能を提供できます。 スペースを追加する場合でも、パフォーマンスを最適化する方法を評価する場合でも、他のストレージ機能を利用する場合でも、このチュートリアルでは、MySQLのデータディレクトリを再配置する方法について説明します。

前提条件

このガイドを完了するには、次のものが必要です。

この例では、/mnt/volume-nyc1-01にマウントされたブロックストレージデバイスにデータを移動しています。 設定方法については、DigitalOceanガイドでブロックストレージを使用する方法をご覧ください。

使用する基盤となるストレージに関係なく、このガイドはデータディレクトリを新しい場所に移動するのに役立ちます。

ステップ1—MySQLデータディレクトリの移動

MySQLのデータディレクトリを移動する準備をするために、管理者の資格情報を使用してインタラクティブなMySQLセッションを開始することにより、現在の場所を確認しましょう。

  1. mysql -u root -p

プロンプトが表示されたら、MySQLルートパスワードを入力します。 次に、MySQLプロンプトから、データディレクトリを選択します。

  1. select @@datadir;
Output
+-----------------+ | @@datadir | +-----------------+ | /var/lib/mysql/ | +-----------------+ 1 row in set (0.00 sec)

この出力は、MySQLがデフォルトのデータディレクトリ/var/lib/mysql/,を使用するように構成されていることを確認するため、移動する必要のあるディレクトリです。 これを確認したら、exitと入力してモニターを終了します。

データの整合性を確保するために、実際にデータディレクトリに変更を加える前にMySQLをシャットダウンします。

  1. sudo systemctl stop mysql

systemctlは、すべてのサービス管理コマンドの結果を表示するわけではないため、成功したことを確認したい場合は、次のコマンドを使用してください。

  1. sudo systemctl status mysql

出力の最後の行にサーバーが停止していることが示されている場合は、確実にシャットダウンされます。

Output
. . . Jul 18 11:24:20 ubuntu-512mb-nyc1-01 systemd[1]: Stopped MySQL Community Server.

サーバーがシャットダウンされたので、rsyncを使用して既存のデータベースディレクトリを新しい場所にコピーします。 -aフラグを使用すると、アクセス許可とその他のディレクトリプロパティが保持され、-vは詳細な出力を提供するため、進行状況を追跡できます。

注:ディレクトリに末尾のスラッシュがないことを確認してください。これは、タブ補完を使用する場合に追加される可能性があります。 末尾にスラッシュがある場合、rsyncは、ディレクトリの内容を、含まれているmysqlディレクトリに転送するのではなく、マウントポイントにダンプします。

  1. sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01

rsyncが完了したら、現在のフォルダーの名前を.bak拡張子に変更し、移動が成功したことを確認するまで保持します。 名前を変更することで、新しい場所と古い場所の両方にあるファイルから発生する可能性のある混乱を回避できます。

  1. sudo mv /var/lib/mysql /var/lib/mysql.bak

これで、構成に注意を向ける準備が整いました。

ステップ2—新しいデータの場所を指す

MySQLには、構成値をオーバーライドするいくつかの方法があります。 デフォルトでは、datadir/etc/mysql/mysql.conf.d/mysqld.cnf ファイルで/var/lib/mysqlに設定されています。 このファイルを編集して、新しいデータディレクトリを反映します。

  1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

datadir=で始まる行を見つけ、新しい場所を反映するように続くパスを変更します。

この場合、更新されたファイルは次の出力のようになります。

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
datadir=/mnt/volume-nyc1-01/mysql
. . .

これはMySQLを再び起動するのに適切なタイミングのようですが、それを正常に実行する前に構成する必要があることがもう1つあります。

ステップ3—AppArmorアクセス制御ルールの設定

デフォルトのディレクトリと新しい場所の間にエイリアスを作成して、MySQLに新しいディレクトリへの書き込みを許可するようにAppArmorに指示する必要があります。 これを行うには、AppArmoraliasファイルを編集します。

  1. sudo nano /etc/apparmor.d/tunables/alias

ファイルの最後に、次のエイリアスルールを追加します。

. . .
[label /etc/apparmor.d/tunables/alias]
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .

変更を有効にするには、AppArmorを再起動します。

  1. sudo systemctl restart apparmor

注: AppArmorの設定手順をスキップすると、次のエラーメッセージが表示されます。

Output
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.

systemctljournalctlの両方からの出力は、次のようになります。

Output
Jul 18 11:03:24 ubuntu-512mb-nyc1-01 systemd[1]: mysql.service: Main process exited, code=exited, status=1/FAILURE

メッセージはAppArmorとデータディレクトリを明示的に結び付けていないため、このエラーを理解するのに時間がかかる場合があります。

ステップ4—MySQLを再起動する

次のステップはMySQLを起動することですが、起動すると、別のエラーが発生します。 今回は、AppArmorの問題ではなく、スクリプトmysql-systemd-startがディレクトリ-dまたはシンボリックリンク-Lのいずれかの存在をチェックするためにエラーが発生します。 2つのデフォルトパスに一致します。 それらが見つからない場合は失敗します。

/ usr / share / mysql / mysql-systemd-start
. . .
if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then
 echo "MySQL data dir not found at /var/lib/mysql. Please create one."
 exit 1
fi

if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then
 echo "MySQL system database not found. Please run mysql_install_db tool."
 exit 1
fi

. . .

サーバーを起動するためにこれらが必要なので、スクリプトの環境チェックに合格するための最小限のディレクトリ構造を作成します。

  1. sudo mkdir /var/lib/mysql/mysql -p

これでMySQLを起動する準備が整いました。

  1. sudo systemctl start mysql
  2. sudo systemctl status mysql

新しいデータディレクトリが実際に使用されていることを確認するには、MySQLモニターを起動します。

  1. mysql -u root -p

データディレクトリの値をもう一度見てください。

Output
+----------------------------+ | @@datadir | +----------------------------+ | /mnt/volume-nyc1-01/mysql/ | +----------------------------+ 1 row in set (0.01 sec)

MySQLを再起動し、新しい場所を使用していることを確認したので、この機会にデータベースが完全に機能していることを確認してください。 既存のデータの整合性を確認したら、バックアップデータディレクトリを削除できます。

  1. sudo rm -Rf /var/lib/mysql.bak

MySQLを最後にもう一度再起動して、期待どおりに機能することを確認します。

  1. sudo systemctl restart mysql
  2. sudo systemctl status mysql

結論

このチュートリアルでは、MySQLのデータディレクトリを新しい場所に移動し、調整に対応するためにUbuntuのAppArmorACLを更新しました。 ブロックストレージデバイスを使用していましたが、ここでの手順は、基盤となるテクノロジに関係なく、データディレクトリの場所を再定義するのに適しているはずです。

MySQLのデータディレクトリの管理の詳細については、MySQLの公式ドキュメントの次のセクションを参照してください。