Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MySQL 云数据库物理备份本地恢复方案

MySQL 云数据库物理备份本地恢复方案

作者头像
soulteary
发布于 2022-01-24 06:05:43
发布于 2022-01-24 06:05:43
3.5K00
代码可运行
举报
运行总次数:0
代码可运行

在国内不论是使用阿里云、腾讯云还是华为云的云平台版本的 MySQL 数据库,在遇到数据备份恢复的场景,都会遇到需要使用 Percona XtraBackup 工具进行备份还原的需求。

看着网上一堆既啰嗦又落后的备份恢复方案,不免厌烦,借着再次帮朋友做数据迁移的机会,整理分享之前的实战笔记,希望能够帮助到有需求的同学。

写在前面

国内云平台从业者不多,加上成熟的方案相对固定,所以我们不难看到“御三家”的产品备份恢复策略甚至文档都非常“相似”。

  • 阿里云:《RDS MySQL物理备份文件恢复到自建数据库
  • 腾讯云:《云数据库 MySQL - 使用物理备份恢复数据库》
  • 华为云:《通过备份文件恢复到自建数据库(MySQL)》

本文将基于容器工具的方式进行数据恢复处理,避免折腾不必要的软件依赖。

编写数据库恢复实例配置文件

容器时代,如果你不是容器环境的运维工作者,不必过度纠结系统配置,我们直接使用 Percona 官方提供的镜像即可,下面以 MySQL 5.7 为例,你可以根据自己的需求自行修改版本号。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# https://hub.docker.com/r/percona/percona-xtradb-cluster/

version: "3"

services:
  percona:
    image: percona/percona-xtradb-cluster:5.7
    container_name: percona
    restart: always
 # 根据你的需要,声明暴露端口
    # ports:
    #   - 3306:3306
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=1
    volumes:
      - ./node.cnf:/etc/mysql/node.cnf
      - ./data:/var/lib/mysql:rw
      - ./restore:/var/lib/mysql-files:rw

上面的配置中,我声明了两个目录用于保存数据,首先是用于放置云数据库备份restore 目录,其次是用于暂存还原后的数据库文件的 data 目录。将上面的内容保存为 docker-compose.yml,稍后使用。

接着,编写一个可以用于还原的数据库配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[mysqld]

skip-grant-tables

ignore-db-dir=lost+found
datadir=/var/lib/mysql
socket=/tmp/mysql.sock
skip-host-cache

#coredumper
#server_id=0
binlog_format=ROW
default_storage_engine=InnoDB

innodb_flush_log_at_trx_commit  = 0
innodb_flush_method             = O_DIRECT
innodb_file_per_table           = 1
innodb_autoinc_lock_mode=2

bind_address = 0.0.0.0

wsrep_slave_threads=2
wsrep_cluster_address=gcomm://
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

wsrep_cluster_name=noname
wsrep_node_address=172.20.12.2
wsrep_node_incoming_address=0cdb19fc56e4:3306

wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth='xtrabackup:xtrabackup'

[client]
socket=/tmp/mysql.sock

[sst]
progress=/var/lib/mysql/sst_in_progresss

将上面的配置保存为 node.cnf,然后和之前的 docker-compose.yml 放置相同目录,使用我们熟悉的 docker-compose up -d 将用于数据还原的数据库实例启动起来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
2021-10-12T06:08:37.329788Z 0 [Note] Server socket created on IP: '0.0.0.0'.
2021-10-12T06:08:37.385234Z 0 [Note] InnoDB: Buffer pool(s) load completed at 211012  6:08:37
2021-10-12T06:08:37.665867Z 0 [Note] mysqld: ready for connections.
Version: '5.7.33-36-57'  socket: '/tmp/mysql.sock'  port: 3306  Percona XtraDB Cluster (GPL), Release rel36, Revision a1ed9c3, WSREP version 31.49, wsrep_31.49
2021-10-12T06:08:37.666282Z 2 [Note] WSREP: Initialized wsrep sidno 2
...

使用 docker-compose logs -f 查看运行日志,稍等片刻,看到类似上面的日志,包含 “ready for connections” 就可以开始进行数据恢复操作啦。

进行数据恢复

将你需要恢复的数据复制到本地的 restore目录中(对应容器内 /var/lib/mysql-files/ 目录),也可以使用 docker cp 命令直接向容器复制,不过对于大文件来说,体验并不友好。

数据“解压缩”

在准备好数据备份文件之后,我们进入容器进行后续操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it percona bash

进入容器之后,先切换工作目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /var/lib/mysql-files/

假设我们的备份文件格式为 tar 格式的存储文件,需要先进行解压缩。如果是其他格式,比如 .xb 格式,容器内置了 qpressxbstream 工具,参考你的云平台提供的说明文档直接使用就是了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tar zxvf *.tar

在备份文件解压缩之后,我们就可以正式开始进行数据恢复操作了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
innobackupex --defaults-file=/etc/mysql/node.cnf --apply-log /var/lib/mysql-files/

数据恢复时间,根据你的备份文件大小而定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
InnoDB: 5.7.32 started; log sequence number 3006781461
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 3006781480
211013 07:57:02 completed OK!

当你看到上面的日志输出后,正常的 MySQL 实例正常运行的数据文件就都就绪了。

但是为了进行完整数据导出,我们还需要进行一些额外操作。

导出数据文件

在上文的操作过程中,考虑数据库实例需要稳定运行,所以并没有直接将数据恢复到 /var/lib/mysql 目录,而是在 mysql-files 目录进行解压缩处理。

为了能够正确导出数据,我们需要让数据库实例能够读取我们恢复的数据,所以我们将解压缩后的数据对数据库实例数据进行完整的覆盖。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp -r /var/lib/mysql-files/* /var/lib/mysql/
rm -rf /var/lib/mysql-files/*

在执行过后,我们切换到容器外面,执行 docker-compose down && docker-compose up -d 删除掉之前的容器,并重新创建一个干净的新容器,来继续进行数据恢复。使用 docker exec -it 再次进入容器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it percona bash

使用默认的用户名进入 MySQL 交互终端中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql -u xtrabackup

尝试列举一下当前能够读取的数据库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| YOUR_DATABASE      |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

会发现云端的 MySQL 数据库已经被正确的还原在了本地。

然而,如果你尝试使用 mysqldump 直接进行数据导出的话,可能会收到 “PXC” 报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysqldump: Got error: 1105: Percona-XtraDB-Cluster prohibits use of LOCK TABLE/FLUSH TABLE <table> WITH READ LOCK/FOR EXPORT with pxc_strict_mode = ENFORCING when using LOCK TABLES

为了解决这个文件,我们需要在 MySQL 交互终端里进行全局设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> set global pxc_strict_mode=DISABLED ;
Query OK, 0 rows affected (0.00 sec)

接着再进行数据库导出便不会再出现问题了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysqldump -u xtrabackup YOUR_DATABASE > backup.sql

因为我们导出的是标准的数据库备份,所以继续进行迁移也很简单,可以使用诸如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql -u USER -p DATABSE_NAME < backup.sql

或者 file load 的方式快速进行数据库恢复重建。

最后

对于工程师而言,懒惰是美德,但是懒惰成立的前提是你能够正确的、简单的定位和解决问题,共勉。

-- EOF

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 折腾技术 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在Docker中安装使用MySQL 部署PXC高可用(多主同时写入)
PXC是Percona公司的(Percona XtraDB Cluster) 简称PXC。它是基于Galera协议的高可用集群方案。可以实现多个节点间的数据同步复制以及读写,并且可保障数据库的服务高可用及数据强一致性。
jwangkun
2021/12/23
1.2K0
「实战篇」开源项目docker化运维部署-mysql 热备份数据(五)
PS:数据库的热备份,冷还原也讲完了,真心感觉也不是那么复杂。其实就是这样,但是在云平台越来越盛行的今天,基本上买个rdrs数据库这些功能都有了。了解下XtraBackup 这个工具确定很重要晚上很多的写成shell脚本的,更加方便了。
IT架构圈
2019/07/08
1.1K0
「实战篇」开源项目docker化运维部署-mysql 热备份数据(五)
高性能、高可用、可扩展的MySQL集群如何组建?
PXC是基于Galera的面向OLTP的多主同步复制插件,mysql自带的主从集群方案(replication)异步复制无法保证主从复制的完整一致。
灵雀云
2022/04/14
5460
高性能、高可用、可扩展的MySQL集群如何组建?
关于数据库的各种备份与还原姿势详解
上一小节提到了数据备份是指将数据库中数据存储的相关文件进行拷贝,而这些文件有很多,所以让我们来简单认识下MySQL中与数据相关的文件。
端碗吹水
2020/09/23
1.6K0
关于数据库的各种备份与还原姿势详解
用 Docker 搭建高可用 MySQL 集群玩玩儿!
4、创建五个数据卷(pxc无法直接存取宿组机的数据,所以创建五个docker数据卷)
dys
2021/09/09
1.6K0
MySQL 冷备份操作 + shell 脚本自动备份
tar jcvf data_cold_back.tar.bz2 data 当需要进行冷备份操作时, 只需执行脚本命令即可(操作会覆盖掉之前备份的压缩文件,没啥不利影响)
泥豆芽儿 MT
2022/01/06
3K2
MySQL 冷备份操作 + shell 脚本自动备份
在CentOS8下搭建PXC集群
PXC是Percona XtraDB Cluster的缩写,是 Percona 公司出品的免费MySQL集群产品。PXC的作用是通过mysql自带的Galera集群技术,将不同的mysql实例连接起来,实现多主集群。在PXC集群中每个mysql节点都是可读可写的,也就是主从概念中的主节点,不存在只读的节点。
端碗吹水
2020/09/23
1.1K0
在CentOS8下搭建PXC集群
MySQL高可用方案-PXC环境部署记录
之前梳理了Mysql+Keepalived双主热备高可用操作记录,对于mysql高可用方案,经常用到的的主要有下面三种: 一、基于主从复制的高可用方案:双节点主从 + keepalived 一般来说,中小型规模的时候,采用这种架构是最省事的。 两个节点可以采用简单的一主一从模式,或者双主模式,并且放置于同一个VLAN中,在master节点发生故障后,利用keepalived/heartbeat的高可用机制实现快速 切换到slave节点。 在这个方案里,有几个需要注意的地方: 采用keepalived作为
洗尽了浮华
2018/01/22
5.9K0
MySQL高可用方案-PXC环境部署记录
PXC安装+keepalived配置
💡 PXC(Percona XtraDB Cluster)是一个开源的、高可用性的MySQL解决方案,它基于Galera集群技术,提供了内置的多主节点、同步复制和故障转移等功能。PXC支持无需共享存储就能实现可扩展性和高可用性,使得应用程序能够更好地应对高并发访问和故障恢复。PXC集群主要由两部分组成:Percona Server with XtraDB和Write Set Replication patches(同步、多主复制插件)
救救404
2023/09/15
4760
「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)
为了让学习的知识融汇贯通,目前是把所有的集群都放在了一个虚拟机上,如果这个虚拟机宕机了怎么办?俗话说鸡蛋不要都放在一个篮子里面,把各种集群的节点拆分部署,应该把各种节点分机器部署,多个宿主机,这样部署随便挂哪个主机我们都不担心。 源码:https://github.com/limingios/netFuture/blob/master/docker-swarm/
IT架构圈
2019/03/04
6480
「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)
【Docker】基于实例项目的集群部署(五)Docker搭建MySQL集群 | PXC集群
例如,在2016年春节,微信红包的业务量巨大:共有142亿个红包,比平时的业务量增加了75%,且每秒76万个红包。同时,产生了2900万张红包张片,5.16亿人参与,每秒的支付峰值达到20.8万。 如果这是一个单节点的MySQL数据库,则将带来性能上巨大的瓶颈。
前端修罗场
2023/10/07
8780
【Docker】基于实例项目的集群部署(五)Docker搭建MySQL集群 | PXC集群
CentOS 7.2下安装PXC 5.7.21
https://www.percona.com/downloads/Percona-XtraDB-Cluster-57/LATEST/
星哥玩云
2022/08/17
3850
MySQL高可用性解决方案—Percona XtraDB Cluster
MySQL的历史演变: 1985 年,瑞典的几位志同道合小伙子成立了一家公司,这就是MySQL AB 的前身 1996年年初,MySQL 1.0发布 1996年10月,MySQL 3.11.1发布了,中间没有2.x版本。 1999-2000年,有一家公司在瑞典成立了,叫MySQL AB。 在2000 年的时候,MySQL 公布了自己的源代码,并采用GPL(GNU General Public License)许可协议,正式进入开源世界。 2000年4月,MySQL对旧的存储引擎进行了整理,命名为MyISA
MySQL轻松学
2018/03/09
5K0
MySQL高可用性解决方案—Percona XtraDB Cluster
Docker搭建pxc
pxc是基于Galera,可以实现多节点间的数据同步以及不需要读写分离可以随时访问任一节点,保证数据库的强一致性(无延迟)以及高可用,但牺牲了部分性能
风起--追风
2021/11/08
9200
MySQL PXC 集群运维指南
Percona XtraDB Cluster (PXC) 是一个完全开源的 MySQL 数据库集群解决方案,它可确保高可用性,防止停机和数据丢失,并为不断增长的环境提供线性可扩展性。它将 Percona Server 和 Percona XtraBackup 与 Galera 库集成在一起,以实现同步多源复制。
雪人
2022/10/13
2.2K0
MySQL高可用之PXC
PXC简介 PXC(Percona XtraDB Cluster)是一个开源的MySQL高可用解决方案。他将Percona Server和XtraBackup与Galera库集成,以实现同步多主复制。基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster,目前PXC架构在生产线上用的更多而且更成熟一些。PXC相比那些传统的基于主从模式的集群架构MHA和双主,Galera Cluster 最突出的特点就是解决了诟病已久的复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,它们互相的关系是对等的。本身Galera Cluster也是一种多主架构。PXC是在存储引擎层实现的同步复制,而非异步复制,所以其数据的一致性是相当高的。
小手冰凉
2020/07/06
2.6K0
ABP 框架 数据库底层迁移 Mysql 集群
我的各种github 开源项目和代码:https://github.com/linbin524
林滨
2018/12/20
2.6K0
mysql5.7.25最强集群方案(附一键部署脚本)
我已将项目上传到了我的github仓库中,大家可以点击仓库地址出现的连接登录查看相应的代码!如果觉得不错别忘了转发、点赞哦!
IT运维技术圈
2022/06/26
1.1K0
mysql5.7.25最强集群方案(附一键部署脚本)
CentOS7 下 MySQL 之 PXC 集群部署【Docker+单机多节点】
背景 【注意】: 鄙人认为本篇适合做入门测试/学习之用,选择的 "单机多节点配置" 建议移步: “多机多节点部署” —— 【CentOS7.9 下 MySQL 之 PXC 集群部署【Docker+多机多节点】 近期正突击学习数据库知识 想着对 PXC 集群部署实际操作一番,提高技能点,为后续的升职加薪做充足的准备 于是,在此记录一下, 既能作为采坑笔记,又能帮助到后期有需要的道友,欢迎指摘 … 【注】:Percona XtraDB Cluster(简称 PXC 集群) PXC的优缺点 PXC
泥豆芽儿 MT
2022/01/06
1.2K0
CentOS7 下 MySQL 之 PXC 集群部署【Docker+单机多节点】
CentOS7 下 MySQL 数据库 PXC 集群部署操作指导
背景 最近在进行 MySQL 的 PXC 集群搭建使用和研究 前期已完成了一篇记录文章 : 【CentOS7 下 MySQL 之 PXC 集群部署【Docker+多机多节点】】 但是,毕竟不是所有人都熟悉 docker 而作为开发人员,还是习惯于原生状态的安装流程 所以,在此整理官方指导的PXC 集群配置步骤 欢迎指摘 … 【注】:Percona XtraDB Cluster(简称 PXC 集群) —— 业界主流的 MySQL 集群方案 环境 CentOS 版本: CentOS Linux
泥豆芽儿 MT
2021/02/01
2.1K0
CentOS7 下 MySQL 数据库 PXC 集群部署操作指导
推荐阅读
相关推荐
在Docker中安装使用MySQL 部署PXC高可用(多主同时写入)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档