mysqldump是MySQL自带的逻辑备份工具,可以进行温备也可以进行热备,两者都是在数据库服务不停止的情况下进行的备份
对于myisam只能进行温备
myisam不支持事务,加锁也比较快,没有热备机制
对于InnoDB最好使用热备份
InnoDB支持事务,在生产环境中,使用热备加锁可能要很久,事务要从缓存中同步到日志文件,日志文件最后还要同步到数据库文件当中,即使锁上了也要等写完
写锁优先级可能大于读锁
而且如果启动了一个很大的事务的话,可能很久都锁不上
若真的要使用热备,要等很久的时间加锁,可以SHOW ENGINE INNODB STATUS查看InnoDB写入状态,写入完成了才可dump
可以对InnoDB做热备的原因
使用--single-transaction参数,可以开启一个直到备份结束的大事务,事务隔离级别默认为REPEATABLE-READ,所以大事务在整个读取过程当中数据是一致的,可以做到备份的过程中数据一直处于备份开始时的状态
过程:
一般使用mysqldump进行完全备份,之后再通过二进制日志的方式进行后续增量备份
对于myisam引擎
1:锁表
备份的时候,可能有用户正往当中写数据,需加读锁 # FLUSH TABLES WITH READ LOCK;
2:记录二进制日志位置
当前二进制日志是哪一个以及事件所处的位置是哪里,这样做即时点恢复的时候就知道从哪个事件之后需要导入进行恢复,一般先做日志滚动 # FLUSH LOGS; SHOW MASTER STATUS;
3:开始备份
4:备份完解锁 # UNLOCK TABLES;
5:增量备份
直接复制二进制文件即可
其实可以在使用mysqldump命令时直接使用参数,不用进行上述1,2,4步骤
--lock-all-tables:锁定所有表
--master-data=2:以CHANGE MASTER TO的方式记录位置,默认被注释
--flush-logs:刷新日志
--all-databases:备份所有库
--databases db_name1,db_name2:备份多个库
以上也是常用参数
对于InnoDB存储引擎
使用--single-transaction参数实现热备,无需使用-lock-all-tables加锁
例子:温备份+完全备份+增量备份(周期视情况而定)
备份:
1:完全备份
mysqldump -uroot -hlocalhost -p --all-databases --lock-all-tables --flush-logs --master-data=2 > /backup/all`date +%F`.sql
2:若备份周期为一天,增量备份
先滚动日志 # FLUSH LOGS;
直接在数据目录下cp -a当天的二进制日志
或者最好使用mysqlbinlog命令重定向 # mysqlbinlog mysql-bin.000015 > /backup/increment`date +%F`.sql
3:根据周期进行备份
还原:
1:最严重的情况是数据库完全奔溃,这种情况需要数据库进行初始化
scripts/mysql_install_db --user=mysql --datadir/mysql/data/ #利用初始化脚本
2:导入之前的完全备份
mysql -uroot -hlocalhost -p < all2015-03-22.sql
3:导入增量备份
mysql -uroot -hlocalhost -p ...
4:当天的数据利用二进制日志即时点还原(一般二进制日志文件应存放在不同的存储中,保证安全性)
mysqlbinlog mysql-bin.000016 | mysql -uroot -hlocalhost -p
本文出自 “Call me Boxin” 博客,请务必保留此出处http://boxinknown.blog.51cto.com/10435935/1677038
原文地址:http://boxinknown.blog.51cto.com/10435935/1677038