MySQLデータディレクトリをUbuntu16.04の新しい場所に移動する方法
序章
データベースは時間の経過とともに大きくなり、ファイルシステムのスペースを超えることもあります。 また、オペレーティングシステムの他の部分と同じパーティションにある場合、I/Oの競合が発生する可能性があります。 RAID、ネットワークブロックストレージ、およびその他のデバイスは、冗長性およびその他の望ましい機能を提供できます。 スペースを追加する場合でも、パフォーマンスを最適化する方法を評価する場合でも、他のストレージ機能を利用する場合でも、このチュートリアルでは、MySQLのデータディレクトリを再配置する方法について説明します。
前提条件
このガイドを完了するには、次のものが必要です。
-
sudo権限を持つ非rootユーザーのUbuntu16.04サーバー。 これらの権限を持つユーザーをセットアップする方法の詳細については、 Ubuntu16.04を使用したサーバーの初期セットアップガイドを参照してください。
-
MySQLサーバー。 MySQLをまだインストールしていない場合は、 Ubuntu16.04にMySQLをインストールする方法ガイドが役立ちます。
この例では、にマウントされたブロックストレージデバイスにデータを移動しています /mnt/volume-nyc1-01
. DigitalOceanでブロックストレージを使用する方法ガイドで、セットアップ方法を学ぶことができます。
使用する基盤となるストレージに関係なく、このガイドはデータディレクトリを新しい場所に移動するのに役立ちます。
ステップ1—MySQLデータディレクトリの移動
MySQLのデータディレクトリを移動する準備をするために、管理者の資格情報を使用してインタラクティブなMySQLセッションを開始することにより、現在の場所を確認しましょう。
- mysql -u root -p
プロンプトが表示されたら、MySQLルートパスワードを入力します。 次に、MySQLプロンプトから、データディレクトリを選択します。
- select @@datadir;
Output+-----------------+
| @@datadir |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)
この出力は、MySQLがデフォルトのデータディレクトリを使用するように構成されていることを確認します。 /var/lib/mysql/,
これが、移動する必要のあるディレクトリです。 これを確認したら、次のように入力します exit
モニターを離れます。
データの整合性を確保するために、データディレクトリに実際に変更を加える前にMySQLをシャットダウンします。
- sudo systemctl stop mysql
systemctl
すべてのサービス管理コマンドの結果を表示するわけではないため、成功したことを確認したい場合は、次のコマンドを使用してください。
- 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
ディレクトリ:
- sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01
一度 rsync
が完了したら、現在のフォルダの名前を.bak拡張子に変更し、移動が成功したことを確認するまで保持します。 名前を変更することで、新しい場所と古い場所の両方にあるファイルから発生する可能性のある混乱を回避できます。
- sudo mv /var/lib/mysql /var/lib/mysql.bak
これで、構成に注意を向ける準備が整いました。
ステップ2—新しいデータの場所を指す
MySQLには、構成値をオーバーライドするいくつかの方法があります。 デフォルトでは、 datadir
に設定されています /var/lib/mysql
の中に /etc/mysql/mysql.conf.d/mysqld.cnf
ファイル。 このファイルを編集して、新しいデータディレクトリを反映します。
- sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
で始まる行を見つける datadir=
新しい場所を反映するように、次のパスを変更します。
この場合、更新されたファイルは次の出力のようになります。
. . .
datadir=/mnt/volume-nyc1-01/mysql
. . .
これはMySQLを再び起動するのに適切なタイミングのようですが、それを正常に実行する前に構成する必要があることがもう1つあります。
ステップ3—AppArmorアクセス制御ルールの設定
デフォルトのディレクトリと新しい場所の間にエイリアスを作成して、MySQLに新しいディレクトリへの書き込みを許可するようにAppArmorに指示する必要があります。 これを行うには、AppArmorを編集します alias
ファイル:
- sudo nano /etc/apparmor.d/tunables/alias
ファイルの最後に、次のエイリアスルールを追加します。
. . .
[label /etc/apparmor.d/tunables/alias]
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .
変更を有効にするには、AppArmorを再起動します。
- sudo systemctl restart apparmor
注: AppArmorの設定手順をスキップすると、次のエラーメッセージが表示されます。
OutputJob for mysql.service failed because the control process
exited with error code. See "systemctl status mysql.service"
and "journalctl -xe" for details.
両方からの出力 systemctl
と journalctl
結論:
OutputJul 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つのデフォルトパスに一致します。 それらが見つからない場合は失敗します。
. . .
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
. . .
サーバーを起動するためにこれらが必要なので、スクリプトの環境チェックに合格するための最小限のディレクトリ構造を作成します。
- sudo mkdir /var/lib/mysql/mysql -p
これでMySQLを起動する準備が整いました。
- sudo systemctl start mysql
- sudo systemctl status mysql
新しいデータディレクトリが実際に使用されていることを確認するには、MySQLモニターを起動します。
- mysql -u root -p
データディレクトリの値をもう一度見てください。
Output+----------------------------+
| @@datadir |
+----------------------------+
| /mnt/volume-nyc1-01/mysql/ |
+----------------------------+
1 row in set (0.01 sec)
MySQLを再起動し、新しい場所を使用していることを確認したので、この機会にデータベースが完全に機能していることを確認してください。 既存のデータの整合性を確認したら、バックアップデータディレクトリを削除できます。
- sudo rm -Rf /var/lib/mysql.bak
MySQLを最後にもう一度再起動して、期待どおりに機能することを確認します。
- sudo systemctl restart mysql
- sudo systemctl status mysql
結論
このチュートリアルでは、MySQLのデータディレクトリを新しい場所に移動し、調整に対応するためにUbuntuのAppArmorACLを更新しました。 ブロックストレージデバイスを使用していましたが、ここでの手順は、基盤となるテクノロジに関係なく、データディレクトリの場所を再定義するのに適しているはずです。
MySQLのデータディレクトリの管理の詳細については、MySQLの公式ドキュメントの次のセクションを参照してください。