要使用mysqlbinlog 恢复数据首先必须启用过binglog
/etc/my.cnf
log-bin=mysql-bin
当然不是等到数据损坏的时候再启用binglog,那时候已经为时已晚!
mysqlbinlog恢复命令:
/mysql/bin/mysqlbinlog --database=bbs --start-date="2013-01-22 05:00:00" --stop-date="2013-01-22 09:00:00" /mysql/data/mysql-bin.000001 | /mysql/bin/mysql -u root -p123456 -f
注释:
--database=bbs // 需要恢复的数据库
--start-date="2013-01-22 05:00:00"
// 恢复数据起始时间
--stop-date="2013-01-22 09:00:00" // 恢复数据截至时间
/mysql/data/mysql-bin.000001 // 引用的日志文件,多个日志就多增加几条
/mysql/bin/mysql -u root -p123456 // 登录Mysql帐号密码
-f // 忽略错误,否则遇到相同条目恢复就会终止
需要注意的问题:
mysqlbinlog命令只能恢复binglog日志里有的数据
一般我们都使用
expire-logs-days来限制日志保存的天数,以防止日志文件不断增大撑爆硬盘。
假设
expire-logs-days = 7
那么7天之前的数据如果被误删除将无法通过此命令恢复,比如discuz论坛,你要是误删除了某个版块,而这个版块创建已经有半年,显然版块以及版块内的所有帖子,无法使用近期的binglog日志恢复。
遇到这种情况,要想恢复数据,必须配合每天定时备份的数据来进行
假设数据是每天早上5点定时打包备份,早上9点误删了某个版块
首先恢复打包备份的数据
service mysql stop
cd /mysql/data
tar zxvf /mysql/dbbackup/bbs20130122.tar.gz
service mysql start
/mysql/bin/mysqlbinlog
--database=bbs
--start-date="2013-01-22 5:00:00"
--stop-date="2013-01-22 9:00:00" /mysql/data/mysql-bin.000001 | /mysql/bin/mysql -u root -p123456 -f
恢复的时候最好是断开网站与数据库的连接
假如9点以后有产生的数据,再取个9点后的时间段恢复下应该没问题
用一个从数据库做上述恢复测试,使用测试论坛连接该数据库,去测试论坛后台删了个版块,没料到把正在使用的该版块附件都给删除了,明明去后台修改了远程附件连接地址,幸亏,附件我也有备份,所以说,数据备份多么重要!
假设几种需要恢复数据的状况出现:
1.误删数据,这些数据在日志能够恢复的期限内创建,直接使用命令就行了
2.误删的数据不包含在日志内,使用日志配合定期打包的数据按上述方法恢复
3.系统因种种原因被破坏,比如黑客入侵、硬盘损坏等等情况,日志也没了,以防万一,我们只要事先做好主从同步,只需要把数据库切换到从库上就解决了
4.从库也同时被黑客捣毁了,我们还有定时备份到网盘的数据,损失几个小时的数据吧
5.网盘也被黑客攻击瘫痪了,不怕,数据已经由网盘实时同步到本地硬盘,揣上移动硬盘奔机房去吧