首页 > 数据库 >MySQL Binlog 的配置

MySQL Binlog 的配置

时间:2022-11-16 22:39:57浏览次数:40  
标签:Binlog log binlog 配置 flush MySQL 磁盘 ###


binlog简介

binlog是一个二进制格式的文件,用于记录用户对数据库增量操作的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是对库表等内容的查询不会记录

默认情况下,binlog日志是二进制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog解析查看

mysqlbinlog --base64-output=decode-rows -v /var/lib/mysql/mysql-bin.000001
log_bin                 = /var/lib/mysql/mysql-bin.log   #默认路径可修改
expire_logs_days = 7 #日志过期时间,设置为0则永不过期
binlog_format = ROW #复制模式
max_binlog_size = 100M #超过max_binlog_size或超过6小时会切换到下一序号文件

binlog_cache_size = 16M
#二进制日志缓冲大小,通过show status like 'binlog_%';查看调整写入磁盘的次数,写入磁盘为0最好

max_binlog_cache_size = 256M

relay_log_recovery = 1
#当slave从库宕机后,假如relay-log损坏了,
#导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,
#并且重新从master上获取日志,这样就保证了relay-log的完整性。

sync_binlog = 1 #二进制日志(binary log)同步到磁盘的频率
innodb_flush_log_at_trx_commit = 1 #每次事务提交将日志缓冲区写入log file,并同时flush到磁盘。

以下2个参数可以减少网络问题导致的主从数据同步延迟

slave_net_timeout       = 5       #当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据,默认3600秒


#此选项为从库 change master to 的参数
master-connect-retry = 60 #当重新建立主从连接时,如果连接建立失败,间隔多久后重试

MySQL binlog的三种工作模式

  • Statement level(默认)

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

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

缺点:容易出现主从复制不一致

BEGIN
/*!*/;
# at 503
# at 535
#190629 22:44:03 server id 2 end_log_pos 535 CRC32 0x5f886e71 Intvar
SET INSERT_ID=1/*!*/;
#190629 22:44:03 server id 2 end_log_pos 687 CRC32 0x0f3e188e Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1561819443/*!*/;
insert into student (name,age) values
('tom',20),('alice',16),('helen',22)
/*!*/;
# at 687
#190629 22:44:03 server id 2 end_log_pos 718 CRC32 0x10c379a2 Xid = 25
COMMIT/*!*/;
  • Row level

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

优点:能清楚的记录每一行数据修改的细节

缺点:数据量太大

BEGIN
/*!*/;
# at 194
#190629 21:39:57 server id 2 end_log_pos 250 CRC32 0xa2b4d227 Table_map: `school`.`student` mapped to number 73
# at 250
#190629 21:39:57 server id 2 end_log_pos 328 CRC32 0x69783f01 Write_rows: table id 73 flags: STMT_END_F
### INSERT INTO `school`.`student`
### SET
### @1=1
### @2='tom'
### @3=20
### INSERT INTO `school`.`student`
### SET
### @1=2
### @2='alice'
### @3=16
### INSERT INTO `school`.`student`
### SET
### @1=3
### @2='helen'
### @3=22
# at 328
#190629 21:39:57 server id 2 end_log_pos 359 CRC32 0x91fe958e Xid = 50
COMMIT/*!*/;
  • Mixed(混合模式)

以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。

sync_binlog

sync_binlog=0

当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。这个是性能最好的。

sync_binlog=1

当每进行1次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。

sync_binlog=n

当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。

注:大多数情况下,对数据的一致性并没有很严格的要求,所以并不会把 sync_binlog 配置成 1. 为了追求高并发,提升性能,可以设置为 100 或直接用 0,而对于支付服务这样的应用,还是比较推荐 sync_binlog = 1.

innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit=0

设置为0,该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。

innodb_flush_log_at_trx_commit=1

当设置为1,该模式是最安全的,但也是最慢的一种方式。在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认。

innodb_flush_log_at_trx_commit=2

当设置为2,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

标签:Binlog,log,binlog,配置,flush,MySQL,磁盘,###
From: https://blog.51cto.com/u_14508118/5857799

相关文章

  • MySQL 关闭slave主重
    1、停止从服务 stopslave;2、检查slave_open_temp_tables变量的值 showstatuslike'%slave%';mysql>showstatuslike'%slave%';+------------------------+-------+......
  • MySQL高级篇-第2章MySQL的数据目录
    第02章MySQL的数据目录1.MySQL8的主要目录结构find/-namemysql安装好MySQL8之后,我们查看如下的目录结构:这里是执行命令后的结果1.1数据库文件的存放路径MySQ......
  • Docker-compose 安装 Nginx PHP MySQL
    1、创建mkdir-p/docker/wwwmkdir-p/docker/nginx/conf.d/2、配置vimnginx/conf.d/default.confserver{listen80;server_namelocalhost;location/{......
  • MySQL动态SQL
    if单独使用的时候需要注意where需要带一条永真的语句如“1=1”,或者有其他不被if包含的语句,否则就可能出现“whereand titlelike#{title}”,只有一条语句,然后还被and连......
  • KVM 虚拟机 配置 NAT 连接方式上网
    1、命令行安装方式 virt-install\--name=kvm99--ram1024--vcpus=1\--diskpath=/home/vms/kvm99.qcow2,size=10,format=qcow2,bus=virtio\--location=/mnt/CentOS-7-......
  • 修改 matplotlib 的默认配置添加雅黑字体
    jupyter中默认并不支持中文,我们每次使用都需要指明字体,比较麻烦,其实可以通过修改配置文件,永久解决这个问题的。根据anaconda安装路径找到配置文件E:\software\anaconda3......
  • datatables参数配置详解
    配置//@translatorcodepiano//@blogcodepiano//@[email protected]//尝试着翻译了一下,难免有错误的地方,欢迎发邮件告知,多谢。/*--------------......
  • MySQL 索引最左前缀原则失效?
    测试索引最左前缀原则,发现缺失带头索引后,索引还是生效的。一、测试创建测试表CREATETABLE`user`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键',......
  • Maven之阿里云镜像仓库配置
    Maven镜像简介阿里云Maven中央仓库为阿里云云效提供的公共代理仓库,帮助研发人员提高研发生产效率,使用阿里云Maven中央仓库作为下载源,速度更快更稳定。阿里云云效 是企......
  • MySQL索引和SQL调优手册
    MySQL索引MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTre......