MySQL日志

MySQL的日志是数据库管理、监控、恢复和故障处理中不可或缺的一部分。它们记录了数据库运行期间的各种信息,包括错误、查询、数据变更等。以下是MySQL中常见的几种日志类型,以及它们的主要作用和特点:

事务日志(InnoDB Log)

  • 作用:InnoDB存储引擎特有的日志,包括重做日志(Redo Log)和撤销日志(Undo Log)。

    • 重做日志(Redo Log)redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。记录事务中修改数据的操作,确保在发生故障时能够恢复数据。
  • 特点

    • 重做日志和撤销日志都是InnoDB存储引擎实现事务持久性和原子性的关键。
    • 日志文件的大小和数量由InnoDB的配置参数控制,如innodb_log_file_sizeinnodb_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_loggeneral_log_file参数在配置文件中配置。

慢查询日志(Slow Query Log)

  • 作用 :记录所有执行时间超过long_query_time秒(默认值为10秒)的查询,或者不使用索引的查询。

  • 特点

    • 慢查询日志有助于定位性能问题。
    • 可以通过slow_query_logslow_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_logrelay_log_index

综上所述,MySQL的日志系统提供了丰富的功能和灵活性,能够满足不同场景下的需求。通过合理配置和使用这些日志,可以有效地监控数据库运行状态、定位性能问题、保障数据安全性和一致性。

相关推荐
Ai 编码助手1 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
白云如幻2 小时前
MySQL排序查询
数据库·mysql
苹果醋32 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
二十雨辰2 小时前
[linux]docker基础
linux·运维·docker
饮浊酒3 小时前
Linux操作系统 ------(3.文本编译器Vim)
linux·vim
stars_User3 小时前
MySQL数据库面试题(下)
数据库·mysql
lihuhelihu3 小时前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算
Yaml43 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
矛取矛求3 小时前
Linux系统性能调优技巧
linux
One_Blanks3 小时前
渗透测试-Linux基础(1)
linux·运维·安全