MYSQL日志文档维护

2008-02-23 07:43:34来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

在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

在Linux 中,最好用logrotate 来安装MySQL分发包中的mysql- log - rotate 脚本,而不是自己编写脚本。假如mysql-log-rotate 不通过RPM 文档自动安装,应查看MySQL分发包的support-files 目录。

由于服务器处理更新日志文档的方法不同,日志文档的循环在更新日志和常规日志之间稍有不同。假如告诉服务器使用没有扩展名的更新日志文档名(如up date),则服务器将使用顺序的up date . 0 0 1、update.002 等自动创建更新日志文档名。在服务器启动连同在日志刷新时,一个新的更新日志产生。假如您开启更新日志而没有指定文档名,服务器则使用主机名作为基名产生一个更新日志文档的序列。

当终止一个由这种方法生成的文档序列时,您或许想要根据其期限(最后被修改的时间)而非根据名字来终止他们。这样做的理由是由于您不知道flush-log 命令将在何时发布,因此您不能指望在任何给定的时间周期内创建固定数量的更新日志。例如,假如用mysqldump 备份表并使用--flush-logs 选项,在该更新日志名序列中的一个新文档随每个备份一同创建。

对于带有由服务器自动产生的顺序文档名的更新日志,基于日志期限的终止脚本类似如下:



find 命令定位并删除修改时间超过一个星期的更新日志文档。重要的是使用-name 参数来对一个数字的文档扩展名进行测试,以避免删除由错误的update 所指定的表。

还能够告诉服务器使用固定的更新日志文档名(假如希望的话),假如想用和常规日志相同的方法循环更新日志,这是有用的。要想使用固定的更新日志名,应指定一个包含扩展名的名字。例如,能够用--log-update=update.log 选项启动服务器来使用名字up date . l o g。服务器将一直关闭并在接收flush-logs 命令时打开该日志,但是服务器并不是每次都产生新的文档。在这种情况下,用于更新日志的日志循环脚本和用于常规日志的脚本仅在循环的文档基名上有所不同。

假如想自动执行日志循环和终止,可使用c r o n。假定循环常规日志和更新日志的脚本为rotate-logs 和r o t a t e - up date - l o g s,且安装在/usr/user/mysql/bin 目录中。以mysqlladm 用户进行注册,然后用以下命令编辑mysqladm 用户的crontab 文档: % crontab -e

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 使用MySql

下一篇: 需要避免的MYSQL客户机程式设计错误