MySQL 日志

系统参数
系统变量variables
  • 数据库的配置信息,分为session级和global级别,可以动态或静态改变,也可以用--选项来在启动时设
置参数
  • show global variables like '%slow%';
状态变量status
  • 数据库运行状态的记录,揭示了数据库SQL数量,连接, I/O负载,缓存使用,文件FD等即时状态量。也分为session级和global级别,无法改变。
  • show global status like 'com_select';
查看帮助详细信息
设置my.cnf进入数据库
创建参数文件进入数据库
[mysql@mysql5 ~]$ mysql_config_editor set --login-path=test --user=root --password --socket=/mysqldb/db_slave/mysql.sock
Enter password:
[mysql@mysql5 ~]$ mysql --login-path=test
默认读取配置文件的顺序
/etc/my.cnf
/etc/mysql/my.cnf
$basdir/etc/my.cnf
~./.my.cnf
针对拥有global session两个级别的变量,gloabl的改变只影响新增session,不映像现有的session,例如:autocommit。
日志文件
general log
  • 记录数据库全部的SQL(包括错误的),连接信息,启动和关闭服务,按照时间顺序记录
  • 数据量巨大
  • 默认关闭,防止大量日志沾满空间
  • mv之后要flush logs
参数
  • general_log #控制是否开启,动态调整
    • (默认关闭) {0-关闭,1-开启} 可以在线打开和关闭;
    • set global general_log=‘ON’;
  • general_log_file #控制日志路径,动态调整
  • 默认路径为datadir/hostname.log
  • log_output={TABLE | FILE | NONE}
    • TABLE:便于统计,写入一个CSV引擎的表中。
    • FILE:默认。
    • NONE:任何地方都不写。
注意:如果log_output=NONE但是general_log为1,则默认不写常规日志。
格式
格式如下:
  • Event_time每秒第一次query打印
  • Query发出时记录
  • 错误的,失败的,成功的均会记录
  • 数据库的流量日志
关于表mysql.general_log表:
  • select * from mysql.general_log;
  • 表mysql.general_log不支持insert, update和delete;
  • 表是不同步的(复制),不写binlog;
binlog
  • 以“事件”的形式保存,描述数据的变更,包含关于每个更新数据库的语句的执行时间点。
  • binlog只记录完整事务。
  • 目的:最大可能地恢复数据库
  • 启用该选项数据库性能降低1%,但保障数据库完整性,重要数据库必须启用。
  • 主要用途:
    • 主从复制
    • 基于binlog的恢复
    • 审计
参数
  • log_bin
    • (默认关闭) 不可以在线打开和关闭;
    • 只能在my.cnf中的修改!需要重启mysqld
  • log_bin_basename
    • 不指定路径则为hostname-bin.00000N
  • log_bin_index
    • 不指定路径则为hostname-bin.index
注意:
  • 文件路径需要在log_bin中设置,而不是log_bin_basename!
  • 所有的日志都建议自己起名字,不要用默认
  • binlog_checksum
    • {CRC32|NONE}
    • 写binlog时,会将内容生成校验位,之后存储在binlog中。
    • 默认情况下,服务器记录事件的长度以及事件本身,并使用它来验证事件是否正确写入。 可以通过设置binlog_checksum系统变量来使服务器为事件写入校验和。
  • master_verify_checksum
    • 主库应用二进制日志时候,如果需要开启校验和,则打开此参数。
  • slave_sql_verify_checksum
    • 从库sql_thread读取relay log时使用checksum核对数据,如果需要开启校验和,则打开此参数。
  • max_binlog_size: 二进制日志的大小。
  • 记录binlog,在语句或事务完成之后立即执行(而不是在任何锁释放或任何提交完成之前写入),这确保日志以提交顺序登录。
    • 对于不支持事务的表(MyISAM), 执行之后马上会被记录到binlog中。
    • 对于未提交的事务中,更改事务表(例如InnoDB表)的所有更新(UPDATE, DELETE或INSERT)将被缓存,直到服务器收到COMMIT语句。 在这一点上, mysqld在执行COMMIT之后将整个事务写入二进制日志。
    • 对非事务性表的修改无法回滚。 如果回滚的事务包括对非事务性表的修改,则会在最后使用ROLLBACK语句记录整个事务,但是非事务表无法回滚。
  • binlog_cache_size:
    • 内存中缓存二进制的缓冲区大小。
    • 注意:对于大的事务,二进制日志会超过max_binlog_size设定的值。即该事务仅写入一个二进制日志。
  • 当处理事务的线程开始时,它将给语句分配一个binlog_cache_size缓冲区。 如果一个语句大于这个值,线程将打开一个临时文件来存储事务文本。 当线程结束时,临时文件被删除。
  • binlog_cache_use
    • 状态变量, 显示用于存储语句的此缓冲区(可能还有一个临时文件)的事务数。
  • binlog_cache_disk_use
    • 状态变量, 显示有多少这些事务实际上必须使用临时文件。
  • 根据这两个状态值,判断binlog_cache_size值设置是否合理,避免使用临时文件。
  • max_binlog_cache_size
    • 系统变量(默认为4GB,也是最大值)可用于限制用于缓存多语句事务的总大小。 如果一个事务大于这个多个字节,它将失败并回滚。 最小值为4096。
  • sync_binlog: {0,1}
    • 二进制内容从缓冲区flush到磁盘的触发点。
    • 多少日志组,提交时,同步一次
    • 5.7.7以后, sync_binlog参数被默认设置为1,减少了binlog中的不一致可能性。
  • expire_logs_days:
    • 日志过期时间,一定要和备份相结合。
    • 8.0.3以后废弃,有binlog_expire_logs_seconds替代
格式
  • binlog_format: STATEMENT, ROW, MIXED
  • STATEMENT模式(SBR)
    • 每一条变更数据的sql原语句记录到binlog。
    • 缺点是在某些情况(如非确定函数)下会导致master-slave中的数据不一致(如sleep()函数,last_insert_id(),以及udf等会出现问题)
  • ROW模式(RBR)
    • 将原SQL语句等价转化为涉及数据变更的行的多条语句, 记录表中各个行如何被改变
    • 不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。
  • MIXED模式(MBR)
    • 以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog, MySQL会根据执行的SQL语句选择日志保存方式。
管理
  • Show binary logs; show master logs;
    • 查看当前实例有哪些binlog文件
  • Show master status;
    • 查看当前实例最新的binlog点
  • Flush logs;
    • 生成一个新的binlog
    • 关闭errlog,general log和slow log的fd重新打开fd
  • reset master;
    • 清理所有二进制日志,并从新开始记录二进制日志
    • 写入binlog索引文件
  • 清理指定编号之前的二进制日志:
    • purge binary logs to ‘3306-bin.000005’;
  • 清理指定时间前的二进制日志:
    • purge binary logs before '2017-02-25 19:30:57';
  • 不建议手动rm删除二进制日志,会造成index文件不一致。
slowlog
  • 记录数据库中影响时间超过阀值的慢SQL(包括所有的select和更新)
  • 不计算SQL执行前等待锁的时间,mysqld只从SQL等待的锁释放掉后,并开始执行时,开始计算时间(执行开始后的锁定时间会记录),所以慢查询日志中的语句顺序和语句的发出顺序或者general log的顺序不同
  • mv之后要flush logs
参数
  • slow_query_log #控制是否开启,动态调整
    • (默认关闭) {0-关闭,1-开启} 可以在线打开和关闭;
    • set global slow_query_log=‘ON’;
  • slow_query_log_file #控制日志路径,动态调整
    • 默认路径为datadir/hostname-slow.log
  • long_query_time # SQL执行的阀值,默认为10s,动态
  • log_queries_not_using_indexes 记录未用索引的慢查询
  • log_throttle_queries_not_using_indexes: 记录没有使用索引查询的语句条数,
在一分钟内记录的条数
  • min_examined_row_limit:
    • 要检查的行数大于等于N时才记录为慢查询,前提是必须满足long_query_time和log-queries-notusing-indexes约束。
  • log_slow_admin_statements:
    • 管理语句是否记录
    • ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE.
  • log_slow_slave_statements:
    • 从库的语句执行是否记录
error log
  • 记录数据库启动,关闭, innodb加载,错误,告警信息, aborted connection
等信息
  • 数据库的alert日志
参数
log_error=[path/[file_name]],如果不指定文件名,则默认hostname.err.
  • 修改后重启生效
  • 默认存放位置 datadir/hostname.err
log_error_verbosity(5.7.2被引入)
  • Errors only
  • Errors and warnings
  • Errors, warnings, and notes (默认)
查看错误日志的位置
show variables like 'log_error’;
错误日志重建
[mysql@mysql5 log]$ mv mysql.err mysql.err'20180810';
mysql> flush logs;
原文地址:https://www.cnblogs.com/Knight7971/p/9634694.html