mysql服务端的日志7.4

https://dev.mysql.com/doc/refman/8.4/en/server-logs.html

mysql服务端有6种日志,分别是Err log、General query log、Binary log、Relay log、Slow query log、DDL log。

log可以输出到文件中,也可以输出到表中,由log_output指定,默认是输出到文件,值可以是由英文逗号分隔的字符串,如file,table。

通用查询日志通过设置general_log为1开启,默认不开启,修改后立即生效。set global general_log=1。可以通过general_log_file查看或者设置通用查询日志文件位置及文件名。

慢查询日志通过设置slow_query_log为1开启,默认不开启,修改后立即生效。set global slow_query_log=1。可以通过slow_query_log_file查看或者设置慢查询日志文件位置及文件名。slow由long_query_time决定,默认是10s。

Binary log 7.4.4

binary log包含建表、修改表数据的事件。binary log主要有2个作用:

1、复制。

2、数据恢复。在执行备份恢复后,binary log中备份时间点之后的事件会被重新执行,以使得数据达到最新。

对非事务表的更新(insert、delete、update),服务端会在执行结束后立即写入到binary log中。对事务表的更新,服务端会先缓存,直到收到commit语句。此时,服务端将先把更新写入到binary log中,然后再执行commit。对非事务表的修改不能回滚。

 

binary log文件的位置和名称由log_bin_basename指定,可以通过设置binlog_encryption为1来加密binary log文件。binary log目录中有一个对应的index文件,里面记录了所有的binary log文件。可以使用mysqlbinlog打开binlog文件,如mysqlbinlog --no-defaults binlog.000001。mysqlbinlog也可用于打开relay log。

binary log默认是启用的(log_bin默认值为ON)。

当mysql重启时或flush log时或当前文件大小超过max_binlog_size(默认为1G)时,mysql会新建一个binary log文件。

主从复制时,每个server的id都得是唯一的。

由于log_replica_updates默认为ON,所以主从同步的从节点也会写binary log。

即使sync_binlog设为1,数据表的内容和binary log的内容也可能不一致。比如,操作事务表时,有一个很大的事务,服务端收到commit语句后,逐条写入binary log,再刷到binary log文件中,都刷完后,再执行commit语句。如果在将要执行commit语句之时服务器断电了,那么在服务重启后,数据表的数据会回滚,而binary log文件中的记录却不会删除。在mysql8.4之前,这个问题可以通过让InnoDB支持XA事务中的两阶段提交而解决,具体操作是???。从8.4开始,InnoDB默认支持XA事务中的两阶段提交。InnoDB对XA事务中两阶段提交的支持保证了binary log和InnoDB数据文件的同步。然而,mysql服务端应该配置成在commit前就把binary log和InnoDB log同步到磁盘上。InnoDB log是默认同步的,而sync_binlog=1保证了binary log的同步。InnoDB对XA事务中两阶段提交的支持和sync_binlog=1的结果是mysql在崩溃重启后,在回滚事务后,mysql会扫描最新的binary log文件去收集事务xid和最后一个有效的位置。mysql服务端之后会告诉InnoDB去完成已经写入到binary log中的事务,并把binary log截取到最后一个有效位置。这保证了binary log能够准确反映InnoDB表的数据,因此副本与源保持同步,因为它没有收到被回滚的语句。

binary log的格式

binary log文件中记录的格式取决于binlog_format,支持三种格式:ROW(基于行)、STATEMENT(基于语句)、MIXED(混合)。

默认是基于行,这会把变更的每一行都记录下来。优点是数据的前世今生都被记录的明明白白,缺点是变更多行时,日志量很大,哪怕只有一条语句。基于语句的话,优点是日志量小,每执行一条sql语句就记录一条日志,缺点是主从复制时,有些语句的执行结果可能和主库不一样,如带有uuid()、now()函数的语句。所以,最好设置成MIXED,混合模式下,不带uuid()这种函数的,会基于语句记录,带uuid()这种函数的,会基于行记录,这种模式结合了基于语句和基于行记录的优点。

修改全局:SET GLOBAL binlog_format = 'MIXED';

仅修改当前会话:SET SESSION binlog_format = 'MIXED';

如果想记录临时表,那么必须用STATEMENT模式,用其他两个不行。

posted on   koushr  阅读(617)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示