MySQL下FLUSH命令mysql日志的轮询

作者:袖梨 2022-11-14


通过mysql的my.cnf文件可以设置mysql的日志。而日志文件如果长期不进行清理或回收,势必会造成日志文件越来越大,进而影响到mysql的性能。而利用rpm 包安装方式的自带有mysql日志的轮询刷新,通过源码包安装的一样能实现该功能。该功能的实现要通过flush命令和mysql自带脚本的修改来完成。(当然,二进制日志文件除外,因为系统自带了expire_logs_days和max-binlog-size参数进行设置,并且二进制文件为系统数据恢复时的重要文件,不建议使用该方式进行配置,如果有其他备份策略也可以使用该方式进行轮询)

Flush命令的用法如下:

mysql> help flush;

Name: 'FLUSH'

Description:

Syntax:

FLUSH [NO_WRITE_TO_BINLOG | LOCAL]

flush_option [, flush_option] ...

…………

The RESET statement is similar to FLUSH. See [HELP RESET], for

information about using the RESET statement with replication.

URL: http://dev.mysql.com/doc/refman/5.5/en/flush.html

从上面的英文帮助文档中可以查看mysql的flush命令和日志相关的用法。

BINARY closes and reopens the binary log files.
ENGINE closes and reopens any flushable logs for installed storage engines. Currently, this causes InnoDB to flush its logs to disk and perform a checkpoint.
ERROR closes and reopens the error log file.
GENERAL closes and reopens the general query log file.
RELAY closes and reopens the relay log files.
SLOW closes and reopens the slow query log file.
The log_type options were added in MySQL 5.5.3.

关于flush其他方面的用法,我不想直接翻译了,直接拿个网上别人现成的吧!如下:

MySQL的FLUSH句法(清除或者重新加载内部缓存) FLUSH flush_option [,flush_option],如果你想要清除一些MySQL使用内部缓存,你应该使用FLUSH命令。为了执行FLUSH,你必须有reload权限。
flush_option 可以是下列任何东西:

HOSTS 这个用的最多,经常碰见。主要是用来清空主机缓存表。如果你的某些主机改变IP数字,或如果你得到错误消息Host ... isblocked,你应该清空主机表。当在连接MySQL服务器时,对一台给定的主机有多于 max_connect_errors个错误连续不断地发生,MySQL为了安全的需要将会阻止该主机进一步的连接请求。清空主机表允许主机再尝试连接。

LOGS 关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。

PRIVILEGES 这个也是经常使用的,每当重新赋权后,为了以防万一,让新权限立即生效,一般都执行一把,目地是从数据库授权表中重新装载权限到缓存中。

TABLES 关闭所有打开的表,同时该操作将会清空查询缓存中的内容。

FLUSH TABLES WITH READ LOCK 关闭所有打开的表,同时对于所有数据库中的表都加一个读锁,直到显示地执行unlock tables,该操作常常用于数据备份的时候。

STATUS 重置大多数状态变量到0。

MASTER 删除所有的二进制日志索引文件中的二进制日志文件,重置二进制日志文件的索引文件为空,创建一个新的二进制日志文件,不过这个已经不推荐使用,改成reset master 了。可以想象,以前自己是多土啊,本来一条简单的命令就可以搞定的,却要好几条命令来,以前的做法是先查出来当前的二进制日志文件名,再用purge 操作。

QUERY CACHE 重整查询缓存,消除其中的碎片,提高性能,但是并不影响查询缓存中现有的数据,这点和Flush table 和Reset Query Cache(将会清空查询缓存的内容)不一样的。

SLAVE 类似于重置复制吧,让从数据库忘记主数据库的复制位置,同时也会删除已经下载下来的relay log,与Master一样,已经不推荐使用,改成Reset Slave了。这个也很有用的。

一般来讲,Flush操作都会记录在二进制日志文件中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不会记录,因此上述操作如果记录在二进制日志文件中话,会对从数据库造成影响。注意:Reset操作其实扮演的是一个Flush操作的增强版的角色。

Mysql自的带的日志轮询脚本位于源码包的support-files目录中————mysql-log-rotate.sh文件。

具体操作如下(query日志为例):

先将query_log.log文件mv

[root@localhost logs]# ll

total 32

-rw-rw---- 1 mysql mysql 1 Mar 12 14:28 mysql.err

-rw-rw---- 1 mysql mysql 6 Mar 5 15:44 mysql.pid

-rw-rw---- 1 mysql mysql 1015 Mar 12 15:32 query_log.log

-rw-rw---- 1 mysql mysql 704 Mar 5 15:44 slow.log

[root@localhost logs]# mv query_log.log query_log.log.1

登陆mysql命令界面下,执行如下操作

mysql> flush general logs;

Query OK, 0 rows affected (0.06 sec)

注:这一步分关键,也容易错,我之前进行flush general操作老是出错,后来看了官方的文档后,才发现后面少了logs。

下面再看下日志文件

[root@localhost logs]# ll

total 40

-rw-rw---- 1 mysql mysql 1 Mar 12 14:28 mysql.err

-rw-rw---- 1 mysql mysql 6 Mar 5 15:44 mysql.pid

-rw-rw---- 1 mysql mysql 176 Mar 12 15:38 query_log.log

-rw-rw---- 1 mysql mysql 1285 Mar 12 15:38 query_log.log.1

-rw-rw---- 1 mysql mysql 704 Mar 5 15:44 slow.log

[root@localhost logs]# cat query_log.log

/usr/local/mysql/bin/mysqld, Version: 5.5.21-log (Source distribution). started with:

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

Time Id Command Argument

关于使用轮询脚本时的注意点:

/data/mysql/mysqld.log {

# create 600 mysql mysql

notifempty

daily

rotate 3

missingok

compress

postrotate

# just if mysqld is really running

if test -x /usr/local/mysql/bin/mysqladmin &&

/usr/local/mysql/bin/mysqladmin ping &>/dev/null

then

/usr/local/mysql/bin/mysqladmin flush-logs

fi

endscript

}

上面脚本中的二处在设置密码后进运行时会报错的,因为其要使用密码的直持。具体为:

/usr/local/mysql/bin/mysqladmin –uroot-ptest ping (其中用户名为root,密码为test)

/usr/local/mysql/bin/mysql -uroot -ptest -e "flush general logs"

设置完成后将该脚本放到/etc/logrotate.d目录就行了。

相关文章

精彩推荐