MYSQL_CONN="-hhostip -uusername -ppassword"
mysql ${MYSQL_CONN} -A -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
SEARCHING_FOR_SLEEP=0
while [ ${SEARCHING_FOR_SLEEP} -eq 0 ]
do
sleep 3
SEARCHING_FOR_SLEEP=`${MYSQL} ${MYSQL_CONN} -A -e"SHOW PROCESSLIST;" | grep -c "SELECT SLEEP(86400)"`
done
sleep 1
SLEEP_ID=`mysql ${MYSQL_CONN} -A -e"SHOW PROCESSLIST;" | grep "SELECT SLEEP(86400)" | awk '{print $1}'`
mysqldump ${MYSQL_CONN} --master-data=2 --single-transaction --flush-privileges --routines --triggers --all-databases > /root/mydata.sql
mysql ${MYSQL_CONN} -A -e"KILL ${SLEEP_ID}"
这是一个示例脚本,一次使用全局读锁和并行 mysqldumps 20 个数据库
MYSQL_CONN="-hhostip -uusername -ppassword"
mysql ${MYSQL_CONN} -A -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
SEARCHING_FOR_SLEEP=0
while [ ${SEARCHING_FOR_SLEEP} -eq 0 ]
do
sleep 3
SEARCHING_FOR_SLEEP=`${MYSQL} ${MYSQL_CONN} -A -e"SHOW PROCESSLIST;" | grep -c "SELECT SLEEP(86400)"`
done
sleep 1
SLEEP_ID=`mysql ${MYSQL_CONN} -A -e"SHOW PROCESSLIST;" | grep "SELECT SLEEP(86400)" | awk '{print $1}'`
mysql ${MYSQL_CONN} -AN -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > /tmp/ListOfDatabases.txt
COMMIT_COUNT=0
COMMIT_LIMIT=20
for DB in `cat /tmp/ListOfDatabases.txt`
do
mysqldump ${MYSQL_CONN} --single-transaction --hex-blob --routines --triggers ${TBL_EXCLUSION_LIST} ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
mysql ${MYSQL_CONN} -A -e"KILL ${SLEEP_ID}"
不冷不热/寒冷的备份
备份 mysql 的一种更冒险的方法是执行 rsync。基本概念是这样的:
步骤 01) 大约提前 1 小时,运行SET GLOBAL innodb_max_dirty_pages_pct = 0;(如果您的数据全部是 InnoDB,则可选)
因为 MySQL 还没有那么成熟。
但也有一些选择,例如 Percona 的(免费)innodb 热备份:
http://www.percona.com/software/percona-xtrabackup/
Oracle 也提供 MySQL Enterprise Backup,但它不是免费的。
有两种不符合 MySQL 标准的备份方法
冷备份
您可以结合执行并行 mysqldumps
FLUSH TABLES WITH READ LOCK
我很久以前写过一篇关于这个的帖子:如何优化大型数据库的 mysqldump?
这是一个使用全局读锁和单片 mysqldump 的示例脚本
这是一个示例脚本,一次使用全局读锁和并行 mysqldumps 20 个数据库
不冷不热/寒冷的备份
备份 mysql 的一种更冒险的方法是执行 rsync。基本概念是这样的:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
(如果您的数据全部是 InnoDB,则可选)从这里,您可以随心所欲地在 DB2 上启动 mysql 并在 DB2 上执行 mysqldumps。
我不仅将代码放在这里,还与您分享我过去发布的有关此概念的链接(我定期使用此概念为 Giant Masters 制作新奴隶)