代码改变世界

Mysql的数据备份问题

2004-10-05 13:54  FantasySoft  阅读(1751)  评论(0编辑  收藏
        几乎一切的Web应用程序都离不开数据,而数据库又是数据的集中地,其健壮性和安全性是十分重要的。如果把整个应用程序比作大脑,那么数据库就像是大脑的记忆一样,一旦完全失去了记忆,大脑无疑也就瘫痪了。为了保证数据的安全性,一个健壮的Database Server是十分必要的,但是,再健壮的server也难免会有crash的时候,从而导致数据丢失,在这个时候,及时而有效的数据备份也显得格外重要了。做好数据备份能够最大程度地减少数据库服务器崩溃造成的损失。下面就以MySql为例讨论一下数据备份的问题。
        由于Mysql的数据文件是以二进制文件的方式存在的,你可以在Mysql/data/database目录下面找到database中所有表对应的数据文件,譬如database server中有一个命名为test的database,那么在Mysql/data/test目录下就存放着test包含的所有表对应的数据文件。因此,最简单的一种数据备份的方法就是直接将这些数据文件复制到另外一个目录下面。然而这种方法有很大的缺陷,一个就是如果在复制的过程,数据表正好被更新的话,那么数据的完整性就会被破坏了,同时这种方法对于支持事务的数据表(InnoDB)也不是很有效,因为对于支持事务的数据表的更新并不会马上反映到数据表中,如果这个时候去复制数据表文件,得到的副本也是不完备的。因此这种方法只能适用于数据表更新频率较低的情况。
        第二种数据备份的方法就是使用mysqldump命令,这个命令有着很长的一串可选参数。具体的信息可以参考Mysql Reference。
        如果只是SQL级别的备份,那么也可以使用第三种方法:利用SELECT INTO OUTFILE 或者BACKUP TABLE命令。
        由于自己对于数据备份了解甚少,这里仅是将数据备份的几种方法做了列举,有这方面经验的朋友多多指教了。我觉得真正意义上的数据备份,在数据完整性上的考虑是很多的,因此通常在数据备份之前,应该将数据表加上只读锁,等到备份完毕之后,再将锁去掉。如果是支持事务的数据表进行备份的话,为了保证数据完整性,对表进行加锁也是不够的(我也不知道该用什么办法)。总之,对数据进行备份是一件很麻烦的事情,现在也有很多软件解决了MySql数据备份的问题,只可惜都不是开源的,又要花大把的银子,很是头痛。