金穗农机指南

MySQL的日志基础知识及基本操作

admin 116

一、错误日志:ErrorLog

1、简介

错误日志是记录MySQL服务进程mysqld在启动/关闭或运行过程中遇到的错误信息。错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况下,错误日志存储在mysql数据库的数据文件中。错误日志文件通常的名称为。其中,hostname表示服务器主机名。

错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-error是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。

2、log-error参数配置

vi/data/3306/

[mysqld_safe]

log-error=/data/3306/mysql_

二、查询日志:QueryLog

1、简介

(1)普通查询日志(GeneralQueryLog)

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

(2)慢查询日志(SlowQueryLog)

慢查询日志是用来记录执行时间超过指定时间(Long_Query_Time)的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。

(3)查看与log相关的参数

showvariableslike'%_log%';

+-----------------------------------------+-------------------------------+

|Variable_name|Value|

+-----------------------------------------+-------------------------------+

|back_log|600|

|binlog_cache_size|1048576|

|binlog_direct_non_transactional_updates|OFF|

|binlog_format|STATEMENT|

|binlog_stmt_cache_size|32768|

|expire_logs_days|7|

|general_log|OFF|

|general_log_file|/data/3306/data/3306.log|

|innodb_flush_log_at_trx_commit|2|

|innodb_locks_unsafe_for_binlog|OFF|

|innodb_log_buffer_size|2097152|

|innodb_log_file_size|4194304|

|innodb_log_files_in_group|3|

|innodb_log_group_home_dir|./|

|innodb_mirrored_log_groups|1|

|max_binlog_cache_size|1048576|

|max_binlog_size|2097152|

|max_binlog_stmt_cache_size|709547520|

|max_relay_log_size|0|

|relay_log|/data/3306/relay-bin|

|relay_log_index||

|relay_log_info_file|/data/3306/|

|relay_log_purge|ON|

|relay_log_recovery|OFF|

|relay_log_space_limit|0|

|slow_query_log|OFF|

|slow_query_log_file|/data/3306/data/3306-|

|sql_log_bin|ON|

|sql_log_off|OFF|

|sync_binlog|0|

|sync_relay_log|0|

|sync_relay_log_info|0|

+-----------------------------------------+-------------------------------+

2、设置普通查询日志

(1)开启普通查询日志

setglobalgeneral_log=ON;

(2)查看参数是否生效

showvariableslike'%general_log%';

+------------------+--------------------------+

|Variable_name|Value|

+------------------+--------------------------+

|general_log|ON|

|general_log_file|/data/3306/data/3306.log|

+------------------+--------------------------+

(3)查看日志内容

a、执行SQL语句

select*;

createdatabaseddd;

b、查看日志内容

cat/data/3306/data/3306.log

Tcpport:3306Unixsocket:/data/3306/

TimeIdCommandArgument

17042513:38:209Queryshowvariableslike'%general_log%'

17042513:41:559Queryselect*

17042513:45:169Querycreatedatabaseddd

17042513:45:179Quit

17042513:45:2110Connectroot@localhoston

10Queryselect@@version_commentlimit1

(4)关闭普通查询日志

setglobalgeneral_log=OFF;

3、设置慢查询日志

(1)在配置文件中加入慢查询参数

vi/data/3306/

[mysqld_safe]

long_query_time=1

log-slow-queries=/data/3306/

log_queries_not_using_indexes

(2)查看参数

showvariableslike'lo%';

+---------------------------------+---------------------------------+

|Variable_name|Value|

+---------------------------------+---------------------------------+

|local_infile|ON|

|lock_wait_timeout|31536000|

|locked_in_memory|OFF|

|log|OFF|

|log_bin|ON|

|log_bin_trust_function_creators|OFF|

|log_error|/data/3306/mysql_|

|log_output|FILE|

|log_queries_not_using_indexes|OFF|

|log_slave_updates|OFF|

|log_slow_queries|OFF|

|log_warnings|1|

|long_query_time|1.000000|

|low_priority_updates|OFF|

|lower_case_file_system|OFF|

|lower_case_table_names|1|

+---------------------------------+---------------------------------+

三、二进制日志:BinaryLog

1、简介

记录数据被修改的相关信息,由参数log-bin指定位置和文件名。

2、查看binlog参数

showvariableslike'%log_bin';

+---------------+-------+

|Variable_name|Value|

+---------------+-------+

|log_bin|ON|临时在binlog不记录sql语句的日志

+---------------+-------+

3、binlog日志的三种级别

(1)StatementLevel(SQL语句级别,默认)

a、作用

每一条会修改数据的sql都会记录在binlog中。

b、优点

不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。)

c、缺点

由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同的结果。另外mysql的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(如sleep()函数,last_insert_id(),以及user-definedfunctions(udf)会出现问题).

使用以下函数的语句也无法被复制:

*LOAD_FILE()

*UUID()

*USER()

*FOUND_ROWS()

*SYSDATE()(除非启动时启用了--sysdate-is-now选项)

同时在INSERTSELECT会产生比RBR更多的行级锁

(2)RowLevel(行级模式)

a、作用

不记录sql语句上下文相关信息,仅保存哪条记录被修改。

b、优点

binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题

c、缺点

所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行altertable之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。

(3)MixedLevel(混合模式,官方推荐)

是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中队rowlevel模式也被做了优化,并不是所有的修改都会以rowlevel来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更

4、调整binlog日志的模式

(1)设置方法

a、方法一:修改配置文件

vi/data/3306/

binlog_format="STATEMENT"

binlog_format="MIXED"

b、方法二:在线修改

(i)运行时生效

setsessionbinlog_format='STATEMENT';

setsessionbinlog_format='ROW';

setsessionbinlog_format='MIXED';

(ii)全局生效

setglobalbinlog_format='STATEMENT';

setglobalbinlog_format='ROW';

setglobalbinlog_format='MIXED';

(2)查看当前binlog日志模式(默认为STATEMENT)

showvariableslike'%binlog_format%';

+---------------+-----------+

|Variable_name|Value|

+---------------+-----------+

|binlog_format|STATEMENT|

+---------------+-----------+

(3)在线设置为RowLevel模式

a、设置

setglobalbinlog_format='ROW';

b、查看修改后的结果,发现没有改变

showvariableslike'%binlog_format%';

+---------------+-----------+

|Variable_name|Value|

+---------------+-----------+

|binlog_format|STATEMENT|

+---------------+-----------+

c、退出,重进

quit;

mysql-uroot-p'123456'-S/data/3306/

d、再次查询

showvariableslike'%binlog_format%';

+---------------+-------+

|Variable_name|Value|

+---------------+-------+

|binlog_format|ROW|

+---------------+-------+

(4)查看RowLevel模式效果

a、刷新日志,切换binlog

flushlogs;

b、更新表中数据

updatestudentsetname='cc'whereid=3;

c、查看binlog内容

mysqlbinlog--base64-output=

17042519:46:00。。。Table_map:`test`.`student`mappedtonumber35

UPDATE`test`.`student`

@1=3

SET

@2='cc'

17042519:46:00serverid1_log_pos296Xid=68

COMMIT/*!*/;

d、查看binlog中的ROWLevel内容,必须用--base64-output=decode-rows-v才会正确显示