- 工信部备案号 滇ICP备05000110号-1
- 滇公安备案 滇53010302000111
- 增值电信业务经营许可证 B1.B2-20181647、滇B1.B2-20190004
- 云南互联网协会理事单位
- 安全联盟认证网站身份V标记
- 域名注册服务机构许可:滇D3-20230001
- 代理域名注册服务机构:新网数码
对于 MySQL 来说,日志文件尤为重要。MySQL 常见的日志文件有二进制日志(Binlog)、通用查询日志(General Log)、慢查询日志(Slow Log)、错误日志(Error Log)、重做日志(Redo Log)、回滚日志(Undo Log)等。今天蓝队云会详细介绍这些日志文件。
Binlog
Binlog包含描述数据库修改的语句,如create table、update等数据变更语句,不会记录类似select、show 等不修改数据的语句。如果想记录所有的 SQL 语句,则可以使用General Log,此部分内容将在下一节进行详细讲解。下面通过例子(在没有其他会话正在修改数据的MySQL环境中操作)展开介绍。查看当前Binlog的位点:
创建一张表:
查看Binlog信息(其中的Binlog文件和位点都是通过执行上面的show master status语句获取的):
从上面的例子中可以看出,执行的create table语句会记录到Binlog中。
如果要开启Binlog,就需要在配置文件的[mysqld]中加上如下语句:
表示 Binlog 的存放路径为“/data/mysql/binlog/”,文件名为 mysql-bin 后接 Binlog的序列号。例如:
为了跟踪使用了哪些Binlog文件,mysqld还创建了一个Binlog索引文件,其中包含Binlog文件的名称。在默认情况下,该名称与Binlog文件具有相同的基本名称,扩展名为“.index”。如上面查询的内容为mysql-bin.index。在本例中,其内容为如下形式:
如果没有指定文件名和路径,在[mysqld]中的配置如下:
log-bin
则默认存放在datadir下,Binlog的文件名为主机名后接Binlog的序列号,如datadir为“/data/mysql/data/”,主机名为node1,Binlog的全路径为如下形式:
一般建议指定一个基本名称,防止更改主机名时出现 Binlog 的文件名与之前不一致的现象。如果要关闭Binlog,就需要在配置文件中加上如下语句:
skip_log_bin
或者:
disable_log_bin
如果要关闭当前会话的Binlog,则可以执行如下语句
set sql_log_bin=0;
Binlog的作用主要有以下两个。
复制:主库的变更先写入Binlog,然后传到从库进行回放。主从的具体原理会在第9章中详细介绍。
灾备:当误操作后,可以先把全备导入某个新的实例中,然后通过全备时间点到误操作中间的Binlog解析出所有事务(需要注意的是,把误操作这条SQL语句排除掉),并在新实例中执行这些事务,达到恢复到误操作前一刻的状态。
Binlog可以设置为以下几种日志格式。
statement(基于 SQL 语句的格式):每条会修改数据的 SQL 语句都会记录在Binlog中,不需要记录每行的变化。
row(基于行):会非常清楚地记录每行数据被修改的细节。
mixed(混合模式):以上两种格式的混合使用,默认采用的 statement 格式保存Binlog,statement格式无法准确复制的操作可以使用row格式保存Binlog。
MySQL会根据执行的SQL语句选择保存日志的方式。
几种日志格式的优点和缺点如表所示。
Binlog记录的格式由参数binlog_format控制,如果要设置为row格式,则在[mysqld]中加上如下语句:
当然,也支持动态修改,修改参数binlog_format的全局值的方法如下:
修改参数binlog_format的会话级别的方法如下:
Binlog文件不能直接查看,需要通过mysqlbinlog工具解析。例如,在row格式下,解析Binlog的方法如下。首先执行create语句:
解析Binlog:
其中,--start-position表示开始位点,-vv表示显示详细信息。查看解析结果:
由上述内容可以看出,执行 create table test.b(id int)语句后,该语句就会记录在Binlog中。
从MySQL 8.0.14开始,可以对Binlog文件和中继日志文件进行加密,从而保护敏感数据。可以通过在配置文件的[mysqld]中加上如下语句开启Binlog加密:
查看Binlog列表:
由此可以发现,最新的Binlog Encrypted已经变为Yes。下面尝试通过mysqlbinlog解析最新的Binlog,具体如下:
由此可以发现,已经解析不出结果。应该使用MySQL的用户密码进行解析才可以,具体如下:
--read-from-remote-server参数表示从MySQL服务中读取Binlog,而不是读取本地日志文件。读取远程MySQL的Binlog要求远程MySQL实例正在运行。
对于一个繁忙的MySQL实例,其Binlog增长也是比较快的,因此,需要设置其保留天数,如果磁盘即将满,那么可能还要单独删除历史 Binlog。本节主要介绍 Binlog的清除。可以使用 purge binary logs 语句来删除指定 Binlog 的文件名或指定时间之前的Binlog文件,具体示例如下。
示例一,删除指定Binlog之前的文件:
示例二,删除指定时间之前的Binlog文件。查看Binlog文件:
删除指定时间之前的Binlog文件:
当然,一般还是建议设置expire_logs_days参数或binlog_expire_logs_seconds参数。expire_logs_days参数定义了日志保留天数。binlog_expire_logs_seconds参数定义了日志保留秒数,MySQL 8.0建议设置这个参数,在未来的版本中可能会废除expire_logs_days参数。
当Binlog存在的时间超过binlog_expire_logs_seconds参数设置的时间时,则自动删除。有
时Binlog占用的磁盘空间会过大,如果要降低其保留时间,则可以进行如下操作:
如上所示,缩短保留时间后,需要执行flush logs语句才能删除之前的Binlog
Binlog同步到磁盘的频率由sync_binlog参数控制。sync_binlog参数大致有以下几种配置。
sync_binlog=0,禁用MySQL服务将Binlog同步到磁盘的功能,是由操作系统控制 Binlog 的刷盘。在这种情况下,性能比较好,但是当操作系统崩溃时可能会丢失部分事务。- sync_binlog=1,每个事务都会同步到磁盘。这是最安全的设置,但是磁盘写入次数的增加可能会导致性能下降。
sync_binlog=N,表示每N个事务Binlog同步一次到磁盘。当操作系统崩溃时,服务器提交的事务可能没有被刷新到 Binlog 中,此时可能会丢失部分事务,虽然设置比较大的值可以提高性能,但是数据丢失的风险也会增加。
max_binlog_size:单个Binlog文件大小的最大值。
log-slave-update:从库从主库接收的更新是否记录到从库自身的Binlog中,如果从库后面又接了从库,或者在从库上做备份,或者MySQL 5.6主从复制使用了GTID模式(具体原因见9.2.1节),那么建议开启这个参数。
binlog-do-db:后面接库名,表示当前数据库只记录该参数设置的库的 Binlog,其他库都不记录。
binlog-ignore-db:后面接库名,表示当前数据库不记录该参数设置的库的Binlog,其他库都记录。
综上所述,二进制日志(Binlog)在 MySQL 中扮演着极为重要的角色,无论是主从复制、数据灾备,还是日常的数据管理,都离不开它。了解 Binlog 的各项特性、配置方法及相关操作,有助于数据库管理员更好地管理 MySQL 数据库,保障数据的安全与稳定。
想了解更多相关技术小分享可以上蓝队云官网查阅,更多技术问题,也可以直接咨询。同时,蓝队云整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。
售前咨询
售后咨询
备案咨询
二维码
TOP