Mysql备份恢复
开启mysql的binlog功能可以有效防止在日常mysql操作过程中因操作失误而导致的数据丢失问题
但是,对于DBA来说,第一准则就是备份重于一切。eygle在DBA四大生存法则中也有提到
我们必需知道,系统总是要崩溃的,没有有效的备份只是等哪一天死!我经常开玩笑的说,唯一会使DBA在梦中惊醒的就是,没有有效的备份.
binlog
binlog,也称为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作)、数据库增量备份和恢复(增量备份和基于时间点的恢复)、Mysql的复制(主主数据库的复制、主从数据库的复制)
开启binlog
1 | mysql> show variables like '%log_bin%'; |
Mysql备份恢复
环境:Centos 6.6
Mysql version: 5.5.541
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#先执行全备操作
[root@host1 ~]# sh mysql_back.sh
Usage: please input Mysql_Fullbackup|Mysql_Incbackup
[root@host1 ~]# sh mysql_back.sh Mysql_Fullbackup
Full backup of MySQL database... Please wait.
Mysql database full backup success.
[root@host1 ~]#
[root@host1 ~]# tree /backup/mysql_backup/
/backup/mysql_backup/
├── backup_20170308.log
├── Full_backup
│ └── 20170308
│ ├── all_databases_backup_20170308_17:06:08.sql.gz
│ └── jack_backup_20170308_17:06:08.sql.gz
├── Full_backup_time.txt
├── Inc_backup
└── mysql_db.txt
3 directories, 5 files
[root@host1 ~]#
[root@host1 mysql_backup]# cat backup_20170308.log
[ 2017-03-08 17:06:08 ] - Databases all-databases has been backup successful.
[ 2017-03-08 17:06:08 ] - Databases jack has been backup successful.
----------------------------------------
[root@host1 mysql_backup]# cat Full_backup_time.txt
2017-03-08 17:06:08
[root@host1 mysql_backup]# cat mysql_db.txt
jack
[root@host1 mysql_backup]#
向jack库的yfshare表插入几条数据1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30mysql> use jack;
mysql> select * from yfshare;
+------+---------+
| id | name |
+------+---------+
| 1 | jack |
| 2 | yfshare |
| 3 | tom |
| 4 | jerry |
| 5 | bob |
+------+---------+
5 rows in set (0.00 sec)
mysql> INSERT INTO yfshare values(6,'aaa');
mysql> INSERT INTO yfshare values(7,'bbb');
mysql> commit;
mysql> select * from yfshare;
+------+---------+
| id | name |
+------+---------+
| 1 | jack |
| 2 | yfshare |
| 3 | tom |
| 4 | jerry |
| 5 | bob |
| 6 | aaa |
| 7 | bbb |
+------+---------+
7 rows in set (0.00 sec)
mysql>
然后做增量备份1
2
3
4
5
6
7
8
9
10
11
12
13[root@host1 ~]# sh mysql_back.sh Mysql_Incbackup
Increment backup of MySQL database... Please wait.
Mysql database Increment backup success.
[root@host1 ~]#
[root@host1 ~]# tree /backup/mysql_backup/Inc_backup/
/backup/mysql_backup/Inc_backup/
└── 20170308
└── jack_Inc_20170308_17:15:27.zip
1 directory, 1 file
[root@host1 ~]#1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27再向jack库和yfshare表插入几条数据后,不做备份,假设不小心删除了库jack
```bash
mysql> INSERT INTO yfshare values(8,'ccc');
mysql> INSERT INTO yfshare values(9,'ddd');
mysql> commit;
mysql> select * from yfshare;
+------+---------+
| id | name |
+------+---------+
| 1 | jack |
| 2 | yfshare |
| 3 | tom |
| 4 | jerry |
| 5 | bob |
| 6 | aaa |
| 7 | bbb |
| 8 | ccc |
| 9 | ddd |
+------+---------+
9 rows in set (0.00 sec)
mysql> drop database jack;
mysql> commit;
mysql> desc yfshare;
ERROR 1046 (3D000): No database selected
mysql> use jack;
ERROR 1049 (42000): Unknown database 'jack'
mysql>
下面来开始恢复jack库的yfshare表
恢复步骤:
- 恢复jack库的全量备份
- 恢复jack库的增量备份
- 通过binlog恢复数据库到删除前
恢复思路:先在mysql中新建一个测试库,在测试库导入误删除表所在的库全量增量备份,然后通过binlog恢复到该表删除前一刻,并导入测试库,然后从测试库导出该表的sql,最后导入到正式库1
2
3
4
5
6
7[root@host1 mysql_backup]# mysql -uroot -p123456 jack --one-database < Full_backup/20170308/jack_backup_20170308_17\:06\:08.sql
ERROR 1049 (42000): Unknown database 'jack'
[root@host1 mysql_backup]#
这时是因为没有库,所以需要先创建对应的库名,再执行全备恢复操作
mysql> create database jack;
mysql> commit;1
2
3#全量备份恢复
[root@host1 mysql_backup]# gunzip Full_backup/20170308/jack_backup_20170308_17\:06\:08.sql.gz
[root@host1 mysql_backup]# mysql -uroot -p123456 jack --one-database < Full_backup/20170308/jack_backup_20170308_17\:06\:08.sql1
2
3#增量备份恢复
[root@host1 mysql_backup]# unzip Inc_backup/20170308/jack_Inc_20170308_17\:15\:27.zip -d Inc_backup/20170308/
[root@host1 mysql_backup]# mysql -uroot -p123456 jack --one-database < Inc_backup/20170308/jack_Inc_20170308_17\:15\:27.sql1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#先看看恢复的情况
mysql> use jack;
mysql> show tables;
+----------------+
| Tables_in_jack |
+----------------+
| aaa |
| yfshare |
+----------------+
2 rows in set (0.00 sec)
mysql> select * from yfshare;
+------+---------+
| id | name |
+------+---------+
| 1 | jack |
| 2 | yfshare |
| 3 | tom |
| 4 | jerry |
| 5 | bob |
| 6 | aaa |
| 7 | bbb |
+------+---------+
7 rows in set (0.00 sec)
mysql>
现在yfshare表里面只有7条数据,删除前是有9条数据的,而后边的数据没有备份,所以只能通过mysqlbinlog恢复了
增量备份时间是20170308_17:15:27,所以需要把从这个时间点到删除前的操作导出成一个sql文件1
2
3
4
5[root@host1 mysql_backup]# tail -3 /var/lib/mysql/mysql_bin.index
./mysql_bin.000031
./mysql_bin.000032
./mysql_bin.000033
[root@host1 mysql_backup]#
binlog的时间格式是:170308 17:15:27
mysqlbinlog恢复的时间格式:2017-03-08 17:15:271
2
3#查找增量备份时记录到了哪个binlog文件
#因为我们在增量备份文件中记录了备份时间,所以能很快找到是从mysql_bin.000032开始的
[root@host1 tmp]# mysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.000032 | grep -i '170308 17:15:27'1
2
3
4
5
6
7
8
9
10
11
12
13#查找删除的时间点
#可以考虑把所有mysql_bin文件导成sql文件后过滤查找
[root@host1 ~]# mysqlbinlog -d jack /var/lib/mysql/mysql_bin.000033 > test.sql
#发现误删除操作的时间是170308 17:18:29
SET TIMESTAMP=1488964709/*!*/;
DROP TABLE `yfshare` /* generated by server */
/*!*/;
# at 602
SET TIMESTAMP=1488965083/*!*/;
drop database jack
通过查找binlog发现,我们需要恢复的时间是170308 17:18:29
这时候我们就可以恢复了1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#因为找到具体的binlog文件和误删除操作时间,所以我们要把期间所有的操作导成一个sql文件,然后恢复
[root ~]# mysqlbinlog -d jack --start-datetime="2017-03-08 17:15:27" /var/lib/mysql/mysql_bin.000032 > recover.sql
[root ~]# mysqlbinlog -d jack --stop-datetime="2017-03-08 17:18:29" /var/lib/mysql/mysql_bin.000033 >> recover.sql
mysql> use jack;
mysql> source ~/recover.sql
mysql> commit;
mysql> select * from yfshare;
+------+---------+
| id | name |
+------+---------+
| 1 | jack |
| 2 | yfshare |
| 3 | tom |
| 4 | jerry |
| 5 | bob |
| 6 | aaa |
| 7 | bbb |
| 8 | ccc |
| 9 | ddd |
+------+---------+
9 rows in set (0.00 sec)
mysql>
OK,恢复成功
Mysql备份恢复脚本
1 | #mysql备份脚本目录结构 |
1 | [root@host1 ~]# cat mysql_back.sh |
本作品采用知识共享署名 2.5 中国大陆许可协议进行许可,欢迎转载,但转载请注明来自Jack Wang Blog,并保持转载后文章内容的完整。本人保留所有版权相关权利。
本文出自”Jack Wang Blog”:http://www.yfshare.vip/2017/03/08/Mysql%E5%A4%87%E4%BB%BD%E6%81%A2%E5%A4%8D/