介绍
使用活动数据库系统时遇到的常见问题是执行热备份,即创建备份而不停止数据库服务或使其为只读。简单地复制活动数据库的数据文件通常会导致数据库的副本在内部不一致,即它将不可用或者将丢失在复制期间发生的事务。另一方面,停止计划备份的数据库会使应用程序的数据库相关部分变得不可用。 Percona XtraBackup是一个开源实用程序,可用于规避此问题,并为运行的MySQL,MariaDB和Percona Server数据库(也称为热备份)创建一致的完全或增量备份。 相对于公用事业例如mysqldump农产品,XtraBackup创建数据库的
物理备份的
逻辑备份文件-它使数据文件的副本。 然后,它将事务日志(也称为重做日志)应用于物理备份,以回填在创建备份期间未完成的任何活动事务,从而对运行的数据库执行一致的备份。 所得数据库备份然后可以使用备份到远程位置
rsync ,像一个备份系统
Bacula ,或
DigitalOcean备份 。 本教程将向您介绍如何使用CentOS 7上的Percona XtraBackup对MySQL或MariaDB数据库执行完全热备份。还介绍了从备份还原数据库的过程。本指南的Ubuntu的版本可以找到
这里 。
先决条件
要遵循本教程,您必须具有以下内容:
- CentOS 7系统上的超级用户权限
- 运行MySQL或MariaDB数据库
- 访问数据库的管理用户(root)
而且,要执行你的数据库的热备份,数据库系统必须使用
InnoDB存储引擎。这是因为XtraBackup依赖于InnoDB维护的事务日志。如果您的数据库使用MyISAM存储引擎,您仍然可以使用XtraBackup,但数据库将在备份结束时锁定一段时间。
检查存储引擎
如果您不确定数据库使用的存储引擎,您可以通过各种方法查找它。一种方法是使用MySQL控制台选择相关的数据库,然后输出每个表的状态。 首先,进入MySQL控制台:
mysql -u root -p
然后输入您的MySQL root密码。 在MySQL提示符下,选择要检查的数据库。请务必在此处替换您自己的数据库名称:
USE database_name;
然后打印其表状态:
SHOW TABLE STATUS\G;
应该为数据库中的每一行指示引擎:
Example Output:...
*************************** 11. row ***************************
Name: wp_users
Engine: InnoDB
...
完成后,离开控制台:
exit
让我们安装Percona XtraBackup。
安装Percona XtraBackup
安装Percona XtraBackup的最简单的方法是使用yum,因为Percona的存储库提供了一个RPM。
sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
然后,您可以运行此命令来安装XtraBackup:
sudo yum install percona-xtrabackup
接受任何确认提示以完成安装。 XtraBackup主要包括了XtraBackup程序和的
innobackupex
Perl脚本,我们将用它来创建我们的数据库备份。
首次准备
在第一次使用XtraBackup之前,我们需要准备XtraBackup将使用的系统和MySQL用户。本节包括初始准备。
系统用户
除非计划使用系统root用户,否则必须执行一些基本准备工作,以确保XtraBackup可以正确执行。我们假设您以运行XtraBackup的用户身份登录,并且拥有超级用户权限。 将您的系统用户添加到“mysql”组(替换为您的实际用户名):
sudo gpasswd -a username mysql
虽然我们在这里,让我们创建将用于存储XtraBackup创建的备份的目录:
sudo mkdir -p /data/backups
sudo chown -R username: /data
该
chown
命令确保用户将能够写入备份目录。
MySQL用户
XtraBackup需要一个MySQL用户,它将在创建备份时使用。让我们现在创建一个。 使用此命令输入MySQL控制台:
mysql -u root -p
提供MySQL root密码。 在MySQL提示符下,创建一个新的MySQL用户并为其分配一个密码。在本示例中,用户名为“bkpuser”,密码为“bkppassword”。将这两者更改为安全:
CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bkppassword';
接下来,授予新的MySQL用户对所有数据库的重新加载,锁定和复制权限:
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
FLUSH PRIVILEGES;
这些是XtraBackup创建数据库完全备份所需的最低要求权限。 完成后,退出MySQL控制台:
exit
现在我们准备创建我们的数据库的完整备份。
执行完全热备份
本节介绍使用XtraBackup创建MySQL数据库的完全热备份所需的步骤。确保数据库文件权限是否正确后,我们将使用XtraBackup
创建一个备份,然后
准备 。
更新Datadir权限
在CentOS 7,MySQL的数据文件存储在
/var/lib/mysql
,有时也被称为
DATADIR。 默认情况下,获得了DATADIR会限制在
mysql
用户。 XtraBackup需要访问此目录以创建其备份,所以让我们运行几个命令,以确保我们之前设置的系统用户作为mysql组的成员具有适当的权限:
sudo chown -R mysql: /var/lib/mysql
sudo find /var/lib/mysql -type d -exec chmod 775 "{}" \;
这些命令确保datadir中的所有目录都可以被mysql组访问,并且应该在每次备份之前运行。
如果您在同一会话中添加用户到mysql组,您将需要再次对组成员身份更改登录才能生效。
创建备份
现在我们准备创建备份。与MySQL数据库的运行,使用
innobackupex
工具来做到这一点。在更新用户和密码以匹配MySQL用户的登录名之后运行此命令:
innobackupex --user=bkpuser --password=bkppassword --no-timestamp /data/backups/new_backup
这将在指定的位置创建数据库的备份
/data/backups/new_backup
:
innobackupex outputinnobackupex: Backup created in directory '/data/backups/new_backup'
150420 13:50:10 innobackupex: Connection to database server closed
150420 13:50:10 innobackupex: completed OK!
或者 ,你可以省略
--no-timestamp
有XtraBackup创建一个备份目录基于当前的时间戳,就像这样:
innobackupex --user=bkpuser --password=bkppassword /data/backups
这将在自动生成的子目录中创建数据库的备份,如下所示:
innobackupex output — no timestampinnobackupex: Backup created in directory '/data/backups/2015-04-20_13-50-07'
150420 13:50:10 innobackupex: Connection to database server closed
150420 13:50:10 innobackupex: completed OK!
你决定的方法应该输出“innobackupex:completed OK!”在其输出的最后一行。一个成功的备份将导致数据库的datadir,可以使用前必须被
准备的副本。
准备备份
在创建具有XtraBackup热备份的最后一步是
准备吧。这涉及“重放”事务日志以将任何未提交的事务应用于备份。准备备份将使其数据一致,并可用于还原。 在我们的例子中,我们将准备一个是在创建备份
/data/backups/new_backup
。将其替换为实际备份的路径:
innobackupex --apply-log /data/backups/new_backup
再次,你应该看到“innobackupex:完成!作为输出的最后一行。 您的数据库备份已创建,可以用于恢复数据库。另外,如果你有一个文件备份系统,如
Bacula的 ,这个数据库的备份应该包括作为备份选择的一部分。 下一节将介绍如何从刚刚创建的备份恢复数据库。
执行备份恢复
使用XtraBackup恢复数据库需要数据库已停止,并且其datadir为空。 使用此命令停止MySQL服务:
sudo systemctl stop mariadb
然后移动或删除DATADIR中的内容(
/var/lib/mysql
)。在我们的示例中,我们将其移动到临时位置:
mkdir /tmp/mysql
mv /var/lib/mysql/* /tmp/mysql/
现在我们可以从我们的备份“new_backup”恢复数据库:
innobackupex --copy-back /data/backups/new_backup
如果成功,最后一行输出应该说“innobackupex:completed OK!”。 datadir中恢复的文件可能属于您运行恢复过程的用户。将所有权更改为mysql,以便MySQL可以读取和写入文件:
sudo chown -R mysql: /var/lib/mysql
现在我们准备启动MySQL:
sudo systemctl start mariadb
而已!您恢复的MySQL数据库应该已启动并正在运行。
结论
现在,您可以使用Percona XtraBackup创建MySQL数据库的热备份,有几个事情,你应该考虑设置。 首先,建议自动化过程,以便您可以根据计划创建备份。其次,你应该做备份的远程副本,以防您的数据库服务器有问题,通过使用类似
rsync ,网络文件备份系统像
Bacula ,或
DigitalOcean备份 。 在这之后,你会想看看
旋转备份(按计划删除旧的备份)和创建增量备份(带XtraBackup)以节省磁盘空间。 祝你好运!