[root@hcloud ~]# mysqlbinlog --start-datetime="2016-08-09 5:05:27" /var/lib/mysql/mysql-bin.000001 --stop-datetime从二进制日志中读取指定小于时间戳或者等于本地计算机的时间 取值和上述一样
[root@hcloud ~]# mysqlbinlog --start-position="2698" /var/lib/mysql/mysql-bin.000001 --stop-position从二进制日志中读取指定position 事件位置作为事件截至。取值:="2698"
mysql> show binary logs;+------------------+-----------+| Log_name | File_size |+------------------+-----------+| mysql-bin.000001 | 106 |+------------------+-----------+1 row in set (0.00 sec)
3) 先创建一些原始数据。
mysql> create database Test_DB;Query OK, 1 row affected (0.00 sec)mysql> use Test_DB;Database changedmysql> CREATE TABLE OneTb(id INT(10) NOT NULL,name varchar(20),age INT(10));Query OK, 0 rows affected (0.00 sec)mysql> insert into OneTb values (1,"user1",18);mysql> insert into OneTb values (2,"user2",19);insert into OneTb values (3,"user3",20);检查下数据:
mysql> select * from OneTb;+----+-------+------+| id | name | age |+----+-------+------+| 1 | user1 | 18 || 2 | user2 | 19 || 3 | user3 | 20 |+----+-------+------+3 rows in set (0.00 sec)4) 备份还原 (完整备份以及还原)
[root@hcloud ~]# mysqldump -uroot -p Test_DB > /data/mysqlbackup/Test_DB_0809-16:50.sqlEnter password:模拟下操作失误,将数据修改错误了。
mysql> update OneTb set age = 15;Query OK, 3 rows affected (0.00 sec)Rows matched: 3 Changed: 3 Warnings: 0mysql> select * from OneTb;+----+-------+------+| id | name | age |+----+-------+------+| 1 | user1 | 15 || 2 | user2 | 15 || 3 | user3 | 15 |+----+-------+------+3 rows in set (0.00 sec)现在我们使用传统的方式来进行恢复还原。
[root@hcloud ~]# mysql -uroot -p Test_DB < /data/mysqlbackup/Test_DB_0809-16:50.sql再次查询一下:
mysql> select * from Test_DB.OneTb;+----+-------+------+| id | name | age |+----+-------+------+| 1 | user1 | 18 || 2 | user2 | 19 || 3 | user3 | 20 |+----+-------+------+3 rows in set (0.00 sec)可以看到数据都已经还原回来。
mysql> insert into Test_DB.OneTb values(4,"user4",21),(5,"user5",22),(6,"user6",23);Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0mysql> select * from Test_DB.OneTb;+----+-------+------+| id | name | age |+----+-------+------+| 1 | user1 | 18 || 2 | user2 | 19 || 3 | user3 | 20 || 4 | user4 | 21 || 5 | user5 | 22 || 6 | user6 | 23 |+----+-------+------+6 rows in set (0.00 sec)如果这个时候我们把数据不小心修改了或者把库删除掉了,导致数据全部丢失,这个时候如果再用之前最新的备份文件 Test_DB_0809-16:50.sql,去恢复数据的话,那么将会丢掉备份之后新插入的数据。
mysql> update Test_DB.OneTb set name="user10";Query OK, 6 rows affected (0.00 sec)Rows matched: 6 Changed: 6 Warnings: 0不行,上一步不够狠,这里再狠一点,把表都给删除
mysql> drop table Test_DB.OneTb;ERROR 2006 (HY000): MySQL server has gone awayNo connection. Trying to reconnect...Connection id: 3Current database: *** NONE ***Query OK, 0 rows affected (0.00 sec)由于之前我们一开始开启了binlog 日志选项,用binlog恢复数据库。下面从binlog入手,先检查一下binlog 文件,目前我的mysql 服务自开启binlog 后重启了两次,所以有2个binlog文件(每重启一次,便会重新生成一个binlog文件,还有一种情况就是运行了FLUSH LOGS命令也会重建一个);
注意:在实际生产环境中,如果遇到需要恢复数据库的情况,不要让用户能访问到数据库,以避免新的数据插入进来,以及在主从的环境下,关闭主从。
使用mysqlbinlog 命令可以查看binlog文件.我们看下最新的文件mysql-bin.00002
从最后可以看出有删除的操作。但是我们不能完全的恢复,因为最后还有删除的操作。
现在我的思路就是,先将第一个binlog 和第二个binlog 文件导出来à利用指定的position位置的方式(过滤掉删除表操作和update Test_DB.OneTb set name="user10";这条语句 ),导出2个sql 语句,最后我们将2个sql 合成一个sql,导入到数据库中即可。
我们先用mysqlbinlog命令找到update 那条语句的位置,然后指定position 将mysql-bin.00001 导出来。
[root@hcloud ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000001….#160809 5:09:28 server id 1 end_log_pos 2698 Query thread_id=17 exec_time=0 error_code=0SET TIMESTAMP=1470733768/*!*/;SET @@session.foreign_key_checks=1, @@session.unique_checks=1/*!*/;SET @@session.sql_mode=0/*!*/;/*!C latin1 *//*!*/;SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;insert into Test_DB.OneTb values(4,"user4",21),(5,"user5",22),(6,"user6",23)/*!*/;# at 2698#160809 5:19:49 server id 1 end_log_pos 2795 Query thread_id=17 exec_time=0 error_code=0SET TIMESTAMP=1470734389/*!*/;update Test_DB.OneTb set name="user10"/*!*/;# at 2795#160809 5:30:38 server id 1 end_log_pos 2814 StopDELIMITER ;# End of log fileROLLBACK /* added by mysqlbinlog */;/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;从上面可以看到我们在做插入正常数据后的position 是2698,那么使用下面的命令导出sql
[root@hcloud ~]# mysqlbinlog --stop-position="2698" /var/lib/mysql/mysql-bin.000001 > Backup_1.sql然后导出mysql-bin.00002的sql 语句(注:由于演示操作,该文件只有一个drop 表操作,所以不做处理,但是在实际环境中,由于中途可能会有重启数据库操作,那时就需要检测最新的binlog有没有业务需要的语句。)
mysql> DROP DATABASE Test_DB;Query OK, 0 rows affected (0.03 sec)恢复数据库时还可以利用在登陆mysql 后,用source 命令导入sql语句,这里暂不介绍
[root@hcloud ~]# mysql -uroot -p < Backup_1.sqlEnter password:
mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || Test_DB || mysql |+--------------------+3 rows in set (0.00 sec)mysql> select * from Test_DB.OneTb;+----+-------+------+| id | name | age |+----+-------+------+| 1 | user1 | 18 || 2 | user2 | 19 || 3 | user3 | 20 || 4 | user4 | 21 || 5 | user5 | 22 || 6 | user6 | 23 |+----+-------+------+6 rows in set (0.00 sec)Ok完整的都恢复过来了。