MySQL複製數據庫

MySQL複製數據庫的辦法很是多。針對不一樣的場景,選擇相應的辦法。
在能夠中止寫入,不用保證數據一致性,須要速度的狀況下,能夠經過物理複製的辦法。如下給出腳本:html

#!/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

具體實現能夠參閱官方文檔mysql

其中實現很簡單,但過程發現了一些有意思的東西。
開始的時候,腳本中並無[ -d ${datadir}/$2 ] && rm -rf ${datadir}/$2/*這一句。在第一次執行腳本沒什麼毛病。可是,當對源庫修改後,再次執行,這個時候目標庫鎖定了。查看進程發現System lock,錯誤日誌提示Orphan table encountered during DROP DATABASE. This is possible if 'db2/t1.frm' was lost。
MySQL複製數據庫sql

MySQL複製數據庫
這個MySQL服務不能正常shutdown,經過kill掉進程重啓。
重啓服務事後,仍然不能刪除目標庫。須要刪除目標庫目錄下的全部文件,可刪除目標庫。數據庫

以上問題在5.6系列會發生,5.7和8.0系列並沒有此問題。bash

相關文章
相關標籤/搜索