安装ZRM:
[root@master ~]# yum -y install perl-DBI perl-DBD-MySQL perl-XML-Parser[root@master ~]# yum localinstall MySQL-zrm-3.0-1.noarch.rpm[root@master ~]# ls /etc/mysql-zrm/mysql-zrm.conf mysql-zrm-release mysql-zrm-reporter.conf RSS.header[root@master mysql-zrm]# ln -s /usr/local/mysql/bin/* /usr/bin/
创建备份用户并授权
mysql> grant select, insert, update, create, drop, reload, shutdown, alter, super, lock tables, replication client on *.* to 'backup-user'@'localhost' identified by 'redhat';Query OK, 0 rows affected (0.01 sec)mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)
创建备份目录
[root@master ~]# mkdir /backup/zrm -pv[root@master mysql-zrm]# mkdir full
修改配置文件:
[root@master full]# egrep -v '^#|^$' mysql-zrm.confbackup-level=0backup-mode=rawlvm-snapshot=100Msnapshot-plugin="/usr/share/mysql-zrm/plugins/lvm-snapshot.pl"backup-type=regulardestination=/backup/zrmretention-policy=1Wcompress=1compress-plugin=/usr/bin/gzipall-databases=1user="backup-user"password="redhat"host="localhost"socket=/tmp/mysql.sockmysql-binlog-path="/mydata/data"mailto="mysqldba@sanyu.com"
手工执行备份:
[root@master mysql-zrm]# mysql-zrm-scheduler --now --backup-set fullschedule:INFO: ZRM for MySQL Community Edition - version 3.0Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.logbackup:INFO: ZRM for MySQL Community Edition - version 3.0full:backup:INFO: START OF BACKUPfull:backup:INFO: PHASE START: Initializationfull:backup:WARNING: The lvm-snapshot option is deprecated. Use snapshot-size insteadfull:backup:INFO: backup-set=fullfull:backup:INFO: backup-date=20130827000610full:backup:INFO: mysql-server-os=Linux/Unixfull:backup:INFO: backup-type=regularfull:backup:INFO: host=localhostfull:backup:INFO: backup-date-epoch=1377533170full:backup:INFO: retention-policy=1Wfull:backup:INFO: mysql-zrm-version=ZRM for MySQL Community Edition - version 3.0full:backup:INFO: mysql-version=5.5.28-logfull:backup:INFO: backup-directory=/backup/zrm/full/20130827000610full:backup:INFO: backup-level=0full:backup:INFO: backup-mode=rawfull:backup:INFO: PHASE END: Initializationfull:backup:INFO: PHASE START: Running pre backup pluginfull:backup:INFO: PHASE END: Running pre backup pluginfull:backup:INFO: PHASE START: Flushing logsfull:backup:INFO: PHASE END: Flushing logsfull:backup:INFO: PHASE START: Creating snapshot based backupfull:backup:INFO: File Position Binlog_Do_DB Binlog_Ignore_DBmysql-bin.000019 107 full:backup:INFO: innodb-data=/mydata/data/ibdata1;full:backup:INFO: innodb-logs=/mydata/data/./ib_logfile*full:backup:INFO: raw-databases-snapshot=test shop mysql performance_schema bbsfull:backup:INFO: PHASE END: Creating snapshot based backupfull:backup:INFO: PHASE START: Calculating backup size & checksumsfull:backup:INFO: next-binlog=mysql-bin.000019full:backup:INFO: backup-size=35.41 MBfull:backup:INFO: PHASE END: Calculating backup size & checksumsfull:backup:INFO: PHASE START: Compression/Encryptionfull:backup:INFO: compress=/usr/bin/gzipfull:backup:INFO: backup-size-compressed=1.60 MBfull:backup:INFO: PHASE END: Compression/Encryptionfull:backup:INFO: read-locks-time=00:00:02full:backup:INFO: flush-logs-time=00:00:01full:backup:INFO: compress-encrypt-time=00:00:20full:backup:INFO: backup-time=00:00:15full:backup:INFO: backup-status=Backup succeededfull:backup:INFO: Backup succeededfull:backup:INFO: PHASE START: Running post backup pluginfull:backup:INFO: PHASE END: Running post backup pluginfull:backup:INFO: PHASE START: Mailing backup reportfull:backup:INFO: PHASE END: Mailing backup reportfull:backup:INFO: PHASE START: Cleanupfull:backup:INFO: PHASE END: Cleanupfull:backup:INFO: END OF BACKUP/usr/bin/mysql-zrm started successfully
备份过程使用了逻辑卷快照功能
root@master ~]# df -ThFilesystem Type Size Used Avail Use% Mounted on/dev/mapper/mydata-mydata ext4 5.0G 182M 4.5G 4% /mydata/dev/mapper/mydata-zrmQGzbaZ6jWo ext4 5.0G 182M 4.5G 4% /backup/zrm/full/20130827000610/ZRM_MOUNTS/zrmQGzbaZ6jWo[root@master mysql-zrm]# ll -h full/total 4.0K-rw-r--r-- 1 root root 32 Aug 27 00:06 last_backup
指向备份集所在的目录
[root@master mysql-zrm]# cat full/last_backup/backup/zrm/full/20130827000610[root@master mysql-zrm]# ll -h /backup/zrm/full/20130827000610/total 1.7M #启用了压缩功能的缘故-rw-r--r-- 1 root root 1.6M Aug 27 00:06 backup-data-rw-r--r-- 1 root root 680 Aug 27 00:06 index-rw-r--r-- 1 root root 126 Aug 27 00:06 zrm_checksum
mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || bbs || mysql || performance_schema || shop || test |+--------------------+6 rows in set (0.00 sec)
插入一条记录
mysql> insert into shop.ecs_users(user_name,last_time) values('week0',now());Query OK, 1 row affected, 7 warnings (0.00 sec)mysql> select user_id,user_name,last_time from shop.ecs_users;+---------+-----------+---------------------+| user_id | user_name | last_time |+---------+-----------+---------------------+| 1 | ecshop | 0000-00-00 00:00:00 || 2 | vip | 0000-00-00 00:00:00 || 3 | text | 0000-00-00 00:00:00 || 5 | zuanshi | 0000-00-00 00:00:00 || 6 | week0 | 2013-08-27 00:15:21 |+---------+-----------+---------------------+5 rows in set (0.00 sec)mysql> drop database shop;Query OK, 88 rows affected (0.13 sec)
还原(备份后发生的数据改变需要用二进制日志恢复):
[root@master mysql-zrm]# mysql-zrm-reporter --show restore-info --where backup-set=fullREPORT TYPE : restore-info backup_set backup_date backup_level backup_directory backup_status comment----------------------------------------------------------------------------------------------------------------------------------------------------- full Tue 27 Aug 2013 12:06:10 0 /backup/zrm/full/20130827000610 Backup succeeded ---- AM CST
校验备份集
[root@master mysql-zrm]# mysql-zrm --action verify-backup --backup-set fullverify-backup:INFO: ZRM for MySQL Community Edition - version 3.0full:verify-backup:INFO: Verification successful
还原
root@master mysql-zrm]# mysql-zrm --action restore --backup-set full --source-directory /backup/zrm/full/20130827000610restore:INFO: ZRM for MySQL Community Edition - version 3.0dailyrun:restore:WARNING: The lvm-snapshot option is deprecated. Use snapshot-size insteaddailyrun:restore:INFO: Restored innodb log '/mydata/data/ib_logfile0'dailyrun:restore:INFO: Restored innodb log '/mydata/data/ib_logfile1'dailyrun:restore:INFO: Restored innodb data file '/mydata/data/ibdata1'dailyrun:restore:INFO: Restored database from raw backup: testdailyrun:restore:INFO: Restored database from raw backup: shopdailyrun:restore:INFO: Restored database from raw backup: mysqldailyrun:restore:INFO: Restored database from raw backup: performance_schemadailyrun:restore:INFO: Restored database from raw backup: bbsdailyrun:restore:INFO: Restore done in 31 seconds.MySQL server has been shutdown. Please restart after verification.[root@master ~]# service mysqld startStarting MySQL... SUCCESS!mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || bbs || mysql || performance_schema || shop || test |+--------------------+6 rows in set (0.00 sec)mysql> use shopDatabase changedmysql> select user_id,user_name,last_time from shop.ecs_users;+---------+-----------+---------------------+| user_id | user_name | last_time |+---------+-----------+---------------------+| 1 | ecshop | 0000-00-00 00:00:00 || 2 | vip | 0000-00-00 00:00:00 || 3 | text | 0000-00-00 00:00:00 || 5 | zuanshi | 0000-00-00 00:00:00 |+---------+-----------+---------------------+4 rows in set (0.00 sec)记录中不含week0
增量备份
插入一条记录
mysql> insert into shop.ecs_users(user_name,last_time) values('week0',now());Query OK, 1 row affected, 7 warnings (0.03 sec)mysql> select user_id,user_name,last_time from shop.ecs_users;+---------+-----------+---------------------+| user_id | user_name | last_time |+---------+-----------+---------------------+| 1 | ecshop | 0000-00-00 00:00:00 || 2 | vip | 0000-00-00 00:00:00 || 3 | text | 0000-00-00 00:00:00 || 5 | zuanshi | 0000-00-00 00:00:00 || 6 | week0 | 2013-08-27 01:11:39 |+---------+-----------+---------------------+5 rows in set (0.00 sec)
全备
[root@master mysql-zrm]# mkdir mybak-`date +%F`[root@master mysql-zrm]# cp mysql-zrm.conf mybak-`date +%F`[root@master mysql-zrm]# mysql-zrm-scheduler --now --backup-set mybak-`date +%F`schedule:INFO: ZRM for MySQL Community Edition - version 3.0Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.logbackup:INFO: ZRM for MySQL Community Edition - version 3.0mybak-2013-08-27:backup:INFO: START OF BACKUPmybak-2013-08-27:backup:INFO: PHASE START: Initializationmybak-2013-08-27:backup:WARNING: The lvm-snapshot option is deprecated. Use snapshot-size insteadmybak-2013-08-27:backup:INFO: backup-set=mybak-2013-08-27mybak-2013-08-27:backup:INFO: backup-date=20130827012922mybak-2013-08-27:backup:INFO: mysql-server-os=Linux/Unixmybak-2013-08-27:backup:INFO: backup-type=regularmybak-2013-08-27:backup:INFO: host=localhostmybak-2013-08-27:backup:INFO: backup-date-epoch=1377538162mybak-2013-08-27:backup:INFO: retention-policy=1Wmybak-2013-08-27:backup:INFO: mysql-zrm-version=ZRM for MySQL Community Edition - version 3.0mybak-2013-08-27:backup:INFO: mysql-version=5.5.28-logmybak-2013-08-27:backup:INFO: backup-directory=/backup/zrm/mybak-2013-08-27/20130827012922mybak-2013-08-27:backup:INFO: backup-level=0mybak-2013-08-27:backup:INFO: backup-mode=rawmybak-2013-08-27:backup:INFO: PHASE END: Initializationmybak-2013-08-27:backup:INFO: PHASE START: Running pre backup pluginmybak-2013-08-27:backup:INFO: PHASE END: Running pre backup pluginmybak-2013-08-27:backup:INFO: PHASE START: Flushing logsmybak-2013-08-27:backup:INFO: PHASE END: Flushing logsmybak-2013-08-27:backup:INFO: PHASE START: Creating snapshot based backupmybak-2013-08-27:backup:INFO: File Position Binlog_Do_DB Binlog_Ignore_DBmysql-bin.000026 107 mybak-2013-08-27:backup:INFO: innodb-data=/mydata/data/ibdata1;mybak-2013-08-27:backup:INFO: innodb-logs=/mydata/data/./ib_logfile*mybak-2013-08-27:backup:INFO: raw-databases-snapshot=test shop mysql performance_schema bbsmybak-2013-08-27:backup:INFO: PHASE END: Creating snapshot based backupmybak-2013-08-27:backup:INFO: PHASE START: Calculating backup size & checksumsmybak-2013-08-27:backup:INFO: next-binlog=mysql-bin.000026mybak-2013-08-27:backup:INFO: backup-size=35.41 MBmybak-2013-08-27:backup:INFO: PHASE END: Calculating backup size & checksumsmybak-2013-08-27:backup:INFO: PHASE START: Compression/Encryptionmybak-2013-08-27:backup:INFO: compress=/usr/bin/gzipmybak-2013-08-27:backup:INFO: backup-size-compressed=1.60 MBmybak-2013-08-27:backup:INFO: PHASE END: Compression/Encryptionmybak-2013-08-27:backup:INFO: read-locks-time=00:00:01mybak-2013-08-27:backup:INFO: flush-logs-time=00:00:01mybak-2013-08-27:backup:INFO: compress-encrypt-time=00:00:20mybak-2013-08-27:backup:INFO: backup-time=00:00:09mybak-2013-08-27:backup:INFO: backup-status=Backup succeededmybak-2013-08-27:backup:INFO: Backup succeededmybak-2013-08-27:backup:INFO: PHASE START: Running post backup pluginmybak-2013-08-27:backup:INFO: PHASE END: Running post backup pluginmybak-2013-08-27:backup:INFO: PHASE START: Mailing backup reportmybak-2013-08-27:backup:INFO: PHASE END: Mailing backup reportmybak-2013-08-27:backup:INFO: PHASE START: Cleanupmybak-2013-08-27:backup:INFO: PHASE END: Cleanupmybak-2013-08-27:backup:INFO: END OF BACKUP/usr/bin/mysql-zrm started successfully[root@master ~]# du /backup/zrm/mybak-`date +%F`/* -sh1.7M /backup/zrm/mybak-2013-08-27/20130827012922
执行增量备份:
[root@master mysql-zrm]# mysql-zrm-scheduler --now --backup-level 1 --backup-set mybak-`date +%F`schedule:INFO: ZRM for MySQL Community Edition - version 3.0Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.logbackup:INFO: ZRM for MySQL Community Edition - version 3.0mybak-2013-08-27:backup:INFO: START OF BACKUPmybak-2013-08-27:backup:INFO: PHASE START: Initializationmybak-2013-08-27:backup:WARNING: The lvm-snapshot option is deprecated. Use snapshot-size insteadmybak-2013-08-27:backup:INFO: backup-set=mybak-2013-08-27mybak-2013-08-27:backup:INFO: backup-date=20130827013928mybak-2013-08-27:backup:INFO: mysql-server-os=Linux/Unixmybak-2013-08-27:backup:INFO: backup-type=regularmybak-2013-08-27:backup:INFO: host=localhostmybak-2013-08-27:backup:INFO: backup-date-epoch=1377538768mybak-2013-08-27:backup:INFO: retention-policy=1Wmybak-2013-08-27:backup:INFO: mysql-zrm-version=ZRM for MySQL Community Edition - version 3.0mybak-2013-08-27:backup:INFO: mysql-version=5.5.28-logmybak-2013-08-27:backup:INFO: backup-directory=/backup/zrm/mybak-2013-08-27/20130827013928mybak-2013-08-27:backup:INFO: backup-level=1mybak-2013-08-27:backup:INFO: PHASE END: Initializationmybak-2013-08-27:backup:INFO: PHASE START: Running pre backup pluginmybak-2013-08-27:backup:INFO: PHASE END: Running pre backup pluginmybak-2013-08-27:backup:INFO: PHASE START: Flushing logsmybak-2013-08-27:backup:INFO: PHASE END: Flushing logsmybak-2013-08-27:backup:INFO: PHASE START: Creating incremental backupsrc = /mydata/data/mysql-bin.000026k = /backup/zrm/mybak-2013-08-27/20130827013928/mysql-bin.000026mybak-2013-08-27:backup:INFO: incremental=mysql-bin.[0-9]*mybak-2013-08-27:backup:INFO: PHASE END: Creating incremental backupmybak-2013-08-27:backup:INFO: PHASE START: Calculating backup size & checksumsmybak-2013-08-27:backup:INFO: next-binlog=mysql-bin.000027mybak-2013-08-27:backup:INFO: last-backup=/backup/zrm/mybak-2013-08-27/20130827012922mybak-2013-08-27:backup:INFO: backup-size=0.00 MBmybak-2013-08-27:backup:INFO: PHASE END: Calculating backup size & checksumsmybak-2013-08-27:backup:INFO: PHASE START: Compression/Encryptionmybak-2013-08-27:backup:INFO: compress=/usr/bin/gzipmybak-2013-08-27:backup:INFO: backup-size-compressed=0.00 MBmybak-2013-08-27:backup:INFO: PHASE END: Compression/Encryptionmybak-2013-08-27:backup:INFO: read-locks-time=00:00:00mybak-2013-08-27:backup:INFO: flush-logs-time=00:00:01mybak-2013-08-27:backup:INFO: compress-encrypt-time=00:00:00mybak-2013-08-27:backup:INFO: backup-time=00:00:01mybak-2013-08-27:backup:INFO: backup-status=Backup succeededmybak-2013-08-27:backup:INFO: Backup succeededmybak-2013-08-27:backup:INFO: PHASE START: Running post backup pluginmybak-2013-08-27:backup:INFO: PHASE END: Running post backup pluginmybak-2013-08-27:backup:INFO: PHASE START: Mailing backup reportmybak-2013-08-27:backup:INFO: PHASE END: Mailing backup reportmybak-2013-08-27:backup:INFO: PHASE START: Cleanupmybak-2013-08-27:backup:INFO: PHASE END: Cleanupmybak-2013-08-27:backup:INFO: END OF BACKUP/usr/bin/mysql-zrm started successfully[root@master mysql-zrm]# du /backup/zrm/mybak-`date +%F`/* -sh40M /backup/zrm/mybak-2013-08-27/2013082701292216K /backup/zrm/mybak-2013-08-27/20130827013928
增量备份只有16K
全备中不含binlog
[root@master mysql-zrm]# mysql-zrm-parse-binlogs --backup-set mybak-`date +%F` --source-directory /backup/zrm/mybak-2013-08-27/20130827012922/parse-binlogs:INFO: ZRM for MySQL Community Edition - version 3.0mybak-2013-08-27:parse-binlogs:ERROR: /backup/zrm/mybak-2013-08-27/20130827012922/ contains a full backup and there are no binary logs in this directory.
增量备份中binlog信息中包新增记录:
[root@master mysql-zrm]# mysql-zrm-parse-binlogs --backup-set mybak-`date +%F` --source-directory /backup/zrm/mybak-2013-08-27/20130827013928/parse-binlogs:INFO: ZRM for MySQL Community Edition - version 3.0
Log filename | Log Position | Timestamp | Event Type | Event |
/backup/zrm/mybak-2013-08-27/20130827013928/mysql-bin.000026 | 4 | 13-08-27 01:29:25 | Start: binlog v 4, server v 5.5.28-log created 130827 1:29:25 | |
/backup/zrm/mybak-2013-08-27/20130827013928/mysql-bin.000026 | 107 | 13-08-27 01:33:00 | Query | /*!\C utf8 *//*!*/; BEGIN /*!*/; |
/backup/zrm/mybak-2013-08-27/20130827013928/mysql-bin.000026 | 179 | 13-08-27 01:33:00 | Intvar | |
/backup/zrm/mybak-2013-08-27/20130827013928/mysql-bin.000026 | 207 | 13-08-27 01:33:00 | Query | insert into shop.ecs_users(user_name,last_time) values('week0',now()) /*!*/; |
/backup/zrm/mybak-2013-08-27/20130827013928/mysql-bin.000026 | 343 | 13-08-27 01:33:00 | Query | COMMIT /*!*/; |
/backup/zrm/mybak-2013-08-27/20130827013928/mysql-bin.000026 | 416 | 13-08-27 01:39:28 | Rotate to mysql-bin.000027 pos: 4 |
模拟误操作删除shop库:
mysql> drop database shop;Query OK, 88 rows affected (0.06 sec)
还原测试:
看看备份集信息
[root@master mysql-zrm]# mysql-zrm-reporter --show restore-info --where backup-set=mybak-2013-08-27REPORT TYPE : restore-info backup_set backup_date backup_level backup_directory backup_status comment----------------------------------------------------------------------------------------------------------------------------------------------------- mybak-2013-08-27 Tue 27 Aug 2013 01:39:28 1 /backup/zrm/mybak-2013-08-27/20130827013 Backup succeeded ---- AM CST 928 mybak-2013-08-27 Tue 27 Aug 2013 01:29:22 0 /backup/zrm/mybak-2013-08-27/20130827012 Backup succeeded ---- AM CST 922
先用全备还原
[root@master mysql-zrm]# mysql-zrm --action restore --backup-set mybak-2013-08-27 --source-directory /backup/zrm/mybak-2013-08-27/20130827012922/restore:INFO: ZRM for MySQL Community Edition - version 3.0mybak-2013-08-27:restore:WARNING: The lvm-snapshot option is deprecated. Use snapshot-size insteadmybak-2013-08-27:restore:INFO: Restored innodb log '/mydata/data/ib_logfile0'mybak-2013-08-27:restore:INFO: Restored innodb log '/mydata/data/ib_logfile1'mybak-2013-08-27:restore:INFO: Restored innodb data file '/mydata/data/ibdata1'mybak-2013-08-27:restore:INFO: Restored database from raw backup: testmybak-2013-08-27:restore:INFO: Restored database from raw backup: shopmybak-2013-08-27:restore:INFO: Restored database from raw backup: mysqlmybak-2013-08-27:restore:INFO: Restored database from raw backup: performance_schemamybak-2013-08-27:restore:INFO: Restored database from raw backup: bbsmybak-2013-08-27:restore:INFO: Restore done in 42 seconds.MySQL server has been shutdown. Please restart after verification.[root@master ~]# service mysqld startStarting MySQL... SUCCESS!mysql> select user_id,user_name,last_time from shop.ecs_users;+---------+-----------+---------------------+| user_id | user_name | last_time |+---------+-----------+---------------------+| 1 | ecshop | 0000-00-00 00:00:00 || 2 | vip | 0000-00-00 00:00:00 || 3 | text | 0000-00-00 00:00:00 || 5 | zuanshi | 0000-00-00 00:00:00 |+---------+-----------+---------------------+4 rows in set (0.00 sec)
此时shop库已还原,但是全备后插入的记录(week0)还未恢复
用增量备份还原:
[root@master mysql-zrm]# mysql-zrm --action restore --backup-set mybak-2013-08-27 --source-directory /backup/zrm/mybak-2013-08-27/20130827013928/restore:INFO: ZRM for MySQL Community Edition - version 3.0mybak-2013-08-27:restore:WARNING: The lvm-snapshot option is deprecated. Use snapshot-size insteadmybak-2013-08-27:restore:INFO: BINLOG = mysqlbinlog --user="backup-user" --password="*****" --host="localhost" --socket="/tmp/mysql.sock" "/backup/zrm/mybak-2013-08-27/20130827013928/"/mysql-bin.[0-9]* >> /tmp/e88CEUVrrjmybak-2013-08-27:restore:INFO: Incremental restore donemybak-2013-08-27:restore:INFO: Restore done in 0 seconds.mysql> select user_id,user_name,last_time from shop.ecs_users;+---------+-----------+---------------------+| user_id | user_name | last_time |+---------+-----------+---------------------+| 1 | ecshop | 0000-00-00 00:00:00 || 2 | vip | 0000-00-00 00:00:00 || 3 | text | 0000-00-00 00:00:00 || 5 | zuanshi | 0000-00-00 00:00:00 || 6 | week0 | 2013-08-27 01:33:00 |+---------+-----------+---------------------+5 rows in set (0.01 sec)
至此数据已找回,增备到误操作期间的数据需借助binlog人工恢复,这里不再演示
备份脚本:
#!/bin/bash## Written by Sanyu ,not tested#Name1=lvm-monthName2=lvm-weekmkdir /backup/zrm 2>/dev/nullmkdir /etc/mysql-zrm/$Name1mkdir /etc/mysql-zrm/$Name2mkconf () {cat >$1<