前言:随着数据量的增加,备份问题会越来越突出,尤其是当前没有免费热备工具的情形下。本文针对 InnoDB 的备份需求,采用商业的 ibbackup 以及免费的 mysqldump 2种工具进行对比,让大家有个大致的了解。
ibbackup 是 InnoDB 提供的收费工具,它支持在线热备 InnoDB 数据,主要有以下特性:
* Online backup of InnoDB tables — the backup takes place entirely online, without preventing queries or updates.
* Online backup of MyISAM tables — during the backup of InnoDB tables, read and write access is permitted to MyISAM tables. While the MyISAM tables are being copied, updates (but not reads) to the MyISAM tables are precluded.
* Compressed backups — the backup of InnoDB files can be compressed at various levels, saving as much as 70% or more of the storage required.
* Partial backups — you can selectively backup all or only some of your InnoDB tables.
* High performance — backup time is comparable to file copy, applying logs for recovery is even faster.
* Unlimited database size — no practical limit to database size or number of tables.
* Broad platform support — runs on Linux, Windows and leading Unix platforms.
在 innodb官网 申请了个试用版测试下,发现效果还是不错的,不过在我们自己的独特应用环境下,ibbackup 的优势并没有多少。具体的测试结果就不发上来了,有兴趣的同学自己测试看看吧。
ibbackup 只需要识别简单的几个 InnoDB
相关参数即可。它在备份时需要用到2个配置文件,一个是指定在线运行的信息,一个是备份相关信息。例如:
online-my.cnf 告诉 ibbackup 当前正在运行的mysql数据文件所在目录
backup-my.cnf 告诉 ibbackup 备份文件存储的目录
[mysqld] datadir = /home/hotbackup innodb_data_file_path = ibdata1:512M:autoextend innodb_data_home_dir = /home/hotbackup innodb_log_file_size = 256M innodb_log_files_in_group = 3 innodb_log_group_home_dir = /home/hotbackup运行 ibbackup --help,就能看到以下几个主要选项:
[yejr@imysql.cn]# ibbackup --help Usage: ibbackup [--sleep ms] [--suspend-at-end] [--compress [level]] [--include regexp] my.cnf backup-my.cnf or ibbackup --apply-log [--use-memory mb] [--uncompress] backup-my.cnf or ibbackup --restore [--use-memory mb] [--uncompress] backup-my.cnf我一般只需要用到 --compress 以及 --uncompress,告诉 ibbackup 压缩/解压缩的级别。
执行以下命令:
[yejr@imysql.cn]# ibbackup --compress 5 online-my.cnf backup-my.cnf InnoDB Hot Backup version 3.0.0; Copyright 2002-2005 Innobase Oy License A13002 is granted to imysql Inc. (imysql@imysql.cn) (--apply-log works in any computer regardless of the hostname) Licensed for use in a computer whose hostname is 'yejr.imysql.cn' Expires 2008-9-1 (year-month-day) at 00:00 See http://www.innodb.com for further information Type ibbackup --license for detailed license terms, --help for help Contents of online-my.cnf: innodb_data_home_dir got value /home/mysql innodb_data_file_path got value ibdata1:512M:autoextend datadir got value /home/mysql innodb_log_group_home_dir got value /home/mysql innodb_log_files_in_group got value 3 innodb_log_file_size got value 268435456 Contents of backup-my.cnf: innodb_data_home_dir got value /home/hotbackup innodb_data_file_path got value ibdata1:512M:autoextend datadir got value /home/hotbackup innodb_log_group_home_dir got value /home/hotbackup innodb_log_files_in_group got value 3 innodb_log_file_size got value 268435456 ibbackup: Found checkpoint at lsn 8 804380391 ibbackup: Starting log scan from lsn 8 804380160 080716 19:50:47 ibbackup: Copying log... 080716 19:50:47 ibbackup: Log copied, lsn 8 804380391 ibbackup: We wait 1 second before starting copying the data files... 080716 19:50:48 ibbackup: Copying /home/mysql/ibdata1 ibbackup: Progress in MB: 100 200 300 400 500 600 700 800 900 1000 080716 19:51:21 ibbackup: Copying /home/mysql/test/sbtest.ibd ibbackup: Progress in MB: 100 200 300 400 080716 19:51:34 ibbackup: Copying /home/mysql/test/geom.ibd 080716 19:51:34 ibbackup: Copying /home/mysql/test/t.ibd 080716 19:51:34 ibbackup: Copying /home/mysql/test/sbtest1.ibd ibbackup: Progress in MB: 100 200 300 400 080716 19:51:50 ibbackup: Copying /home/mysql/yejr/yejr.ibd ibbackup: Progress in MB: 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 ............ ibbackup: A copied database page was modified at 8 804394835 ibbackup: Scanned log up to lsn 8 804394835 ibbackup: Was able to parse the log up to lsn 8 804394835 ibbackup: Maximum page number for a log record 209 080716 19:53:03 ibbackup: Full backup completed!就会在 /home/hotbackup 下产生相应备份文件,例如
[yejr@imysql.cn]# ls -l hotbackup/ total 34368 -rw-r----- 1 root root 1024 Jul 17 17:40 ibbackup_logfile -rw-r----- 1 root root 35128069 Jul 17 17:38 ibdata1.ibz drwxr-x--- 2 root root 4096 Jul 17 17:39 yejr drwxr-x--- 2 root root 4096 Jul 17 17:38 test
在备份过程中,还可以持续的提交事务,例如增、删、改数据等,ibbackup 会以最后一次提交的事务为准,取得最新备份。
压缩级别视各自的实际情况而定了。一般需要通过测试,得到一个中间折中值。
然后把还原出来的数据文件 "冷" 拷贝到mysql的 datadir 下,启动mysqld,即可正常使用了。
从测试结果来看,ibbackup 备份和恢复是基于物理块级,把每个表空间文件做一个干净的备份,并且支持备份同时有事务提交,以得到最新的数据备份。
因此 ibbackup 产生的备份文件如果不经压缩(不管是备份时压缩,还是事后压缩),那么占用的空间会比较大。
mysqldump 可以用 single-transaction 来得到一致性备份,但是备份的数据是发起操作的瞬间快照,之后提交的事务都不会在备份
中体现。mysqldump 可能会导致 log purge 停滞很长时间,使得mysql的响应变得非常慢,这点 ibbackup 就可以避免。mysqldump 产生的备份文件相对 ibbackup 生成的小多了。
还原时,ibbackup 相比重新导入sql文件会快不少,在这方面,ibbackup 有非常大的优势。
innodb备份方案
ibbackup是mysql innodb的收费授权热备份脚本。
它会备份innodb的表和索引,但是不会备份.frm文件。
ibbackup文档地址为:http://www.innodb.com/doc/hot_backup/manual.html
innobackup
因此可以使用innodb自带的perl脚本工具innobackup。innobackup是结合ibbackup使用的一个脚本,他会协助对.frm文件的备份。
现在最新的版本是1.5.1版。
下载脚本的地址为:http://www.innodb.com/download/
请下载你需要的innobackup脚本。然后chown u+x innobackup。
测试备份
现启动一个mysql的实例在3308端口。
建立测试数据库
create database testinnodb CREATE TABLE T1 (A INT NOT NULL, B INT, PRIMARY KEY(A)) TYPE=INNODB; insert into t1 (`A`,`B`) values (,),(,),(,);进行备份
./innobackup-1.5.1 --ibbackup=/opt/scriptlet/ibbackup --no-timestamp --user=root --port=3308 /usr/local/mysql_3308/etc/my.cnf /usr/local/mysql_3308/back/参数说明
--ibbackup 为ibbackup的路径 --user 为你的账号 --port 为您的端口 /usr/local/mysql_3308/etc/my.cnf 为你的运行数据库实例的配置脚本 /usr/local/mysql_3308/back/ 为你的配置目录检查备份
关闭mysql 3308实例
修改配置文件
修改datadir为你选择的备份目录。 修改innodb_data_home_dir为你选择的备份目录。 修改innodb_log_group_home_dir为你选择的备份目录。 重启mysql 3308实例。进入3308端口的 testinnodb数据库,检查T1表
show table status from testinnodb; select * from T1 limit G;检查下数据是否正确。
innobackup其他参数
--copy-back 恢复数据库 --compress 压缩备份数据库,可以选择压缩级别,(当备份选择compress,那么请在恢复的时候选择--uncompress参数) --uncompress 解压缩备份数据库,于--compress --no-timestamp 不需要时间搓,备份时候,脚本会帮你建立一个以时间措为目录名的目录,如果你选择的备份目录就是你需要恢复的目录,就没必要去使用timestamp