MySQL:bin log

redo log 它是物理日志,记录内容是“在某个数据页上做了什么修改”,属于 InnoDB 存储引擎。

binlog 是逻辑日志,记录内容是语句的原始逻辑,类似于“给 ID=2 这一行的 c 字段加 1”,属于MySQL Server 层。

不管用什么存储引擎,只要发生了表数据更新,都会产生 binlog 日志。

那 binlog 到底是用来干嘛的?

可以说 MySQL 数据库的数据备份、主备、主主、主从都离不开 binlog,需要依靠 binlog 来同步数据,保证数据一致性。

binlog 会记录所有涉及更新数据的逻辑操作,并且是顺序写。

一、记录格式

binlog 日志有三种格式,可以通过binlog_format参数指定。

  • statement
  • row
  • mixed

指定statement,记录的内容是SQL语句原文,比如执行一条update T set update_time=now() where id=1,记录的内容如下。

同步数据时,会执行记录的SQL语句,但是有个问题,update_time=now()这里会获取当前系统时间,直接执行会导致与原库的数据不一致。

为了解决这种问题,我们需要指定为row,记录的内容不再是简单的SQL语句了,还包含操作的具体数据,记录内容如下。

 

row格式记录的内容看不到详细信息,要通过mysqlbinlog工具解析出来。

update_time=now()变成了具体的时间update_time=1627112756247,条件后面的@1、@2、@3 都是该行数据第 1 个~3 个字段的原始值(假设这张表只有 3 个字段)。

这样就能保证同步数据的一致性,通常情况下都是指定为row,这样可以为数据库的恢复与同步带来更好的可靠性。

但是这种格式,需要更大的容量来记录,比较占用空间,恢复与同步时会更消耗 IO 资源,影响执行速度。

所以就有了一种折中的方案,指定为mixed,记录的内容是前两者的混合。

MySQL 会判断这条SQL语句是否可能引起数据不一致,如果是,就用row格式,否则就用statement格式。

二、写入机制

binlog 的写入时机也非常简单,事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到 binlog 文件中。

因为一个事务的 binlog 不能被拆开,无论这个事务多大,也要确保一次性写入,所以系统会给每个线程分配一个块内存作为binlog cache

我们可以通过binlog_cache_size参数控制单个线程 binlog cache 大小,如果存储内容超过了这个参数,就要暂存到磁盘(Swap)。

binlog 日志刷盘流程如下

  • 上图的 write,是指把日志写入到文件系统的 page cache,并没有把数据持久化到磁盘,所以速度比较快
  • 上图的 fsync,才是将数据持久化到磁盘的操作

writefsync的时机,可以由参数sync_binlog控制,默认是1

0的时候,表示每次提交事务都只write,由系统自行判断什么时候执行fsync

虽然性能得到提升,但是机器宕机,page cache里面的 binlog 会丢失。

为了安全起见,可以设置为1,表示每次提交事务都会执行fsync,就如同 redo log 日志刷盘流程 一样。

最后还有一种折中方式,可以设置为N(N>1),表示每次提交事务都write,但累积N个事务后才fsync

在出现 IO 瓶颈的场景里,将sync_binlog设置成一个比较大的值,可以提升性能。

同样的,如果机器宕机,会丢失最近N个事务的 binlog 日志。

<think> 首先,用户的问题是:“我想查找在MySQL中打开bin-log的方法 请问如何在MySQL中打开bin-log”。用户明确要求知道如何在MySQL中启用二进制日志bin-log)。 现在,系统指令包括: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 用户提供了三个引用: - 引用[1]:描述了在CentOS中MySQL的配置文件通常在/etc/mysql目录下,如何编辑my.cnf文件来配置bin-log,包括设置server-id、log_bin路径、expire_logs_days、max_binlog_size、binlog_format、sync_binlog等。 - 引用[2]:讨论sql_log_bin变量,如何临时关闭它。 - 引用[3]:在Linux下启用log-bin的配置示例。 这些引用是用户提供的,我需要参考它们来回答用户的问题。用户的问题是开启bin-log,所以我应该基于引用中的信息来回答。 关键点从引用中提取: - 要开启bin-log,需要编辑MySQL的配置文件(通常是my.cnf)。 - 配置文件的位置:在CentOS中,可能在/etc/mysql/my.cnf;如果不是,可以用find命令查找。 - 在配置文件中设置log_bin参数来指定bin-log文件路径。 - 其他相关设置如server-id(对于复制很重要)、binlog_format等。 - 设置后需要重启MySQL服务。 - 引用[2]提到sql_log_bin变量,可以用来临时启用或禁用bin-log写入,但它不是永久开启的方法;永久开启需要在配置文件中设置。 所以,开启bin-log的主要方法是: 1. 定位MySQL配置文件。 2. 编辑配置文件,添加或修改log_bin设置。 3. 可选地设置其他bin-log相关参数。 4. 重启MySQL服务使配置生效。 基于用户的问题,我应该提供一个清晰的、步骤式的回答,使用中文。 回答结构: - 首先,确认用户的问题:如何在MySQL中打开bin-log。 - 然后,逐步解释方法。 - 引用相关引用中的信息,自然地添加引用标识。 - 最后,生成相关问题。 生成相关问题:作为系统指令的一部分,我需要生成相关问题。例如: 1. 如何验证bin-log是否已开启? 2. bin-log的格式有什么不同(如statement, row, mixed)? 3. 如何管理bin-log文件(如删除旧日志)? 4. 临时禁用bin-log的方法是什么? 5. bin-log在复制中的作用是什么? 确保回答真实可靠。我是AI,但我应该基于标准知识和引用提供信息。 最终回答格式: - 使用段落。 - 代码块如果有命令(如编辑配置文件或重启服务)。 - 引用标识添加在相关句子末尾。 - 最后生成相关问题。 </think> ### 如何在MySQL中启用二进制日志(bin-log) 在MySQL中开启二进制日志(bin-log)是数据库管理中的重要操作,主要用于数据复制、备份恢复和审计。启用bin-log的永久方法是通过修改MySQL的配置文件来实现。下面我将基于参考引用和MySQL标准实践,逐步说明操作步骤。操作前请确保您有服务器管理员权限。 #### 步骤1: 定位MySQL配置文件 MySQL的配置文件通常是`my.cnf`(或`my.ini`在Windows系统中)。在Linux系统(如CentOS)中,它一般位于`/etc/mysql/`目录下。如果找不到配置文件,可以使用`find`命令搜索: ```bash find / -name "my.cnf" ``` 找到文件后,使用文本编辑器(如`vi`或`nano`)打开它[^1]。 #### 步骤2: 编辑配置文件启用bin-log 在配置文件中添加或修改以下参数来开启bin-log: - **核心参数**:设置`log_bin`指定bin-log文件的存储路径,这直接启用bin-log功能。 - **推荐附加参数**:为了确保日志有效和安全,建议配置server-id(复制必需)、日志格式、存储周期等。 在配置文件的`[mysqld]`部分添加如下内容(路径可自定义): ```ini [mysqld] # 启用bin-log并指定文件路径 log_bin = /var/lib/mysql/mysql-bin.log # 设置服务ID(复制环境必需,单机可设置为1) server-id = 1 # 定义bin-log格式(推荐ROW格式,避免数据不一致) binlog_format = ROW # 日志文件最大大小(避免文件过大) max_binlog_size = 1024M # 日志保留天数(0为永久,建议根据需求设置) expire_logs_days = 30 # 事务提交后强制刷盘(高一致性场景设为1,一般设为0) sync_binlog = 0 ``` - **关键说明**: - `log_bin`参数是必选项:只要设置了这个参数,bin-log就会启用[^1][^3]。 - `binlog_format`:推荐`ROW`格式(数据变更安全),但也可以是`STATEMENT`(默认)或`MIXED`[^1][^3]。 - `server-id`:在复制环境中必须唯一,单机MySQL可设为1[^1]。 - 其他参数如`expire_logs_days`和`max_binlog_size`是可选的,用于优化日志管理[^1][^3]。 #### 步骤3: 重启MySQL服务使配置生效 保存配置文件后,必须重启MySQL服务来加载新设置。在Linux系统中,使用以下命令: ```bash # 适用于systemd系统(如CentOS 7+) systemctl restart mysqld # 或适用于SysVinit系统 service mysql restart ``` 重启后,MySQL会自动创建bin-log文件并开始记录日志[^1]。 #### 步骤4: 验证bin-log是否启用 连接到MySQL服务器,运行以下SQL命令检查状态: ```sql SHOW VARIABLES LIKE 'log_bin'; ``` 如果返回值为`ON`,表示bin-log已成功启用。您还可以查看日志列表: ```sql SHOW MASTER LOGS; ``` 这会显示当前的bin-log文件列表[^1]。 #### 注意事项 - **临时启用/禁用**:如果需要临时关闭bin-log(例如在大批量数据导入时避免日志膨胀),可以在MySQL会话中设置`sql_log_bin`变量: ```sql SET sql_log_bin = OFF; -- 临时禁用 SET sql_log_bin = ON; -- 临时启用 ``` 但这不是永久方法,仅影响当前会话[^2]。 - **文件权限**:确保MySQL用户对`log_bin`指定的路径有读写权限,否则启动服务可能失败[^3]。 - **性能影响**:启用bin-log会增加磁盘I/O。在高负载环境中,优化参数如`sync_binlog`(设为0可提升性能)和`max_binlog_size`很重要[^1][^3]。 通过以上步骤,您可以在MySQL中可靠地启用bin-log。如果在操作中遇到问题(如路径错误或服务启动失败),建议检查MySQL错误日志`/var/log/mysqld.log`以获取详情。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值