二进制日志简单介绍 html
MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引发数据变动的MySQL语句。二进制日志(binary log)中记录了对MySQL数据库执行更改的全部操做,而且记录了语句发生时间、执行时长、操做数据等其它额外信息,可是它不记录SELECT、SHOW等那些不修改数据的SQL语句。二进制日志(binary log)主要用于数据库恢复和主从复制,以及审计(audit)操做。 mysql
官方文档关于二进制日志(binary log)的介绍以下: 算法
The binary log contains “events” that describe database changes such as table creation operations or changes to table data. It also contains events for statements that potentially could have made changes (for example, a DELETE which matched no rows), unless row-based logging is used. The binary log also contains information about how long each statement took that updated data. The binary log has two important purposes: sql
· For replication, the binary log on a master replication server provides a record of the data changes to be sent to slave servers. The master server sends the events contained in its binary log to its slaves, which execute those events to make the same data changes that were made on the master. See Section 17.2, “Replication Implementation”. 数据库
· Certain data recovery operations require use of the binary log. After a backup has been restored, the events in the binary log that were recorded after the backup was made are re-executed. These events bring databases up to date from the point of the backup. See Section 7.5, “Point-in-Time (Incremental) Recovery Using the Binary Log”. api
The binary log is not used for statements such as SELECT or SHOW that do not modify data. To log all statements (for example, to identify a problem query), use the general query log. See Section 5.4.3, “The General Query Log”. 缓存
Running a server with binary logging enabled makes performance slightly slower. However, the benefits of the binary log in enabling you to set up replication and for restore operations generally outweigh this minor performance decrement. 服务器
二进制日志状态查看 session
系统变量log_bin的值为OFF表示没有开启二进制日志(binary log)。ON表示开启了二进制日志(binary log)并发
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
查看当前服务器全部的二进制日志文件
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000004 | 478421400 |
| mysql-bin.000005 | 9653 |
| mysql-bin.000006 | 340631484 |
+------------------+-----------+
3 rows in set (0.00 sec)
固然你还可使用下面命令查看
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000004 | 478421400 |
| mysql-bin.000005 | 9653 |
| mysql-bin.000006 | 340631484 |
+------------------+-----------+
3 rows in set (0.00 sec)
mysql>
查看当前二进制日志文件状态
mysql> show master status;
+------------------+-----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000006 | 373655406 | | | |
+------------------+-----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>
二进制日志开启方法
查看系统变量log_bin,若是其值为OFF,表示没有开启二进制日志(binary log),若是须要开启二进制日志,则必须在my.cnf中[mysqld]下面添加log-bin [=DIR\[filename]] ,DIR参数指定二进制文件的存储路径;filename参数指定二级制文件的文件名。 其中filename能够任意指定,但最好有必定规范。系统变量log_bin是静态参数,不能动态修改的(由于它不是Dynamic Variable)。以下所示:
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set global log_bin=mysql_bin;
ERROR 1238 (HY000): Variable 'log_bin' is a read only variable
mysql>
1:修改my.cnf,在[mysqld]下面增长log_bin=mysql_bin_log,重启MySQL后,你就会发现log_bin变为了ON,二进制日志(binary log)默认放在数据目录下(系统变量datadir下),以下所示:
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql_bin_log |
| log_bin_index | /var/lib/mysql/mysql_bin_log.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+------------------------------------+
6 rows in set (0.00 sec)
mysql>
2:若是在my.cnf里面只设置log_bin,可是不指定file_name,而后重启数据库。你会发现二进制日志文件名称为${hostname}-bin 这样的格式。以下所示:
[mysqld]
log_bin
mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/DB-Server-bin |
| log_bin_index | /var/lib/mysql/DB-Server-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+------------------------------------+
6 rows in set (0.00 sec)
mysql>
3:固然你能够能够指定二进制日志的路径位置,以下所示:
log_bin=/mysql/bin_log/mysql_binlog
二进制日志切换方法
使用命令flush logs切换二进制日志,以下所示:
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000002 | 120 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> flush logs;
Query OK, 0 rows affected (0.03 sec)
mysql> show master status
-> ;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000003 | 120 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>
请注意,每次重启MySQL服务也会生成一个新的二进制日志文件,至关于二进制日志切换。切换二进制日志时,你会看到这些number会不断递增。另外,除了这些二进制日志文件外,你会看到还生成了一个DB-Server-bin.index的文件,这个文件中存储全部二进制日志文件的清单又称为二进制文件的索引。
[root@DB-Server mysql]# ls -lrt DB-Server-bin*
-rw-rw---- 1 mysql mysql 143 Mar 22 10:55 DB-Server-bin.000001
-rw-rw---- 1 mysql mysql 171 Mar 22 11:20 DB-Server-bin.000002
-rw-rw---- 1 mysql mysql 171 Mar 22 11:23 DB-Server-bin.000003
-rw-rw---- 1 mysql mysql 171 Mar 22 11:24 DB-Server-bin.000004
-rw-rw---- 1 mysql mysql 138 Mar 22 11:24 DB-Server-bin.index
-rw-rw---- 1 mysql mysql 120 Mar 22 11:24 DB-Server-bin.000006
-rw-rw---- 1 mysql mysql 171 Mar 22 11:24 DB-Server-bin.000005
[root@DB-Server mysql]# more DB-Server-bin.index
./DB-Server-bin.000001
./DB-Server-bin.000002
./DB-Server-bin.000003
./DB-Server-bin.000004
./DB-Server-bin.000005
./DB-Server-bin.000006
[root@DB-Server mysql]#
二进制日志删除方法
二进制日志的删除能够经过命令手工删除,也能够设置自动清理。下面简单介绍一下,如何删除二进制日志。
1: purge binary logs to xxx; 表示删除某个日志以前的全部二进制日志文件。这个命令会修改index中相关数据
mysql> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| DB-Server-bin.000001 | 143 |
| DB-Server-bin.000002 | 171 |
| DB-Server-bin.000003 | 171 |
| DB-Server-bin.000004 | 171 |
| DB-Server-bin.000005 | 171 |
| DB-Server-bin.000006 | 143 |
| DB-Server-bin.000007 | 143 |
| DB-Server-bin.000008 | 120 |
+----------------------+-----------+
8 rows in set (0.00 sec)
mysql> purge binary logs to 'DB-Server-bin.000002';
Query OK, 0 rows affected (0.02 sec)
mysql> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| DB-Server-bin.000002 | 171 |
| DB-Server-bin.000003 | 171 |
| DB-Server-bin.000004 | 171 |
| DB-Server-bin.000005 | 171 |
| DB-Server-bin.000006 | 143 |
| DB-Server-bin.000007 | 143 |
| DB-Server-bin.000008 | 120 |
+----------------------+-----------+
7 rows in set (0.00 sec)
mysql> purge binary logs to 'DB-Server-bin.000004';
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| DB-Server-bin.000004 | 171 |
| DB-Server-bin.000005 | 171 |
| DB-Server-bin.000006 | 143 |
| DB-Server-bin.000007 | 143 |
| DB-Server-bin.000008 | 120 |
+----------------------+-----------+
5 rows in set (0.00 sec)
mysql>
2: 清除某个时间点之前的二进制日志文件。
mysql> purge binary logs before '2017-03-10 10:10:00';
Query OK, 0 rows affected (0.00 sec)
3: 清除7天前的二进制日志文件
mysql> purge master logs before date_sub( now( ), interval 7 day);
Query OK, 0 rows affected (0.00 sec)
4: 清除全部的二进制日志文件(当前不存在主从复制关系)
mysql> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| DB-Server-bin.000004 | 171 |
| DB-Server-bin.000005 | 171 |
| DB-Server-bin.000006 | 143 |
| DB-Server-bin.000007 | 143 |
| DB-Server-bin.000008 | 143 |
| DB-Server-bin.000010 | 143 |
| DB-Server-bin.000011 | 120 |
+----------------------+-----------+
7 rows in set (0.00 sec)
mysql> reset master;
Query OK, 0 rows affected (0.02 sec)
mysql> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| DB-Server-bin.000010 | 120 |
+----------------------+-----------+
1 row in set (0.00 sec)
mysql>
5:另外,咱们也能够设置expire_logs_days参数,设置自动清理,其默认值为0,表示不启用过时自动删除功能,若是启用了自动清理功能,表示超出此天数的二进制日志文件将被自动删除,自动删除工做一般发生在MySQL启动时或FLUSH日志时。
mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 7 |
+------------------+-------+
1 row in set (0.00 sec)
mysql>
二进制日志相关参数
关于二进制日志(binary log)的一些相关参数,下面一一介绍,若有不足或疏漏之处,敬请指出:
1:系统变量log_bin_basename是MySQL 5.6.2开始引入的。 它表示二进制日志文件名。默认值为datadir + '/' + hostname + '-bin'。 该参数不须要设置,也不能在my.cnf中设置,不然会报错(实验环境为MySQL 5.6.20,若有不对,敬请指出!)。
Holds the name and complete path to the binary log file. Unlike the log_bin system variable, log_bin_basename reflects the name set with the --log-bin server option
mysql> show variables like 'log_bin_basename';
+------------------+------------------------------+
| Variable_name | Value |
+------------------+------------------------------+
| log_bin_basename | /var/lib/mysql/DB-Server-bin |
+------------------+------------------------------+
1 row in set (0.00 sec)
mysql>
2:系统变量log_bin_index是MySQL 5.6.4开始引入的。 它表示二进制日志的索引文件。该参数能够在my.cnf中设置。
mysql> show variables like 'log_bin_index';
+---------------+------------------------------------+
| Variable_name | Value |
+---------------+------------------------------------+
| log_bin_index | /var/lib/mysql/DB-Server-bin.index |
+---------------+------------------------------------+
1 row in set (0.01 sec)
mysql>
3:系统变量log_bin_trust_function_creators,默认为OFF,这个参数开启会限制存储过程、Function、触发器的建立。
mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF |
+---------------------------------+-------+
1 row in set (0.00 sec)
mysql>
4:系统变量sql_log_bin 用于控制会话级别二进制日志功能的开启或关闭,默认为ON,表示启用二进制日志功能。
mysql> show variables like 'sql_log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
5:系统变量expire_logs_days ,前面已经阐述。在此不作介绍。
mysql> show variables like '%binlog%';
+-----------------------------------------+----------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------+
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | MIXED |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_row_image | FULL |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| binlogging_impossible_mode | IGNORE_ERROR |
| innodb_api_enable_binlog | OFF |
| innodb_locks_unsafe_for_binlog | OFF |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| sync_binlog | 0 |
+-----------------------------------------+----------------------+
16 rows in set (0.00 sec)
mysql>
6:系统变量binlog_cache_size 表示为每一个客户端分配binlog_cache_size大小的缓存,默认值32768。二进制日志缓存使用的前提条件是服务器端使用了支持事务的引擎以及开启了bin log功能,它是MySQL用来提升binlog的效率而设计的一个用于短期内临时缓存binlog数据的内存区域。通常来讲,若是咱们的数据库中没有什么大事务,写入也不是特别频繁,2MB~4MB是一个合适的选择。可是若是咱们的数据库大事务较多或多事务语句,写入量比较大,可适当调高binlog_cache_size。同时,咱们能够经过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache因为内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了。
mysql> show variables like 'binlog_cache_size';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| binlog_cache_size | 32768 |
+-------------------+-------+
1 row in set (0.00 sec)
mysql>
mysql> show status like 'binlog%';
+----------------------------+---------+
| Variable_name | Value |
+----------------------------+---------+
| Binlog_cache_disk_use | 37 |
| Binlog_cache_use | 1048300 |
| Binlog_stmt_cache_disk_use | 0 |
| Binlog_stmt_cache_use | 2306 |
+----------------------------+---------+
4 rows in set (0.00 sec)
mysql>
如上所示,能够经过查看Binlog_cache_disk_use 与 Binlog_cache_use来判断binlog_cache_size是否须要调整。
7: 系统变量max_binlog_cache_size 二进制日志可以使用的最大cache内存大小。当执行多语句事务时,max_binlog_cache_size 若是不够大,系统可能会报出“Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes of storage”的错误。
mysql> show variables like 'max_binlog_cache_size';
+-----------------------+----------------------+
| Variable_name | Value |
+-----------------------+----------------------+
| max_binlog_cache_size | 18446744073709547520 |
+-----------------------+----------------------+
1 row in set (0.00 sec)
mysql>
8: 系统变量max_binlog_stmt_cache_size
max_binlog_cache_size针对事务语句,max_binlog_stmt_cache_size针对非事务语句,当咱们发现Binlog_cache_disk_use或者Binlog_stmt_cache_disk_use比较大时就须要考虑增大cache的大小
max_binlog_stmt_cache_size sets the size for the statement cache only; the upper limit for the transaction cache is governed exclusively by the max_binlog_cache_size system variable.
mysql> show variables like 'max_binlog_stmt_cache_size';
+----------------------------+----------------------+
| Variable_name | Value |
+----------------------------+----------------------+
| max_binlog_stmt_cache_size | 18446744073709547520 |
+----------------------------+----------------------+
1 row in set (0.00 sec)
mysql>
9:系统变量max_binlog_size, 表示二进制日志的最大值,通常设置为512M或1GB,但不能超过1GB。该设置并不能严格控制二进制日志的大小,尤为是二进制日志比较靠近为不而又遇到一根比较大事务时, 为了保证事务的完整性,不可能作切换日志的动做,只能将该事务的全部SQL都记录进当前日志,直到事务结束。
mysql> show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name | Value |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.00 sec)
mysql>
10:系统变量binlog_checksum 用做复制的主从校检。 NONE表示不生成checksum,CRC-32表示使用这个算法作校检。
mysql> show variables like 'binlog_checksum';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| binlog_checksum | CRC32 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql>
11:系统变量sync_binlog,这个参数对于Mysql系统来讲是相当重要的,它不只影响到二进制日志文件对MySQL所带来的性能损耗,并且还影响到MySQL中数据的完整性。
sync_binlog=0,当事务提交后,Mysql仅仅是将binlog_cache中的数据写入binlog文件,但不执行fsync之类的磁盘同步指令通知文件系统将缓存刷新到磁盘,而是让Filesystem自行决定何时来作同步。MySQL中默认的设置是 sync_binlog=0,即不做任何强制性的磁盘刷新指令,这个设置性能是最好的,但风险也是最大的。一旦系统崩溃(Crash),在文件系统缓存中的全部二进制日志信息都会丢失。从而带来数据不完整问题。
sync_binlog=n,在进行n次事务提交之后,Mysql将执行一次fsync之类的磁盘同步指令,同时文件系统将Binlog文件缓存刷新到磁盘。
能够适当的调整sync_binlog, 在牺牲必定的一致性下,获取更高的并发和性能。
mysql> show variables like 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 0 |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
12:系统变量binlog_format 指定二进制日志的类型。分别有STATEMENT、ROW、MIXED三种值。MySQL 5.7.6以前默认为STATEMENT模式。MySQL 5.7.7以后默认为ROW模式。这个参数主要影响主从复制。
mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
mysql>
复制的模式有下面几种:
基于SQL语句的复制(statement-based replication, SBR),
基于行的复制(row-based replication, RBR),
混合模式复制(mixed-based replication, MBR)。
相应地,二进制日志的格式也有三种:STATEMENT,ROW,MIXED。这里限于篇幅和主题,不作展开介绍。后面会单独总结介绍。
查看二进制日志内容
方法1:使用show binlog events方式能够获取当前以及指定binlog的日志,不适宜提取大量日志。
SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
方法2: 使用mysqlbinlog命令行查看日志内容(适宜批量提取日志)。
下面咱们来经过实验验证一下,先看看show binlog events方式的测试:
1: 查看第一个binlog文件的内容(show binlog events)
2: 查看某个特定binglog文件的内容。
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000011 | 120 | | | |
+----------------------+----------+--------------+------------------+-------------------+
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test values(21, 'kkk21');
Query OK, 1 row affected (0.02 sec)
mysql> insert into test values(22, 'kkk22');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+-------+
| id | name |
+------+-------+
| 10 | kerry |
| 20 | kern |
| 21 | kkk21 |
| 22 | kkk22 |
+------+-------+
4 rows in set (0.00 sec)
mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(12) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000012 | 552 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> show binlog events in 'DB-Server-bin.000012';
+----------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+----------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------+
| DB-Server-bin.000012 | 4 | Format_desc | 1 | 120 | Server ver: 5.6.20-enterprise-commercial-advanced-log, Binlog ver: 4 |
| DB-Server-bin.000012 | 120 | Query | 1 | 197 | BEGIN |
| DB-Server-bin.000012 | 197 | Query | 1 | 305 | use `gsp`; insert into test values(21, 'kkk21') |
| DB-Server-bin.000012 | 305 | Xid | 1 | 336 | COMMIT /* xid=46 */ |
| DB-Server-bin.000012 | 336 | Query | 1 | 413 | BEGIN |
| DB-Server-bin.000012 | 413 | Query | 1 | 521 | use `gsp`; insert into test values(22, 'kkk22') |
| DB-Server-bin.000012 | 521 | Xid | 1 | 552 | COMMIT /* xid=47 */ |
+----------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------+
7 rows in set (0.00 sec)
mysql>
mysql> show binlog events in 'DB-Server-bin.000012' from 336;
+----------------------+-----+------------+-----------+-------------+-------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+----------------------+-----+------------+-----------+-------------+-------------------------------------------------+
| DB-Server-bin.000012 | 336 | Query | 1 | 413 | BEGIN |
| DB-Server-bin.000012 | 413 | Query | 1 | 521 | use `gsp`; insert into test values(22, 'kkk22') |
| DB-Server-bin.000012 | 521 | Xid | 1 | 552 | COMMIT /* xid=47 */ |
+----------------------+-----+------------+-----------+-------------+-------------------------------------------------+
3 rows in set (0.00 sec)
mysql>
接下来,咱们来看看使用mysqlbinlog命令如何查看二进制日志文件中的的内容
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000012 | 552 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
mysql> use gsp;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into test values(303, 'kerry');
Query OK, 1 row affected (0.01 sec)
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000013 | 337 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> system mysqlbinlog /var/lib/mysql/DB-Server-bin.000013;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#170323 18:43:17 server id 1 end_log_pos 120 CRC32 0xabfd028f Start: binlog v 4, server v 5.6.20-enterprise-commercial-advanced-log created 170323 18:43:17
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
hU/UWA8BAAAAdAAAAHgAAAABAAQANS42LjIwLWVudGVycHJpc2UtY29tbWVyY2lhbC1hZHZhbmNl
ZC1sb2cAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAY8C
/as=
'/*!*/;
# at 120
#170323 18:43:46 server id 1 end_log_pos 197 CRC32 0xc5ff49de Query thread_id=4 exec_time=0 error_code=0
SET TIMESTAMP=1490309026/*!*/;
SET @@session.pseudo_thread_id=4/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 197
#170323 18:43:46 server id 1 end_log_pos 306 CRC32 0x75c26223 Query thread_id=4 exec_time=0 error_code=0
use `gsp`/*!*/;
SET TIMESTAMP=1490309026/*!*/;
insert into test values(303, 'kerry')
/*!*/;
# at 306
#170323 18:43:46 server id 1 end_log_pos 337 CRC32 0x6ea837f4 Xid = 80
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
mysql>
2: 解析DB-Server-bin.000013并将内容输出到test.sql
[root@DB-Server ~]# mysqlbinlog /var/lib/mysql/DB-Server-bin.000013 > test.sql;
[root@DB-Server ~]# more test.sql
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#170323 18:43:17 server id 1 end_log_pos 120 CRC32 0xabfd028f Start: binlog v 4, server v 5.6.20-enterprise-commercial-advanced-log created 170323 18:43:17
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
hU/UWA8BAAAAdAAAAHgAAAABAAQANS42LjIwLWVudGVycHJpc2UtY29tbWVyY2lhbC1hZHZhbmNl
ZC1sb2cAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAY8C
/as=
'/*!*/;
# at 120
#170323 18:43:46 server id 1 end_log_pos 197 CRC32 0xc5ff49de Query thread_id=4 exec_time=0 error_code=0
SET TIMESTAMP=1490309026/*!*/;
SET @@session.pseudo_thread_id=4/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 197
#170323 18:43:46 server id 1 end_log_pos 306 CRC32 0x75c26223 Query thread_id=4 exec_time=0 error_code=0
use `gsp`/*!*/;
SET TIMESTAMP=1490309026/*!*/;
insert into test values(303, 'kerry')
/*!*/;
# at 306
#170323 18:43:46 server id 1 end_log_pos 337 CRC32 0x6ea837f4 Xid = 80
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
mysqlbinlog有许多参数,你能够分析、提取指定position位置的binlog日志;也能够按指定时间恢复数据;也能够导出的脚本文件;或者压缩处理等等,很是灵活强大。在这里不作详细展开,后面将单独的写一篇总结介绍。
开启二进制日志影响性能吗?
开启MySQL的二进制日志会影响服务器性能吗?答案是会有一些性能损耗,可是性能开销很是小(slightly slower),另外,开启binlog带来的好处要远远超过带来的性能开销。官方文档的介绍以下所示:
Running a server with binary logging enabled makes performance slightly slower. However, the benefits of the binary log in enabling you to set up replication and for restore operations generally outweigh this minor performance decrement.
参考资料:
https://dev.mysql.com/doc/refman/5.6/en/binary-log.html
https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_log_bin_basename