如何在Ubuntu 14.04上使用Percona XtraBackup创建MySQL数据库的热备份

介绍

使用活动数据库系统时遇到的一个非常常见的挑战是执行热备份,即在不停止数据库服务或将其设置为只读的情况下创建备份。简单地复制活动数据库的数据文件通常会导致内部不一致的数据库副本,即它将无法使用或者将丢失在复制期间发生的事务。另一方面,停止数据库以进行计划备份会使应用程序的数据库相关部分变为不可用。Percona XtraBackup是一个开源实用程序,可用于解决此问题,并为运行MySQL,MariaDB和Percona Server数据库(也称为热备份)创建一致的完整备份或增量备份。

与mysqldump等实用程序生成的逻辑备份相反,XtraBackup会创建数据库文件的物理备份 - 它会复制数据文件。然后,它将事务日志(也称为重做日志)应用于物理备份,以回填在创建备份期间未完成的任何活动事务,从而实现正在运行的数据库的一致备份。然后,可以使用rsync,像Bacula之类的备份系统将生成的数据库备份备份到远程位置。

本教程将向您展示如何使用Uconntu 14.04上的Percona XtraBackup对MySQL或MariaDB数据库执行完整的热备份。还介绍了从备份还原数据库的过程。

准备

要学习本教程,您必须具备以下条件:

  • Ubuntu 14.04系统的超级用户权限
  • 运行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最简单的方法是使用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程序和innobackupexPerl脚本,我们将使用它来创建数据库备份。

第一次准备

在第一次使用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权限

在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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

Oracle使用小记

windows下Oracle必须要启动的服务 Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume...

2085
来自专栏你不就像风一样

CentOS 6.5下RPM方式(重新)安装MySQL 5.7.21从头到尾篇

ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables ...

892
来自专栏aoho求索

基于可靠消息方案的分布式事务(三):Lottor使用

前面两篇文章介绍了笔者关于可靠消息方案的分布式事务的实现思路以及Java中的事务概念,奈何工作抽不出时间,如今时隔已久,分布式事务系列拖了很久,一直没能好好把项...

861
来自专栏Linux运维学习之路

MySQL日志管理

MySQL日志管理 错误日志 配置方法: vim /etc/my.cnf [mysqld] log-error=/tmp/mysql.log 查看配置方式: s...

45012
来自专栏pangguoming

Centos7 Mysql 双机热备实现数据库高可用

mysql双主热备,也称主主互备,目的是mysql数据库高可用,只支持双机,原因是mysql的复制是一主多从,但一个从服务器只能有一个主服务器。

4222
来自专栏pangguoming

CentOS7 安装 mysql8

本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ManagementAndJava/article/details/80...

8122
来自专栏我是攻城师

Elasticsearch如何动态维护一个不可变的倒排索引

4019
来自专栏csxiaoyao

mysql 配置总结( linux & macos )

39811
来自专栏乐沙弥的世界

MySQL多实例配置(二)

    MySQL数据库的集中化运维,可以通过在一台MySQL数据库服务器上,部署多个MySQL实例。该功能是通过mysqld_multi来实现。mysqld_...

1252
来自专栏耕耘实录

新玩法,CentOS7中LVM通过扩展逻辑卷扩展swap空间

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

1194

扫码关注云+社区

领取腾讯云代金券