MySQLデータディレクトリを移動するにはどうすればよいですか?


57

MySQLデータベースのデータディレクトリを、マウントポイントとして持っている2番目のディスクアレイに移動しようとしています/array2/

私が抱えている問題は、すべてを試しましたが、my.cnfのdatadirの場所を変更した後、mysqlが再び起動しないことです。

私が得るすべては:

start: Job failed to start

回答:


62

アプリの装甲を忘れました。

興味がある人のために、フォルダを移動するために次のことをしました。

mysqlサーバーを停止します。

stop mysql

新しいディレクトリを作成します。

mkdir /array2/mysql

データベースフォルダーのみをコピーします。

cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql

my.cnfファイルをバックアップします。

cp /etc/mysql/my.cnf /root/my.cnf.backup

my.cnfファイルを編集します。

nano /etc/mysql/my.cnf

古いdatadirとソケットに関するすべての記述を新しい場所に変更します

私のものになりました:

datadir=/array2/mysql
socket=/array2/mysql/mysql.sock

ディレクトリのアクセス許可を更新します。

chown -R mysql:mysql /array2/mysql

古いディレクトリの名前を変更します。

mv /var/lib/mysql /var/lib/mysql-old

念のため、シンボリックリンクを作成します。

ln -s /array2/mysql /var/lib/mysql 

AppArmorに新しいdatadirについて知らせます。

echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias

装甲プロファイルをリロードする

sudo /etc/init.d/apparmor reload

次に、mysqlを起動します。

start mysql

これは良い答えですが、クライアントがmysqlに接続できるようにするためにもう1ステップが必要な場合があります。1行下に新しいグループを追加します... [clients] socket = / array2 / mysql / mysql.sock socket =部分はmysql.sockファイルの新しい場所を指します。
夜のフクロウ

1
あなたがマージする気にしたくない場合は/etc/apparmor.d/usr.sbin.mysqld、MySQLが更新を受信するたびに、あなたは追加することができます/array2/mysql/** rwk,/etc/apparmor.d/local/usr.sbin.mysqld代わりに。Mysqlは引き続き古いデータディレクトリにアクセスできますが、それはおそらく問題ではありません。
drevicko

sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf。データベースフォルダーのみが必要な理由
int_ua

Linux上のZFSはAIOをサポートしていないため、datadirをZFSに移動する場合(私が行ったように)、ファイルinnodb_use_native_aio=0[mysqld]セクションにも以下を追加してくださいmy.cnfdev.mysql.com/doc/refman/5.5/en/...
アンドリューEnsley

23

AppArmorがを調べることで犯人でありsyslogmysqlこのプロセスに従うことでデータの場所を正常に変更できることがわかりました。

以下で編集したファイルでは、で始まる行+が追加され、で始まる行-が削除されていることに注意してください。+これらのファイルに行を追加するときに、実際に記号を入力/貼り付けしないでください。

mysqlディレクトリを新しい場所に複製しました。

sudo rsync -av /var/lib/mysql /new_dir

次に、次のdatadir行を編集しました/etc/mysql/my.cnf

sudo vi /etc/mysql/my.cnf
-datadir     = /var/lib/mysql
+datadir     = /new_dir/mysql

次に編集しました/etc/apparmor.d/usr.sbin.mysqld

sudo vi /etc/apparmor.d/usr.sbin.mysqld
-  /var/lib/mysql/ r,
-  /var/lib/mysql/** rwk,
+  /new_dir/mysql/ r,
+  /new_dir/mysql/** rwk,

その後、再起動しましたmysql


13

注意してください。

InnoDBテーブルがある場合はibdata*ib_logfile*ファイルとファイルをコピーする必要があります。コピーしないと、テーブルを使用できません。あなたが取得します:

「テーブル 'databaseName.tableName'は存在しません」

エラー。

このコピーコマンドを実行してibdata*ib_logfile*ファイルとファイルをコピーします。

sudo cp -p /var/lib/mysql/ib* /array2/mysql/

これはコメントである必要があり、それは完全な答えではありません
Postadelmaga

4

私は別の方法を試してみましたが、いくつかは役に立つかもしれません

権限をそのままにコピー:

rsync -avzh /var/lib/mysql /path/to/new/place

バックアップ(何かがうまくいかない場合):

mv /var/lib/mysql /var/lib/_mysql

古い場所の代わりに新しい空のディレクトリを作成します。

mkdir /var/lib/mysql

新しい場所を古い場所にバインドマウントします。

mount -B /path/to/new/place /var/lib/mysql

シンボリックリンクが私にとってうまくいかなかったので、それが誰かを助けることを願っています、これは最も簡単な方法でした


3

データディレクトリを移動する場合、新しいデータディレクトリにアクセス許可を与えるだけでなく、すべての親ディレクトリにアクセス許可があることを確認する必要があります。

datadirをハードドライブに移動し、Ubuntuに次のようにマウントしました。

/media/*user*/Data/

私のdatadirはDatabasesでした。

メディア、ユーザー、データの各ディレクトリへのアクセス許可を771に設定する必要がありました。

sudo chmod 771 *DIR*

これが機能しない場合、mysqlを機能させる別の方法は、/ etc / mysql / my.cnfのユーザーをrootに変更することです。ただし、セキュリティの観点からそれを行うにはいくつかの問題があります。


2

バインドオプション付きのマウントを使用することで、ApparmorおよびMysqlの構成にこれ以上変更が加えられないようにします。


例えば:

すべてをに移動したいとし/var/wwwます。このディレクトリが私の開発環境であり、別のパーティションにマウントされているとしましょう

  1. 最初にmysqlを停止する必要があります

    sudo systemctl stop mysql.service
    
  2. ファイルを移動します(許可を保持)

    sudo rsync -av /var/lib/mysql /var/www
    

    これにより/var/www/mysql/、すべてのコンテンツを含むディレクトリが生成されます。

  3. 古いディレクトリ内のすべてを削除します。

    sudo rm -r /var/lib/mysql/*
    
  4. bind古いディレクトリのオプションで新しいディレクトリをマウントします。この行を
    編集/etc/fstabして追加します。

    /var/www/mysql /var/lib/mysql  none  bind 0 0
    

    これ/var/www/mysqlにより、空のディレクトリにマウントされます。ここで/var/lib/mysql
    bindオプションは魔法を実行します。mysqlとapparmorの/var/lib/mysqlコンテンツが読み込まれ、/var/www/mysql何も変更されていないようになります。

  5. マウントを行います:

    sudo mount -a
    

    そしてmysqlを再起動します。


0

受け入れられた答えから逐語的にコマンドに従うと失敗することを理解していますか?

cp -R / var / lib / mysql / array2 / mysql

/ var / lib / mysqlを/ array2 / mysql / mysqlにコピーします。

構成ファイルを設定するときは、ディレクトリとして/ array2 / mysql / mysqlに配置することをお勧めします。そうしないと、mysqldが起動に失敗します。

より良いコピーコマンドは次のとおりです。

cp -R / var / lib / mysql / array2 / cp -R / var / lib / mysql / users / array2 / mysql

ちょうど私の2セントの価値。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.