MySQL常用的日志文件
查看MySQL支持的日志
mysql> show variables like 'log_%';
+----------------------------------------+----------------------------+
| Variable_name | Value |
+----------------------------------------+----------------------------+
| log_bin | ON |
| log_bin_basename | /var/mysql/mysql-bin |
| log_bin_index | /var/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| log_builtin_as_identified_by_password | OFF |
| log_error | /var/log/mysqld.log |
| log_error_verbosity | 3 |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | ON |
| 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_indexe|
1.错误日志
编辑my.cnf 写入
- log-error=[path]/[file]
通过命令参数错误日志
- mysqld_safe --user=mysql --log-error=[path]/[file]
2. 查询日志
mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
1 row in set (0.02 sec)
mysql> set global log_output='table'
set global log_output=file;
set global general_log_file='/var/log/mysqld/general.log';
set global general_log=on; ##不需要服务器的重启
set global general_log=off;
set global sql_log_off=on; 可以让 当前session不记录 执行的sql 语句
3、慢查询日志
ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE
log_slow_slave_statements :默认情况下主从架构的子节点是不会复制慢查询日志,为了改变这个,你可以去使用thelog_slow_slave_statements这个系统变量来开启。
##指定初始化参数,开启慢查询
slow_query_log = 1 #0是关闭慢查询,1是打开
slow_query_log_file = /var/lib/mysql/log-slow-query.log ##指定慢查询日志的名称,如果你没有指定慢查询日志的名称,默认会在数据文件目录下创建 host_name-slow.log慢查询日志
show variables like 'log_output';##日志存放的方式,是表还是文件
set global log_slow_queries = ON;mysql> set long_query_time=0.01; #设置大于0.1s的sql语句记录下来
使用mysql自带命令mysqldumpslow查看
常用命令
-s ORDER what to sort by (t, at, l, al, r, ar etc), 'at’ is default
-t NUM just show the top n queries
-g PATTERN grep: only consider stmts that include this string
eg:
s,是order的顺序,说明写的不够详细,看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序 -t,是top n的意思,即为返回前面多少条的数据 -g,后边可以写一个正则匹配模式,大小写不敏感的
mysqldumpslow -s c -t 20 host-slow.log
mysqldumpslow -s r -t 20 host-slow.log
上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。
mysqldumpslow -t 10 -s t -g “left join” host-slow.log
这个是按照时间返回前10条里面含有左连接的sql语句。
4 二进制日志
二进制日志不会记录select ,show 等不修改数据的语句。打开二进制日志会消耗一些系统系能,但是对于高可用和系统恢复,所带来的好处大于减少的性能。
二进制日志的功能
- 恢复(recovery)
- 复制(replication)
binlog_cache_size :
mysql> show variables like 'Binlog_cache_size';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| binlog_cache_size | 32768 |
+-------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 1 |
+---------------+-------+
1 row in set (0.01 sec)
set global sql_log_off=on;## 可以让 当前session不记录 执行的sql 语句Log-slave-update ##该参数在搭建master=>slave=>slave的架构时,需要配置。
指定日志路径mysqld_safe --user=mysql --log-bin=[path] &
如果没有指定文件名 默认mysql-bin,默认路径为datadir目录
[mysqld]
log-bin = /var/mysql/binlog/mysql-bin ##指定二进制日志的名称或者路径server-id = 1##MySQL5.6以后需要标明服务器顺序
read-only=0##是否只读log_bin_index = /var/mysql/binlog/mysql-bin.index ##二进制日志索引的名称relay_log = /var/log/mysql/mysql-bin.relay ##中继日志的名称relay_log_index = /var/log/mysql/mysql-bin.relay.index ##中继日志索引的名称
查看binlog
mysqlbinlog mysql-bin.000001#查看编号000001的日志show binlog events \G##只能查看第一个日志的events
show binlog events in 'mysql-bin.000003';##可以查看具体位置日志的events
删除binlog
1. mysql> reset master; 删除所有日志,新日志重新从000001开始编号
2. mysql> purge master logs to 'mysq-bin.******' 命令可以删除指定编号前的所有日志
3. mysql> purge master logs to before 'YYYY-MM-DD HH:MM:SS' 命令可以删除'YYYY-MM-DD HH:MM:SS'之前的产生的所有日志
4. 在my.cnf 中指定日志过期 expire_logs-days=n5.可以使用purgebinary logs语句来清除binary logs。
6.Binlog_format参数也特别重要。从mysql5.1版本开始引入这个参数,该参数可以设置的值有STATEMENT、ROW、MIXED;(1)STATEMENT格式和之前的mysql版本一样,二进制日志文件记录的是日志的逻辑失SQL语句。
(2)在ROW格式下,二进制日志记录的不再是简单的SQL语句了,而是记录表的行更改情况,此时可以将InnoDB的事务隔离基本设为READ COMMITTED,以获得更好的并发性。
(3)MIXED格式下,mysql默认采用的STATEMENT格式进行二进制日志文件的记录,但是在一些情况下会使用ROW格式,可能的情况包括:
1)表的存储引擎为NDB,这时对于表的DML操作都会以ROW格式记录
2)使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不确定函数
3)使用了INSERT DELAY语句
4)使用了用户定义函数
5)使用了临时表
mysql> show variables like "%binlog_format%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.01 sec)
6 innodb 在线redo 日志 innodb redo log
总结:
日志直接性能损耗数据库系统中最为昂贵的IO 资源,在默认情况下,系统仅打开错误日志,关闭了其他所有日志,以达到尽可能减少IO 损耗提高系统性能的目的。
但在实际应用场景中,都至少需要打开二进制日志,因为这是MySQL 很多存储引擎进行增量备份的基础,也是MySQL 实现复制的基本条件。有时候为了进一步的性能优化,定位执行较慢的SQL 语句,很多系统也会打开慢查询日志来记录执行时间超过特定数值的SQL 语句。
一般情况下,在生产系统中很少有系统会打开查询日志。因为查询日志打开之后会将MySQL 中执行的每一条Query 都记录到日志中,会该系统带来比较大的IO 负担,而带来的实际效益却并不是非常大。
一般只有在开发测试环境中,为了定位某些功能具体使用了哪些SQL 语句的时候,才会在短时间段内打开该日志来做相应的分析。所以,在MySQL 系统中,会对性能产生影响的MySQL日志(不包括各存储引擎自己的日志)主要是Binlog 。
文章评论