使用source命令进行恢复:
mysql>set sql_log_bin=0; #关闭二进制日志记录
mysql> source /opt/xxx.sql;
下面我们来看一下数据恢复的实例:
背景环境:
正在运行的网站系统,mysql数据库,数据量25G,日业务增量10-15M。
备份方式:
每天23:00点,计划任务调用mysqldump执行全备脚本
故障时间点: 上午10点,误删除了一个表
如何恢复?
思路:
1、断开业务,防止对数据库二次伤害,挂出维护页面
2、搭建备用库,恢复全备
3、截取昨天晚上23:00之后到上午10点误删除操作之前的二进制日志
4、恢复到备用库,验证数据可用性和完整性
5、两种方案恢复前端应用
5.1 备用库导出误删除的表,导入到生产库,开启业务
5.2 直接将应用切割到备用库,替代生产库,开启业务
模拟故障并恢复:
- 原始数据:
mysql> create database fxw; mysql> use fxw mysql> create table t1 (id int,name varchar(20)); mysql> insert into t1 values (1,'zhang3'); mysql> insert into t1 values (2,'li4'); mysql> insert into t1 values (3,'wang5'); mysql> commit;
- 模拟前一天晚上23:00全备
[root@db01 backup]# mysqldump -uroot -p123456 -A -R --triggers --master-data=2 --single-transaction |gzip >/data/mysql/backup/all_$(date +%F).sql.gz
- 模拟白天(23:00-10:00)业务对数据的修改
mysql> insert into t1 values (4,'zhang33'); mysql> insert into t1 values (5,'li44'); mysql> insert into t1 values (6,'wang54'); mysql> commit;
- 模拟故障
drop table t1;
- 恢复
(1)准备全备,并获取到备份文件中的binlog的截取起点
gunzip all_2019-08-16.sql.gz
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=1904;
(2)截取二进制日志
最后一样可以看到Drop table ·t1·; 即drop之前的position为2287mysql> show binlog events in 'mysql-bin.000004'; +------------------+------+-------------+-----------+-------------+-------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+------+-------------+-----------+-------------+-------------------------------------------------------------+ | mysql-bin.000004 | 4 | Format_desc | 10 | 120 | Server ver: 5.6.36-log, Binlog ver: 4 | `testtab` /* generated by server */ | | mysql-bin.000004 | 331 | Query | 10 | 422 | create database fxw | mysql-bin.000004 | 1411 | Query | 10 | 1524 | use `fxw`; create table t1 (id int,name varchar(20)) | | mysql-bin.000004 | 1524 | Query | 10 | 1595 | BEGIN | | mysql-bin.000004 | 1595 | Table_map | 10 | 1642 | table_id: 248 (fxw.t1) | | mysql-bin.000004 | 1642 | Write_rows | 10 | 1689 | table_id: 248 flags: STMT_END_F | | mysql-bin.000004 | 1689 | Table_map | 10 | 1736 | table_id: 248 (fxw.t1) | | mysql-bin.000004 | 1736 | Write_rows | 10 | 1780 | table_id: 248 flags: STMT_END_F | | mysql-bin.000004 | 1780 | Table_map | 10 | 1827 | table_id: 248 (fxw.t1) | | mysql-bin.000004 | 1827 | Write_rows | 10 | 1873 | table_id: 248 flags: STMT_END_F | | mysql-bin.000004 | 1873 | Xid | 10 | 1904 | COMMIT /* xid=4865 */ | | mysql-bin.000004 | 1904 | Query | 10 | 1975 | BEGIN | | mysql-bin.000004 | 1975 | Table_map | 10 | 2022 | table_id: 283 (fxw.t1) | | mysql-bin.000004 | 2022 | Write_rows | 10 | 2070 | table_id: 283 flags: STMT_END_F | | mysql-bin.000004 | 2070 | Table_map | 10 | 2117 | table_id: 283 (fxw.t1) | | mysql-bin.000004 | 2117 | Write_rows | 10 | 2162 | table_id: 283 flags: STMT_END_F | | mysql-bin.000004 | 2162 | Table_map | 10 | 2209 | table_id: 283 (fxw.t1) | | mysql-bin.000004 | 2209 | Write_rows | 10 | 2256 | table_id: 283 flags: STMT_END_F | | mysql-bin.000004 | 2256 | Xid | 10 | 2287 | COMMIT /* xid=5881 */ | | mysql-bin.000004 | 2287 | Query | 10 | 2400 | use `fxw`; DROP TABLE `t1` /* generated by server */ | +------------------+------+-------------+-----------+-------------+-------------------------------------------------------------+ 22 rows in set (0.01 sec) mysql>
切割日志:[root@db01 binlog]# mysqlbinlog --start-position=1904 --stop-position=2287 /application/mysql/data/binlog/mysql-bin.000004 >/data/mysql/backup/binlog.sql [root@db01 binlog]# cd /data/mysql/backup/ [root@db01 backup]# ll total 2012 -rw-r--r-- 1 root root 903215 Aug 15 11:08 all_2019-08-15.sql -rw-r--r-- 1 root root 2675 Aug 15 11:14 binlog.sql -rw-r--r-- 1 root root 901833 Aug 15 09:50 full.sql -rw-r--r-- 1 root root 244008 Aug 15 09:15 world.sql [root@db01 backup]#
- 恢复全备+binlog
set sql_log_Bin=0; source /data/mysql/backup/all_2019-08-15.sql; source /data/mysql/backup/binlog.sql;
- 查看恢复后的数据。
mysql> use fxw; Database changed mysql> select * from t1; +------+---------+ | id | name | +------+---------+ | 1 | zhang3 | | 2 | li4 | | 3 | wang5 | | 4 | zhang33 | | 5 | li44 | | 6 | wang54 | +------+---------+ 6 rows in set (0.01 sec)
终于恢复了,中间还是需要注意小细节的,千万别用正式数据做操作哦。学到这里算是已经很不错了,普通的程序员是没有关注到这里的,记得几年前的我删除了数据,直接傻眼了,不知道该怎么办,公司同事也没办法,因为很多中小型公司都是没有DBA的,那个时候的我只有一年经验,对数据库完全不了解(其实很多年经验的人未必会,因为程序员更多的专注在程序上,平时只是用用数据库,不会在数据库上做文章或者专门去学习数据库),因此我只能重新弄一批测试数据。现在基本不怕这种误操作。
最后修改于 2019-08-16 10:24:50
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

