MYSQL教程:日志文件管理
有关MySQL的日志文件前面章节已简要讨论过了,主要有四种日志文件,分别是常规查询日志、慢查询日志、变更查询日志和二进制变更日志。这些日志文件的创建需在启动服务器时用选项指定。
本文由IT教学网(http://www.itjxue.com)整理发布!转载请注明出处,谢谢!
Table 4.3. 日志启动选项
启动选项 | 激活日志 |
---|---|
--log[=file_name] | 常规日志文件 |
--log-bin[=file_name] | 二进制变更日志文件 |
--log-bin-index=file_name | 二进制变更日志文件索引文件 |
--log-update[=file_name] | 变更日志文件 |
--log-slow-queries[=file_name] | 慢查询日志文件 |
--log-isam[=file_name] | ISAM/MyISAM日志文件 |
--log-long-format | 设置慢查询日志和变更日志的格式 |
BDB和InnoDB数据表的日志文件会自动创建不用指定选项。但可用以下选项指时日志文件的存放路径。
Table 4.4. BDB和InnoDB数据表日志选项
启动选项 | 用途 |
---|---|
--bdb-logdir=dir_name | 存放BDB日志文件的位置 |
--innodb-log_arch_dir=dir_name | 存放InnoDB日志文件的归档目录 |
--innodb_log_group_home_dir=dir_name | 存放InnoDB日志文件的位置 |
MySQL日志文件选项可在mysqld和mysqld_safe脚本中使用,也可在选项文件my.cnf的[mysqld]中使用。推荐在选项文件中使用,因为每次启动服务器的日志选项基本上都是一致的。
日志的刷新可用mysqladmin flush-logs命令或flush logs语句实现。另外,对MySQL服务器发送一条SIGHUP信号也会刷新日志。错误日志和DBD/InnoDB日志不能用以上方法刷新。
错误日志记录MySQL数据库系统的论断和出错信息,由mysqld_safe脚本创建,文件名默认为hostname.err,也可通过--err-log或选项文件的err-log语句指定另外的名字。如果直接用mysqld程序启动服务器,错误信息会直接输出到输出设备,也就是屏幕。但我们可用重定向方法把错误信息输出到其它地方,如把错误信息输出到/var/log/mysql.err文件中,可以执行以下语句:
% mysqld > /var/log/mysql.err 2>&1 &
在windows平台下,MySQL服务器默认把诊断信息写到数据目录的mysql.err文件中,并且不允许另外指定错误日志文件名。如在启动MySQL服务器时给出了--console选项,则MySQL会把诊断信息输出到控制台窗口而不创建错误日志。但如MySQL是作为一个服务运行,则--console选项不起作用。
4.5.1. 日志失效处理
在服务器正常运行中,会产生大量的日志文件。我们要对这些日志文件进行失效管理,以节省磁盘空间和方便查询。进行日志失效处理的方式主要有以下几种:
-
日志轮转。该方法适用于常规查询日志和慢查询日志这些文件名固定的日志文件,在日志轮转时,应进行日志刷新操作(mysqladmin flush-logs命令或flush logs语句),以确保缓存在内存中的日志信息写入磁盘;
日志轮转的操作过程是这样的:第一次轮转时,把log更名为log.1,然后服务器再创建一个新的log文件,在第二轮转时,再把log.1更名为log.2,把log更名为log.1,然后服务器再创建一个新的log文件。如此循环,创建一系列的日志文件。当到达日志轮转失效位置时,下次轮转就不再对它进行更名,直接把最后一个日志文件覆盖掉。例如:如果每天进行一次日志轮转并想保留最后7天的日志文件,就需要保留log.1--log.7共七个日志文件,等下次轮转时,用log.6覆盖原来的log.7成新的log.7,原来的log.7就自然失效。下面是一个失效处理的shell脚本,以供参考:
#!/bin/sh # shell script --- rotate_log.sh if [ $# -ne 1 ]; then echo "Usage: $0 logname" 1>&2 exit 1 if logfile=$1 mv $logfile.6 $logfile.7 mv $logfile.5 $logfile.6 mv $logfile.4 $logfile.5 mv $logfile.3 $logfile.4 mv $logfile.2 $logfile.3 mv $logfile.1 $logfile.2 mv $logfile $logfile.1 mysqladmin -u flush -pflushpass flush-logs #执行mysqladmin flush-logs会打开一个日志文件----重新生成一个新的日志文件
该脚本以日志文件名为参数,执行方法如下:
% rotate_log.sh /usr/local/mysql/data/log
注意,脚本中的mysqladmin命令是带有-u和-p参数的,因为我们进行日志刷新时需连接服务器。为确保安全,我们建立一个flush用户,密码为flushpass。该用户只有日志刷新的权限(reload权限)。创建该用户的语句如下:
GRANT RELOAD ON *.* TO 'flush'@'localhost' IDENTIFIED BY 'fulshpass';
设置好后,我们就可利用系统的自动处理机制定期运行该脚本以生成轮转日志。在Linux系统上的MySQL发行版中带有一个用来安装mysql-log-rotate日志轮转脚本的logrotate工具,如用RPM安装,则在/usr/share/mysql目录,如用二进制方式安装,则在MySQL安装目录的support-files目录,如用源码安装,则在安装目录的share/mysql目录中。
在windows平台下,不能在线更名,需停掉服务器,再进行。下面是一个进行日志更名的批处理文件:
@echo off REM script name : rotate_log.bat if not "%1" == "" goto ROTATE @echo Usage: rotate_log logname goto DONE :ROTATE set logfile=%1 erase %logfile%.7 rename %logfile%.6 %logfile%.7 rename %logfile%.5 %logfile%.6 rename %logfile%.4 %logfile%.5 rename %logfile%.3 %logfile%.4 rename %logfile%.2 %logfile%.3 rename %logfile%.1 %logfile%.2 rename %logfile% %logfile%.1 :DONE
该脚本的执行方法如下:
c:\rotate_log c:\mysql\data\log
-
以时间为依据对日志进行失效处理。该方法将定期删除超过给定时间的日志文件,适用于变更日志和二进制日志等文件名用数字编号标识的日志文件。下面是一个用Perl写成的处理脚本:
#!/usr/bin/perl -w # script name: expire_log.pl # Usage: expire_log.pl logfile ... use strict die "Usage: $0 logfile ...\n" if @ARGV == 0; my $max_allowed_age = 7; #max allowed age in days foreach my $file (@ARGV) #chack each argument { unlink ($file) if -e $file && -M $file >= $max_allowed_age; } exit(0);
该脚本需提供一个将被轮转的日志文件名作为参数,如:
% expire_log.pl /usr/local/mysql/data/log.[0-9]*
在给脚本参数时请小心,如给出*为参数,则会删除目录中所有更新时间大于7天的文件。 -
镜像机制。把日志文件镜像到所有的从服务器上。要使用镜像机制,你必须知道主服务器有多少个从服务器,哪些正在运行,并需依次连接每一个从服务器并发出show slave status语句以确定它正处理主服务器的哪个二进制日志文件(语句输出列表的Master_Log_File项),只有所有的从服务器都不会用到的日志文件才能删除。删除方法是在主服务器上发出以下语句:
mysql> PURGE MASTER LOGS TO 'last_log.xx';
上面语句中的last_log.xx是所有从服务器已处理的最小编号日志文件。