mysqldump备份的时候先进行一次完整备份,mysqldump恢复日志的方法是完整备份+二进制日志。二进制恢复的时候是定义希望恢复的位置,或者定义想要恢复的那个状态的时间。
1、对MySQL先做个完整备份,备份放在/tmp下
[root@dr1 data]# mysqldump --all-databases --lock-all-tables --flush-logs --master-data=2 > /tmp/global.sql
参数说明:
--all-databases 指定所有的数据库 --lock-all-tables 表示锁定所有的表
--flush-logs 表示日志滚动一次
--master-data=2 将当前二进制日志的位置记录在备份文件中 “1”表示不注释掉 “2”表示注释掉
2、
为了演示备份恢复的效果,模拟场景就是我在jiaowu当中的scores插入了一行,这个是我想要的结果,但是我插入完这行以后不小心把整个scores表删除了。
[root@dr1 data]# mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| jiaowu |
| mysql |
| performance_schema |
| test |
+--------------------+
mysql> use jiaowu;
Database changed
mysql> show tables;
+------------------+
| Tables_in_jiaowu |
+------------------+
| courses |
| scores |
| students |
| tutors |
+------------------+
mysql> select * from scores;
+----+-----+-----+-------+
| ID | SID | CID | Score |
+----+-----+-----+-------+
| 1 | 2 | 2 | 67 |
| 2 | 2 | 3 | 71 |
| 3 | 1 | 2 | 90 |
| 4 | 1 | 7 | 45 |
| 5 | 3 | 6 | 32 |
| 6 | 3 | 1 | 99 |
| 7 | 4 | 8 | 95 |
| 8 | 4 | 10 | 36 |
+----+-----+-----+-------+
插入一行信息
mysql> insert into scores (ID,SID,CID,Score) values (11,11,11,11);
mysql> select * from scores;
+----+-----+-----+-------+
| ID | SID | CID | Score |
+----+-----+-----+-------+
| 1 | 2 | 2 | 67 |
| 2 | 2 | 3 | 71 |
| 3 | 1 | 2 | 90 |
| 4 | 1 | 7 | 45 |
| 5 | 3 | 6 | 32 |
| 6 | 3 | 1 | 99 |
| 7 | 4 | 8 | 95 |
| 8 | 4 | 10 | 36 |
| 11 | 11 | 11 | 11 |
不小心删除了scores整张表
mysql> DROP tables scores;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+------------------+
| Tables_in_jiaowu |
+------------------+
| courses |
| students |
| tutors |
+------------------+
mysql> \q
3、查看此时的二进制日志文件,我们想要恢复到删除scores表之前,插入那条语句之后的状态。如下图所示可以看到在327或300之前,177之后是我们想要的状态,而在437的时候DROP这个语句已经执行完毕了。
[root@dr1 data]# mysqlbinlog mysql-bin.000004
mysqlbinlog是一个专门用于查看二进制日志文件的命令
这里选择对177—300这段日志做备份放置在/tmp目录下命名为004.sql,用于做二进制日志回复
[root@dr1 data]# mysqlbinlog --start-position=177 --stop-position=300 /mysql/data/mysql-bin.000004 > /tmp/004.sql
参数说明:--start-position 用于定义从哪个位置开始恢复
--stop-position 用于定义恢复至哪个位置
4、在用备份恢复之前,我们暂时要关闭二进制日志记录,因为我们不需要记录我们备份恢复的过程.
mysql> show global variables like '%log%';
mysql> set global sql_log_bin=off;
mysql> set sql_log_bin=off;
sql_log_bin 这个参数on就表示记录二进制日志off即是不记录二进制日志
5、备份恢复
1)先恢复完整的日志
[root@dr1 data]# mysql < /tmp/global.sql
[root@dr1 data]# mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| jiaowu |
| mysql |
| performance_schema |
| test |
+--------------------+
查看恢复的结果,可以看到scores表已经恢复了,并且表中的没有我们插入的那行数据,这说明我们的完成备份恢复是成功的。
mysql> use jiaowu;
Database changed
mysql> show tables;
+------------------+
| Tables_in_jiaowu |
+------------------+
| courses |
| scores |
| students |
| tutors |
+------------------+
mysql> select * from scores;
+----+-----+-----+-------+
| ID | SID | CID | Score |
+----+-----+-----+-------+
| 1 | 2 | 2 | 67 |
| 2 | 2 | 3 | 71 |
| 3 | 1 | 2 | 90 |
| 4 | 1 | 7 | 45 |
| 5 | 3 | 6 | 32 |
| 6 | 3 | 1 | 99 |
| 7 | 4 | 8 | 95 |
| 8 | 4 | 10 | 36 |
+----+-----+-----+-------+
2)恢复二进制日志,将那段二进制日志导入到我们的数据库。
[root@dr1 data]# mysql < /tmp/004.sql
查看scores表中我们之前插入的那条数据恢复了
[root@dr1 data]# mysql
mysql> use jiaowu;
Database changed
mysql> select * from scores;
+----+-----+-----+-------+
| ID | SID | CID | Score |
+----+-----+-----+-------+
| 1 | 2 | 2 | 67 |
| 2 | 2 | 3 | 71 |
| 3 | 1 | 2 | 90 |
| 4 | 1 | 7 | 45 |
| 5 | 3 | 6 | 32 |
| 6 | 3 | 1 | 99 |
| 7 | 4 | 8 | 95 |
| 8 | 4 | 10 | 36 |
| 11 | 11 | 11 | 11 |
+----+-----+-----+-------+
mysql> \q
补充说明:二进制日志文件也可以通过定义时间点,定义恢复至什么状态。
mysqlbinlog --start-datetime='2012-11-30 20:54:39' --stop-datetime='2012-11-30 20:55:41 ' /mysql/data/mysql-bin.000004 > /tmp/004.sql
--start-datetime 定义从哪一时刻开始恢复
--start-datetime 定义恢复至哪一时刻