MySQL 的备份方法

jopen 11年前

逻辑备份

        通过一些普通的SQL SELECT查询语句的集合,通过表扫描创建逻辑备份。
    优缺点:速度慢,可在线备份。

物理备份
        通过对原始二进制数据的复制获得的备份。
    优缺点:速度快,但必须离线备份(数据库系统必须关闭)。

备份实用程序和操作系统及方案

1、InnoDB Hot Backup应用
        备份InnoDB引擎的商业产品,在备份时保持数据库的查询和更新,无需离线或显示锁定表。
        也可备份MyISAM表,但需要在备份的过程中阻塞MyISAM表的更新。
        可备份部分或全部数据库、压缩备份的输出文件、进行有选择的备份(如备份指定的表)。
        包含两个文件 ibbackup和innobackup

    使用ibbackup备份:在命令行中指定两个备份所需的文件作为参数,第一个为标准的my.cnf 配置文件,第二个文件包含用于保存备份的文件信息。
    shell> ibbackup my.cnf backup.cnf
    文件的参数如下:
        datadir = directory
        innodb_data_home_dir = directory
        innodb_data_file_patch = parameter-list
        innodb_log_group_home_dir = directory
        innodb_log_file_in_group = group_number
        innodb_log_file_size = size

    实例:
        [mysqld]
        datadir = /usr/local/mysql/data
        innodb_data_home_dir = /usr/local/mysql/data
        innodb_data_file_patch = ibdata1:10M:autoextend
        innodb_log_group_home_dir = /usr/local/mysql/data
        innodb_log_file_in_group = 2
        innodb_log_file_size = 20M
</div>
    假设要将备份文件写入 /home/cbell/backup 目录,则 backup.cnf 如下:
        datadir = /home/cbell/backup
        innodb_data_home_dir = /home/cbell/backup
        innodb_data_file_patch = ibdata1:10M:autoextend
        innodb_log_group_home_dir = /home/cbell/backup
        innodb_log_file_in_group = 2
        innodb_log_file_size = 20M
</div>
    还可以使用 --compress 选项压缩备份
        ibbackup --compress my.cnf  backup.cnf

    应用日志备份:由于备份过程中InnoDB数据库仍在运行,如果想得到完全一致的备份,必须将当前日志应用到备份文件中以同步数据。
    执行此操作只需要备份配置文件和 --applylog 选项,如:
    shell$ ibbackup --applylog  /home/cbell/backup.cnf
    如果使用了 compress 选项,那么还需要提供 --uncompress 选项,如:
    shell$  ibbackup --applylog --uncompress /home/cbell/backup.cnf

    使用ibbackup还原数据
        直接启动MySQL实例即可,如:
        shell$  mysqld --defaults-file=/home/cbell/backup.cnf

    innobackup脚本:是一个perl脚本,可以自动执行ibbackup的许多操作
        a) 执行备份
            perl innobackup  /etc/mysql/my.cnf  /home/cbell/backup
            perl innobackup --apply-log  /etc/mysql/my.cnf  /home/cbell/backup

        b) 恢复数据
            perl innobackup --apply-log /etc/mysql/my.cnf /home/cbell/backup
            mysqladmin -uroot shutdown
            perl innobackup --copy-file /etc/mysql/my.cnf  /home/cbell/backup
            service mysqld start
        
        c) 支持PITR(及时恢复)(http://www.innodb.com/doc/hot_backup/manual.html)

2、物理文件的复制    
    需要停止服务器,常见方法使用 tar 命令创建归档,然后将归档复制到另一个系统上并恢复数据目录。
    或者在备份的过程中保证没有数据更新的情况下就不需要关闭服务器,如锁定所有表并执行 flush tables 命令,然后在复制文件之前将服务器离线。
    mysqlhotcopy.sh 位于安装文件目录的 ./scripts文件夹下,允许对数据库进行热备份,但只能用来备份MyISAM或文档引擎。(unix上使用)

3、mysqldump工具
    优缺点:使用灵活、方便;速度慢、更大的存储空间
    mysqldump -uroot --all-databases
    mysqldump -uroot db1, db2
    mysqldump -uroot my_db t1
    可以非常方便转储数据库模式,如使用--no-data选项

4、XtraBackup
    XtraDB的热备份方案,可备份InnoDB、XtraDB、MyISAM表。
    http://www.percona.com/docs/wiki/percona-xtrabackup:xtrabackup_manual

5、逻辑卷管理器快照备份
    LVM快照
        lvm文件系统快照备份的前提是系统中有不小于当前数据库文件所在卷的空闲磁盘空间。
    ZFS快照
        a) 创建可管理的ZFS文件系统
            zpool create -f mypool c0d0s5
            zfs create mypool/mydata
        b) 创建备份(执行新文件系统的快照)
            zfs snapshot mypool.mydata@backup_12_dec_2012
        c) 将文件系统恢复到某个指定的备份
            cd /mypool/mydata
            zfs rollback mypool/mydata@backup_12_dec_2012