序章

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

前提条件

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

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

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

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

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

  1. mysql -u root -p

プロンプトが表示されたら、MySQLルートパスワードを入力します。 次に、MySQLプロンプトから、データディレクトリを選択します。

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

この出力は、MySQLがデフォルトのデータディレクトリ/var/lib/mysql/,を使用するように構成されていることを確認するため、移動する必要のあるディレクトリです。 これを確認したら、exitと入力し、「ENTER」を押してモニターを終了します。

  1. exit

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

  1. sudo systemctl stop mysqld

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

  1. sudo systemctl status mysqld

出力の最後の行にサーバーが停止していることが示されている場合は、確実にシャットダウンされます。

Output
. . . Jul 18 11:24:20 ubuntu-512mb-nyc1-01 systemd[1]: Stopped MySQL Community Server.

サーバーがシャットダウンされたので、rsyncを使用して既存のデータベースディレクトリを新しい場所にコピーします。 -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/my.cnf ファイルで/var/lib/mysqlに設定されています。 このファイルを編集して、新しいデータディレクトリを反映します。

  1. sudo vi /etc/my.cnf

[mysqld]ブロックで、datadir=で始まる行を見つけます。これは、いくつかのコメントでブロック見出しから分離されています。 新しい場所を反映するように、次のパスを変更します。 さらに、ソケットは以前はデータディレクトリにあったため、新しい場所に更新する必要があります。

/etc/my.cnf
[mysqld]
. . .
datadir=/mnt/volume-nyc1-01/mysql
socket=/mnt/volume-nyc1-01/mysql/mysql.sock
. . .

既存の行を更新した後、mysqlクライアントの構成を追加する必要があります。 [mysqld]ブロックでディレクティブが分割されないように、ファイルの最後に次の設定を挿入します。

/etc/my.cnf
[client]
port=3306
socket=/mnt/volume-nyc1-01/mysql/mysql.sock

完了したら、ESCAPEを押し、:wq!と入力してファイルを保存し、終了します。

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

新しい場所を使用するように構成を更新したので、MySQLを起動して作業を検証する準備が整いました。

  1. sudo systemctl start mysqld
  2. sudo systemctl status mysqld

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

  1. mysql -u root -p

データディレクトリの値をもう一度見てください。

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

MySQLを再起動し、新しい場所を使用していることを確認したので、この機会にデータベースが完全に機能していることを確認してください。 既存のデータの整合性を確認したら、sudo rm -Rf /var/lib/mysql.bakを使用してバックアップデータディレクトリを削除できます。

結論

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

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