序章

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

ここでの説明は、MySQLの単一インスタンスを実行するサーバーに適しています。 複数のインスタンスがある場合は、ガイド MySQLデータディレクトリをUbuntu16.04の新しい場所に移動する方法は、構成設定を通じて場所を明示的に変更する方法を説明します。

前提条件

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

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

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

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

データの整合性を確保するために、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.

サーバーをシャットダウンしたら、既存のデータベースディレクトリを新しい場所に移動します。

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

次に、シンボリックリンクを作成します。

  1. sudo ln -s /mnt/volume-nyc1-01/mysql /var/lib/mysql

シンボリックリンクが設定されているので、これはMySQLを再び起動する適切なタイミングのようですが、それを正常に実行する前に、もう1つ構成する必要があります。

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

MySQLディレクトリを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の設定手順をスキップして、mysqlを起動しようとすると、次のエラーメッセージが表示されます。

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とデータディレクトリを明示的に結び付けていないため、このエラーを理解するのに時間がかかる場合があります。 ただし、syslogを見ると問題がわかります。

  1. sudo tail /var/log/syslog
Output
Nov 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を起動する準備が整いました。

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

MySQLを再起動したら、データが正常であり、MySQLが期待どおりに機能していることを確認する機会を利用してください。

結論

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

このアプローチは、MySQLの単一インスタンスを実行している場合にのみ適しています。 単一のサーバーで実行される複数のMySQLインスタンスをサポートする必要がある場合は、MySQLデータディレクトリをUbuntu16.04の新しい場所に移動する方法が役立ちます。