MySQL 8 服务器日志

错误日志:

启动、运行、停止 mysqld(MySQL Server) 遇到的问题

通用查询日志:

建立客户端连接和从客户端接收的语句

二进制日志:

更改数据的语句(也用于复制)

中继日志:

从复制master server接收到的数据更改

慢查询日志:

执行查询超过long_query_time 系统变量指定的秒数

DDL日志(元数据日志):

DDL语句执行的元数据操作

 

通过刷新日志可以强制服务器关闭并重新打开日志文件(有时还会生成一个新的日志文件)

刷新日志文件方法:

mysql> flush logs;

mysql> mysqladmin flush-logs

mysql> mysqladmin refresh

shell> mysqldump --flush-logs

此外,当二进制日志的大小达到 max_binlog_size 系统变量设置也会刷新该日志

注:官档中提到 mysqldump 的 --master-data 选项也可会刷新日志,测试发现不能

 

通用查询日志和慢查询日志的一些说明:

log_output 系统变量:控制通用查询日志和慢查询日志输出目标位置,可选值包括:TABLE,FILE,NONE;这些值可以任意组合,NONE的优先级最高

如果将设置log_output='table',则通用查询日志文件、慢查询日志文件中只会保存系统启动信息

general_log 系统变量:控制是否启用通用日志

general_log_file 系统变量:控制通用日志文件

slow_query_log 系统变量:控制是否启用慢查询日志

slow_query_log_file 系统变量:控制慢查询日志文件

注:如果将通用查询日志和慢查询日志存放在TABLE中,可以通过查询mysql schema下的general_log表以及slow_log表获取日志内容

 

关于日志表的一些补充:

写到日志表中的条目不会写到二进制日志文件中,所以也不会复制到 SLAVE Server

关于日志表清理方法:可以通过TRUNCAET TABLE语句清理,或者通过一个轮询的方式,比如:

mysql > user mysql;

mysql> create table general_log2 like general_Log;

mysql> drop table general_log to gerneral_log_backup, gerneral_logs2 to general_log;

通过mysqldump命令只会dump日志表的定义,不会dump日志表中的数据,这样在恢复时,可以保证恢复日志表结构

 

如果日志写到文件当中,可以通过如下方式清理日志文件:

shell> mv host_name.log host_name-old.log

shell> mysqladmin flush-logs

shell> mv host_name-old.log backup-directory

 

也可以通过一种通用方式处理:

SET GLOBAL general_log = 'OFF';

shell> mv host_name.log host_name-old.log

SET GLOBAL general_log = 'ON';

 

在会话级启停通用查询日志,可以通过 sql_log_off 会话变量实现

 

写在通用查询日志中的密码会被重写,通过在MySQL Server启动时添加 --log-raw 选项密码不会重写,这在排查问题时可能有用,但是不安全,生成中不建议使用

 

log_timestamps 系统变量:

这个系统变量影响通用查询日志文件、慢查询日志文件、错误日志的显示时间戳,通过存储在日志表中的日志时间戳显示没有影响

log_timestamps 系统变量有两个取值:UTC、SYSTEM

 

错误日志:

错误日志包含:MySQL Server 启停时间信息,以及在启停和运行过程中的错误、警告、提示信息

如果使用mysqld_safe启用MySQL Server,在mysqld异常终止时,mysqld_safe会重启mysqld并把信息写到错误日志中

在MySQL 8.0 中,错误日志子系统有执行log event过滤以及写log event的组件和控制组件选择的系统变量组成

log_error 系统变量:指定错误日志位置

log_error_verbosity 系统变量:指定错误日志记录等级(0、1、2 分别对应 error、error warning、error warning note)

log_error_services 系统变量:指定过滤组件、写组件

 

二进制日志:

二进制日志包含描述数据库更改的 events,还包含每个更新语句花费的时间

二进制日志记录对数据库对象做出更改的语句,如果这个语句可能更改数据,比如:delete from table_name where 1=0;在二进制日志格式为STATEMENT时会记录到二进制日志文件中,而二进制日志格式为ROW时则不会记录到二进制日志文件中

二进制日志有两个重要作用:

复制

恢复

二进制日志会对系统产生一些额外的开销,如果MySQL Server不适用复制环境,或者不需要做时间点恢复的话,可以不用开启二进制日志

 

与二进制日志相关系统变量:

log_bin 系统变量:指定二进制日志的basename

log_slave_updates 系统变量:这个系统变量应用在Slave Server中,在Slave Server应用从Master Server接收的二进制events时,是否将应用的events写到Slave Server自身的二进制日志中

slave_preserve_commit_order 系统变量:这个系统变量也是在Slave Server中使用,而且是在多线程复制Slave Server才有意义

配置多线程复制Slave,设置 slave_parallel_workers 系统变量为非 0 值

可以将 slave_parallel_type 系统变量设置为 Logical Clock,这样对于Master Server端组提交的事务可以在Slave Server端并行化应用接收的events

 

二进制日志刷新的几种情形:

MySQL Server 启动

flush logs

日志文件大小达到max_binlog_size 系统变量定义的值

注:二进制日志文件大小可能会超过 max_binlog_size 指定的大小,比如:一个大事务写到日志文件,由于事务以 one piece 存储到日志文件中,不会在日志文件中分割

 

log_bin_index 系统变量:查看二进制日志文件索引文件位置

sql_log_bin 会话变量:可以在会话级关闭二进制日志生成

 

验证二进制日志完整性:

默认情况下,MySQL Server 会写events和events长度用于验证events是否正确写入

如果 binlog_checksum 系统变量启用,MySQL Server 还会写入events校验和

这样在从二进制日志读信息时,Master Server会使用events长度,以及校验和信息(如果配置了master_verify_checksum 系统变量)

在Slave Server端,IO线程会验证从Master Server端接收的events,如果Slave Server端配置了slave_sql_verify_checksum 系统变量,Slave Server的SQL线程也会验证校验和信息

 

在二进制日志中记录的events的格式取决于二进制日志的格式,二进制日志格式包括:STATEMENT、ROW、MIX-BASED

 

可以通过 RESET MASTER命令删除所有的二进制日志,或者通过 PURGE BINARY LOG语句删除部分二进制日志

补充说明一下:

在复制环境中,在Master Server端,RESET MASTER不仅会删除所有的二进制日志,如果使用的是基于GTID复制模式,也会清除所有的GTID信息;在Slave Server端,RESET SLAVE删除所有中继日志,RESET SLAVE ALL不仅会删除所有中继日志,而且会清除连接、状态信息,在MySQL 8 中,默认使用mysql.slave_relay_log_info、mysql.slave_master_info表存储有关信息

 

可以通过mysqlbinlog命令查看二进制日志内容,这是MySQL Server做时间点恢复会有用,比如:

shell> mysqlbinlog log_file | mysql -h server_name

 

对于事务表,在语句或者事务完成后,释放锁或者提交前,会立即记录在二进制日志中

对于非事务表,在语句执行后,就会立即记录在二进制日志中

在一个未提交的事务中,所有对支持事务表的更改,在Server未接收到提交之前会先进行缓存;提交后,在执行COMMIT前,MySQL Server将整个事务写到二进制日志中

当一个线程开始处理事务时,会分配一个binlog_cache_size 系统变量的buffer用于buffer事务语句,如果事务语句大于binlog_cache_size 指定的值,线程打开一个临时文件用于存储该事务

binlog_cache_use 状态变量:查看MySQL Server中使用binlog_cache这个buffer的事务数量(包括使用临时文件的事务)

binlog_cache_disk_use 状态变量:查看MySQL Server中使用临时文件的事务

通过这两个状态变量,可以来调整binlog_cache_size值

MySQL Server中还定义了一个系统变量 max_binlog_cache_size用来限制整个Server中所有线程能够使用的binlog buffer 大小

基于ROW格式的二进制日志,对于像CREATE ... SELECT 和 INSERT ... SELECT语句会将其转化为一般的INSERT语句,这对于binlog_cache_size有一定的影响

 

binlog_error_action 系统变量:控制在写、刷新、同步二进制日志时发生错误,MySQL Server所采取的动作,默认是:ABORT_SERVER,另外一个值是:IGNORE_ERROR,这个值用于向后兼容

sync_binlog 系统变量:控制通过二进制日志的频率,默认值 1,是最安全的,但也是最慢的,与其相关的另一个系统变量:innodb_flush_log_at_trx_commit,默认值也是 1 

 

早期MySQL Server存在的一种情况:

使用InnoDB表,MySQL处理事务,在将事务写到二进制日志后,提交事务到InnoDB前,系统崩溃,重启后,InnoDB回滚该事务,但是事务相关的日志保留在二进制日志文件中

早期解决这种情况的方法是使用XA事务,使InnoDB支持事务的两阶段提交,MySQL Server会截断二进制日志到最后有效的位置

在MySQL 8.0以后总是启用XA事务的两阶段提交,保证InnoDB 表数据与二进制日志数据一致

 

如果MySQL Server在崩溃恢复时发现二进制日志比他应该的大小下的时候,它丢失了至少一个成功提交的事务;在这种情况下,二进制日志是不正确的,复制应该从Master Server 新的快照中开始;

这种情况不会发生,如果sync_binlog=1并且二进制日志真的同步到磁盘上(有时不会)

 

sync_binlog=1: Enables synchronization of the binary log to disk before transactions are committed. This is the safest setting but can have a negative impact on performance due to the increased number of disk writes. In the event of a power failure or operating system crash, transactions that are missing from the binary log are only in a prepared state. This permits the automatic recovery routine to roll back the transactions, which guarantees that no transaction is lost from the binary log.

 

二进制日志格式:

binlog_format 系统变量:可选值:STATEMENT、ROW、MIXED

基于MIXED的二进制日志格式默认使用基于STATEMENT二进制日志格式

在复制模式下,主从节点的binglog_format应该保持一致

在使用InnoDB存储引擎,同时事务隔离等级时READ-COMMITTED情况下,将BINLOG_FORMAT设置为STATEMENT,会导致InnoDB表不能插入数据

binlog_row_event_max_size 系统变量:

Where possible, rows stored in the binary log are grouped into events with a size not exceeding the value of this setting. If an event cannot be split, the maximum size can be exceeded.

 

 

 

 

 

 

 

 

你可能感兴趣的:(MySQL 8 服务器日志)