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

相关推荐
知初~3 小时前
出行项目案例
hive·hadoop·redis·sql·mysql·spark·database
子非衣5 小时前
MySQL修改JSON格式数据示例
android·mysql·json
钊兵6 小时前
数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)
数据库·mysql·postgresql·oracle·达梦·驱动
lllsure8 小时前
Linux 实用指令
linux·物联网
隔壁老王1568 小时前
mysql实时同步到es
数据库·mysql·elasticsearch
努力的小T8 小时前
使用 Docker 部署 Apache Spark 集群教程
linux·运维·服务器·docker·容器·spark·云计算
Nerd Nirvana8 小时前
OpenSSL crt & key (生成一套用于TLS双向认证的证书密钥)
linux·ssl·shell·认证·加密·tls·oepnssl
letisgo59 小时前
记录一次部署PC端网址全过程
linux·阿里云·服务器运维
猫猫的小茶馆9 小时前
【网络编程】UDP协议
linux·服务器·网络·网络协议·ubuntu·udp