之前搭建了在docker上搭建了一套MySQL的PXC集群,当时没有做备份处理,今天搭建了一套备份方案。
MySQL的数据备份方式有很多种,如自带的MySQLDUMP命令,或者直接拷贝数据文件等等方式,但是这些方式都是系统的冷备份,即需要停机服务进行备份,这种方式我没有采用。
本次备份方案是热备份,MySQL的热备份的方式有两种:1、LVM 2、xtrabackup
lvm是Linux自带的一种,通过对某一个分区创建快照进行备份,所以可以备份多种数据库。但是缺点是会对数据库加锁,使得数据库在备份区间只读不可写,生产环境这是不允许的。
xtrabackup是percona公司的开源免费的MySQL备份工具,在热备份上不需要锁表进行备份,所以一般MySQL上备份采用xtrabackup,它还有个优势是备份数据是被压缩过的,会减小磁盘压力。
备份方式两种:全量、增量,一般一周一次全量备份,一天一次增量备份。
由于PXC安装在docker上的,备份方式和单机备份有一些差异:
1、备份数据docker服务上需要有数据卷映射到MySQL-PXC的backup备份文件夹。具体在搭建pxc笔记中有。
2、要进入docker中MySQL上安装xtrabackup进行数据备份,不是在宿主机上安装
由于PXC各个节点数据节点都是一致的,所以只需要进入一个节点进行备份就行了。
方法:
进入节点
docker exec -it node2 /bin/bash
更新update
apt-get update
如果执行这一步update时候报错,如以下错误:
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
这代表进入这个node2服务中的时候没有权限操作,所以我们要给到root用户进入服务
方式:
退出当前服务
ctrl+d
重新以root角色进入docker服务,随便进入一个节点,这里我进入node1
docker exec -it -u 0 node1 /bin/bash
执行update更新
apt-get update
安装xtrabackup
apt-get install percona-xtrabackup-24
安装完后进行全量备份:
innobackupex --user=root --password=MySQL密码 /data/backup/full
执行完后自动开始全量备份
检查全量备份:
切换到全量备份文件夹
cd /data/backup/full
查看
ls
退出docker服务,由于有目录映射,所以宿主机上也会看到文件,具体方法:
查看宿主机备份的数据目录在哪:
docker inspect backup
切换到该文件夹
cd /var/lib/docker/volumes/backup/_data
查看
ls
发现有backup目录,进入backup目录里面的full目录中查看,发现有全量备份文件
全量备份完成。
还原:
MySQL的数据还原方式不像备份一样,MySQL数据还原只有冷还原,docker服务和单机节点差异是,docker还原的时候需要把docker的PXC集群解散掉,删除各个节点,之后新建一个新的节点并 进行冷还原,最后新建其他节点和当前节点进行数据同步;
docker stop掉各个节点
docker rm删掉各个节点
docker volume rm删掉各个数据卷,这里删掉的是pxc服务的数据卷不是backup备份文件数据卷,千万别用删除孤卷命令,因为解散pxc后backup卷也是孤卷了,删除孤卷命令会把备份数据也删掉了
新建一个新节点,命令和搭建pxc集群一致
进入该节点
docker exec -it -u 0 node1 bash
安装xtrabackup
执行MySQL数据清空指令
rm -rf /var/lib/mysql/*
执行还原命令
innodackupex --user=root --password=密码 --apply-back /data/backup/full/备份文件名/
这里的--apply-back参数指的是回滚掉全量备份之间产生的事务差异数据
退出容器,重启docker节点
之后在搭建其他的节点即完成冷还原