说明
腾讯云Mysql云数据库的备份文件分为逻辑备份、物理冷备两种,扩展名均为.xb文件,本教程介绍如何使用物理备份在云服务器上还原数据库的操作流程。
本文主要资料来自于腾讯云官方文档:使用物理备份恢复数据库,本人结合实际操作经验,对文档进行了细化补充,以至于无需刻意学习,只需复制粘贴就可以大概率可以成功还原数据库。
如需通过逻辑备份文件还原数据库,请参考:【玩转云数据库】云Mysql数据库逻辑备份文件还原数据库教程
准备事项
1、CentOS 7.x 64位纯净版云服务器一台,因为物理备份还原是将整个数据库实例全部还原,然后再对单个数据库或表进行操作,所以建议开通一台全新服务器进行操作。(可按量付费开通一台低配服务器,不能在已有数据库实例的服务器上进行操作)
2、FileZilla软件(由于需要对服务器文件进行操作,如不会Vim的同学可以准备这个软件,以方便进行文本处理)
3、Mysql云数据库物理备份文件(从云数据库控制台可以下载物理备份,扩展名为.xb)
4、与云数据库同版本的Mysql源码包,源码包大版本需与云数据库版本相同。比如云数据库为mysql-5.6,那么源码包主版本也需为mysql-5.6,但后面的数字mysql-5.6.41可以不同(如本文演示所用的mysql-5.6.41-linux-glibc2.12-x86_64.tar)
操作步骤
一、安装解包软件
1、由于备份文件先经过 qpress 压缩,后经过 xbstream 打包(xbstream 为 Percona 的一种打包/解包工具),所以先用 xbstream 将其解包。xbstream 工具可以通过添加 Percona 的 yum 源安装。
代码语言:javascript复制yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
2、由于进行第3操作的时候会出现秘钥验证的问题,所以先将/etc/yum.repos.d/percona-release.repo文件中的gpgcheck=1全部修改为gpgcheck=0,上传覆盖后再进行第3步。
3、安装xtrabackup-24版本
代码语言:javascript复制yum install percona-xtrabackup-24
二、将备份文件解包至目标目录
先将下载的Mysql云数据库的物理备份文件重命名为纯英文.xb(如bakup.xb),上传至/root目录,这里使用/data做为还原数据库的目标目录
代码语言:javascript复制xbstream -x -C /data < ~/bakup.xb
解包结果如下图所示,文件均为.qp结尾的扩展名。
三、解压备份文件
因备份文件经过 quicklz 算法压缩,所以需要进行解压。需 下载 qpress 工具 ,下载之后通过以下命令解出 qpress 二进制文件。(现在命令中qpress-11-linux-x64.tar为文件名,具体以所下载的文件名为准)
代码语言:javascript复制tar -xf qpress-11-linux-x64.tar -C /usr/local/bin
source /etc/profile
使用 qpress 命令将目标目录下所有以.qp结尾的文件都解压出来。
代码语言:javascript复制xtrabackup --decompress --target-dir=/data
xtrabackup默认在解压缩时不删除原始的压缩文件,若想解压完删除原始的压缩文件,可在上面的命令中加上 (2个-)-remove-original 参数。
四、Prepare 备份文件
备份解压出来之后,需要执行以下命令进行 apply log 操作。
代码语言:javascript复制xtrabackup --prepare --target-dir=/data
执行后如果结果中包含以下输出,则表示 prepare 成功。
五、修改配置文件
由于存在的版本问题,请将解压文件 /data/backup-my.cnf 中以下参数注释掉(某行前面加#表示注释)。
innodb_checksum_algorithm innodb_log_checksum_algorithm innodb_fast_checksum innodb_page_size innodb_log_block_size redo_log_version
六、源码安装Mysql
1、先安装基本软件
代码语言:javascript复制yum -y install numactl.x86_64
yum -y install autoconf
2、执行一串命令
代码语言:javascript复制tar xf mysql-5.6.41-linux-glibc2.12-x86_64.tar -C /usr/local
cd /usr/local/
mv mysql-5.6.41-linux-glibc2.12-x86_64/ mysql
useradd mysql
chown -R mysql:mysql mysql/
cd /var/log
mkdir mariadb
cd mariadb/
touch mariadb.log
cd /usr/local/
mysql/scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
echo $?
如果显示0就证明成功了
代码语言:javascript复制cp mysql/support-files/mysql.server /etc/init.d/mysqld
service mysqld start
那么此时大概率会报错,提示如下代码
./support-files/mysql.server startStarting MySQL. ERROR! The server quit without updating PID file (/var/lib/mysql/VM_0_10_centos.pid).
修改/etc/my.cnf文件,在mysqld下方添加以下代码,如下
代码语言:javascript复制[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
basedir=/usr/local/mysql
port=3306
pid=/usr/local/mysql/data/VM_0_10_centos.pid
log-error=/usr/local/mysql/data/error.log
其中VM_0_10_centos.pid的就改成报错提示中的pid文件名即可。然后上传覆盖。
代码语言:javascript复制cp mysql/support-files/mysql.server /etc/init.d/mysqld # 提示覆盖选择 y
service mysqld start
此时mysql就可以正常启动了,可以登录mysql查看数据库(密码默认为空)
代码语言:javascript复制mysql/bin/mysql -uroot
show databases;
七、还原物理备份中的mysql 数据库
1、修改文件属性
代码语言:javascript复制chown -R mysql:mysql /data
2、启动 mysqld 进程
代码语言:javascript复制service mysqld stop
mysql/bin/mysqld_safe --defaults-file=/data/backup-my.cnf --user=mysql --datadir=/data &
需先将mysqld停止,然后再运行mysqld_safe,否则大概率会报错。mysqld_safe这一步执行后界面会卡住无响应,并且类似于下面的提示信息,此时可按一下回车,进入正常命令界面。
root@VM_0_10_centos ~# 190620 13:46:34 mysqld_safe Logging to ‘/data/VM_0_10_centos.err’.
190620 13:46:34 mysqld_safe Starting mysqld daemon with databases from /data
3、查看mysql进程是否已启动
代码语言:javascript复制ps aux | grep 3306
4、客户端登录 mysql 验证。
代码语言:javascript复制mysql/bin/mysql -uroot
至此,物理备份还原成功,可以通过phpmyadmin或Navicat等软件进行管理。
八、额外注意事项
恢复完成后,表 mysql.user 中是不包含 TencentDB 中创建的用户,需要新建。
新建用户前请执行以下SQL语句。
代码语言:javascript复制delete from mysql.db where user<>'root' and char_length(user)>0;
delete from mysql.tables_priv where user<>'root' and char_length(user)>0;
flush privileges;
九、修改mysql root密码以提高安全性
上述操作中,mysql 的 root 账号默认密码为空,强烈建议修改root密码以保证数据安全。
请执行以下SQL语句。
命令行修改root密码,其中newpassword表示新密码。
代码语言:javascript复制mysql> UPDATE mysql.user SET password=PASSWORD('newpassword') WHERE User='root';
运行完这行之后会提示下面的信息:
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0
这时候还需要运行下面一句,否则密码不会被修改:
代码语言:javascript复制mysql> FLUSH PRIVILEGES;
下面运行结果代表修改成功:
Query OK, 0 rows affected (0.16 sec)
小结
通过以上的操作,就可以恢复完整的数据库实例。