MYSQL日志文件维护[组图]_MySQL

在MySQL服务器启动时,它检查其命令行的操作,来查看它是否应该执行登录并打开相应的日志文件(如果应该的话)。可以让服务器生成两种主要类型的日志文件:常规日志文件。它报告客户机的连接、查询和其他各种各样的事件。它对于跟踪服务器的活动很有用:谁正在连接、从哪里连接,以及他们正在做什么。

  更新日志

  它报告修改数据库的查询。在此上下文中的术语“更新”不只涉及UPDATE语句,还涉及修改数据库的所有语句。由于这个原因,它包含了对D E L E T E、INSERT、REPLACE、CREATE TABLE、DROP TABLE、GRANT 和REVOKE 的查询记录。更新日志的内容以SQL 语句的形式书写,这些语句用作对mysql的输入。如果在崩溃后必须恢复表的话,更新日志与备份是很有用的。您可以从备份文件中恢复数据库,然后通过将更新日志作为对mysql的输入,重新运行在该备份文件之后又修改数据库的任何查询。这样,可将表恢复到崩溃时刻的状态。

  为了使日志有效,可使用--log 选项开启常规日志,并用--log-update 选项开启更新日志。可以在mysqld.safe_mysqld 或mysql.server 的命令行中,或在某个选项的[mysqld] 组中指定这些选项。当日志有效时,日志文件在缺省时被写到服务器的数据目录中。

  笔者建议在首次使用MySQL时应使两种日志类型都有效。在获得一些使用MySQL的经验后,可能会只用更新日志来对付,以便减少磁盘空间的需求。

  在使日志有效后,要确保不用大量的日志信息将磁盘填满,尤其是如果服务器正在处理大量的查询话。可使用日志文件循环和截止时间,在避免日志文件无边界地增长的同时保持最近的几个日志是联机可用的。

  日志文件循环工作如下。假定日志文件名为l o g。在第一个循环中, log 被重新命名为l o g . 0,且服务器开始写新的l o g文件。在第二次循环中, log.0 被重命名为l o g . 1,log 重命名为l o g . 0,服务器开始写另一个新的log 文件。这样,每个文件循环通过名字l o g . 0、l o g . 1,等等。当文件到达循环的某一点时,可以终止它。

  更新日志和LOAD DATA 语句

  通常,当服务器执行LOAD DATE 语句时,它只将该语句本身而不是被加载的行内容写到更新日志中。这意味着除非该数据文件仍然保持可访问,否则使用更新日志的恢复操作将是不完整的。为了确保这一点的安全,除非数据库已经备份,否则不应该删除数据文件。

  系统备份

  更新日志对于数据库恢复并不是任何时候都好,如果一个磁盘崩溃导致您失去了更新日志的话,应确保您执行定期的文件系统备份。将更新日志写到与存储数据库不相同的磁盘中也是一个好主意。

  例如,如果您每天都循环日志,并且想保持一周的日志,则应保留log.0 到l o g . 6。在下一个循环中,将通过令log.5 覆盖log.6 使其成为新的log.6 来终止l o g . 6。这样,您就可以保留许多日志而又避免了它们超过磁盘的限度。

  日志循环频率和保持的旧日志数量将依赖于服务器的繁忙程度(活动的服务器产生更多的日志信息)以及您希望为旧日志投入多少磁盘空间。当循环常规日志时,可以用mysqla d - min flush-logs 命令告诉服务器关闭当前的日志文件并打开新的日志文件。

  执行常规日志循环的脚本类似如下(可修改它来反映您的日志基名和数据目录的位置,或许还有希望保留的旧日志的数量):

  最好从mysqladm 账号中运行此脚本以确保日志文件属于那个用户。如果在.my.cnf 选项文件中保留连接参数,您不需要在该脚本的mysqladmin 命令中指定任何参数。如果您不这样做的话可以建立一个受限用户,它除了发布刷新命令外什么也不做。然后可以以最小的风险在该脚本中放置这个用户的口令。如果想这样做,则该用户应只有RELOAD 权限。例如,要想调用用户flush 并分配一个口令f l us h pass,可使用下列GRANT 语句:

  GRANT RELOAD ON *.* TO flush@localhost IDENTIFIEDBY "flushpass"

  当需要在脚本中执行刷新操作时,可以这样做:

  mysqladmin -uflush -pflushpass flush -logs