序章
データベースは時間の経過とともに大きくなり、ファイルシステムのスペースを超えることもあります。 また、オペレーティングシステムの他の部分と同じパーティションにある場合、I/Oの競合が発生する可能性があります。 RAID、ネットワークブロックストレージ、およびその他のデバイスは、冗長性およびその他の望ましい機能を提供できます。 スペースを追加する場合でも、パフォーマンスを最適化する方法を評価する場合でも、他のストレージ機能を利用する場合でも、このチュートリアルでは、MySQLのデータディレクトリを再配置する方法について説明します。
ここでの説明は、MySQLの単一インスタンスを実行するサーバーに適しています。 複数のインスタンスがある場合は、ガイド MySQLデータディレクトリをUbuntu16.04の新しい場所に移動する方法は、構成設定を通じて場所を明示的に変更する方法を説明します。
前提条件
このガイドを完了するには、次のものが必要です。
-
sudo権限を持つ非rootユーザーのUbuntu16.04サーバー。 これらの権限を持つユーザーをセットアップする方法の詳細については、 Ubuntu16.04を使用したサーバーの初期セットアップガイドを参照してください。
-
MySQLサーバー。 まだ設定していない場合は、 Ubuntu16.04にMySQLをインストールする方法ガイドが役立ちます。
-
データベースのバックアップ。 MySQLの新規インストールで作業している場合を除き、データのバックアップがあることを確認する必要があります。 ガイドUbuntuVPSでMySQLデータベースをバックアップする方法は、これに役立ちます。
この例では、/mnt/volume-nyc1-01
にマウントされたブロックストレージデバイスにデータを移動しています。 設定方法については、DigitalOceanガイドでブロックストレージを使用する方法をご覧ください。
使用する基盤となるストレージに関係なく、このガイドはデータディレクトリを新しい場所に移動するのに役立ちます。
ステップ1—MySQLデータディレクトリの移動
データの整合性を確保するために、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.
サーバーをシャットダウンしたら、既存のデータベースディレクトリを新しい場所に移動します。
- sudo mv /var/lib/mysql /mnt/volume-nyc1-01/mysql
次に、シンボリックリンクを作成します。
- sudo ln -s /mnt/volume-nyc1-01/mysql /var/lib/mysql
シンボリックリンクが設定されているので、これはMySQLを再び起動する適切なタイミングのようですが、それを正常に実行する前に、もう1つ構成する必要があります。
ステップ2—AppArmorアクセス制御ルールの設定
MySQLディレクトリをMySQLサーバーとは別のファイルシステムに移動する場合は、AppArmorエイリアスを作成する必要があります。
エイリアスを追加するには、AppArmoralias
ファイルを編集します。
- 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の設定手順をスキップして、mysql
を起動しようとすると、次のエラーメッセージが表示されます。
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とデータディレクトリを明示的に結び付けていないため、このエラーを理解するのに時間がかかる場合があります。 ただし、syslog
を見ると問題がわかります。
- sudo tail /var/log/syslog
OutputNov 24 00:03:40 digitalocean kernel:
[ 437.735748] audit: type=1400 audit(1479945820.037:20):
apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld"
name="/mnt/volume-nyc1-01/mysql/mysql.lower-test" pid=4228
comm="mysqld" requested_mask="c" denied_mask="c" fsuid=112 ouid=112
これでMySQLを起動する準備が整いました。
- sudo systemctl start mysql
- sudo systemctl status mysql
MySQLを再起動したら、データが正常であり、MySQLが期待どおりに機能していることを確認する機会を利用してください。
結論
このチュートリアルでは、MySQLのデータを移動し、シンボリックリンクを使用してMySQLに新しい場所を認識させました。 調整に対応するために、UbuntuのAppArmorACLも更新しました。 ブロックストレージデバイスを使用していましたが、ここでの手順は、基盤となるテクノロジに関係なく、データディレクトリの場所を再定義するのに適しているはずです。
このアプローチは、MySQLの単一インスタンスを実行している場合にのみ適しています。 単一のサーバーで実行される複数のMySQLインスタンスをサポートする必要がある場合は、MySQLデータディレクトリをUbuntu16.04の新しい場所に移動する方法が役立ちます。