mysqlLog - juedaiyuer/researchNote GitHub Wiki
#MySQL日志#
##MySQL服务层日志##
- 二进制日志
- 慢查日志
- 通用日志
##MySQL存储引擎层日志##
###innodb###
- 重做日志
- 回滚日志
##MySQL日志种类##
- 错误日志: -log-err
- 查询日志: -log
- 慢查询日志: -log-slow-queries
- 更新日志: -log-update
- 二进制日志: -log-bin
##错误日志##
- 在mysql数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止
- 默认情况下,错误日志存储在mysql数据库的数据文件中
- 错误日志文件通常名称为: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;
##查询日志##
- 默认情况下查询日志是关闭的
- 由于查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的
- 如若不是为了调试数据库的目的建议不要开启查询日志
mysql> show global variables like '%log%';
| general_log | OFF |
| general_log_file | /var/lib/mysql/juedaiyuer.log |
| log_output | FILE |
-
日志输出位置:log_output
-
三种方式: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##