当前操作环境
# 服务器环境
[root@mysql]$lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.6.1810 (Core)
Release: 7.6.1810
Codename: Core
# mysql版本
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.26-log |
+------------+
mysql日志类型
| 日志类型 | 说明 |
|---|---|
| 错误日志(ErrorLog) | 记录在启动、运行或者停止mysqld时遇到的问题 |
| 通用查询日志(General Query Log) | 记录建立的客户端连接和执行的语句 |
| 二进制日志(Binary Log) | 记录更改数据的语句,逻辑日志 |
| 慢查询日志 (Show Query Log) | 记录所有执行时间超过long_query_time秒的所有查询 |
| 重做日志(redo log) | 物理层面的改动日志,主要用于数据重做(仅存在innodb) |
| 回滚日志(undo log) | 记录的逻辑日志,主要用于MVCC中记录回滚(仅存在innodb) |
| 中继日志(relay log) | 保存从主服务器中继到从属服务器的二进制日志事件,并记录有关中继日志中当前状态和位置的信息 |
1、错误日志(ErrorLog)
1.1 简介
记录mysql运行过程中Error、Warning、Note等信息,系统出错或者某条记录出问题
1.2 配置
mysql> show variables like 'log_error%';
+---------------------+-------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------+
| log_error | /data/server/mysql/mysqld.log |
| log_error_verbosity | 3 |
+---------------------+-------------------------------+
一般通过配置文件my.cnf进行配置
[root@mysql]$grep -Ri "error" /etc/my.cnf
log-error=/data/server/mysql/mysqld.log
1.3 案例
[root@mysql]$tail -f mysqld.log
2020-10-25T02:33:44.910929Z 0 [Note] InnoDB: Buffer pool(s) load completed at 201025 10:33:44
2020-10-25T02:33:44.922505Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
2020-10-25T02:33:44.922583Z 0 [Note] Server hostname (bind-address): '*'; port: 8004
2020-10-25T02:33:44.922658Z 0 [Note] IPv6 is available.
2020-10-25T02:33:44.922678Z 0 [Note] - '::' resolves to '::';
2020-10-25T02:33:44.922708Z 0 [Note] Server socket created on IP: '::'.
2020-10-25T02:33:44.929486Z 0 [Note] Failed to start slave threads for channel ''
2020-10-25T02:33:44.937759Z 0 [Note] Event Scheduler: Loaded 0 events
2020-10-25T02:33:44.938055Z 0 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.7.26-log' socket: '/tmp/mysql.sock' port: 8004 MySQL Community Server (GPL)
2、通用查询日志(General Query Log)
2.1 简介
记录mysql的日常日志,包括查询,修改,更新等每条sql语句
2.2 配置
mysql> show variables like 'general%';
+------------------+------------------------------------------------+
| Variable_name | Value |
+------------------+------------------------------------------------+
| general_log | ON |
| general_log_file | /data/server/mysql/izbp12xvjjwqe4ogfp2sdjz.log |
+------------------+------------------------------------------------+
2 rows in set (0.01 sec)
设置日志开启 set global general_log=ON;
2.3 案例
[root@mysql]$tail -f izbp12xvjjwqe4ogfp2sdjz.log
2020-09-26T08:57:43.260205Z 33 Query SELECT DATABASE()
2020-09-26T08:57:43.262119Z 33 Prepare SHOW INDEXES FROM `sys_operation_records` FROM `qmPlus` WHERE Key_name = ?
2020-09-26T08:57:43.263391Z 33 Execute SHOW INDEXES FROM `sys_operation_records` FROM `qmPlus` WHERE Key_name = 'idx_sys_operation_records_deleted_at'
2020-09-26T08:57:43.266796Z 33 Close stmt
/usr/local/mysql/bin/mysqld, Version: 5.7.26 (MySQL Community Server (GPL)). started with:
Tcp port: 8004 Unix socket: /tmp/mysql.sock
Time Id Command Argument
/usr/local/mysql/bin/mysqld, Version: 5.7.26 (MySQL Community Server (GPL)). started with:
Tcp port: 8004 Unix socket: /tmp/mysql.sock
Time Id Command Argument
3 二进制归档日志(Binary Log)
3.1 简介
二进制日志,包含一些事件,这些事件描述了数据库的改动,如建表、数据改动等,主要用于备份恢复、回滚操作等;
binlog是mysql的Server层实现的,所有引擎都可以使用。
3.2 作用
包含了所有更新了数据或者已经潜在更新了数据DML语句(insert、update、delete)
包含关于每个更新数据库DDL语句的执行时间信息
主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含备份后进行的所有更新
3.3 注意事项
一般开启binlog日志大概会有1%的性能损耗;但保障数据库完整性,对于重要数据库值得以性能换完整
3.4 应用场景
- mysql主从复制:mysql replication在master端开启binlog,然后主库将日志同步到从库达到master-slave数据一致的目的
- 数据恢复:通过使用mysqlbinlog工具来恢复数据
3.5 日志格式
- statement:记录的是每一条执行的sql语句
- row:记录是的每一行数据的变化
- mixed:statement和row两种的混合模式,会根据当前sql语句来区别对待
3.6 配置
mysql> show variables like "%log_bin%";
+---------------------------------+------------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------------+
| log_bin | ON |
| log_bin_basename | /data/server/mysql/bin-log |
| log_bin_index | /data/server/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+------------------------------------+
6 rows in set (0.00 sec)
cat my.cnf
# Binary Log
log_bin=/data/server/mysql/bin-log
log_bin_index=/data/server/mysql/mysql-bin.index
binlog_format=ROW
server-id=1
expire_logs_days=7
| 配置项 | 值 | 说明 |
|---|---|---|
| log_bin | /data/server/mysql/bin-log | 是否开启日志 |
| log_bin_index | /data/server/mysql/mysql-bin.index | |
| binlog_format | row | 日志格式row/statement/mined |
| server-id | 1 | 指定服务 |
| expire_logs_da | 7 | 过期时间 |
3.7 常用有关Binlog操作命令
# 查看当前服务器使用的biglog文件及大小
show binary logs;
# 查看最新一个binlog日志文件名称和位置
show master status;
# 事件查询命令
# in 'log_name' : 指定要查询的binlog文件名(不指定就是第一个binlog文件)
# from pos :从指定pos起始点开始查询(不指定就是从这个文件首个pos点开始算)
# limit offset : 偏移量(不指定就是0)
# row_count : 查询总条数(不指定就是中行数)
show binlog events [in 'log_name'] [from pos] [limit [offset,] row_count]
# 查询指定文件
show binlog events in 'bin-log.000002';
# 删除当前binlog文件
reset master
# 删除从库的中继日志
reset slave
# 删除指定日期前的日志索引中binlog日志文件
purge master logs before '2020-10-25 17:30:00'
# 删除指定文件
purge master logs to 'bin-log.000002'
# 设置过期时间
set global expire_logs_days=1;
flush logs;
3.8 binlog写入的时机
对于支持事务的引擎如InnoDB而言,需要等到事务提交了才会记录binlog;binlog刷入磁盘与参数sync_binlog相关。
| 值 | 说明 |
|---|---|
| 0 | 表示不受binlog控制,由文件系统控制缓存的刷新 |
| 非0 n | 表示每n次事务提交, 会将日志文件刷新到磁盘 |
4 慢查询日志(Show Query Log)
4.1 简介
记录mysql慢查询日志,修改配置文件my.cnf
4.2 慢查询配置相关命令
mysql> show variables like "%slow%";
+---------------------------+-----------------------------------------------------+
| Variable_name | Value |
+---------------------------+-----------------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /data/server/mysql/izbp12xvjjwqe4ogfp2sdjz-slow.log |
+---------------------------+-----------------------------------------------------+
5 rows in set (0.00 sec)
slow_query_log配置为OFF,说明为开启慢查询日志
打开慢查询日志功能
mysql> set global slow_query_log=on;
Query OK, 0 rows affected (0.01 sec)
mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | ON |
+----------------+-------+
1 row in set (0.00 sec)
查看默认设置的慢查询的时间
mysql> show variables like '%long_query%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
5 重做日志(redo log)
是indodb独有的日志功能
5.1 简介
用来保证事务的持久性
当数据库对数据做修改的时候,需要把数据页从磁盘读到buffer pool中,然后在buffer pool中进行修改,那么这个时候buffer pool中的数据页就与磁盘上的数据页内容不一致,称buffer pool的数据页为dirty page脏数据。
5.2 redo log已经存了物理逻辑,为什么还是用binlog?
- 1、redo log的大小固定,采用循环写入,日志会被覆盖掉,无法用于数据回滚、数据恢复等操作;binlog是可以追加写入的
- 2、redo log是Innodb引擎层使用的,并不是所有引擎都支持;binlog是mysql的server层实现的,所有引擎都可以使用
- 3、redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑
5.3 作用
innodDB保证数据库发生异常重启,之前的提交记录不会丢失
6.回滚日志(undo log)
6.1 简介
用来保证事务的原子性以及InnoDB的MVCC;
主要为了事务的回滚服务,undo log记录了数据在每个操作前的状态,如果事务执行过程中需要回滚,就可以根据undo log进行回滚
6.2 注意事项
undo log记录的逻辑日志,仅存在innodb日志