MySQL的FLUSH语句实现mysql日志的轮询

2012年3月12日 发表评论 阅读评论

 通过mysqlmy.cnf文件可以设置mysql的日志。而日志文件如果长期不进行清理或回收,势必会造成日志文件越来越大,进而影响到mysql的性能。而利用rpm 包安装方式的自带有mysql日志的轮询刷新,通过源码包安装的一样能实现该功能。该功能的实现要通过flush命令和mysql自带脚本的修改来完成。(当然,二进制日志文件除外,因为系统自带了expire_logs_daysmax-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

 

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

    • 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其他方面的用法,我不想直接翻译了,直接拿个网上别人现成的吧!如下:

    MySQLFLUSH句法(清除或者重新加载内部缓存) 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 LOGSFLUSH MASTERFLUSH SLAVEFLUSH 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目录就行了。




    本站的发展离不开您的资助,金额随意,欢迎来赏!

    You can donate through PayPal.
    My paypal id: itybku@139.com
    Paypal page: https://www.paypal.me/361way

    分类: 数据库 标签:
    1. 本文目前尚无任何评论.