二进制日志(binary log)介绍与调整

1、二进制日志(binary log)介绍

  二进制日志(binary log):记录数据库里的数据被修改。

  (insert,update,delete,create,drop,alter)的相关语句;

  作用:增量数据恢复和主从复制;

2、二进制日志(binary log)调整

[root@db01-51 ~]# mysql -S /data/3306/mysql.sock -e "show variables like '%log_bin%';"
+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |记录binlog开关
| log_bin_basename                | /data/3306/oldboy-bin       |
| log_bin_index                   | /data/3306/oldboy-bin.index |binlog文件
| log_bin_trust_function_creators | OFF                         |
| log_bin_use_v1_row_events       | OFF                         |
| sql_log_bin                     | ON                          |临时不记录binlog开关(增量恢复)某个时间点某些语句不记录binlog
+---------------------------------+-----------------------------+

临时不记录binlog(增量恢复)做主从同步的时候关闭会出现错误

mysql> set session sql_log_bin = OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |
| log_bin_basename                | /data/3306/oldboy-bin       |
| log_bin_index                   | /data/3306/oldboy-bin.index |
| log_bin_trust_function_creators | OFF                         |
| log_bin_use_v1_row_events       | OFF                         |
| sql_log_bin                     | OFF                         |
+---------------------------------+-----------------------------+
6 rows in set (0.00 sec)

 binlog文件切割的条件:

  a.数据库重启自动切割binlog为新文件。

  b.执行mysqldump -Fmysqladmin flush-logs切割binlog为新文件。

  c.binlog文件达到1.1G,自动切割binlog为新文件。

  d.人为配置切割及调整

删除binlog日志文件方法:

  1.设置参数自动删除

[root@db01-51 ~]# grep expire_logs_days /data/3306/my.cnf 
expire_logs_days = 7
[root@db01-51 ~]# mysql -S /data/3307/mysql.sock -e "show variables like 'expire_logs_days%';"
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 7 |
+------------------+-------+

  2.从头删除到指定的文件位置

[root@db01-51 ~]# mysql -S /data/3307/mysql.sock -e "purge binary logs to 'xusx-bin.000002';"
[root@db01-51 ~]# ll /data/3307/data/
drwx------ 2 mysql mysql      4096 Mar 19 08:11 xusx
-rw-rw---- 1 mysql mysql    654021 Mar 20 18:17 xusx-bin.000002  ##--->01删到02
-rw-rw---- 1 mysql mysql        32 Mar 20 23:44 xusx-bin.index

  3.删除指定的时间

mysql> PURGE MASTER LOGS BEFORE '2017-03-20 00:00:00';

  4.删除所有,重置

mysql> reset master;
Query OK, 0 rows affected (0.03 sec)

MySQL binlog三种模式

二进制日志log-bin作用:

  1、以二进制形式记录更改数据库的SQL语句(insert,update,delete,create,drop,alter等)。

  2、用于MySQL主从复制。

  3、增量数据备份及恢复

Row Level:

  日志中会记录成每一行数据被修改的情况,然后在slave端再对相同的数据进行修改。

  优点:在row level模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录哪一条记录被修改了,修改成什么样。所以row level的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解,而且不会出现某些特定情况下的存储过程或function,以及trigger的调用和触发无法被正确复制问题。

Statement Level(默认语句模式)

  每一条被修改数据的sql都会记录到master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。

  优点:statement level下的优点首先就是解决了row level下的缺点,不需要记录每一行数据的变化,减少bin-log日志量,节约磁盘IO,提高性能。因为他只需要记录在Master上所有执行的语句的细节,以及执行语句时候的上下文的信息。

Mixed:

  实际上就是前两种模式的结合。在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。新版本中的Statment level还是和以前一样,仅仅记录执行的语句。新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row level来记录像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。

总结:

Statement level (默认语句模式)按照执行的SQL语句记录

  不需要记录每行数据的变化,减少bin-log日志量,节约磁盘IO,提高性能

  缺点:主从复制特殊功能会导致无法正常复制。存储过程、触发器、函数。

Row Level

  按行记录日志,细致,主从复制容易保持一致

  缺点:数据量大

mixed:智能模式

  数据量大选择Statement Level,特殊可能引起数据不一致就选行模式

  企业场景如何选择binlog的模式

1、互联网公司、使用MySQL的功能相对少(存储过程、触发器、函数)

  选择默认的语句模式,Statement Level(默认)

2、公司如果用到使用MySQL的特殊功能(存储过程、触发器、函数)

  选择Mixed模式

3、公司如果用到使用MySQL的特殊功能(存储过程、触发器、函数),又希望数据最大化,此时最好Row level模式 

mysql> show variables like '%binlog_format%';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)

mysql> set global binlog_format = 'ROW';
Query OK, 0 rows affected (0.00 sec)


[root@db01-51 ~]# grep binlog_format /data/3306/my.cnf
binlog_format = 'ROW'

mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)

修改3306中的数据

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
+----+------+
2 rows in set (0.00 sec)

mysql> update test set name='kk';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | kk   |
|  2 | kk   |
+----+------+
2 rows in set (0.00 sec)

查看binlog日志文件

[root@mysql-db03 ~]# mysqlbinlog --help|grep rows
'decode-rows' decodes row events into commented

[root@db01-51 3306]# mysqlbinlog --base64-output='decode-rows' -v oldboy-bin.000002
# at 904
#170321  1:17:07 server id 6  end_log_pos 970 CRC32 0xb53c660d 	Update_rows: table id 70 flags: STMT_END_F
### UPDATE `xusx`.`test`
### WHERE
###   @1=1
###   @2='a'
### SET
###   @1=1
###   @2='kk'
### UPDATE `xusx`.`test`
### WHERE
###   @1=2
###   @2='b'
### SET
###   @1=2
###   @2='kk'
# at 970

 

posted @ 2017-03-21 00:23  reborn枪  阅读(3828)  评论(0编辑  收藏  举报