mysqldump
には時間がかかるため、ファイルを移動することにしました。 2つのデータベースは同じサーバー上にあるため、cp
は高速です。
問題は、調査によると、MyISAMは完全に移動しても問題ありませんが、InnoDBはそうではありません。
私はこれについて読みました: http://www.mysqlperformanceblog.com/2009/07/31/copying-innodb-tables-between-servers/
最後の問題は、データベース全体を一度に移動して、InnoDBテーブルとMyISAMテーブルの両方が適切であることを確認する方法があるかどうかです。
何か案は?どうもありがとうございます!
Mysqldumpをあきらめる前に、並列mysqldumpの実行を検討したことがありますか?
これを行う方法についてスクリプトを書きました: 大規模データベースのmysqldumpを最適化するにはどうすればよいですか?
質問に戻ると、ターゲットDBサーバーがソースDBサーバーと完全に同じバージョンのMySQLを持っている限り、ライブサーバーのrsyncを実行することに頼ることができます。
マスターで/ var/lib/mysqlに対してrsyncを実行し、ターゲットサーバーの/ var/lib/mysqlにコピーするだけです。もちろん、rsyncを数回実行します。最後のrsyncまでは、FLUSH TABLES WITH READ LOCK
を実行する必要があります。コピーする前に、すべてのバイナリログをホースし、最初から始めることを確認してください。
ターゲットサーバーにバイナリロギングを設定する場合は、/ etc/my.cnfに次のように記述してください。
[mysqld]
log-bin=mysql-bin
マスターでMySQLをシャットダウンしたくない場合は、このスクリプトを実行してみてください。
RSYNCSTOTRY=10
cd /var/lib/mysql
X=0
while [ ${X} -lt ${RSYNCSTOTRY} ]
do
X=`echo ${X}+1|bc`
rsync -r * slaveserver:/var/lib/mysql/.
sleep 60
done
mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400);"
sleep 60
SLEEPID=`mysql -u... -p... -e"SHOW PROCESSLIST;" | grep "SELECT SLEEP(86400)" | awk '{print $1}'`
rsync -r * slaveserver:/var/lib/mysql/.
mysql -u... -p... -e"KILL ${SLEEPID};"
これを行っている間、データとインデックスページがキャッシュされる点で、私はもう少し保守的です。個人的には、FLUSH TABLES WITH READ LOCK
ではなく、いくつかのrsyncの後でmysqlをシャットダウンすることを好みます。このスクリプトの別の代替案は、最後のrsyncのためにmysqlをシャットダウンする次のスクリプトです。
mysql -u... -p... -e"RESET MASTER;"
RSYNCSTOTRY=10
cd /var/lib/mysql
X=0
while [ ${X} -lt ${RSYNCSTOTRY} ]
do
X=`echo ${X}+1|bc`
rsync -r * slaveserver:/var/lib/mysql/.
sleep 60
done
service mysql stop
rsync -r * slaveserver:/var/lib/mysql/.
service mysql start
試してみる !!!
警告
InnoDBデータがある場合は、rsyncを試行する約1時間前にこれを設定する必要があります。
SET GLOBAL innodb_max_dirty_pages_pct = 0;
これにより、InnoDBはコミットされていないデータをInnoDBバッファープールからより速くページアウトします。 MySQL 5.5では、これは不要になりました。
また、PerconaのXtraBackupも確認してください。 InnoDBテーブルのダウンタイムは本質的にゼロです。 MyISAMテーブルのロック時間。