MySQL 的二进制日志(binary logs)用于记录数据库的更改操作,包括插入、更新和删除操作等。这些日志可以用于恢复数据库到特定的时间点或进行复制(replication)等操作。

在某些情况下,你可以将二进制日志复制到其他服务器上进行恢复或分析。

二进制日志文件通常位于 MySQL 数据目录下,文件名类似于 mysql-bin.000001,其中包含了递增的编号。

1、显示 MySQL 服务器上二进制日志文件的列表

mysql> SHOW BINARY LOGS;

+———————-+———-+
| Log_name | File_size |
+————————–+————+
| mysqld-bin.000001 | 15740 |
| mysqld-bin.000002 | 3319 |

如果没有开启此功能,则会显示:

mysql> SHOW BINARY LOGS;

ERROR 1381 (HY000): You are not using binary logging

二进制日志文件默认会存放在 /var/lib/mysql 目录下

$ ls -l /var/lib/mysql/
-rw-rw—-. 1 mysql mysql 15740 Aug 28 14:57 mysqld-bin.000001
-rw-rw—-. 1 mysql mysql 3319 Aug 28 14:57 mysqld-bin.000002

2、使用mysqlbinlog

$ mysqlbinlog mysqld-bin.000001

#mysqlbinlog默认会显示为以下内容:

/*!40019 SET @@session.max_insert_delayed_threads=0*/;/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/;# at 4#170726 14:57:37 server id 1 end_log_pos 106 Start: binlog v 4, server v 5.1.73-log created 170726 14:57:37 at startup# Warning: this binlog is either in use or was not closed properly.

ROLLBACK/*!*/;

BINLOG ‘ IeZ4WQ8BAAAAZgAAAGoAAAABAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAh5nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC ‘/*!*/;

# at 106

#170726 14:59:31 server id 1 end_log_pos 182 Query thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1501095571/*!*/;

SET @@session.pseudo_thread_id=2/*!*/;

SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;

SET @@session.sql_mode=0/*!*/;

SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;

/*!\C latin1 *//*!*/;

SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;

..

..

..

# at 14191

#170726 15:20:38 server id 1 end_log_pos 14311 Query thread_id=4 exec_time=0 error_code=0SET TIMESTAMP=1501096838/*!*/;

insert into salary(name,dept) values(‘Ritu’, ‘Accounting’)/*!*/;

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*

日志文件如果除了创建表和删除表的sql外,操作数据库的语句都加密了。

那么使用参数”–base64-output=decode-row -v”查看具体的sql语句,如下命令

$ mysqlbinlog –base64-output=decode-row -v /var/lib/mysql/mysql-bin.000001

数据回滚步骤

1、备份当前数据库

2、确定还原点时间

每个二进制日志文件都有一个唯一的日志位置。

1、使用mysqlbinlog读取binlog日志:

$ /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/var/mysql-bin.000063

2、登录服务器,并查看(推荐此种方法)

mysql> show binlog events [IN ‘log_name’] [FROM pos] [LIMIT [offset,] row_count];

参数解释:

  • IN ‘log_name’ :指定要查询的binlog文件名(不指定就是第一个binlog文件)
  • FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
  • LIMIT [offset,] :偏移量(不指定就是0)
  • row_count :查询总条数(不指定就是所有行)

mysql> show binlog events in ‘mysql-bin.000063’\G;

3、使用 mysqlbinlog 分析日志,并抽取出.sql文件

mysqlbinlog –database=db_name –start-position=<position> mysql-bin.000001 > restore.sql

4、过滤数据表

使用 grep 命令可以把某表的二进制日志过滤出来

grep -B3 -w test_borough /usr/local/mysql/var/restore.sql > /usr/local/mysql/var/tb_borough .sql

5、还原数据库

mysql -u username -p < restore.sql

 

还原数据库:

mysqlbinlog mysql-bin.000001 | mysql -u username -p

分析日志:

mysqlbinlog mysql-bin.000001 > log.txt

 

作者 admin

百度广告效果展示