mysql binlog恢复数据实战
【摘要】 数据库备份数据库恢复的先决条件是,定时备份数据库,缩小binlog恢复范围.首先我们备份测试数据库数据:mysqldump -uroot -p --database test > testBackSql.sql复制假定它为最后一次备份数据.test数据库,test数据表最后一个id为164新增测试数据通过mysql存储过程,写入测试新的测试数据BEGINDECLARE num INT;SET...
数据库备份
数据库恢复的先决条件是,定时备份数据库,缩小binlog恢复范围.首先我们备份测试数据库数据:
mysqldump -uroot -p --database test > testBackSql.sql
复制
假定它为最后一次备份数据.
test数据库,test数据表最后一个id为164
新增测试数据
通过mysql存储过程,写入测试新的测试数据
BEGIN
DECLARE num INT;
SET num=1;
WHILE 1 DO
INSERT INTO `test`(`name`, `age`, `sex`)
VALUES
(
CONCAT('name:', num),
FLOOR(1 +(RAND() * 40)),
1
);
SET num = num + 1;
SELECT SLEEP(0.01);
END WHILE;
END
复制
插入一段时间后,直接删除整个数据库,最后id为367 :
数据恢复
在上面的操作中,我们备份了数据为164 id之前的所有数据,插入数据到了367之后被删库.假设我们并不知道id到了367.开始使用binlog分析日志:
首先使用 flush logs; 命令刷新二进制日志
flush logs;
复制
刷新二进制的目的为:确保在刷新日志之前的binlog都为正常数据操作(程序正常更改).
刷新后,新的binlog用于做恢复数据时的记录,
因为当执行备份文件恢复数据和binlog恢复时,都会产生新的binlog,不要和原来的数据进行冲突.
获取binlog日志列表
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 77183 |
| mysql-bin.000002 | 120 |
+------------------+-----------+
2 rows in set (0.00 sec)
mysql>
复制
分析各个日志区间
查询000001日志
/www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-bin.000001 |more
复制
查询000002日志
/www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-bin.000002 |more
复制
很明显,000002没有删库的那条记录,那么代表备份到删库这段时间的binlog日志都存在000001
通过此开始时间,可以判断出,000001 binlog记录了备份后的所有数据.(如果涉及多个binlog,需要执行多个binlog恢复日志)
通过查询binlog,获取到最后恢复点:
/www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-bin.000001 |tail -50
复制
将原有备份数据恢复:
cat testBackSql.sql |mysql -uroot -p
复制
备份数据已经恢复了,开始恢复二进制数据.
/www/server/mysql/bin/mysqlbinlog --stop-position=77066 /www/server/data/mysql-bin.000001| mysql -uroot -p
复制
mysql数据恢复成功.
其他
由于时间限制,关于恢复数据中,需要获取到初始恢复位置(也就是备份数据之后的那个位置,可通过--start-datetime=datetime 参数进行定位)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)