数据库学习----MySQL 日志


MySQL 日志

记录MySQL学习过程中的所有日志,可能不一定所有的都会用到

MySQL 常用的日志类型

日志名称 作用
错误日志(error_log) 记录mysql在启动、运行或停止时出现的问题
常规日志(general_log) 记录所有发向MySQL的请求
慢查日志(slow_query_log) 记录符合条件的查询
二进制日志(binary_log) 记录全部有效的数据修改日志
中继日志(relay_log) 用于主从复制,临时存储从主库的二进制日志

错误日志

  • 分析排除MySQL 运行错误
  • 记录未经授权的访问

配置错误日志

  • log_error=$mysql/sql_log/mysql-error.log(MySQL 的错误日志存储目录)
  • log_error_verbosity=[1,2,3] (级别越高,记录的日志越多)
verbosity 作用
1 Error messages
2 Error and warning messages
3 Error,warning,and note messages
  • log_error_services=[日志服务组件;日志服务组件] (MySQL 8.0 中才有)
组件名称 作用
log_filter_internal 默认的日志过滤组件,依赖log_error_verbosity
log_sink_internal 默认的日志输出组件,依赖log_error
log_sink_json 将错误日志输出到json文件
log_sink_syseventlog 将错误日志输出到系统日志文件

查看日志目录存放目录

select @@log_error;

查看log_error_verbosity

select @@log_error_verbosity;

查看log_error_services;

select @@log_error_services;

查看日志使用的时区

select @@log_timestamps;

设置系统时间作为时间撮

set persist log_timestamps='SYSTEM';

配置常规日志

分析客户端发送到MySQL 的实际请求(短时间内会有大量的日志被记录)

这个日志会从建立连接开始知道连接断开的所有操作日志。

密码明文是不会记录下来的

  • general_log=[ON|OFF]打开或关闭常规日志(不是特殊情况不要打开)
  • general_log_file=$mysql/sql_log/general.log (常规日志文件的位置)
  • log_output=[FILE|TABLE|NONE] 保存在表中或文件中 mysql 库中的 general_log表

查看general_log

select @@general_log; 0 未启动 1启动

查看general_log 文件位置

select @@general_log_file;

设置general_log 文件目录

set persist general_log_file='/home/mysql/sql_log/general.log'

启动general_log

set global general_log=on;

设置log_output的位置

set global general_log='table’;

关闭log_output

set global general_log=off;

配置慢查询日志

将执行成功并符合条件的查询记录到日志中

找到需要优化的SQL

  • slow_query_log=[ON|OFF] (配置是否打开慢查询日志)
  • slow_query_log_file=$mysql/sql_log/slowlog.log(慢查询日志文件位置)
  • long_query_time=xx秒(执行成功符合的条件----查询时间)记录所有sql可以将这个参数设置为0
  • log_queries_not_using_indexes=[ON|OFF] (记录所有没有使用索引的SQL)
  • log_slow_admin_statements=[ON|OFF] (记录所有使用admin 操作的日志)
  • log_slow_slave_statements=[ON|OFF] (记录二进制日志,主从数据库,很少使用,基本不打开了)

查看慢查询日志设置的慢查询时间

show variables like 'long_query_time';

修改慢查询日志的慢查询时间

set global long_query_time=0.01;

配置二进制日志

记录所有对数据库中数据的修改

基于时间点的备份和恢复

主从复制

  • log-bin [=base_name]

  • binlog_format=[Row|STATEMENT|MIXED] (二进制日志格式)

    • Row 每修改一行就记录一条记录
    • STATEMENT 5.7之前 默认 只记录执行的SQL 语句(可避免主从不一致的问题)
    • MIXED MySQL 数据Row 与 STATEMENT 写得混合
  • binlog_row_image=[FULL|MINIMAL|NOBLOB]

    • FULL 全部记录
    • MINIMAL 只记录被修改的值
    • NOBLOB 值记录除了BLOB 外的值的修改
  • binlog_rows_query_log_events=[ON|OFF] (在ROW格式下记录SQL)

  • log_slave_updates=[ON|OFF] 记录从主数据库同步过来的二进制数据

  • sync_binlog=[1|0] 控制MySQL 如何刷新日志到磁盘

    • 1 :每写一次就刷一次
    • 0 :由操作系统决定
  • expire_logs_days=days(每天清理一次二进制日志)

  • PURGE BINARY LOGS TO ‘mysql-bin.010’ (把mysql-bin.001~mysql-bin.009 全部删除掉)

  • PURGE BINARY LOGS BEFORE ‘2010-10-22 10:12:33’ (小于这个时间点的二进制日志全部删除掉)

查看是否打开二进制日志

show variables like 'log_bin';

查看配置文件目录

show variables like 'log_bin_basename';

查看binlog_row_image

show variables like 'binlog_row_image';

查看二进制日志格式

show variables like 'binlog_format';

读取二进制日志(转换为可读的内容)

mysqlbinlog --no-defaults -vv --base64-output=DECODE-ROWS 二进制日志名

修改二进制日志格式

set global binlog_row_image=minimal;

打开ROW 格式下记录SQL

set binlog_rows_query_log_events=on;

配置中继日志

只有在主从复制的数据库中才有

临时记录从主服务器同步的二进制日志

  • relay_log=filename (用于文件位置和文件前缀,不填的话则会存在数据目录中,会用主机名作为前缀)
  • relay_log_purge=[ON|OFF] (对relay_log进行自动清除)

PS:flush logs 可以刷新日志的配置