MySQL日志

文章目录


MySQL日志

mysql> show variables like 'log_%'; 
# 全局变量 设置&状态  show variables & show status
+----------------------------------------+-------------------+
| Variable_name             | Value                
|
+----------------------------------------+-------------------+
| log_bin                | OFF                 
|
| log_bin_basename            |                   
|
| log_bin_index             |                   
|
| log_bin_trust_function_creators    | OFF                 
|
| log_bin_use_v1_row_events       | OFF                 
|
| log_builtin_as_identified_by_password | OFF                 
|
| log_error               |
/usr/local/mysql/data/mysqld.local.err |
| log_error_verbosity          | 3                  
|
| log_output               | FILE                
 |
| log_queries_not_using_indexes     | OFF                 
|
| log_slave_updates           | OFF                 
|
| log_slow_admin_statements       | OFF                 
|
| log_slow_slave_statements       | OFF                 
|
| log_statements_unsafe_for_binlog    | ON                 
 |
| log_syslog               | OFF                 
|
| log_syslog_facility          | daemon               
 |
| log_syslog_include_pid         | ON                 
 |
| log_syslog_tag             |                   
|
| log_throttle_queries_not_using_indexes | 0                  
|
| log_timestamps             | UTC                 
|
| log_warnings              | 2                  
|
+----------------------------------------+----------------------+
21 rows in set (0.00 sec)

打开my.ini,在后面加上上面的参数,保存后重启mysql服务就行了。

#Enter a name for the error log file. Otherwise a default name will be used.
log-error=err.log
#Enter a name for the query log file. Otherwise a default name will be used.
#log=
#Enter a name for the slow query log file. Otherwise a default name will be
used.
#log-slow-queries=
#Enter a name for the update log file. Otherwise a default name will be used.
#log-update=
#Enter a name for the binary log. Otherwise a default name will be used.
#log-bin=

在linux root下重启mysqld服务:service mysqld restart

一:错误日志

错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。

mysqld 使用错误日志名 host_name.err(host_name 为主机名) 并默认在参数 DATADIR(数据目录)指定的目录中写入日志文件。

二:查询日志

查询日志记录了客户端的所有语句。由于上线项目sql特别多,开启查询日志IO太多导致MySQL效率低,只有在调试时才开启,比如通过查看sql发现热点数据进行缓存。

mysql> show global variables like "%genera%";

三:二进制日志

二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言) 语句,但是不包括数据查询语句。语句以“事件”的形式保存,它描述了数据的更改过程。 此日志对于灾难时的数据恢复起着极其重要的作用。
两个重要的应用场景:主从复制、数据恢复
查看binlog:mysql> show binary logs;
通过mysqlbinlog工具(mysql原生自带的工具)可以快速解析大量的binlog日志文件,如:

shell> mysqlbinlog --no-defaults --database=school --base64-output=decode-rows-v --start-datetime='2021-05-01 00:00:00' --stop-datetime='2021-05-10 00:00:00' mysql-bin.000001 | more

可以通过如下命令进行删除后的库恢复:

mysqlbinlog --start-position=xxx --stop-position=xxx mysql-bin.xxxxx | mysql -u root -p

其中,前两个xxx通过查看binlog二进制日志来获取,后一个通过mysql> show master logs;来查看。

四:慢查询日志

MySQL可以设置慢查询日志,当SQL执行的时间超过我们设定的时间,那么这些SQL就会被记录在慢查询日志当中,然后我们通过查看日志,用explain分析这些SQL的执行计划,来判定为什么效率低下,是没有使用到索引?还是索引本身创建的有问题?或者是索引使用到了,但是由于表的数据量太大,花费的时间就是很长,那么此时我们可以把表分成n个小表,比如订单表按年份分成多个小表等。

慢查询日志相关的参数如下所示:

mysql> show variables like '%slow_query%';
+---------------------+-----------------------------------------------+
| Variable_name       | Value          |
+---------------------+-----------------------------------------------+
| slow_query_log      | OFF            |
| slow_query_log_file | /usr/local/mysql/data/LeideMacBook-Pro-slow.log |
+---------------------+-----------------------------------------------+
2 rows in set (0.00 sec)

慢查询日志记录了包含所有执行时间超过参数 long_query_time(单位:秒)所设置值的 SQL语句的日志,在MySQL上用命令可以查看,如下:

mysql> show variables like 'long%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

这个值是可以修改的,如下:

mysql> set long_query_time = 1;  #注意,单位是秒
Query OK, 0 rows affected (0.00 sec)

现在修改成超过1秒的SQL都会被记录在慢查询日志当中!可以设置为0.01秒,表示10毫秒。慢查询日志,默认名称是host_name-slow.log,存放在MySQL的数据路径下,内容格式显示大致如下:

Query_time: 0.012000 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 139
use tuluneducation;
SET timestamp=1534527397;
select id,author from subject where content like '%linux%' and title like '%c++ linux%';

通过查询慢查询日志,发现项目运行过程中,上面这条SQL语句的执行时间超过了设定的慢查询时间,那么接下来就需要用explain分析一下该SQL的执行计划了,根据具体情况找出SQL和索引该怎么去优化。

五:redo log 和 undo log

MySQL日志

2.1、redo log

redo log:重做日志,用于记录事务操作的变化,确保事务的持久性。redo log是在事务开始后就开始记录,不管事务是否提交都会记录下来,在异常发生时(如数据持久化过程中掉电),InnoDB会使用redo log恢复到掉电前的时刻,保证数据的完整性。

innodb_log_buffer_size默认是16M,就是redo log缓冲区的大小,它随着事务开始,就开始写redo log,如果事务比较大,为了避免事务执行过程中花费过多磁盘IO,可以设置比较大的redo log缓存,节省磁盘IO。

InnoDB修改操作数据,不是直接修改磁盘上的数据,实际只是修改Buffer Pool中的数据。InnoDB总是先把Buffer Pool中的数据改变记录到redo log中,用来进行崩溃后的数据恢复。 优先记录redo log,然后再慢慢的将Buffer Pool中的脏数据刷新到磁盘上。

innodb_log_group_home_dir指定的目录下的两个文件:ib_logfile0,ib_logfile1,该文件被称作重做日志。

buffer pool缓存池:
作用:加速读和加速写,直接操作data page,写redo log修改就算完成,有专门的线程去做把buffer pool中的dirty page写入磁盘。
MySQL日志
MySQL日志

2.2、undo log

undo log:回滚日志,保存了事务发生之前的数据的一个版本,用于事务执行时的回滚操作,同时也是实现多版本并发控制(MVCC)下读操作的关键技术。
DB_TRX_ID:事务
ID DB_ROLL_PTR:回滚指针
MySQL日志

上一篇:mysql的主从复制延迟问题--看这一篇就够了


下一篇:谈谈MySQL 主从复制、读写分离