MySQLデータベースのデータディレクトリを、マウントポイントとして持っている2番目のディスクアレイに移動しようとしています/array2/
。
私が抱えている問題は、すべてを試しましたが、my.cnfのdatadirの場所を変更した後、mysqlが再び起動しないことです。
私が得るすべては:
start: Job failed to start
MySQLデータベースのデータディレクトリを、マウントポイントとして持っている2番目のディスクアレイに移動しようとしています/array2/
。
私が抱えている問題は、すべてを試しましたが、my.cnfのdatadirの場所を変更した後、mysqlが再び起動しないことです。
私が得るすべては:
start: Job failed to start
回答:
アプリの装甲を忘れました。
興味がある人のために、フォルダを移動するために次のことをしました。
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
/etc/apparmor.d/usr.sbin.mysqld
、MySQLが更新を受信するたびに、あなたは追加することができます/array2/mysql/** rwk,
に/etc/apparmor.d/local/usr.sbin.mysqld
代わりに。Mysqlは引き続き古いデータディレクトリにアクセスできますが、それはおそらく問題ではありません。
sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf
。データベースフォルダーのみが必要な理由
innodb_use_native_aio=0
の[mysqld]
セクションにも以下を追加してくださいmy.cnf
。dev.mysql.com/doc/refman/5.5/en/...
AppArmorがを調べることで犯人でありsyslog
、mysql
このプロセスに従うことでデータの場所を正常に変更できることがわかりました。
以下で編集したファイルでは、で始まる行+
が追加され、で始まる行-
が削除されていることに注意してください。+
これらのファイルに行を追加するときに、実際に記号を入力/貼り付けしないでください。
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
。
注意してください。
InnoDBテーブルがある場合はibdata*
、ib_logfile*
ファイルとファイルをコピーする必要があります。コピーしないと、テーブルを使用できません。あなたが取得します:
「テーブル 'databaseName.tableName'は存在しません」
エラー。
このコピーコマンドを実行してibdata*
、ib_logfile*
ファイルとファイルをコピーします。
sudo cp -p /var/lib/mysql/ib* /array2/mysql/
私は別の方法を試してみましたが、いくつかは役に立つかもしれません
権限をそのままにコピー:
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
シンボリックリンクが私にとってうまくいかなかったので、それが誰かを助けることを願っています、これは最も簡単な方法でした
データディレクトリを移動する場合、新しいデータディレクトリにアクセス許可を与えるだけでなく、すべての親ディレクトリにアクセス許可があることを確認する必要があります。
datadirをハードドライブに移動し、Ubuntuに次のようにマウントしました。
/media/*user*/Data/
私のdatadirはDatabasesでした。
メディア、ユーザー、データの各ディレクトリへのアクセス許可を771に設定する必要がありました。
sudo chmod 771 *DIR*
これが機能しない場合、mysqlを機能させる別の方法は、/ etc / mysql / my.cnfのユーザーをrootに変更することです。ただし、セキュリティの観点からそれを行うにはいくつかの問題があります。
バインドオプション付きのマウントを使用することで、ApparmorおよびMysqlの構成にこれ以上変更が加えられないようにします。
例えば:
すべてをに移動したいとし/var/www
ます。このディレクトリが私の開発環境であり、別のパーティションにマウントされているとしましょう
最初にmysqlを停止する必要があります:
sudo systemctl stop mysql.service
ファイルを移動します(許可を保持)
sudo rsync -av /var/lib/mysql /var/www
これにより/var/www/mysql/
、すべてのコンテンツを含むディレクトリが生成されます。
古いディレクトリ内のすべてを削除します。
sudo rm -r /var/lib/mysql/*
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
何も変更されていないようになります。
マウントを行います:
sudo mount -a
そしてmysqlを再起動します。
受け入れられた答えから逐語的にコマンドに従うと失敗することを理解していますか?
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セントの価値。