来源:自学PHP网 时间:2015-04-16 10:50 作者: 阅读:次
[导读] 小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,就不太可能每天进行一次完整备份了,这时候就可以使用增量备份。增量备份的原理就是使用了m...
小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,就不太可能每天进行一次完整备份了,这时候就可以使用增量备份。增量备份的原理就是使用了mysql的binlog日志。 本次操作的MySQL版本为 增量备份要确保打开了二进制日志,参考 mysql的日志系统 :
首先对pak数据库做一个完整备份:
这时候就会得到一个全备文件pak_bak_full.sql。mysqldump操作会导致滚动一次log,假设新的binlog文件是mysql-bin.000002。 模拟插入数据和误操作a. 在pak库的某个表插入一些数据,然后执行 b. 再在pak库中的t_user表中增加两条记录,然后误删除t_user表。t_user中增加记录的操作和删除表的操作都记录在mysql-bin.000003中。 开始恢复恢复过程不要记录日志:
首先导入全备数据$ mysql -h localhost -upak -ppwd < pak_bak_full.sql 或 mysql> source /path/backup/pak_bak_full.sql 我们也可以看到全备时的binlog位置:
查看当前所在二进制日志中的位置:
根据上面两个position能大概确定需要完整恢复哪几个binlog文件。 恢复mysql-bin.000002 在待恢复的position或时间点以前、全备以后的binlog需要全部恢复,多个文件以空格隔开
此时查询可以得到前两条数据。 恢复部分mysql-bin.000003 这个日志中包括了新增记录和误删表两个部分,我们需要恢复到新增记录之后、误删操作以前的位置。 如果知道误操作的命令如 (如下面的信息显示,误操作 $ mysqlbinlog /var/lib/mysql/mysql-bin.000003 |grep -C 5 'DROP TABLE' #141204 15:07:05 server id 1 end_log_pos 775 Xid = 376 COMMIT/*!*/; # at 775 #141204 15:08:04 server id 1 end_log_pos 882 Query thread_id=10 exec_time=0 error_code=0 SET TIMESTAMP=1417676884/*!*/; DROP TABLE `t_user` /* generated by server */ /*!*/; # at 882 恢复命令:
如果position难以确定,但知道需要恢复到的确切(服务器)时间,也可以使用datetime:
如果不是误操作导致的,而是迁移数据库,那么不需要position或datetime,使用所有binlog文件增量恢复即可。 确定恢复成功后记得打开日志记录:
报错 1. unknown variable 'default-character-set=utf8' 在使用 /usr/local/mysql/bin/mysqlbinlog: unknown variable 'default-character-set=utf8' 原因是在我为了统一mysql客户端到服务端的的字符编码,在 应对这个bug的方法有两个: 第一,自然是注释到 第二,改用 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com