# 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
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docker.shujuwajue.com/mysql-ji-qun/pxcji-qun/43001-re-bei-fen-shu-ju.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
