10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

5.4.4二进制日志

二进制日志包含事件描述数据库更改,如表创建操作或表数据更改。它还包含可能发生更改的语句的事件(例如,a删除它不匹配任何行),除非使用基于行的日志记录。二进制日志还包含关于每个语句花费多长时间更新数据的信息。二进制日志有两个重要的目的:

  • 对于复制,复制源服务器上的二进制日志提供要发送到副本的数据更改的记录。源将其二进制日志中包含的信息发送到其副本,副本将复制这些事务,以进行与源上所做的相同的数据更改。看到第17.2节“复制的实施”

  • 某些数据恢复操作需要使用二进制日志。恢复备份后,将重新执行备份后记录的二进制日志中的事件。这些事件使数据库从备份点更新到最新。看到第7.5节,“时间点(增量)恢复”

二进制日志不用于诸如选择显示不修改数据。要记录所有语句(例如,识别有问题的查询),请使用通用查询日志。看到第5.4.3节“一般查询纪录”

运行启用了二进制日志记录的服务器会略微降低性能。但是,二进制日志允许您设置复制和进行恢复操作,其好处通常超过了这种轻微的性能下降。

二进制日志对意外停止具有弹性。只有完整的事件或事务才会被记录或回读。

写入二进制日志的语句中的密码由服务器重写,而不是以纯文本的形式出现。另请参阅第6.1.2.3节“密码和日志记录”

从MySQL 8.0.14开始,二进制日志文件和中继日志文件可以加密,帮助保护这些文件和其中包含的潜在敏感数据不被外部攻击者滥用,也不被存储它们的操作系统的用户未经授权查看。可以在MySQL服务器上启用加密binlog_encryption系统变量.有关更多信息,请参见第17.3.2节“加密二进制日志文件和中继日志文件”

下面的讨论描述影响二进制日志记录操作的一些服务器选项和变量。有关完整列表,请参见第17.1.6.4节“二进制日志选项和变量”

默认情况下启用二进制日志记录log_bin系统变量设置为ON)。例外情况是你使用mysqld方法来手动初始化数据目录——初始化——initialize-insecure选项,在默认情况下禁用二进制日志记录,但可以通过指定——log-bin选择。

要禁用二进制日志记录,可以指定——skip-log-bin——disable-log-bin在启动时选项。如果指定了这些选项中的任何一个和——log-bin,则后面指定的选项优先。

——log-slave-updates而且——slave-preserve-commit-order选项需要二进制日志记录。如果禁用二进制日志记录,可以省略这些选项,或者指定——log-slave-updates =了而且——skip-slave-preserve-commit-order.MySQL默认禁用这些选项——skip-log-bin——disable-log-bin都是确定的。如果您指定——log-slave-updates——slave-preserve-commit-order在一起——skip-log-bin——disable-log-bin时,将发出警告或错误消息。

——log-bin [=base_name选项用于指定二进制日志文件的基本名称。如果您不提供——log-bin选项,MySQL使用binlog作为二进制日志文件的默认基名。为了与早期版本的兼容性,如果您提供——log-bin选项,没有字符串或空字符串,则基名默认为host_name,使用主机的名称。建议您指定一个基名,以便在主机名更改时,您可以轻松地继续使用相同的二进制日志文件名(参见B.3.7节“MySQL中的已知问题”).如果在日志名中提供扩展名(例如,——log-bin =base_name.extension),扩展被无声地删除并忽略。

mysqld将数字扩展名追加到二进制日志基名后,以生成二进制日志文件名。每当服务器创建一个新的日志文件时,该数字就会增加,从而创建一个有序的文件系列。每当发生以下任何事件时,服务器在该系列中创建一个新文件:

  • 服务器已启动或重启

  • 服务器将刷新日志。

  • 日志文件大小达到max_binlog_size

二进制日志文件可能大于max_binlog_size如果您使用的是大型事务,因为事务是一块写到文件中的,那么永远不要在文件之间拆分。

要跟踪使用了哪些二进制日志文件,mysqld还创建一个包含二进制日志文件名称的二进制日志索引文件。默认情况下,它与二进制日志文件具有相同的基名(扩展名)“.index”.方法可以更改二进制日志索引文件的名称——log-bin-index [=file_name选择。您不应该手动编辑此文件mysqld运行;这样做会混淆视听mysqld

这个词二进制日志文件一般表示包含数据库事件的单独编号文件。这个词二进制日志集合表示一组编号的二进制日志文件加上索引文件。

二进制日志文件和二进制日志索引文件的默认位置是数据目录。您可以使用——log-bin选项指定备选位置,方法是在基名称中添加前导绝对路径名以指定不同的目录。当服务器从二进制日志索引文件(该文件跟踪已使用的二进制日志文件)读取一个条目时,它会检查该条目是否包含相对路径。方法设置的绝对路径将替换路径的相对部分——log-bin选择。记录在二进制日志索引文件中的绝对路径保持不变;在这种情况下,必须手动编辑索引文件,以启用一个或多个新路径。二进制日志文件基名称和任何指定的路径都可以作为log_bin_basename系统变量。

在MySQL 5.7中,当启用二进制日志记录时必须指定服务器ID,否则服务器将无法启动。在MySQL 8.0中server_id系统变量默认为1。启用二进制日志记录时,服务器可以使用这个默认ID启动,但是如果没有使用server_id系统变量。对于复制拓扑中使用的服务器,必须为每个服务器指定唯一的非零服务器ID。

具有足够权限设置受限制的会话系统变量的客户端(参见第5.1.9.1节“系统变量特权”方法可以禁用自己语句的二进制日志记录设置sql_log_bin =了声明。

默认情况下,服务器记录事件的长度以及事件本身,并使用这一点来验证事件是否被正确写入。属性,还可以使服务器为事件写校验和binlog_checksum系统变量。从二进制日志回读时,源默认使用事件长度,但可以使用校验和(如果可用的话)master_verify_checksum系统变量。副本上的复制I/O线程还验证从源接收到的事件。选项,如果从中继日志读取时可用,则可以使复制SQL线程使用校验和slave_sql_verify_checksum系统变量。

二进制日志中记录的事件的格式取决于二进制日志格式。支持三种格式类型:基于行的日志记录、基于语句的日志记录和混合基日志记录。使用的二进制日志格式取决于MySQL版本。有关日志记录格式的一般描述,请参见第5.4.4.1节,“二进制日志格式”.有关二进制日志格式的详细信息,请参见MySQL内部:二进制日志

服务器计算——binlog-do-db而且——binlog-ignore-db选项,就像——replicate-do-db而且——replicate-ignore-db选项。有关如何做到这一点的信息,请参见第17.2.5.1节“数据库级复制和二进制日志选项的评估”

对象启动副本log_slave_updates默认启用的系统变量,这意味着副本将从源接收到的任何数据修改写入自己的二进制日志。要使此设置工作,必须启用二进制日志(参见第17.1.6.3节“副本服务器选项和变量”).此设置使副本可以作为其他副本的源。

方法可以删除所有二进制日志文件重置的主人语句,或者它们的一个子集清洗二进制日志.看到第13.7.8.6节,“RESET语句”,第13.4.1.1节,"清除二进制日志语句"

如果使用复制,则不应删除源上的旧二进制日志文件,直到确定没有副本仍然需要使用它们。例如,如果您的副本从来不会落后超过三天,那么您可以每天执行一次mysqladmin flush-logs在源上,然后删除超过3天的所有日志。您可以手动删除文件,但最好使用它清洗二进制日志,它还可以安全地为您更新二进制日志索引文件(并且可以采用日期参数)。看到第13.4.1.1节,"清除二进制日志语句"

方法可以显示二进制日志文件的内容mysqlbinlog实用程序。当您希望重新处理日志中的语句以进行恢复操作时,这可能非常有用。例如,您可以从二进制日志更新MySQL服务器如下:

壳> mysqlbinloglog_file| mysql - hserver_name

mysqlbinlog还可用于在副本上显示中继日志文件的内容,因为它们是使用与二进制日志文件相同的格式写入的。如需更多信息mysqlbinlog实用工具和如何使用,见“mysqlbinlog -处理二进制日志文件的实用程序”4.6.9节.有关二进制日志和恢复操作的更多信息,请参见第7.5节,“时间点(增量)恢复”

二进制日志记录在语句或事务完成后立即执行,但在释放任何锁或完成任何提交之前执行。这确保日志按提交顺序记录。

对非事务性表的更新在执行后立即存储在二进制日志中。

在未提交的事务中,所有更新(更新删除,或插入),更改事务表,例如InnoDB表被缓存,直到a提交语句被服务器接收。在这一点上,mysqld对象之前将整个事务写入二进制日志提交是执行。

对非事务性表的修改不能回滚。如果回滚的事务包含对非事务性表的修改,则整个事务将使用回滚语句,以确保复制对这些表的修改。

当处理事务的线程启动时,它分配一个binlog_cache_size来缓冲语句。如果语句大于此值,线程将打开一个临时文件来存储事务。当线程结束时,将删除临时文件。从MySQL 8.0.17中,如果服务器上激活了二进制日志加密,则会加密临时文件。

Binlog_cache_use状态变量显示使用此缓冲区(可能是一个临时文件)存储语句的事务的数量。的Binlog_cache_disk_use状态变量显示有多少事务实际上必须使用临时文件。这两个变量可用于调优binlog_cache_size到一个足够大的值,以避免使用临时文件。

max_binlog_cache_size系统变量(默认4GB,这也是最大的)可以用来限制用于缓存多语句事务的总大小。如果事务大于这个字节数,它将失败并回滚。最小值为4096。

如果使用二进制日志和基于行的日志记录,则并发插入将转换为普通插入创建…选择插入……选择语句。这样做是为了确保在备份操作期间通过应用日志重新创建表的精确副本。如果使用基于语句的日志记录,则原始语句将写入日志。

二进制日志格式有一些已知的限制,可能会影响从备份中恢复。看到第17.5.1节“复制特性和问题”

存储程序的二进制日志记录按第25.7节“存储程序二进制日志记录”

注意,由于复制方面的增强,MySQL 8.0中的二进制日志格式与以前版本的MySQL不同。看到第17.5.2节“MySQL版本间的复制兼容性”

如果服务器无法写入二进制日志、刷新二进制日志文件或将二进制日志同步到磁盘,则复制源服务器上的二进制日志可能不一致,副本可能失去与源的同步。的binlog_error_action系统变量控制在二进制日志中遇到此类错误时所采取的操作。

  • 默认设置,ABORT_SERVER,使服务器停止二进制日志记录并关闭。此时,您可以识别并纠正错误的原因。在重新启动时,恢复将继续进行,就像在服务器意外停止的情况下一样第17.4.2节“处理副本的意外停止”).

  • 设置IGNORE_ERROR提供与旧版本MySQL的向后兼容性。使用此设置,服务器将继续正在进行的事务并记录错误,然后停止二进制日志记录,但继续执行更新。此时,您可以识别并纠正错误的原因。要恢复二进制日志记录,log_bin必须再次启用,这需要重新启动服务器。如果您需要向后兼容,并且二进制日志在这个MySQL服务器实例中不是必需的,那么才使用这个选项。例如,您可能只将二进制日志用于服务器的间歇审计或调试,而不将其用于从服务器复制或依赖于它进行时间点恢复操作。

默认情况下,二进制日志在每次写入时同步到磁盘(sync_binlog = 1).如果sync_binlog如果没有启用,并且操作系统或机器(不仅仅是MySQL服务器)崩溃,则有可能丢失二进制日志的最后语句。要防止这种情况,请启用sync_binlog将系统变量的二进制日志同步到磁盘后N提交组。看到第5.1.8节,“服务器系统变量”.最安全的价值sync_binlog为1(默认值),但这也是最慢的。

在早期的MySQL版本中,如果发生崩溃,表内容和二进制日志内容之间可能存在不一致的情况sync_binlog设置为1。例如,如果你正在使用InnoDB表和MySQL服务器的进程提交语句中,它将许多准备好的事务按顺序写入二进制日志,同步二进制日志,然后将事务提交到InnoDB.如果服务器在这两个操作之间意外退出,事务将被回滚InnoDB但仍然存在于二进制日志中。这种问题在以前的版本中通过启用解决了InnoDB支持XA事务中的两阶段提交。在8.0.0及更高版本中InnoDB始终启用XA事务中对两阶段提交的支持。

InnoDBXA事务中对两阶段提交的支持确保了二进制日志和InnoDB同步数据文件。但是,MySQL服务器也应该配置为同步二进制日志和InnoDB在提交事务之前将日志记录到磁盘。的InnoDB日志默认是同步的sync_binlog = 1确保二进制日志同步。隐性的影响InnoDB支持XA事务中的两阶段提交和sync_binlog = 1在崩溃后重新启动时,在进行事务回滚后,MySQL服务器扫描最新的二进制日志文件来收集事务xid值并计算二进制日志文件中的最后一个有效位置。MySQL服务器然后告诉InnoDB完成已成功写入二进制日志的任何准备事务,并将二进制日志截断到最后的有效位置。这确保了二进制日志反映的准确数据InnoDB表,因此副本与源保持同步,因为它没有收到已回滚的语句。

如果MySQL服务器在崩溃恢复时发现二进制日志比它应该的要短,那么它至少缺少一个成功提交的日志InnoDB事务。这种情况不应该发生sync_binlog = 1当磁盘/文件系统被请求同步(有些没有)时,它们会执行实际的同步,因此服务器会打印一个错误消息二进制日志file_name比预期的尺寸要短吗.在这种情况下,这个二进制日志是不正确的,应该从源数据的一个新快照重新启动复制。

以下系统变量的会话值被写入二进制日志,并在解析二进制日志时由副本执行: