序章

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

前提条件

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

  • sudo権限とファイアウォールが有効になっているroot以外のユーザーがいるUbuntu20.04サーバー。 これらの権限を持つユーザーを設定する方法の詳細については、 Ubuntu20.04を使用したサーバーの初期設定ガイドをご覧ください。

  • MySQLサーバー。 MySQLをまだインストールしていない場合は、 Ubuntu20.04にMySQLをインストールする方法に関するガイドを確認してください。

このチュートリアルでは、/mnt/volume-nyc1-01にマウントされたブロックストレージデバイスにデータを移動します。 セットアップ方法については、DigitalOceanのストレージボリュームのブロックに関する次のドキュメントを参照してください。

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

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

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

  1. sudo mysql

root MySQLユーザーをパスワードを使用して認証するように構成した場合、次のコマンドを使用して、このユーザーとしてMySQLに接続できます。

  1. mysql -u root -p

プロンプトが表示されたら、MySQLユーザーパスワードを入力します。 次に、MySQLプロンプトから、次のSELECTステートメントを実行します。 これにより、このMySQLインスタンスのアクティブなデータディレクトリが返されます。このディレクトリは、常にMySQLのdatadir変数に記録されます::

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

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

  1. exit
Output
Bye

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

  1. sudo systemctl stop mysql

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

  1. sudo systemctl status mysql

次の例で強調表示されているように、出力のActive行にinactive (dead)と表示されている場合は、シャットダウンされていることを確認できます。

Output
● mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: inactive (dead) since Wed 2022-03-23 19:03:49 UTC; 5s ago Process: 3415 ExecStart=/usr/sbin/mysqld (code=exited, status=0/SUCCESS) Main PID: 3415 (code=exited, status=0/SUCCESS) Status: "Server shutdown complete"

サーバーがシャットダウンされたので、既存のデータベースディレクトリ/var/lib/mysqlを、rsyncを使用して新しい場所/mnt/volume-nyc1-01にコピーできます。 -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に設定されています。 新しいデータディレクトリを反映するように、好みのテキストエディタでこのファイルを編集します。 ここではnanoを使用します。

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

datadir=で始まる行を見つけます。 ポンド記号(#)を削除して行のコメントを解除し、新しい場所を反映するようにパスを変更します。 この場合、更新されるファイルの内容は次のようになります。

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

この更新を行ったら、ファイルを保存して終了します。 nanoを使用している場合は、CTRL + XYENTERの順に押すとこれを行うことができます。 これで、MySQLを再び起動する時期が近づいていますが、その前に、成功するために構成する必要があることがもう1つあります。

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

このステップでは、デフォルトのディレクトリと新しい場所の間にエイリアスを作成して、MySQLに新しいディレクトリへの書き込みを許可するようにAppArmorに指示する必要があります。 AppArmor は、Linuxカーネルのセキュリティモジュールであり、システム管理者がユーザー自身ではなく、プログラムプロファイルを介してプログラム機能を制限できるようにします。 AppArmoraliasファイルを開いて編集することから始めます。

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

ファイルの下部で、次の行のコメントを解除し、エイリアスルールを追加します。

/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.

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

AppArmorを適切に構成したら、次のステップに進むことができます。

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

次に、MySQLを起動します。 ただし、そうすると、別のエラーが発生します。 AppArmorの問題ではなく、このエラーはmysql-systemd-startが原因で発生します。これは、systemdを介したMySQLの管理をサポートするスクリプトです。 次のコマンドを使用して、このスクリプトを検査できます。

  1. nano /usr/share/mysql/mysql-systemd-start

このスクリプトは、デフォルトのデータディレクトリパスに一致するディレクトリ-dまたはシンボリックリンク-Lのいずれかの存在を確認します。 これらのいずれかが見つからない場合、スクリプトはエラーをトリガーし、MySQLを起動できなくなります。

/ 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

ステータスをチェックして、MySQLが実行されていることを確認します。

  1. sudo systemctl status mysql
Output
● mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: active (running) since Wed 2022-03-23 20:51:18 UTC; 4s ago Process: 17145 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=> Main PID: 17162 (mysqld) Status: "Server is operational" Tasks: 38 (limit: 1132) Memory: 376.7M CGroup: /system.slice/mysql.service └─17162 /usr/sbin/mysqld

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

  1. mysql -u sammy -p

次に、データディレクトリの値を再度クエリします。

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

MySQLを再起動し、新しい場所を使用していることを確認したら、データベースが完全に機能していることを確認してください。 終了したら、次のようにデータベースを終了し、コマンドプロンプトに戻ります。

  1. exit
Output
Bye

既存のデータの整合性を確認したので、バックアップデータディレクトリを削除できます。

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

次に、MySQLを最後にもう一度再起動します。

  1. sudo systemctl restart mysql

最後に、ステータスを確認して、期待どおりに機能していることを確認します。

  1. sudo systemctl status mysql
Output
● mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: active (running) since Wed 2022-03-23 20:53:03 UTC; 4s ago Process: 17215 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=> Main PID: 17234 (mysqld) Status: "Server is operational" Tasks: 38 (limit: 1132) Memory: 368.9M CGroup: /system.slice/mysql.service └─17234 /usr/sbin/mysqld

Active行にactive(running)と表示されている場合、これはMySQLが機能していることを確認します。

結論

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

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