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)
mysql连接工具按事件查看⽇志内容,这样查看⽐较清晰
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控制,可以把时间戳位置点都能到。恢复步骤略
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论