web-dev-qa-db-ja.com

InnoDBとMyISAMが混在するMySQLデータベースを同じサーバーにコピーする方法は?

mysqldumpには時間がかかるため、ファイルを移動することにしました。 2つのデータベースは同じサーバー上にあるため、cpは高速です。

問題は、調査によると、MyISAMは完全に移動しても問題ありませんが、InnoDBはそうではありません。

私はこれについて読みました: http://www.mysqlperformanceblog.com/2009/07/31/copying-innodb-tables-between-servers/

最後の問題は、データベース全体を一度に移動して、InnoDBテーブルとMyISAMテーブルの両方が適切であることを確認する方法があるかどうかです。

何か案は?どうもありがとうございます!

5
Erica Xu

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では、これは不要になりました。

4
RolandoMySQLDBA

また、PerconaのXtraBackupも確認してください。 InnoDBテーブルのダウンタイムは本質的にゼロです。 MyISAMテーブルのロック時間。

0
Rick James