6.3 备份数据库

使用数据库的备份功能是保护数据有效措施。通常,可以使用下列两种方式来备份数据库:

(1)使用mysqldump程序备份数据库;

(2)直接拷贝数据文件;

6.3.1 使用mysqldump备份

当使用mysqldump程序产生数据库备份文件时,文件内容包含CREATE TABLE语句(这些语句用户创建被备份的表),以及表中数据的INSERT语句(创建表中的数据)。换句话说,mysqldump创建的备份文件,在恢复数据时,可作为mysql的输入使用,以重建数据库。

1.备份整个数据库到文件

通过示例来说明。例如,可以通过下面命令,将整个student_course数据库备份到文本文件student_course_bak.txt中:

    % mysqldump student_course>D:\DataBackup\student_course_bak.txt

查看所生成的文本文件,除注释信息外,其内容包含一些列CREATE TABLE语句和INSETY语句,类似于:

    -- MySQL dump 9.08
    --
    -- Host: localhost    Database: student_course
    ---------------------------------------------------------
    -- Server version 4.0.14-nt
    --
    -- Table structure for table 'courses'
    --
    CREATE TABLE courses (
      cid int(11) NOT NULL default '0',
      cname varchar(50) NOT NULL default '',
      ccredit int(11) NOT NULL default '0',
      cteacher varchar(50) default NULL
    ) TYPE=MyISAM;
    --
    -- Dumping data for table 'courses'
    --
    INSERT INTO courses VALUES (1,'C语言',3,'李老师');
    …
    --
    -- Table structure for table 'stu_cou'
    --
    CREATE TABLE stu_cou (
      sid int(11) NOT NULL default '0',
      cid int(11) NOT NULL default '0',
      score int(11) NOT NULL default '0'
    ) TYPE=MyISAM;
    --
    -- Dumping data for table 'stu_cou'
    --
    INSERT INTO stu_cou VALUES (1,1,88);
    …
    --
    -- Table structure for table 'students'
    --
    CREATE TABLE students (
      sid int(11) NOT NULL default '0',
      sname varchar(50) NOT NULL default '',
      sgender char(2) default NULL,
      sage int(11) default NULL
    ) TYPE=MyISAM;
    --
    -- Dumping data for table 'students'
    --
    INSERT INTO students VALUES (1,'张三','男',21);
    …

2.备份部分表到文件

如果数据库数据量太大,则数据备份文件也将是极大的,管理起来非查困难。可以通过备份部分表的内容来解决这个问题,这个操作将该备份文件分成更小的、更多的、易于管理的多个文件。

下面的例子将说明如何将student_course中的students和courses表转储到两个不同的单独文件中:

    % mysqldump student_course students courses>D:\DataBackup\students_and_courses.sql

3.备份数据到另一个服务器

如果需要将一个数据库直接备份到另一个服务器上,则无须创建备份文件,直接备份即可。这时,应该确保目标数据库正常运行,然后使用一个管道使mysql直接读取mysqldump的输出结果,以备份数据库。

例如,如果想要将student_course数据库从host1拷贝到host2,命令如下:

    % mysqladmin -h host2 create student_course
    % mysqldump student_course | host2 student_course

mysqldump程序还有许多选项,用于控制备份数据库时的选项。常用的如add-drop-table,用于指定在备份到另一个数据库的时候是否删除已经存在的表,在此不作详述。

6.3.2 使用直接拷贝数据文件方式

如果不使用前面所介绍的mysqldump来备份数据库或表,另一种方法是直接拷贝表文件。在Linux中,可利用像cp、tar或cpio这样的命令来进行拷贝,在Windows中则可以通过图形化界面直接拷贝文件。

在拷贝文件时,为确保数据的完整性,最好首先关闭服务器,拷贝文件,然后重新启动服务器。如果在拷贝一个表时服务器正在使用它,则数据拷贝无效。

下面的例子将说明在Linux中,怎样将整个student_course数据库拷贝到备份目录(BACKUPDIR)中:

    % cd DATADIR
    % cp -r student_course BACKUPDIR

其中,DATADIR表示MySQL数据库数据所在目录,而BACKUPDIR表示想要备份到的目录。如果只想备份其中的一部分表,则可以用下面的命令:

    % cd DATADIR/student_course
    % cp students BACKUPDIR
    % cp courses BACKUPDIR
    % ...

在Windows系统中,则更加简单,只需要使用图形化界面将数据文件复制到目的文件夹即可,在此不作详述。

要想用直接拷贝文件的方式将数据库从一台服务器备份到另一台服务器,只要将这些文件拷贝到另一台服务器上的相应数据库中即可。此时,应确保数据文件类型相同,且两台机器都有相同的服务器环境。还应该确保第一台服务器不会在拷贝这些表时访问它们。

当完成备份后,可以重新启动服务器,或者释放在表上施加的锁。

6.3.3 两种方式的比较

前面两部分介绍了使用mysqldump和直接备份数据文件两种方式来备份数据库,在实际的应用中,应该如何选择呢?本节不比较这两种方式的优缺点,读者可以根据自身情况进行合理的选择。

● mysqldump必须配合MySQL服务器来运行,但直接复制的方式则不用。

● mysqldump的方式比直接复制的方式慢。

● mysqldump复制方式所产生的文本文件,可以携带到其他的机器上,但是需要保证两个服务器具有相同的系统环境。

● 利用mysqldMp复制文件时,可以将复制的文件加上时间编号。例如使用下面命令:

    % mysqldump db_name>D:\Databackup\db_name.20060214

这样,便于管理生成的备份文件。