MySQL復(fù)制數(shù)據(jù)庫的辦法非常多。針對不同的場景,選擇相應(yīng)的辦法。
在可以停止寫入,不用保證數(shù)據(jù)一致性,需要速度的情況下,可以通過物理復(fù)制的辦法。以下給出腳本:
創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的向陽網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
#!/bin/bash
datadir=/data/mysql
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/local/mysql/bin
usage(){
echo -e "Usage: $0 db1 db2\nCopy db1 to db2.\nNote: if db2 exists,drop and recreate it."
exit 1
}
if [ $# -ne 2 ]; then usage; fi
[ -d ${datadir}/$2 ] && rm -rf ${datadir}/$2/*
mysql --login-path=recover -e "drop database if exists $2;create database $2;"
for i in `ls -1 ${datadir}/$1/ | grep .ibd | awk -F '.' '{print $1}'`
do
mysql --login-path=recover -e "create table $2.$i like $1.$i;ALTER TABLE $2.$i DISCARD TABLESPACE;flush tables $1.$i for export;system cp -pf ${datadir}/$1/$i.{ibd,cfg} ${datadir}/$2/; unlock tables;"
mysql --login-path=recover -e "set foreign_key_checks=0;alter table $2.$i import tablespace;analyze table $2.$i;"
done
rm -rf ${datadir}/*cfg
exit 0
具體實現(xiàn)可以參閱官方文檔。
其中實現(xiàn)很簡單,但過程發(fā)現(xiàn)了一些有意思的東西。
開始的時候,腳本中并沒有[ -d ${datadir}/$2 ] && rm -rf ${datadir}/$2/*
這一句。在第一次執(zhí)行腳本沒什么毛病。但是,當(dāng)對源庫修改后,再次執(zhí)行,這個時候目標(biāo)庫鎖定了。查看進(jìn)程發(fā)現(xiàn)System lock,錯誤日志提示Orphan table encountered during DROP DATABASE. This is possible if 'db2/t1.frm' was lost。
這個MySQL服務(wù)不能正常shutdown,通過kill掉進(jìn)程重啟。
重啟服務(wù)過后,仍然不能刪除目標(biāo)庫。需要刪除目標(biāo)庫目錄下的所有文件,可刪除目標(biāo)庫。
以上問題在5.6系列會發(fā)生,5.7和8.0系列并無此問題。