MySQL详解--日志类型

 

 MySQL除了有些表类型会用到事务日志外,还使用了7种日志文件,这些日志文件都是可选项。

 

1. 二进制日志

二进制日志存储修改数据库中表数据的所有动作,包含了所有更新了数据或者已经潜在更新了数据的所有语句。潜在跟新了数据的SQL语句例如:无法匹配行的DELETE语句;设置列为当前值的UPDATE语句。除此之外,该日志还存储了语句执行期间耗时的相关信息。二进制日志文件以一种更有效并且是事务安全的方式包含更新日志中可用的所有信息。MySQL在执行语句之后,但在释放锁之前,马上将修改写入二进制日志中,

       使用--log-bin[=file_name]选项启动该日志类型,mysqld写入包含所有更新数据的SQL命令的日志文件。如果未给出file_name值,默认名为“HOSTNAME-bin.nnnnn”;如果给出了文件名,但没有包含路径,则文件被写入数据目录。如果在日志名中提供了扩展名(例如,--log-bin=file_name.extension),则扩展名被悄悄除掉并忽略。二进制日志文件名的.nnnn表示,mysqld在每个二进制日志名后面添加一个数字扩展名。每次启动服务器或刷新日志(flush logs)时该数字增加1。如果当前的日志大小达到设定的max_binlog_size,还会自动创建新的二进制日志。如果在该文件的末尾正使用大的事务,二进制日志还有肯呢个会超过max_binlog_size:事务全写入一个二进制日志中,绝对不要写入不同的二进制日志中。

      

--binlog-do-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的列表内,该语句写入二进制日志文件

 

--binlog-ignore-db=db_name

告诉主服务器,如果当前的数据库(USE选定的数据库)db_name,不将更新保存到二进制日志中。

如果数据库启动时使用选项--binlog-ignore-db=DB_A,使用语句“use DB_B”置DB_B为当前数据库,此时使用update语句修改DB_A的表数据时出现如下情况:

数据库DB_B不在允许binlog的列表内,该语句不写入二进制日志文件

数据库DB_B在允许binlog的列表内,该语句写入二进制日志文件

      

       综上所述,使用这个两个选项时决定是否将该语句写入日志文件还有参考当前数据库的属性,如果指定了这两个选项尽量使指定的数据库为当前数据库,才能按照逻辑来记录日志。但CREATE DATABASEALTER DATABASEDROP DATABASE等语句,有一个例外,即通过操作的数据库来决定是否应记录语句。

 

2. 调试日志

如果使用调试的方式来编译MySQL客户机或服务器,则可以生成一个调试日志文件。默认情况下,MySQL将调试日志写到/tmp/mysql.trace,也可以使用debug命令行选项来修改该位置。

 

3.     错误日志

该日志文件包含了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。可以用--log-error[=file_name]选项来指定mysqld保存错误日志文件的位置。

当使用mysqld_safe启动服务器时,该脚本自动在启动项上加上--log-error但没有加上file_name,或者直接在libexec目录下使用./mysqld --user=mysql  --log-error启动服务器,此时没有给定file_name值,mysqld将使用错误日志名host_name.err 并在数据目录中写入日志文件。

将错误信息写入错误日志文件的原理是,服务器将对标准错误输出重定向到该日志文件,所以如果不指定--log-error,错误被写入标准错误输出stderr,通常标准输出为你的终端。如果在程序中有printf等语句的话,这些函数打印出的信息也被写入该日志文件。

如果执行FLUSH LOGS,错误日志用-old重新命名后缀并且mysqld创建一个新的空日志文件。如第一次生成的错误日志为:linux-8tpn.err。执行该命令后将该文件重命名为:linux-8tpn.err-old

 

4.     MyISAM日志

该日志文件供MySQL开发小组使用该日志来调试MyISAM表处理器。使用--log-isam选项开启该日志类型,服务器在数据目录下创建myisam.log文件。

可以使用myisamlog使用程序从myisam.log文件中提取统计信息,除非用户正在调试MyISAM表处理器,否则对该日志可能不感兴趣。

下面为使用myisamlog的输出实例,暂不清楚各项是什么意思。

linux-8tpn:/home/mysql/var # myisamlog myisam.log

Commands   Used count    Errors   Recover errors

open               12         0                0

close               6         0                0

extra              53         0                0

Total              71         0                0

 

5.     查询日志

该日志文件记录服务器上所做的所有查询。可以使用--log[=file_name]-l [file_name]选项启动它。如果没有给定file_name的值, 默认名是host_name.log;如果file_name为绝对路径则在该目录下创建日志文件,否则在数据目录下创建该日志文件。

mysqld按照它接收的顺序而不是按照语句执行的顺序记录语句到查询日志。这就有可能与执行的顺序不同。与更新日志和二进制日志不同,它们在查询执行后,但是任何一个锁释放之前记录日志。(查询日志还包含所有语句,而二进制日志不包含只查询数据的语句)。

服务器重新启动和日志刷新不会产生新的一般查询日志文件(尽管刷新关闭并重新打开一般查询日志文件)。在所有日志类型中查询日志增长的最快,不要不间断的运行查询日志。

./mysqld, Version: 5.0.41-debug-log (Source distribution). started with:

Tcp port: 3306  Unix socket: /tmp/mysql.sock

Time                 Id Command      Argument

080406  2:05:52       1 Connect        root@localhost on mysql

                     1 Query          select * from user

080406  2:21:09       1 Query          desc user

080406  2:21:43       1 Query          select * from user a, user b where a.Host =  b.User

 

6.     慢查询日志

该日志类型用来收集那些花费太长时间(超过指定时间)执行的SQL语句,该指定时间由long_query_time服务器变量设定。用--log-slow-queries[=file_name]选项启动,如果没有给出file_name值,默认未主机名,后缀为-slow.log,如果给出了文件名,但不是绝对路径名,文件则写入数据目录。

慢查询日志可以用来找到执行时间长的查询,可以用于优化\,使用mysqldumpslow命令获得日志中显示的查询摘要来处理慢查询日志。

MySQL 5.1,通过--log-slow-admin-statements服务器选项,可以请求将慢管理语句,例如OPTIMIZE TABLEANALYZE TABLE ALTER TABLE写入慢查询日志。

MySQL 5.1的慢查询日志中,不使用索引的慢查询同使用索引的查询一样记录。要想防止不使用索引的慢查询记入慢查询日志,使用--log-short-format选项。

使用--log-long-format选项,可以把不使用索引的查询也加入到慢查询日志中。

注:

[1] 获得初使表锁定的时间不算作执行时间。

[2] 语句执行完并且所有锁释放后记入慢查询日志。记录顺序可以与执行顺序不相同

[3] 用查询缓存处理的查询不加到慢查询日志中,因为表有零行或一行而不能从索引中受益的查询也不写入慢查询日志

 

7.     更新日志

更新日志提供查询信息,但只有修改数据库内容的查询。使用--log-update服务器选项,开启更新日志。当启用该日志类型后,MySQL将在数据目录下创建一个名称为:HOSTNAME.nnn的文件。但在5.0以上的MySQL上使用该选项的时候,会有如下的提示:

080306 13:56:59 [ERROR] The update log is no longer supported by MySQL in version 5.0 and above. It is replaced by the binary log

       也就是说在MySQL V5.0以上,系统已经不在支持该日志类型,取而代之的是二进制日志。

 

posted on 2008-04-06 13:54  kevin.Tian  阅读(8610)  评论(0编辑  收藏  举报

导航