2011年2月16日星期三

MySQL在线增量备份

    增量备份的好处是可以节省备份的时间和占用的磁盘空间,可以根据业务和数据的特性,指定不同的全备和增量备份策略。
  
    备份最好是在slave上面进行,这样可以不对主库造成任何影响。使用xtrabackup这个工具能实现在线全备和在线增量备份,步骤如下:

    1、先做一个全备份
xtrabackup --backup --datadir=/data/iscsi/db/ --target-dir=/data/backups/mysql/

    2、每天增量备份

xtrabackup --backup --target-dir=/data/backups/inc/tue/   --incremental-basedir=/data/backups/mysql/       #Suppose the full backup is on Monday,Create an incremental backup on Tuesday

xtrabackup --backup --target-dir=/data/backups/inc/wed/   --incremental-basedir=/data/backups/inc/tue/     #Create an incremental backup on Wednesday

发生异常需要恢复时:

xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/                                               #Prepare the base backup from Monday

xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/  --incremental-dir=/data/backups/inc/tue/     #Roll Monday's data forward to the state on Tuesday

xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/  --incremental-dir=/data/backups/inc/wed/     #Roll forward again to the state on Wednesday

    你可以用脚本程序和crontab一起来控制全备和增量备份的策略,将备份放在远程的服务器上面(可以在数据库服务器上面连接盘柜),达到数据安全的目的。

2011年2月15日星期二

在线做MySQL slave

    之前给MySQL master做slave的时候,为了保证数据一致性,一般选择read lock或者停机,使用直接拷贝文件或者mysqldump的方法来实现。这种方法会使master在一段时间内不可写,影响业务的正常使用。

    有没有更好的方法,可以在master可读写的情况下,生成一个数据没有差错的slave呢?用innobackupex可以实现。具体的原理可以去看文档。实现步骤如下:

    1. on slave:
          nc -l 9999 | cat - > /data/backups/backup.tar
    2. on master:
          innobackupex --stream=tar --slave-info ./ | nc desthost 9999
    3. on slave:
          cd /data/backups/
          tar -ixvf /data/backups/backup.tar
          innobackupex --apply-log  --use-memory 5000M /data/backups