Xtrabackup
Percona XtraBackup 是一款高性能、低负载且非阻塞的开源备份工具,用于 InnoDB 和 XtraDB 数据库。
目前,它是唯一一款在 MySQL 服务器上执行备份的开源工具,并且在备份期间不会锁定您的数据库。备份是在线的,查询和事务可以持续运行而不会中断(“热备份”)。
它可以备份 MySQL 5.0 和 5.1 服务器上 InnoDB、XtraDB 和 MyISAM 表中的数据,并且具有许多高级功能,如部分备份、远程备份、压缩备份和增量备份、用于提高性能的多线程文件复制以及时间点恢复。
安装
安装 xtrabackup。
使用示例
XtraBackup 实际上是一组三个工具
- xtrabackup
- 一个编译后的 C 二进制文件,仅复制 InnoDB 和 XtraDB 数据
- innobackupex
- 一个包装脚本,提供备份包含 MyISAM、InnoDB 和 XtraDB 表的整个 MySQL 数据库实例的功能。
- tar4ibd
- 一个 tar 的补丁版本,用于安全地处理 InnoDB 数据。
在以下所有示例中,假设如下
- 您正在备份数据存储在
/var/lib/mysql/
中的服务器,这是 Arch Linux 的标准位置 - 您将备份存储在
/data/backups/mysql
中 - 您的标准位置(例如
/etc/my.cnf
)中有一个 my.cnf 文件,至少包含以下内容
[mysqld] datadir=/var/lib/mysql/ [xtrabackup] target_dir=/data/backups/mysql/
xtrabackup
进行备份会将 InnoDB 数据和日志文件复制到目标位置,而准备备份会使数据文件保持一致并可以使用。
- 制作备份
# xtrabackup --backup
准备备份
# xtrabackup --prepare
再次准备,以创建新的 InnoDB 日志文件
# xtrabackup --prepare
成功 xtrabackup 的退出状态为 0。在第二个 --prepare 步骤中,您应该看到 InnoDB 打印类似于 “Log file ./ib_logfile0 did not exist: new to be created” 的消息,然后是一行指示日志文件已创建的消息。
如果您在具有足够可用内存的专用服务器上,您可能希望将 --use-memory 选项设置为类似于缓冲池大小的值。该工具的完整文档 在此。
innobackupex
- 从 my.cnf 中指定的目录复制所有 MySQL 数据。
它将默认将备份放在 /data/backups/ 的时间戳子目录中(在本例中为 /data/backups/2010-03-13_02-42-44)。
# innobackupex /data/backups
# 100313 02:43:07 innobackupex: completed OK!
- 如果您从副本(“slave”)进行备份,那么您可能需要查看备份时相对于主服务器(“master”)的位置
# innobackupex --slave-info /data/backups
请参阅此工具的完整文档 在此。
tar4ibd
tar4ibd 二进制文件是 tar 的一个特殊补丁版本,它了解如何正确处理 InnoDB/XtraDB 数据文件。
语法与 tar 相同。您必须考虑的唯一事项是在使用 GNU tar 提取文件时包含 -i 选项。否则,只会提取您数据的一部分。
技巧
使用 Xtrabackup 设置从服务器
Xtrabackup 也可用于将一个从服务器克隆到另一个从服务器,或者只是从主服务器设置新的从服务器。并且对于克隆的服务器,它是以非阻塞方式完成的(几乎对于 MyISAM 设置)。
假设之前的场景,首先执行
# innobackupex --stream=tar /tmp/ --slave-info | ssh user@DESTSERVER "tar xfi - -C /var/lib/mysql"
完成后,在您的目标服务器上运行
# innobackupex --apply-log --use-memory=2G /var/lib/mysql
您将拥有准备好的数据库目录。
从原始服务器复制 my.cnf 并在新从服务器上启动 mysqld。
查看将在从服务器上创建的文件 xtrabackup_slave_info 的内容
# cat /var/lib/mysql/xtrabackup_slave_info CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000834', MASTER_LOG_POS=50743116
并在 mysql 控制台上执行该语句并启动从服务器
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000834', MASTER_LOG_POS=50743116; mysql> START SLAVE;
您应该检查一切是否正常
mysql> SHOW SLAVE STATUS \G ... Slave_IO_Running: Yes Slave_SQL_Running: Yes ... Seconds_Behind_Master: 1643 ...
mysql> STOP SLAVE;