MySQL日志概述
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。
http://www.cnblogs.com/shijiaqi1066/p/3859866.html
MySQL常用日志
错误日志:--log-err 记录启动,运行,停止mysql时出现的信息。
二进制日志:--log-bin 记录所有更改数据的语句,还用于复制,恢复数据库用。
查询日志:--log 记录建立的客户端连接和执行的语句。
慢查询日志:--log-slow-queries 记录所有执行超过long_query_time秒的所有查询。
更新日志:--log-update 二进制日志已经代替了更新日志,更新日志在MySQL 5.1中不再使用。
查看系统日志的相关配置信息
命令:show global variables like '%log%';
选项说明:
log:表示查询日志与慢查询日志是否开启。是一个总开关。
log_output:日志的存储方式,以FILE或以TABLE存储日志。
general_log:表示查询日志是否开启。
general_log_file:/mydata/data/mysql.log
这些值都可以使用SET语句临时修改。若需要需要永久生效,则只需要修改配置文件中的变量。
错误日志
MySQL一般默认开启了错误日志。
错误日志的记录的信息内容:
- 服务器启动和关闭过程中的信息。
- 服务器运行过程中的错误信息。
- 事件调度器运行一个事件时产生的信息。
- 在从服务器上启动从服务器进程时产生的信息。
日志一般位于数据目录下datadir 。错误日志的名称一般为 主机名.err 。
错误日志的配置
- log-error :是否启用错误日志。
- log-warnings:是否启用警告日志。
二进制日志
记录修改数据或有可能引起数据改变的MySQL语句。
日志的位置
使用--log-bin=[file_name]选项启动时,mysqld开始将数据变更情况写入日志文件。没有指定file_name值,默认名为主机名后跟“-bin”。若给出了文件名,但没包含路径,则问默认写入datadir指定的目录中。
日志的格式
MySQL5.5 中,二进制日志格式分为三种,通过--binlog-format设置:
STATEMENT
MySQL5.1 之前的版本都采用这种方式,日志中记录的都是语句。mysqlbinlog工具,可以清晰地看到每条语句的文本。这种格式的优点是日志记录清晰易读,日志量少,对IO影响小。缺点是在某些情况下slave的日志复制会出错。
ROW
MySQL 5.1.11之后,出现了这种新的日志格式。它将每一行的变更记录到日志中,而不是记录SQL语句。这种格式的优点是会记录每一行数据的变化细节,不会出现无法复制。缺点是日志量,对IO影响大。
MIXED
目前MySQL默认的日志格式。该格式混合了STATEMENT和ROW两种日志,避免两种各自的缺点,尽可能利用了两种的优点。默认情况下采用STATEMENT,特殊情况下使用ROW。
-
- 使用了DML语句。
- 使用了临时表。
- 使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不确定函数。这种函数在主从中的值不一定相同。
- 表的存储引擎为NDB,这时对于表的DML操作都会以ROW格式记录。
- 使用了INSERT DELAY语句。
- 使用了用户定义函数。
日志的读取
使用mysqlbinlog命令读取二进制日志。
日志的删除
对于OLTP系统,每条会生成大量的二进制日志。日志若长时间不清楚会浪费很大的磁盘空间。所以需要定期的清理二进制日志。
方法1
命令:RESTART MASTER;
该命令会删除所有的binlog日志。新日志编号重新从“000001”开始。
方法2
命令:PURGE MASTER LOGS TO 'mysql-bin.******';
该命令删除“******”编号之前所有的日志。
方法3
命令:PURGE MASTER LOGS BEFORE 'yyyy-mm-dd hh24:mi:ss';
该命令删除日志为“yyyy-mm-dd hh24:mi:ss”之前的所有日志。
方法4
设置参数expire_logs_days = # ,此参数的含义是设置日志的过期天数,过了指定的天数后,日志将会被自动删除,这样有利于DBA管理日志的工作量。
其他选项
--binlog-do-db=db_name
告诉主服务器,如果当前的数据库(即USE选定的数据库)是db_name,应将更新记录到二进制日志中。其它所有没有明显指定的数据库被忽略。
--binlog-ignore-db=db_name
告诉主服务器,如果当前的数据库(即USE选定的数据库)是db_name,不将更新保存到二进制日志中。
若数据库启动时使用选项--binlog-do-db=DB_A,使用语句“use DB_B”置DB_B为当前数据库,此时使用update语句修改DB_A的表数据时出现如下情况:
- 数据库DB_B不在允许binlog的列表内,该语句不写入二进制日志文件。
- 数据库DB_B在允许binlog的列表内,该语句写入二进制日志文件。
查询日志
MySQL默认不启用查询日志。查询日志不光会记录查询语句,同样也会增删改有相应记录。由于日志量非常大,浪费磁盘IO,所以一般不建议开启。
查询日志的格式是纯文本的,可以直接读取。
慢查询日志
慢查询日志可以记录长时间的查询。慢查询默认是关闭的,由于慢查询日志对系统性能的问题很有帮助,所以建议开启,并经常查看。
慢查询的时长,不是光指的是sql语句的查询时间。是从查询启动开启到结束的时长,任何因为阻塞而导致时间也会包含在内。例:因为表锁而导致sql语句超时。
有关慢查询日志功能的相关参数说明:
log-slow-queries
指定日志文件存放位置,该目录文件一定要有写的权限。可以不用设置,系统会给一个缺省的文件host_name-slow.log
long_query_time
SQL执行时间阈值,慢查询的单位为秒,可以精确到微秒。10.000000表示10秒整。
打开mysql的慢查询日志很简单,只需要在mysql的配置文件里的[mysqld]下面加上
log-slow-queries=mysql_slow.log long_query_time=3
慢查询日志用来收集那些花费太长时间(超过指定时间)执行的SQL语句,该指定时间由long_query_time服务器变量设定。
--log-slow-queries[=file_name]选项启动慢查询日志。如果没有给出file_name值,默认未主机名,后缀为“-slow.log”;如果给出文件名,但不是绝对路径名,文件则写入数据目录。
查询慢查询日志相关的常量
命令:show global variables like '%slow%';
若slow_query_log和log_slow_queries显示为on,那说明服务器的慢查询日志已经开启了。
slow_launch_time跟慢查询日志没有任何关系, 它代表的是thread create的一个阈值。
查询慢查询日志的阈值
命令:show global variables like 'long_query_time';
使用mysqldumpslow命令可以快速定位系统的SQL瓶颈。
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。
http://www.cnblogs.com/shijiaqi1066/p/3859866.html