MySQL重新学之binlog
Posted snower1995
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL重新学之binlog相关的知识,希望对你有一定的参考价值。
测试的大版本号为5.7,小版本为5.7.24,默认是没有开启binlog的
修改 my.ini
,新增两个配置:
# 开启bin log
server-id=1
log-bin=mysql-bin
测试的表和数据:
create table T(ID int primary key, c int);
update T set c=c+1 where ID=2;
重启MySQL,发现多了两个 mysql-bin.
打头的文件,使用MySQL命令查询:
mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------------------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------------------------------------+
| log_bin | ON |
| log_bin_basename | D:Programhecgmysql-5.7.24-winx64datamysql-bin |
| log_bin_index | D:Programhecgmysql-5.7.24-winx64datamysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-----------------------------------------------------------+
6 rows in set, 1 warning (0.00 sec)
使用
show binary log;
查看二进制文件信息:mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 421 | +------------------+-----------+ 1 row in set (0.00 sec)
使用
show master status;
查看当前正在写入的binlog文件:mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
使用
show binlog events;
查看binlog记录的事件:mysql> show binlog events; +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | mysql-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.24-log, Binlog ver: 4 | | mysql-bin.000001 | 123 | Previous_gtids | 1 | 154 | | | mysql-bin.000001 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | | mysql-bin.000001 | 219 | Query | 1 | 291 | BEGIN | | mysql-bin.000001 | 291 | Table_map | 1 | 336 | table_id: 108 (test.t) | | mysql-bin.000001 | 336 | Update_rows | 1 | 390 | table_id: 108 flags: STMT_END_F | | mysql-bin.000001 | 390 | Xid | 1 | 421 | COMMIT /* xid=36 */ | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ 7 rows in set (0.00 sec)
有一点需要注意的时候,
show master status;
里面的Position
刚好是最后一个Event的End_log_pos
。如果有多个binlog,查看事件可以指定binlog名称:
mysql> show binlog events in 'mysql-bin.000001'; +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | mysql-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.24-log, Binlog ver: 4 | | mysql-bin.000001 | 123 | Previous_gtids | 1 | 154 | | | mysql-bin.000001 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | | mysql-bin.000001 | 219 | Query | 1 | 291 | BEGIN | | mysql-bin.000001 | 291 | Table_map | 1 | 336 | table_id: 108 (test.t) | | mysql-bin.000001 | 336 | Update_rows | 1 | 390 | table_id: 108 flags: STMT_END_F | | mysql-bin.000001 | 390 | Xid | 1 | 421 | COMMIT /* xid=36 */ | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ 7 rows in set (0.00 sec)
使用
flush logs;
产生一个新编号的binlog文件:一般是在备份工作完成之后,产生一个新的binlog记录后续的增量记录mysql> flush logs; Query OK, 0 rows affected (0.01 sec) mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 468 | | mysql-bin.000002 | 154 | +------------------+-----------+ 2 rows in set (0.00 sec) ## 重新查看之前binlog文件的Event,发现多了一行记录 mysql> show binlog events in 'mysql-bin.000001'; +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ ... | mysql-bin.000001 | 421 | Rotate | 1 | 468 | mysql-bin.000002;pos=4 | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ 8 rows in set (0.00 sec) ## 重新查看当前的binlog是哪个 mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) ### 查看最新binlog中的记录 mysql> show binlog events in 'mysql-bin.000002'; +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | mysql-bin.000002 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.24-log, Binlog ver: 4 | | mysql-bin.000002 | 123 | Previous_gtids | 1 | 154 | | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ 2 rows in set (0.00 sec)
使用
reset master;
清空所有的binlog日志:mysql> reset master; Query OK, 0 rows affected (0.02 sec) ## 重新查看,还原成了初始状态 mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) ## 找不到之前的binlog了 mysql> show binlog events in 'mysql-bin.000002'; ERROR 1220 (HY000): Error when executing command SHOW BINLOG EVENTS: Could not find target log ## binlog中的数据也变成了初始化的数据 mysql> show binlog events in 'mysql-bin.000001'; +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | mysql-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.24-log, Binlog ver: 4 | | mysql-bin.000001 | 123 | Previous_gtids | 1 | 154 | | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ 2 rows in set (0.00 sec)
执行两遍更新语句,查看binlog事件:
update T set c=c+1 where ID=2; mysql> show binlog events in 'mysql-bin.000002'; +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | mysql-bin.000002 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.24-log, Binlog ver: 4 | | mysql-bin.000002 | 123 | Previous_gtids | 1 | 154 | | | mysql-bin.000002 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | | mysql-bin.000002 | 219 | Query | 1 | 291 | BEGIN | | mysql-bin.000002 | 291 | Table_map | 1 | 336 | table_id: 108 (test.t) | | mysql-bin.000002 | 336 | Update_rows | 1 | 390 | table_id: 108 flags: STMT_END_F | | mysql-bin.000002 | 390 | Xid | 1 | 421 | COMMIT /* xid=62 */ | | mysql-bin.000002 | 421 | Anonymous_Gtid | 1 | 486 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | | mysql-bin.000002 | 486 | Query | 1 | 558 | BEGIN | | mysql-bin.000002 | 558 | Table_map | 1 | 603 | table_id: 108 (test.t) | | mysql-bin.000002 | 603 | Update_rows | 1 | 657 | table_id: 108 flags: STMT_END_F | | mysql-bin.000002 | 657 | Xid | 1 | 688 | COMMIT /* xid=69 */ | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ 12 rows in set (0.00 sec)
指定位置查询Event:
mysql> show binlog events in 'mysql-bin.000002' from 154; +------------------+-----+----------------+-----------+-------------+--------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+--------------------------------------+ | mysql-bin.000002 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | | mysql-bin.000002 | 219 | Query | 1 | 291 | BEGIN | | mysql-bin.000002 | 291 | Table_map | 1 | 336 | table_id: 108 (test.t) | | mysql-bin.000002 | 336 | Update_rows | 1 | 390 | table_id: 108 flags: STMT_END_F | | mysql-bin.000002 | 390 | Xid | 1 | 421 | COMMIT /* xid=62 */ | | mysql-bin.000002 | 421 | Anonymous_Gtid | 1 | 486 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | | mysql-bin.000002 | 486 | Query | 1 | 558 | BEGIN | | mysql-bin.000002 | 558 | Table_map | 1 | 603 | table_id: 108 (test.t) | | mysql-bin.000002 | 603 | Update_rows | 1 | 657 | table_id: 108 flags: STMT_END_F | | mysql-bin.000002 | 657 | Xid | 1 | 688 | COMMIT /* xid=69 */ | +------------------+-----+----------------+-----------+-------------+--------------------------------------+ 10 rows in set (0.00 sec)
指定位置查询,偏移2条,查询4条数据:
mysql> show binlog events in 'mysql-bin.000002' from 154 limit 2,4; +------------------+-----+----------------+-----------+-------------+--------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+--------------------------------------+ | mysql-bin.000002 | 291 | Table_map | 1 | 336 | table_id: 108 (test.t) | | mysql-bin.000002 | 336 | Update_rows | 1 | 390 | table_id: 108 flags: STMT_END_F | | mysql-bin.000002 | 390 | Xid | 1 | 421 | COMMIT /* xid=62 */ | | mysql-bin.000002 | 421 | Anonymous_Gtid | 1 | 486 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | +------------------+-----+----------------+-----------+-------------+--------------------------------------+ 4 rows in set (0.00 sec)
以上是关于MySQL重新学之binlog的主要内容,如果未能解决你的问题,请参考以下文章
连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段