MySQL binlog是什么
binlog 三种模式
Row Level 模式(RBR)
不记录每条sql语句的上下文信息,只需记录哪条数据被修改,修改了哪些信息。优势:* 准确性强,能准确复制数据的变更* 减少数据库锁的使用劣势:* 会产生大量的日志,导致较大的网络IO和磁盘IO* 要求主从数据库表结构完全一致* 无法在从数据库上单独执行触发器
tatement Level 模式(SBR)
每一条修改数据的 sql 都会记录到 master 的 bin_log 中,slave 在复制的时候 sql 进程会解析成 master 端执行过的相同的 sql 在 slave 库上再次执行。优势:* 不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能* 并不强制要求主从数据库的表结构定义完全相同劣势:* 在某些情况下会导致 master-slave 中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)* 相比于 RBR 模式,在执行复制时需要更多的行锁
MIXED模式(MBR)
Row Level模式和tatement Level 模式的混合使用,一般的复制使用 STATEMENT 模式保存 binlog,对于 STATEMENT 模式无法复制的操作使用 ROW 模式保存 binlog,MySQL会根据执行的 SQL 语句选择日志保存方式。优势:准确性强,文件大小适中。劣势:有可能发生主从不一致问题。
binlog模式的选择
不用存储过程、触发器、函数,选择默认的 Statement level 。用到MySQL的特殊功能(存储过程、触发器、函数)选择Mixed模式。用到MySQL的特殊功能(存储过程、触发器、函数),又希望数据最大化一直则选择Row模式。
binlog 常用参数
管理Binlog相关的SQL命令
| SQL命令 | 命令含义 |
| show master logs; | 查看所有Binlog的日志列表 |
| show master status; | 查看最后一个Binlog日志的编号名称,及最后一个事件结束的位置(pos) |
| flush logs; | 刷新Binlog,此刻开始产生一个新编号的Binlog日志文件. |
| reset master; | 刷清空所有的Binlog日志 |
查看binlog日志命令
show binlog events [IN ‘log_name’] [FROM pos] [LIMIT [offset,] row_cout]
| SQL命令 | 命令含义 |
| show binlog events; | 查看第一个Binlog日志 |
| show binlog events in ‘binlog.000030’; | 查看指定的Binlog日志 |
| show binlog events in ‘binlog.000030’ from 931; | 从指定的位置开始,查看指定的Binlog日志 |
| show binlog events in ‘binlog.000030’ from 931 limit 2; | 从指定的位置开始,查看指定的Binlog日志,限制查询的条数 |
| show binlog events in ‘binlog.000030’ from 931 limit 1,2; | 从指定的位置开始,带有偏移,查看指定的Binlog日志,限制查询的条数 |
Binlog 中的常用的Event_type
QUERY_EVENT:与数据无关的操作,begin、drop table、truncate table等TABLE_MAP_EVENT:记录下一个操作所对应的表信息,存储了数据库名和表名XID_EVNET:标记事物提交WRITE_ROWS_EVENT:插入数据,即insert操作UPDATE_ROWS_EVENT:更新数据,即update操作DELETE_ROWS_EVENT:删除数据,即delete操作
Binlog 常用参数配置
| 参数名 | 含义 |
| log_bin = {on | off | base_name} | 指定是否启用记录二进制日志或者指定一个日志路径。 |
| sql_log_bin ={ on | off } | 指定是否启用记录二进制日志 |
| expire_logs_days | 指定自动删除二进制日志的时间,即日志过期时间 |
| log_bin_index | 指定mysql-bin.index文件的路径 |
| binlog_format = { mixed | row | statement } | 指定二进制日志基于什么模式记录 |
| max_binlog_size | 指定二进制日志文件最大值 |
| binlog_cache_size | 指定事务日志缓存区大小 |
| max_binlog_cache_size | 指定二进制日志缓存最大大小 |
| sync_binlog = { 0 | n } | 指定写缓冲多少次,刷新一次磁盘 |
MySQL binlog日志开启和查看方式
binlog日志开启配置
检查 binlog 功能是否开启,默认关闭。
mysql> show variables like 'log_bin';+---------------+-------+| Variable_name | Value |+---------------+-------+| log_bin | OFF |+---------------+-------+1 row in set (0.00 sec)
开启 binlog 功能
[root@VM_0_15_centos log]# vim /etc/my.cnf#在 [mysqld] 标签下编辑如下内容:# binlog 存放路径log_bin=/var/log/mysql/mysql-bin# 服务Id,保持唯一server_id=1# 修改完配置重启MySQL服务。
重新检查是否开启日志功能
mysql> show variables like 'log_bin';+---------------+-------+| Variable_name | Value |+---------------+-------+| log_bin | ON |+---------------+-------+1 row in set (0.00 sec)
查看 binlog 模式,默认binlog模式是ROW
mysql> show variables like '%binlog_format%';+---------------+-------+| Variable_name | Value |+---------------+-------+| binlog_format | ROW |+---------------+-------+1 row in set (0.00 sec)
修改 binlog 模式
[root@VM_0_15_centos log]# vim /etc/my.cnf[mysqld]binlog_format=mixed
mysql> show variables like '%binlog_format%';+---------------+-------+| Variable_name | Value |+---------------+-------+| binlog_format | MIXED |+---------------+-------+1 row in set (0.00 sec)
删除 binlog 文件方式
reset master# 此命令将会删除所有日志,并让日志文件重新从000001开始。# 将会清空 00000X 之前的所有日志文件PURGE { BINARY | MASTER } LOGS { TO ‘log_name’ | BEFORE datetime_expr }purge master logs to “binlog_name.00000X”# 修改 my.cnf 配置expire_logs_days = 3 #保留最近3天的binlog;默认值是0,表示不自动删除.
登录mysql方式查看binlog
只查看第一个binlog文件的内容
show binlog events;
查看指定binlog文件的内容
show binlog events in 'mysql-bin.000002';
查看当前正在写入的binlog文件
show master status\G
获取binlog文件列表
show binary logs;
用mysqlbinlog工具查看
不要查看当前正在写入的binlog文件不要加–force参数强制访问如果binlog格式是行模式的,请加 -vv参数
本地查看binlog
mysqlbinlog --start-datetime='2013-09-10 00:00:00' --stop-datetime='2013-09-10 01:01:01' -d 库名 二进制文件
mysqlbinlog --start-postion=107 --stop-position=1000 -d 库名 二进制文件
mysqlbinlog –base64-output=DECODE-ROWS -v -d 库名 二进制文件
# mysqlbinlog /opt/data/APP01bin.000001# mysqlbinlog /opt/data/APP01bin.000001|grep insert/*!40019 SET @@session.max_insert_delayed_threads=0*/;insert into tb values(2,'WEIJING')
mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001
mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 |gzip >extra_01.sql.gz
mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 | mysql -uroot -p
mysqlbinlog --start-datetime="2014-12-15 20:15:23" /opt/data/APP01bin.000002 --result-file=extra02.sql
mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 /opt/data/APP01bin.000002|more
mysqlbinlog --database=test --set-charset=utf8 /opt/data/APP01bin.000001 /opt/data/APP01bin.000002 >test.sql
远程查看binlog
mysqlbinlog -u username -p password -h192.168.1.116 -P3306 --read-from-remote-server --start-datetime='2018-09-10 20:00:00' --stop-datetime='2018-09-10 21:00:00' mysql-bin.000001 > t.binlog
mysqlbinlog -urobin -p -h192.168.1.116 -P3306 --stop-datetime="2014-12-15 20:30:23" --read-from-remote-server mysql-bin.000033 |more
mysqlbinlog -uroot -p -P3606 -h192.168.1.177 --read-from-remote-server -vv inst3606bin.000005 >row.sql
文章转载自潍鲸,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




