使用活动数据库系统时遇到的一个非常常见的挑战是执行热备份,即在不停止数据库服务或将其设置为只读的情况下创建备份。简单地复制活动数据库的数据文件通常会导致内部不一致的数据库副本,即它将无法使用或者将丢失在复制期间发生的事务。另一方面,停止数据库以进行计划备份会使应用程序的数据库相关部分变为不可用。Percona XtraBackup是一个开源实用程序,可用于解决此问题,并为运行MySQL,MariaDB和Percona Server数据库(也称为热备份)创建一致的完整备份或增量备份。
与mysqldump等实用程序生成的逻辑备份相反,XtraBackup会创建数据库文件的物理备份 - 它会复制数据文件。然后,它将事务日志(也称为重做日志)应用于物理备份,以回填在创建备份期间未完成的任何活动事务,从而实现正在运行的数据库的一致备份。然后,可以使用rsync,像Bacula之类的备份系统将生成的数据库备份备份到远程位置。
本教程将向您展示如何使用Uconntu 14.04上的Percona XtraBackup对MySQL或MariaDB数据库执行完整的热备份。还介绍了从备份还原数据库的过程。
要学习本教程,您必须具备以下条件:
如果您没有服务器,可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
此外,要执行数据库的热备份,数据库系统必须使用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最简单的方法是使用apt-get。
使用以下命令添加Percona存储库密钥:
sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
然后将Percona存储库添加到apt源:
sudo sh -c "echo 'deb http://repo.percona.com/apt trusty main' > /etc/apt/sources.list.d/percona.list"
sudo sh -c "echo 'deb-src http://repo.percona.com/apt trusty main' >> /etc/apt/sources.list.d/percona.list"
运行此命令以更新apt源:
sudo apt-get update
最后,您可以运行此命令来安装XtraBackup:
sudo apt-get 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
命令确保用户能够写入备份目录。
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 创建备份,然后进行准备。
在Ubuntu 14.04上,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 770 "{}" \;
这些命令确保mysql组可以访问datadir中的所有目录,并且应该在每次备份之前运行。
如果在同一会话中将用户添加到mysql组,则需要再次登录才能使组成员关系更改生效。
现在我们准备创建备份了。运行MySQL数据库后,使用innobackupex
实用程序执行此操作。更新用户和密码后运行此命令以匹配MySQL用户的登录名:
innobackupex --user=bkpuser --password=bkppassword --no-timestamp /data/backups/new_backup
这将在指定的位置/data/backups/new_backup
创建数据库的备份,:
innobackupex output
innobackupex: 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 timestamp
innobackupex: 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:completed OK!” 作为最后一行输出。
您的数据库备份已创建,可以用来还原数据库。此外,如果您有文件备份系统,例如Bacula,则应将此数据库备份作为备份选择的一部分包含在内。
使用XtraBackup还原数据库要求数据库已停止,并且其datadir为空。
使用以下命令停止MySQL服务:
sudo service mysql stop
然后移动或删除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 service mysql start
就是这样!您恢复的MySQL数据库应该已启动并正在运行。
既然您可以使用Percona XtraBackup创建MySQL数据库的热备份,那么您应该考虑设置几个方面。
首先,建议自动化该过程,以便根据计划创建备份。其次,如果数据库服务器出现问题,您应该使用rsync,网络文件备份系统(如Bacula)之类的东西制作备份的远程副本。之后,您将需要考虑轮换备份(按计划删除旧备份)和创建增量备份(使用XtraBackup)以节省磁盘空间。
想要了解更多关于创建MySQL数据库的热备份的相关教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Create Hot Backups of MySQL Databases with Percona XtraBackup on Ubuntu 14.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。