MySQL数据库的维护处理

一、维护,主要是日志记录在维护中的处理,日志记录文件一般保存在与数据文件相同的目录之中,好比:Unix系统中的/usr/local/mysql/var或是/usr/local/mysql/data,在Windows中则是c:\mysql\data目录,日志记录分为如下几类:mysql


1、错误日志:保存了服务器上发生的每一个错误的记录;若是须要激活错误日志,添加--log-error选项到服务器启动命令行或选项文件中,好比:sql

[root@host175 ~]# /etc/rc.d/init.d/mysqld start --log-error数据库

Starting MySQL                                             [  OK  ]缓存

这个日志的文件名通常是以.err为结尾的。好比我机器上的host175.err,以下蓝色字体标记的:安全

[root@host175 ~]# ls /usr/local/mysql/var/服务器

WorkDB                ibdata1           mysql-bin.000008  mysql-bin.000017socket

greedland             mysql             mysql-bin.000009  mysql-bin.000018工具

host.test.com.err     mysql-bin.000001  mysql-bin.000010  mysql-bin.000019性能

host.test.com.pid     mysql-bin.000002  mysql-bin.000011  mysql-bin.000020字体

host175.err           mysql-bin.000003  mysql-bin.000012  mysql-bin.000021

host175.test.com.err  mysql-bin.000004  mysql-bin.000013  mysql-bin.000022

host175.test.com.pid  mysql-bin.000005  mysql-bin.000014  mysql-bin.000023

ib_logfile0           mysql-bin.000006  mysql-bin.000015  mysql-bin.index

ib_logfile1           mysql-bin.000007  mysql-bin.000016  test

具体内容以下,这是一部分:

[root@host175 ~]# more /usr/local/mysql/var/host175.err

081211 17:03:35  InnoDB: Started; log sequence number 0 43665

081211 17:03:35 [Note] /usr/local/mysql/libexec/mysqld: ready for connections.

Version: '5.0.40-log'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution

好像也记录了一些启动信息,固然我这里没有错误消息,而是一些指示性消息。


2、查询日志:这是另一个有用的日志,由于这里保存了客户机发给服务器的每一个查询的踪影,还能够显示客户机链接服务器以及这些客户机所做操做的细节内容。如果但愿监控以排错为目的的活动,就应该激活查询日志选项--log,也是加在服务器启动命令行或选项文件中,以下:

[root@host175 ~]# /etc/rc.d/init.d/mysqld start --log

Starting MySQL                                             [  OK  ]

这个日志的文件名是主机名加.log扩展名的格式,好比我机器上的host175.log,下面蓝色字体标记的文件名:

[root@host175 ~]# ls /usr/local/mysql/var/

WorkDB             host175.err           ib_logfile0  mysql-bin.000001

mysql-bin.000005  mysql-bin.000009  mysql-bin.000013  mysql-bin.000017

mysql-bin.000021  mysql-bin.index   greedland          host175.log           ib_logfile1  mysql-bin.000002  mysql-bin.000006  mysql-bin.000010

mysql-bin.000014  mysql-bin.000018  mysql-bin.000022  test

host.test.com.err  host175.test.com.err  ibdata1      mysql-bin.000003

mysql-bin.000007  mysql-bin.000011  mysql-bin.000015  mysql-bin.000019

mysql-bin.000023  host.test.com.pid  host175.test.com.pid  mysql


查询日志部份内容示例以下:

[root@host175 ~]# more /usr/local/mysql/var/host175.log

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

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

Time                 Id Command    Argument

081211 17:22:52       1 Connect     Access denied for user 'fuhao'@'localhost' (using password: NO)

081211 17:23:12       2 Connect     Access denied for user 'root'@'localhost' (using password: YES)

081211 17:23:19       3 Connect     root@localhost on WorkDB

                      3 Query       select @@version_comment limit 1

081211 17:23:24       3 Query       show tables

081211 17:23:31       3 Query       select * from users

这里面对每个操做记录的很详细。


3、慢查询日志:这文件中记录了超过预先设定时间量(根据long_query_time变量肯定)的全部查询,任何超过这个值的查询都将列在这个日志文件中。如果须要查找优化性能的办法,能够查查这里的问题。

咱们能够以下这样查看long_query_time变量的值:

mysql> show variables like 'long_query_time';

+-----------------+-------+

| Variable_name   | Value |

+-----------------+-------+

| long_query_time | 10    |

+-----------------+-------+

1 row in set (0.00 sec)

我这里的缓存查询时间限制设置是10秒,也就是说查询超过10秒的都会在这个慢查询日志中记录下来;


慢查询日志使用--log-slow-queries选项来激活,以下所示:

[root@host175 ~]# /usr/local/mysql/share/mysql/mysql.server start --log-slow-queries

Starting MySQL                                             [  OK  ]

该日志的默认文件名是主机名后带-slow的后缀以及.log扩展名,好比下面蓝色字体所标记的:

[root@host175 ~]# ls /usr/local/mysql/var/

WorkDB             host175.err           ib_logfile1       mysql-bin.000003

mysql-bin.000008  mysql-bin.000013  mysql-bin.000018  mysql-bin.000023

greedland          host175.log           ibdata1           mysql-bin.000004

mysql-bin.000009  mysql-bin.000014  mysql-bin.000019  mysql-bin.000024

host.test.com.err  host175.test.com.err  mysql             mysql-bin.000005

mysql-bin.000010  mysql-bin.000015  mysql-bin.000020  mysql-bin.000025

host.test.com.pid  host175.test.com.pid  mysql-bin.000001  mysql-bin.000006

mysql-bin.000011  mysql-bin.000016  mysql-bin.000021  mysql-bin.index

host175-slow.log   ib_logfile0


具体的文件内容格式以下:

[root@host175 ~]# more /usr/local/mysql/var/host175-slow.log

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

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

Time                 Id Command    Argument

因为我这里不可能有超过10秒的查询因此下面就没数据了。


4、更新日志:记录了改变具体表的全部查询。与update、create table和drop table同时使用的insert、replace、delete、grant和revoke语句都属于改变具体表的查询,可是select语句不是。

要让服务器写更新日志必须在服务器启动时带选项--log-update,好比:

[root@host175 ~]# /usr/local/mysql/share/mysql/mysql.server start --log-update

Starting MySQL                                             [  OK  ]

若是须要从新构建一个表,可是该表在最近一次备份以后又进行了修改,这个日志能够发挥做用。在数据库受到破坏的状况下,能够根据备份进行恢复,而后按照更新日志从新建立记录到查询,这样能够把系统恢复到受破坏以前的情况。


5、二进制更新日志:在版本3.23.14之后版本支持,这是一种更为有效的保存日志数据的格式,它比标准更新日志记录得更详细,名为mysqlbinlog实用程序能够把二进制日志文件转换回文本文件格式从而能够进行阅读。

在启动MySQL时使用--log-bin选项能够建立二进制更新日志文件,好比:

[root@host175 ~]# /usr/local/mysql/share/mysql/mysql.server start --log-bin

Starting MySQL                                             [  OK  ]

这个日志文件的默认文件名是主机名加-bin后缀,而后有一个分辨日志顺序的数字。


发现个问题,我在5.0.40-log版本的MySQL中的二进制日志文件不是上面说的那样的文件名而是mysql-bin后面再带一个分辨日志顺序的数字,好比下面蓝色字体标记的:

[root@host175 ~]# ls /usr/local/mysql/var/

WorkDB             host175.err           ib_logfile1       mysql-bin.000003

可使用mysql>flush logs;命令刷新日志,即关闭当前日志并使用一个新的顺序编号建立新日志。


特别注意:如果设置了主副服务器以便进行复制,必须启动二进制更新日志。


6、日志截止与循环:若是服务器很忙,日志很快就会变得很大甚至充满整个磁盘,因此日志必须经过截止日期和循环进行管理,确保日志成为你的助手而不是累赘。

日志循环是经过建立一个日志文件的有限数字实现,而后进行覆盖替换,这样每次都会剔除最旧的文件。常见的方式是天天建立新日志,在一个循环中使用7轮,每轮为一周中的一天。

若是使用的是数字编码的日志文件,编号后的日志能够设置截止日期来进行管理,截止日期一到,这些文件将被删除或归档,这就是日志截止。

以上两方法的具体实现能够参考MySQL手册。


二、检查和修理表:


1、检查表错误:使用命令myisamchk table-file-name,因为myisamchk须要专门访问该表因此最好在运行以前让服务器脱机或是停机;一个检查的具体例子:

[root@host175 ~]# /usr/local/mysql/bin/myisamchk -e /usr/local/mysql/var/WorkDB/users

Checking MyISAM file: /usr/local/mysql/var/WorkDB/users

Data records:       1   Deleted blocks:       0

- check file-size

- check record delete-chain

- check key delete-chain

- check index reference

- check data record references index: 1

- check data record references index: 2

- check records and index references

这是一个带-e参数的最慢速度、最完整的扩展选项检查,若是使用扩展选项检查没有发现错误就能够肯定该表没有问题。

myisamchk的缺点是在进行检查时会锁定客户端,可是客户端却不能在运行myisamchk时锁住被检查表,在比较大的表中,这样的检查可能要花费数分钟的时间,这可能会致使一些问题。有两个替代方法:

第一,设置myisamchk可使用很大的缓存空间,可使用myisamchk --help查看修改不一样缓存空间的选项;

第二,使用不一样的方法检查表,好比:check table table-name,以下所示:

mysql> check table users;

+--------------+-------+----------+----------+

| Table        | Op    | Msg_type | Msg_text |

+--------------+-------+----------+----------+

| WorkDB.users | check | status   | OK       |

+--------------+-------+----------+----------+

1 row in set (0.00 sec)

这种方法中还能够在check table命令中添加关键字FAST、MEDIUM、EXTENDED和CHANGED,以便执行但愿使用的检查种类。

第三,经常使用myisamchk而不是check table命令的缘由是,在使用check table命令是MySQL服务器承担了全部工做,如果服务器关闭,check table命令就无法使用了;而myisamchk在文件级工做,即便服务器关闭也能工做,而且不给MySQL服务器带去额外压力。myisamchk不能在InnoDB和BDB表上工做,在这些类型的表上面须要使用check table命令。


2、修理表:

myisamchk工具还能够用来修理被毁坏的表,使用-r选项加表名就能够开始修复过程,即:

myisamchk -r table-name

还有其余修复选项,其中-r是修理和恢复,属于标准恢复方法;

-o是恢复的安全模式,属于慢速、彻底恢复方法;

-q是快速恢复方法,只检查索引,不检查数据文件。

因为myisamchk在文件级工做,因此在操做时须要全部锁被删除而且全部客户被排除才行。


在检查表时,首先尝试最快的选项-F,若是不行再使用比较慢的选项-m,最后再考虑最慢的彻底的检查选项-e。若是在运行最强的修复可能性后问题仍然存在,那么将不得不从备份文件恢复该表了。


修复表可用的另外一个选项是repair table命令,格式:repair table table-name,....

还可使用选项QUICK或EXTENDED关键字来设置修复类型,好比:

mysql>repair table users QUICK;


3、优化表:

使用命令optimize table table-name,....,这个命令的做用就好像母亲整理你的房间,除了抛弃旧的、被删除的文件之外,还能够排序有索引的文件,把变量表行的内容设置到连续空间中,更新统计信息,可是必须注意,这个表已经被锁定,在进行操做时不能被客户端访问。

相关文章
相关标签/搜索