Mysql之binlog日志恢复操作记录

MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。

开启binlog日志

[root@xlc ~]# vim /etc/my.cnf
在[mysqld] 区块添加
log-bin=mysql-bin //如果已经存在去掉#号

查询是否支持binlog

如下OFF代表不支持,ON代表支持

    mysql> show variables like 'log_bin';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | log_bin       | ON    |
    +---------------+-------+
    1 row in set (0.00 sec)

查看当前日志文件名称

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000005 |      120 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    #关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。
    mysql> flush logs;
    Query OK, 0 rows affected (0.02 sec)

恢复测试

创建测试表数据
mysql>  select * from t1;
+----+-------+-----+---------+
| id | name  | sex | address |
+----+-------+-----+---------+
|  7 | daiiy | m   | aaa     |
|  8 | tom   | f   | bbb     |
|  9 | liany | m   | ccc     |
| 10 | lilu  | m   | ddd     |
+----+-------+-----+---------+
4 rows in set (0.00 sec)
误删除测试表数据
mysql> delete from t1;
Query OK, 4 rows affected (0.00 sec)

mysql>  select * from t1;
Empty set (0.00 sec)
重新生成log文件
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 |     1609 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
查看指定时间段内的日志数据
[root@iZwz97cbcapiyem3o09u09Z bin]# ./mysqlbinlog --no-defaults --database=test --start-datetime='2017-08-13 23:10:00' --stop-datetime='2017-08-13 23:12:13' ../data/mysql-bin.000005 | more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#170813 23:07:06 server id 1  end_log_pos 120 CRC32 0x02ab0045  Start: binlog v 4, server v 5.6.33-log created 170813 23:07:06
BINLOG '
GmuQWQ8BAAAAdAAAAHgAAAAAAAQANS42LjMzLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAUUA
qwI=
'/*!*/;
# at 120
#170813 23:10:57 server id 1  end_log_pos 199 CRC32 0xb6a73a78  Query   thread_id=486   exec_time=0     error_code=0
SET TIMESTAMP=1502637057/*!*/;
SET @@session.pseudo_thread_id=486/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 199
#170813 23:10:57 server id 1  end_log_pos 287 CRC32 0x0ac79c04  Query   thread_id=486   exec_time=0     error_code=0
use `test`/*!*/;
SET TIMESTAMP=1502637057/*!*/;
delete from t1
/*!*/;
# at 287
#170813 23:10:57 server id 1  end_log_pos 318 CRC32 0xb0b4da63  Xid = 102852
COMMIT/*!*/;
# at 318
#170813 23:11:20 server id 1  end_log_pos 397 CRC32 0xfeca9fb6  Query   thread_id=486   exec_time=0     error_code=0
SET TIMESTAMP=1502637080/*!*/;
BEGIN
/*!*/;
# at 397
# at 429
#170813 23:11:20 server id 1  end_log_pos 429 CRC32 0x6f803988  Intvar
SET INSERT_ID=7/*!*/;
#170813 23:11:20 server id 1  end_log_pos 561 CRC32 0x2208be50  Query   thread_id=486   exec_time=0     error_code=0
SET TIMESTAMP=1502637080/*!*/;
insert into t1 (name,sex,address)values('daiiy','m','aaa')
/*!*/;
# at 561
#170813 23:11:20 server id 1  end_log_pos 592 CRC32 0x74e80a04  Xid = 102853
COMMIT/*!*/;
# at 592
#170813 23:11:20 server id 1  end_log_pos 671 CRC32 0x75baa899  Query   thread_id=486   exec_time=0     error_code=0
SET TIMESTAMP=1502637080/*!*/;
BEGIN
/*!*/;
# at 671
# at 703
#170813 23:11:20 server id 1  end_log_pos 703 CRC32 0x26252021  Intvar
SET INSERT_ID=8/*!*/;
#170813 23:11:20 server id 1  end_log_pos 833 CRC32 0x82810296  Query   thread_id=486   exec_time=0     error_code=0
SET TIMESTAMP=1502637080/*!*/;
insert into t1 (name,sex,address)values('tom','f','bbb')
/*!*/;
# at 833
#170813 23:11:20 server id 1  end_log_pos 864 CRC32 0x8c2790d6  Xid = 102854
COMMIT/*!*/;
# at 864
#170813 23:11:20 server id 1  end_log_pos 943 CRC32 0x1da588b6  Query   thread_id=486   exec_time=0     error_code=0
SET TIMESTAMP=1502637080/*!*/;
BEGIN
/*!*/;
# at 943
# at 975
#170813 23:11:20 server id 1  end_log_pos 975 CRC32 0x71dc1b65  Intvar
SET INSERT_ID=9/*!*/;
#170813 23:11:20 server id 1  end_log_pos 1107 CRC32 0x870f4947         Query   thread_id=486   exec_time=0     error_code=0
SET TIMESTAMP=1502637080/*!*/;
insert into t1 (name,sex,address)values('liany','m','ccc')
/*!*/;
# at 1107
#170813 23:11:20 server id 1  end_log_pos 1138 CRC32 0xba226ed1         Xid = 102855
COMMIT/*!*/;
# at 1138
#170813 23:11:22 server id 1  end_log_pos 1217 CRC32 0x0dec63f4         Query   thread_id=486   exec_time=0     error_code=0
SET TIMESTAMP=1502637082/*!*/;
BEGIN
/*!*/;
# at 1217
# at 1249
#170813 23:11:22 server id 1  end_log_pos 1249 CRC32 0xfc436a97         Intvar
SET INSERT_ID=10/*!*/;
#170813 23:11:22 server id 1  end_log_pos 1380 CRC32 0x6a004a4e         Query   thread_id=486   exec_time=0     error_code=0
SET TIMESTAMP=1502637082/*!*/;
insert into t1 (name,sex,address)values('lilu','m','ddd')
/*!*/;
# at 1380
#170813 23:11:22 server id 1  end_log_pos 1411 CRC32 0x979f2eab         Xid = 102856
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
还原指定时间段数据
[root@iZwz97cbcapiyem3o09u09Z bin]# ./mysqlbinlog --no-defaults --database=test --start-datetime='2017-08-13 23:10:00' --stop-datetime='2017-08-13 23:12:13' ../data/mysql-bin.000005 | /usr/local/mysql/bin/mysql -uroot -p123456 test
Warning: Using a password on the command line interface can be insecure.
查看恢复后数据
mysql> select * from t1;
+----+-------+-----+---------+
| id | name  | sex | address |
+----+-------+-----+---------+
|  7 | daiiy | m   | aaa     |
|  8 | tom   | f   | bbb     |
|  9 | liany | m   | ccc     |
| 10 | lilu  | m   | ddd     |
+----+-------+-----+---------+
4 rows in set (0.00 sec)

mysqlbinlog常见的选项有:
–start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间
–stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地计算机的时间 取值和上述一样
–start-position:从二进制日志中读取指定position 事件位置作为开始。
–stop-position:从二进制日志中读取指定position 事件位置作为事件截至

测试以后发现,如果想恢复delete了的数据,必须要找到这条数居insert的语句才成,例如某张表中不太确认是什么时候插入的数据,但在今天被误删除了,好像没有办法在被删除的指定时间区间来恢复数据,日志回滚只是把在某一时间段执行的语句重新执行了一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值