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控制,可以把时间戳位置点都能找到。
恢复步骤略