mysqlbinlog工具的使用

mysql的binlog用来记录数据库的增删改以及DDL操作,主要用来做数据增量恢复和数据库的主从复制。要想获得binlog日志,首先要开启日志记录。

一、binlog基本信息

1、开启日志

[mysqld]
log-bin = master-log
在命令窗口查看是否开启binlog

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

2、mysql binlog的三种工作模式

(1)ROW:基于行的复制
日志中会记录每一行数据被修改的形式

(2)Statement:基于sql语句的复制
每一条会修改数据的sql都会记录到master的bin-log中

(3)MIXED:混合模式复制,
在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志格式,也就是在Statement和Row之间选择一种

查看数据库当前模式

ariaDB [hse_whj]> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.00 sec)

3、查看数据库当前日志情况

MariaDB [hse_whj]> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-log.000043 |      899 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [hse_whj]> show master logs;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| master-log.000001 |       352 |
| master-log.000002 |       352 |
| master-log.000003 |       683 |
| master-log.000004 |       366 |
+-------------------+-----------+
43 rows in set (0.00 sec)

按事件查看日志内容,这样查看比较清晰

MariaDB [hse_whj]> show binlog events in 'master-log.000001'\G
*************************** 1. row ***************************
   Log_name: master-log.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 7
End_log_pos: 256
       Info: Server ver: 10.2.14-MariaDB-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: master-log.000001
        Pos: 256
 Event_type: Gtid_list
  Server_id: 7
End_log_pos: 285
       Info: []
*************************** 3. row ***************************
   Log_name: master-log.000001
        Pos: 285
 Event_type: Binlog_checkpoint
  Server_id: 7
End_log_pos: 329
       Info: master-log.000001
3 rows in set (0.01 sec)

MariaDB [hse_whj]> 

常用命令还有:

查询最早的binlog日志:show binlog events\G; 
指定查询 mysql-bin.000001 这个文件,从pos点:32开始查起:show binlog events in 'mysql-bin.000001' from 32\G;
指定查询 mysql-bin.000001 这个文件,从pos点:32开始查起,查询10条:show binlog events in 'mysql-bin.000001' from 32 limit 10\G;
指定查询 mysql-bin.000001 这个文件,从pos点:32开始查起,偏移2行,查询10条show binlog events in 'mysql-bin.000001' from 32 limit 2,10\G;

4、刷新日志,产生一个新的日志文件,一般全量备份开始时都会刷新日志

MariaDB [hse_whj]> flush logs;
Query OK, 0 rows affected (0.02 sec)

5、重置日志,删除所有日志

MariaDB [hse_whj]> reset master;
Query OK, 0 rows affected (0.01 sec)

MariaDB [hse_whj]> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-log.000001 |      329 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

 

二、binlog解析

binlog格式是二进制日志,mysql使用mysqlbinlog工具解析。

语法格式:mysqlbinlog mysql-bin.000001 | mysql -uroot -p 数据库名

mysqlbinlog 常用参数:

(1)-d 指定特定数据库的binlog

(2)-r    相当于重定向到指定文件,与>、<作用相同

(3)--start-position--stop-position    按照指定位置解析binlog日志(精确),如不接--stop-positiion则一直到binlog日志结尾

(4)--start-datetime--stop-datetime    按照指定时间解析binlog日志(模糊,不准确),如不接--stop-datetime则一直到binlog日志结尾

1、在还原全量备份后,直接还原binlog日志

[root@centos007 /]# mysqlbinlog --start-position=4 --stop-position=775 -D /var/lib/mysql/master-log.000043 -d hse_whj | mysql -uroot -p
Enter password: 
[root@centos007 /]# 

参数解释:

(1)-D --disable-log-bin,禁止恢复过程产生日志。指定-D时使用mysqlbinlog解析binlog时,会看到sql_log_bin=0。也可以再把binlog解析到普通SQL文件,在mysql命令行下执行SQL文件前,手工设定set sql_log_bin=0,执行恢复SQL的过程就不会产生日志,恢复后再恢复set sql_log_bin=1。sql_log_bin 是一个动态变量,修改该变量时,可以只对当前会话生效(Session)。

2、在还原全量备份后,先解析binlog日志到普通SQL文件,在执行SQL文件还原数据

[root@centos007 backup_whj]# mysqlbinlog --start-position=4 --stop-position=610 /var/lib/mysql/master-log.000042 | mysql -uroot -p > master-log.sql
Enter password: 
[root@centos007 backup_whj]#

然后可以编辑SQL文件,留下想要恢复的内容,直接在mysql提示符下执行SQL文件

MariaDB [hse_whj]> source ./backup_whj/aa.sql

(3)单表恢复

mysqlbinlog解析后能或得库级的binlog,如果只需要单表恢复,就需要在把binlog转储为普通SQL文件后,利用Linux的grep命令来提取单表的binlog

[root@centos007 /]# mysqlbinlog /var/lib/mysql/master-log.000001 -d hse_whj > ./backup_whj/hse_whj_log.sql
[root@centos007 backup_whj]# grep -B3 -w whj_a hse_whj_log.sql |grep -v  '^--$' > whj_a.sql

参数解释:

-B --before-context=NUM 打印匹配本身以及前面的几个行由NUM控制,可以把时间戳位置点都能找到。

恢复步骤略

你可能感兴趣的:(MariaDB)