前書き
データベースは時間とともに成長し、ファイルシステムのスペースが大きくなることがあります。 また、オペレーティングシステムの他の部分と同じパーティションにI / O競合がある場合もあります。 RAID、ネットワークブロックストレージ、およびその他のデバイスは、冗長性およびその他の望ましい機能を提供できます。 スペースを追加する場合、パフォーマンスを最適化する方法を評価する場合、または他のストレージ機能を活用する場合、このチュートリアルでは、MySQLのデータディレクトリの再配置について説明します。
前提条件
このガイドを完了するには、次のものが必要です。
-
An Ubuntu 18.04 server with a non-root user with
sudo
privileges。 これらの権限を持つユーザーを設定する方法の詳細については、Initial Server Setup with Ubuntu 18.04ガイドを参照してください。 -
A MySQL server。 MySQLをまだインストールしていない場合は、How To Install MySQL on Ubuntu 18.04ガイドが役立ちます。
この例では、/mnt/volume-nyc1-01
にマウントされたブロックストレージデバイスにデータを移動しています。 設定方法については、How To Use Block Storage on DigitalOceanガイドをご覧ください。
基礎となるストレージの種類にかかわらず、このガイドはデータディレクトリを新しい場所に移動するのに役立ちます。
[[step-1 -—- moving-the-mysql-data-directory]] ==ステップ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`は詳細な出力を提供するため、進行状況を追跡できます。
[.note]#Note:ディレクトリに末尾のスラッシュがないことを確認してください。これは、タブ補完を使用する場合に追加される可能性があります。 末尾にスラッシュがある場合、rsync
は、ディレクトリの内容を、それを含むmysql
ディレクトリに転送するのではなく、マウントポイントにダンプします。
#
sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01
rsync
が完了したら、現在のフォルダの名前を.bak拡張子に変更し、移動が成功したことを確認するまで保持します。 名前を変更することで、新しい場所と古い場所の両方のファイルから生じる混乱を回避できます。
sudo mv /var/lib/mysql /var/lib/mysql.bak
これで、構成に注目する準備が整いました。
[[step-2 -—-新しいデータの場所を指す]] ==ステップ2—新しいデータの場所を指す
MySQLには、構成値をオーバーライドする方法がいくつかあります。 デフォルトでは、datadir
は/etc/mysql/mysql.conf.d/mysqld.cnf
ファイルで/var/lib/mysql
に設定されています。 このファイルを編集して、新しいデータディレクトリを反映します。
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つ設定する必要があります。
[[step-3 -—- configuring-apparmor-access-control-rules]] ==ステップ3—AppArmorアクセス制御ルールの構成
デフォルトディレクトリと新しい場所の間にエイリアスを作成して、MySQLに新しいディレクトリへの書き込みを許可するようAppArmorに指示する必要があります。 これを行うには、AppArmoralias
ファイルを編集します。
sudo nano /etc/apparmor.d/tunables/alias
ファイルの最後に、次のエイリアスルールを追加します。
/etc/apparmor.d/tunables/alias
. . .
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .
変更を有効にするには、AppArmorを再起動します。
sudo systemctl restart apparmor
[。注意]##
Note: 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とデータディレクトリを明示的に接続していないため、このエラーの把握には時間がかかる場合があります。
[[step-4 -—- restarting-mysql]] ==ステップ4—MySQLの再起動
次のステップはMySQLを起動することですが、実行すると別のエラーが発生します。 今回は、AppArmorの問題ではなく、スクリプトmysql-systemd-start
が2つのデフォルトに一致するディレクトリ-d
またはシンボリックリンク-L
の存在をチェックするためにエラーが発生しますパス。 見つからない場合は失敗します:
/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
. . .
これらはサーバーを起動するために必要なので、スクリプトの環境チェックに合格するための最小限のディレクトリ構造を作成します。
sudo mkdir /var/lib/mysql/mysql -p
NowMySQLを起動する準備ができました。
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を最後に1回再起動して、期待どおりに機能することを確認します。
sudo systemctl restart mysql
sudo systemctl status mysql
結論
このチュートリアルでは、MySQLのデータディレクトリを新しい場所に移動し、調整に対応するためにUbuntuのAppArmor ACLを更新しました。 Block Storageデバイスを使用していましたが、ここの手順は、基盤となるテクノロジーに関係なく、データディレクトリの場所を再定義するのに適しているはずです。
MySQLのデータディレクトリの管理の詳細については、MySQLの公式ドキュメントの次のセクションを参照してください。