MySQL的日志是数据库管理、监控、恢复和故障处理中不可或缺的一部分。它们记录了数据库运行期间的各种信息,包括错误、查询、数据变更等。以下是MySQL中常见的几种日志类型,以及它们的主要作用和特点:
事务日志(InnoDB Log)
-
作用:InnoDB存储引擎特有的日志,包括重做日志(Redo Log)和撤销日志(Undo Log)。
- 重做日志(Redo Log) :
redo log
(重做日志)是InnoDB
存储引擎独有的,它让MySQL
拥有了崩溃恢复能力。记录事务中修改数据的操作,确保在发生故障时能够恢复数据。
- 重做日志(Redo Log) :
-
特点:
- 重做日志和撤销日志都是InnoDB存储引擎实现事务持久性和原子性的关键。
- 日志文件的大小和数量由InnoDB的配置参数控制,如
innodb_log_file_size
和innodb_log_files_in_group
。 - 撤销日志(Undo Log) :记录事务开始前或执行过程中产生的数据状态,用于事务回滚或MVCC(多版本并发控制)功能。
刷盘时机
-
InnoDB
存储引擎为redo log
的刷盘策略提供了innodb_flush_log_at_trx_commit
参数- 1 此为默认值,日志缓冲区将写入日志文件,并在每次事务执行完成后执行刷新到磁盘。 这是完全遵守ACID特性
- 0 提交时没有写磁盘的操作; 而是每秒执行一次将日志缓冲区的提交的事务写入刷新到磁盘。 这样可提供更好的性能,但服务器崩溃可能丢失最后一秒的事务
- 2 每次提交后都会写入OS的缓冲区,但每秒才会进行一次刷新到磁盘文件中。 性能比0略差一些,但操作系统或停电可能导致最后一秒的交易丢失
- 参数默认为 1 ,也就是说当事务提交时会调用
fsync
对 redo log 进行刷盘另外,InnoDB
存储引擎有一个后台线程,每隔1
秒,就会把redo log buffer
中的内容写到文件系统缓存(page cache
),然后调用fsync
刷盘。
二进制日志(Binary Log, Binlog)
-
作用:记录所有更改数据的语句(DDL和DML),但不包括SELECT和SHOW等不修改数据的语句。主要用于数据恢复、复制和数据审计。
-
特点:
- 二进制日志以二进制形式存储,可以通过
mysqlbinlog
工具查看其内容。 - 通过
log_bin
参数启用二进制日志,并可以通过max_binlog_size
参数设置单个日志文件的大小上限。 - 二进制日志的刷盘时机由
sync_binlog
参数控制。 MySQL
数据库的数据备份、主备、主主、主从 都离不开binlog
,需要依靠binlog
来同步数据,保证数据一致性。
- 二进制日志以二进制形式存储,可以通过
记录格式
-
基于"语句"记录:statement,记录语句,默认模式( MariaDB 10.2.3 版本以下 ),日志量较少
-
基于"行"记录:row,记录数据,日志量较大,更加安全,建议使用的格式,MySQL8.0默认格式
-
混合模式:mixed, 让系统自行判定该基于哪种方式进行,默认模式( MariaDB 10.2.4及版本以上)
sql
show variables like 'binlog_format';
markdown
**二进制日志相关的服务器变量:**
sql_log_bin
ini
sql_log_bin=ON|OFF:
#是否记录二进制日志,默认ON,支持动态修改,系统变量,而非服务器选项,一般默认开启
select @@sql_log_bin;
log_bin
ini
log_bin=mysql-bin #默认是关闭
# 指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开启才可以
# 此选项作用是指明 日志文件的位置所在
# 需要加 server-id = 1 数据库编号
server-id = 1
# 数据库的 编号 区别数据库
select @@log_bin;
#变量 log_bin 和服务器选项是两个意思
binlog_format : 日志格式
sql
binlog_format=STATEMENT|ROW|MIXED:
#二进制日志记录的格式,mariadb5.5默认STATEMENT
update students set age=20 where stuid >=10;
STATEMEN: 语句型那么只记录此条命令
update students set age=20 where stuid >=10;
ROW: 行型 就会记录具体的操作
update students set age=20 where stuid =1;
update students set age=20 where stuid =2;
update students set age=20 where stuid =3;
.............................................
update students set age=20 where stuid =10;
mysql> select @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| ROW |
+-----------------+
1 row in set (0.01 sec)
max_binlog_size 最大日志大小
ini
max_binlog_size=1073741824:
#单个二进制日志文件的最大体积,到达最大值会自动滚动,默认为1G
#说明:文件达到上限时的大小未必为指定的精确值
其他:
ini
binlog_cache_size=4m
#此变量确定在每次事务中保存二进制日志更改记录的缓存的大小(每次连接)
max_binlog_cache_size=512m
#限制用于缓存多事务查询的字节大小。
sync_binlog=1|0
#设定是否启动二进制日志即时同步磁盘功能,默认0,由操作系统负责同步日志到磁盘,1立即写入磁盘
expire_logs_days=N
#二进制日志可以自动删除的天数。 默认为0,即不自动删除
例子:开启二进制日志
ini
[root@localhost ~]#vim /etc/my.cnf
log_bin=/data/mysql-bin
#指明二进制日志所存在的目录
server-id = 1
#指明数据库的编号
[root@localhost ~]#chown mysql.mysql /data/
[root@localhost ~]#systemctl restart mysqld
通用日志
通用日志:记录对数据库的通用操作,包括:错误的SQL语句
通用日志可以保存在:file(默认值)或 table(mysql.general_log表)
通用日志相关设置
ini
general_log=ON|OFF
general_log_file=HOSTNAME.log
log_output=TABLE|FILE|NONE
例子:
sql
范例: 启用通用日志并记录至文件中
select @@general_log; #默认没开启
set global general_log=1; #开启
SHOW GLOBAL VARIABLES LIKE 'log_output';
#默认通用日志存放在文件中
select @@general_log_file;
#通用日志存放的文件路径
错误日志(Error Log)
-
作用:记录MySQL服务启动、运行或停止时出现的问题,以及服务器运行过程中发生的严重错误。
-
特点:
- 默认情况下,MySQL会生成错误日志文件。
- 日志文件的位置和名称可以通过
log_error
参数在配置文件中指定。 - 记录的内容包括服务器启动和停止过程中的信息、服务器运行过程中的错误信息、事件调试器运行事件的信息等。
查询日志(General Query Log)
-
作用:记录所有客户端连接和执行的SQL语句,包括SELECT、INSERT、UPDATE、DELETE等。
-
特点:
- 默认情况下,查询日志不会被启动,需要手动配置。
- 由于记录内容详尽,可能会占用大量磁盘空间并产生大量I/O,因此一般只在需要调试或采样分析时开启。
- 可以通过
general_log
和general_log_file
参数在配置文件中配置。
慢查询日志(Slow Query Log)
-
作用 :记录所有执行时间超过
long_query_time
秒(默认值为10秒)的查询,或者不使用索引的查询。 -
特点:
- 慢查询日志有助于定位性能问题。
- 可以通过
slow_query_log
和slow_query_log_file
参数在配置文件中配置。 log_query_not_using_indexes
参数可以控制是否将没有使用索引的查询也记录到慢查询日志中。
慢查询相关变量
mysql
slow_query_log=ON|OFF #开启或关闭慢查询,支持全局和会话,只有全局设置才会生成慢查询文件
long_query_time=N #慢查询的阀值,单位秒,默认为10s 才会记录
slow_query_log_file=HOSTNAME-slow.log #慢查询日志文件
log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan,
query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
#上述查询类型且查询时长超过long_query_time,则记录日志
log_queries_not_using_indexes=ON #不使用索引或使用全索引扫描,不论是否达到慢查询阀值的语句是否记录日志,默认OFF,即不记录
log_slow_rate_limit = 1 #多少次查询才记录,mariadb特有
log_slow_verbosity= Query_plan,explain #记录内容
log_slow_queries = OFF #同slow_query_log,MariaDB 10.0/MySQL 5.6.1 版后已删除
set global slow_query_log=1;
#开启
set long_query_time=1;
select sleep(10)
中继日志(Relay Log)
-
作用:在MySQL复制环境中,从服务器用于记录从主服务器接收到的二进制日志事件。
-
特点:
- 中继日志是主从复制过程中的关键组件,确保从服务器能够正确地应用主服务器的数据变更。
- 中继日志的名称和位置可以通过配置参数指定,如
relay_log
和relay_log_index
。
综上所述,MySQL的日志系统提供了丰富的功能和灵活性,能够满足不同场景下的需求。通过合理配置和使用这些日志,可以有效地监控数据库运行状态、定位性能问题、保障数据安全性和一致性。