> For the complete documentation index, see [llms.txt](https://docker.shujuwajue.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docker.shujuwajue.com/mysql-ji-qun/pxcji-qun/43001-re-bei-fen-shu-ju.md).

# 4、热备份数据

## 热备份数据

> **冷备份**
>
> * 冷备份是关闭数据库时候的备份方式，通常做法是拷贝数据文件或者使用mysql dump指令。
> * 冷备份是最简单最安全的一种备份方式
> * 大型网站无法做到关闭业务备份数据，所以冷备份不是最佳选择。

![](/files/-LfnTJyoNhSsU5fMfr8_)

如果非要进行冷备份方案，可以考虑将PXC集群中的某个节点下线，然后备份数据，完成后让节点再上线，产生同步，这样又可以和其他节点数据保持一致。

### 热备份

热备份是在系统运行的状态下备份数据，也是难度最大的备份。

Mysql常见的热备份又LVM和XtraBackup两种方案。

#### LVM备份方式

是linux自带的一种技术，Linux对某一个分区创建快照实现对这个分区数据的备份。原则上LVM可以备份的数据库有很多：例如mysql，orcale，mongodb等。

缺**点：**

1.备份数据库时，需要对数据库加锁，这个数据库只能读取数据不能写入数据。这样对业务开展还是有一定的影响。

2.指令繁琐

#### XtraBackup备份方式（推荐使用）

XtraBackup是一款基于InnoDB的在线热备工具，具有开源免费，支持在线热备，占用磁盘空间小，能够非常快速地备份与恢复mysql数据库

**优点：**

* XtraBackup备份过程中不锁表、快速可靠
* XtraBackup备份过程不会打断正在执行的事务。
* XtraBackup能够基于压缩等功能节约磁盘空间和流量
* 支持全量备份，也支持增量备份
* 支持mysql官方版，以及衍生版，例如miradb等
* 免费

**全量备份和增量备份**

全量备份是备份全部数据。备份过程时间长，占用空间大。（对数据库的第一次更新一定要采用全量备份，后续的备份就可以采用增量备份）

![](/files/-LfnTJyqtlk54SHNKWW5)

增量备份是只备份变化的那部分数据。备份时间短，占用空间小。（比如一周做一次全量备份，一天做一次增量备份）

![](/files/-LfnTJys_FjQmNe2qWK5)

## XtraBackup的安装

XtraBackup工具需要安装在数据库所在的节点容器内，它备份出来的数据就直接保存在容器里了，这样做不好，我们应该把备份的数据导出到宿主机上，采用映射的技术。

**准备工作具体操作：**

宿主机上创建一个数据卷，将这个卷映射个某一个数据库节点上，然后通过热备工具备份出来的数据就可以在宿主机上看到了。

宿主机上创建数据卷：

```
$ docker volume create backup
```

配置某个数据节节点，映射数据卷(停止删除之前容器，加入热备份数据卷)

```
$ docker stop node1
$ docker run -d -p 3306:3306 -v v1:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 --privileged -e CLUSTER_JOIN=node2 --name=node1 --net=net1 --ip 172.18.0.2 pxc
```

对比之前启动node1的不同点：

1.-v backup\:/data：加入备份数据库的数据卷

2.-e CLUSTER\_JOIN=node2：启动后跟哪个节点同步数据

**PXC全量备份的步骤**

PXC节点容器中安装XtraBackup，并执行备份。

```
$ docker exec -it node1 bash
$ apt-get update
$ apt-get install percona-xtrabackup-24
$ innobackupex -user=root --password=abc123456 /data/backup/full
$ exit
```

在宿主机器查看

```
$ docker inspect backup # 查看backup数据卷信息，查看路径
```

**PXC全量恢复步骤**

* 数据库可以热备份，但是不能热还原。为了避免恢复过程中的数据同步，我们采用空白 MYSQL还原数据，然后建立PXC集群。
* 还原数据前要将未提交的事务回滚，还原数据之后重启MySQL

宿主操作

1.删除pxc集群节点

2.删除数据卷

3.重新运行node1，加入备份的数据卷

```
$ docker stop node1 node2 node3
$ docker rm node1 node2 node3
$ docker volume rm v1 v2 v3
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --name=node1 --net=net1 --ip 172.18.0.2 pxc
```

进入node1容器节点：

1.删除数据

2.将没有提交的事务回滚（--apply-back）

3.还原数据（--copy-back）

```
$ docker exec -it node1 bash
$ rm -rf /var/lib/mysql/*
$ innobackupex --user=root --password=abc123456 --apply-back /data/backup/full/2018-xxxx-xx/
$ innobackupex --user=root --password=abc123456 --copy-back /data/backup/full/2018-xxxx-xx/
```

退出容器重启node1节点

```
$ exit 
$ docker stop node1
$ docker start node1
```
