mysqlLog - juedaiyuer/researchNote GitHub Wiki

#MySQL日志#

##MySQL服务层日志##

  1. 二进制日志
  2. 慢查日志
  3. 通用日志

##MySQL存储引擎层日志##

###innodb###

  1. 重做日志
  2. 回滚日志

##MySQL日志种类##

  • 错误日志: -log-err
  • 查询日志: -log
  • 慢查询日志: -log-slow-queries
  • 更新日志: -log-update
  • 二进制日志: -log-bin

##错误日志##

  1. 在mysql数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止
  2. 默认情况下,错误日志存储在mysql数据库的数据文件中
  3. 错误日志文件通常名称为:hostname.err

#DIR 指定日志路径
#filename 日志名称,没有指定该参数时默认为主机名,重启mysql服务器即可生效
Log_error=DIR/[filename]

#或者这样定义
Log_error=ON

log_warings=1|0

mysql> show global variables like '%log%';

#错误日志的删除
#DBA可以删除很长时间之前的错误日志,以保证mysql服务器上的硬盘空间
mysqladmin -uroot -p -pflush-logs

flush-logs [log_type ...]

Flush all logs.

As of MySQL 5.7.5, the mysqladmin flush-logs command permits optional log types to be given, to specify which logs to flush.
Following the flush-logs command, you can provide a space-separated list of one or more of the following log types: binary,
engine, error, general, relay, slow. These correspond to the log types that can be specified for the FLUSH LOGS SQL statement.


#刷新日志
mysql> FLUSHLOGS;

##查询日志##

  1. 默认情况下查询日志是关闭的
  2. 由于查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的
  3. 如若不是为了调试数据库的目的建议不要开启查询日志

mysql> show global variables like '%log%';

| general_log                             | OFF                                |
| general_log_file                        | /var/lib/mysql/juedaiyuer.log      |

| log_output                              | FILE                               |
  1. 日志输出位置:log_output

  2. 三种方式:file(文件),table(表),none(不保存)

    #输出位置定义为表时 mysql> use mysql; mysql> show tables; ...

    | general_log | 查询日志表输出位置

    ...

##慢查询日志##

一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的

| slow_query_log                          | OFF                                |
| slow_query_log_file                     | /var/lib/mysql/juedaiyuer-slow.log |

#慢查询日志的定义
[mysqld]
slow_query_log=1
log-slow-queries [=  DIR/[filename] ]

#登录Mysql服务器直接定义
#全局权限
mysql> set global slow_query_log=1;

#定义时间限定值
mysql> SHOW GLOBAL VARIABLES LIKE 'long%';
| long_query_time | 10.000000 |

#开启慢查询日志
mysql> set globalslow_query_log=1;

#当前session中,退出则重置
mysql> setsession long_query_time=0.001;

#全局中,重启服务则重置
mysql> set globallong_query_time=0.001;

##事务日志##

事务日志(InnoDB特有的日志)可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把改修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的,我们通常称之为预写式日志,修改数据需要写两次磁盘。

如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而定。

| innodb_flush_log_at_trx_commit          | 1                                  |
| innodb_locks_unsafe_for_binlog          | OFF                                |
| innodb_log_buffer_size                  | 16777216                           |
| innodb_log_checksums                    | ON                                 |
| innodb_log_compressed_pages             | ON                                 |
| innodb_log_file_size                    | 50331648                           |
| innodb_log_files_in_group               | 2                                  |
| innodb_log_group_home_dir               | ./                                 |
| innodb_log_write_ahead_size             | 8192                               |
| innodb_max_undo_log_size                | 1073741824                         |
| innodb_online_alter_log_max_size        | 134217728                          |
| innodb_undo_log_truncate                | OFF                                |
| innodb_undo_logs                        | 128                                |
  • innodb_flush_log_at_trx_commit,在事务提交时innodb是否同步日志从缓冲到文件中,1:事务提交就同步不提交每隔一秒同步一次,性能会很差造成大量的磁盘I/O;2:表示只有在事务提交时才会同步但是可能会丢失整个事务
  • innodb_log_files_in_group 至少有两个
  • innodb_log_group_home_dir 定义innodb事务日志组的位置
  • innodb_mirrored_log_groups 表示对日志组做镜像

ls -lh
-rw-r----- 1 mysql mysql  48M  7月 18 10:33 ib_logfile0
-rw-r----- 1 mysql mysql  48M  7月 12 16:31 ib_logfile1

##二进制日志##

二进制日志也叫作变更日志,主要用于记录修改数据或有可能引起数据改变的mysql语句,并且记录了语句发生时间、执行时长、操作的数据等等。所以说通过二进制日志可以查询mysql数据库中进行了哪些变化。一般大小体积上限为1G。

mysql> showglobal variables like "%log%";

#用于控制会话级别二进制日志功能的开启或关闭。默认为ON,表示启用记录功能。用户可以在会话级别修改此变量的值,但其必须具有SUPER权限。
sql_log_bin ={ON|OFF}

#默认值32768 Binlog Cache用于在打开了二进制日志(binlog)记录功能的环境,是MySQL 用来提高binlog的记录效率而设计的一个用于短时间内临时缓存binlog数据的内存区域。
#一般来说,如果我们的数据库中没有什么大事务,写入也不是特别频繁,2MB~4MB是一个合适的选择
#但是如果我们的数据库大事务较多,写入量比较大,可与适当调高binlog_cache_size
#同时,我们可以通过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache由于内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了。	
binlog_cache_size =32768 

#当非事务语句使用二进制日志缓存,但是超出binlog_stmt_cache_size时,使用一个临时文件来存放这些语句。
binlog_stmt_cache_size= 32768

#指定binlog的位置,默认在数据目录下
log_bin = mysql-bin

#指定二进制日志的类型,默认为MIXED。如果设定了二进制日志的格式,却没有启用二进制日志,则MySQL启动时会产生警告日志信息并记录于错误日志中
binlog-format= {ROW|STATEMENT|MIXED}

#设定多久同步一次二进制日志至磁盘文件中
#0:不同步,任何正数值都表示对二进制每多少次写操作之后同步一次
#当autocommit的值为1时,每条语句的执行都会引起二进制日志同步,否则,每个事务的提交会引起二进制日志同步
sync_binlog = 10

#二进制日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存,其上限由max_binlog_stmt_cache_size决定
max_binlog_cache_size= {4096 .. 18446744073709547520}

#二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存
max_binlog_stmt_cache_size= {4096 .. 18446744073709547520}

#设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除
#默认为0,表示不启用过期自动删除功能。如果启用此功能,自动删除工作通常发生在MySQL启动时或FLUSH日志时	
expire_log_days ={0..99}


[mysqld]
log-bin [=DIR \ [filename]]
  • 二进制文件名filename.number,number的形式为000001、000002...
  • 每次重启mysql服务或运行mysql> flush logs,就会生成一个新的二进制文件,number递增
  • 生成一个filename.index文件,存储所有二进制日志文件的清单,又称之为二进制文件的索引

##source##