K8s中 备份数据 检查验证(二)--Mysql备份验证

本文介绍了一种用于检查iotplat Mysql数据库状况的脚本,包括从k8s环境中获取数据行数及使用xtrabackup进行数据库备份验证的方法。通过执行特定脚本,可以获取数据库中s1box-user库user表的行数,并验证从*mysql-iotpla*.tar.gz备份文件中还原的数据一致性。

检查名为iotplat的Mysql数据库。

现行k8s中的mysql状况检查;

status-mysql-iotplat.sh

#!/bin/bash


rundir=$(cd $(dirname $0); pwd)
theday=`date +%F`

if [ ! -d "${rundir}/log" ]; then
        mkdir ${rundir}/log
fi


if [ "$*" ];then
        arg=$*
else
        arg="mysql-0"
fi


echo -e "当前 iotplat-mysql-0 数据库中s1box-user库中user表的行数:" > ${rundir}/log/iotplat-mysql-status-${theday}.txt

#连接k8s中指定数据库(s1box-user),查询里边表(user)的行数,并输出结果
kubectl exec -it -n iotplat iotplat-mysql-0 mysql -- -uroot -p数据库密码 -D s1box-user \
-e 'select count(*) from user' >> ${rundir}/log/iotplat-mysql-status-${theday}.txt 2>&1

#-e 'SELECT TABLE_ROWS from information_schema.TABLES WHERE TABLE_SCHEMA="s1box-user" AND TABLE_NAME="user"' \
#>> ${rundir}/log/iotplat-mysql-status-${theday}.txt 2>&1

#删除掉警告提示这些行
#sed -n '$p' ${rundir}/log/redis-status-${theday}.txt
sed -i '/Warning/d' ${rundir}/log/iotplat-mysql-status-${theday}.txt
sed -i '/Defaulting/d' ${rundir}/log/iotplat-mysql-status-${theday}.txt
sed -i '/Use/d' ${rundir}/log/iotplat-mysql-status-${theday}.txt

cat ${rundir}/log/iotplat-mysql-status-${theday}.txt

运行

检查验证备份的数据;

使用xtrabackup备份的备份数据,压缩后名为*mysql-iotpla*.tar.gz这样格式,保存在当前的bak目录下。

解压后的数据在当前dbbak/mysql/目录下,名为mysqlbak.xtrabackup。

成功还原后的数据在当前dbbak/mysql/目录下。

mysql-check-iotplat.sh

#!/bin/bash


#运行目录
rundir=$(cd $(dirname $0); pwd)
#格式化当前日期
theday=`date +%F`

echo -e "=======${theday} iotplat-Mysql备份验证======="

#是否带参数,参数是备份目录,
#如果不带,则在运行目录查找包含“mysql*.tar.gz”的文件中最新的一个
if [ "$1" ];then
	mysqlbaktar=$1
else
	mysqlbaktar=$(find ${rundir} -name "*mysql-iotplat*.tar.gz" | sort -rn | head -1)
fi
if [ ! -e "${mysqlbaktar}" ];then
	echo "没有找到备份压缩包!!!"
	exit 0
fi
echo -e "1.Mysql备份文件是:\n ${mysqlbaktar}"

#在宿主机中创建一个临时的数据库目录
dbtmpdir="${rundir}/dbtmp/mysql"
if [ -d ${dbtmpdir} ];then
	rm -rf ${dbtmpdir}/*
else
	mkdir ${dbtmpdir} -p
fi
echo -e "2.数据库目录:\n ${dbtmpdir}"


echo -e "3.解压备份数据库文件"
tar zxf ${mysqlbaktar} -C ${dbtmpdir}
xtrafile=$(find ${dbtmpdir} -name "*iotplat*.xtrabackup" | sort -rn | head -1)
mv ${xtrafile} ${dbtmpdir}/mysqlbak.xtrabackup
echo -e " 备份文件:${dbtmpdir}/mysqlbak.xtrabackup"

#启动一个容器(xtrabackup)还原数据,完成后关闭此容器
echo -e "4.还原数据库"
docker run -it --rm -v ${dbtmpdir}:/home docker.sunniwell.net/base/xtrabackup:2.4.14 /bin/bash -c 'xbstream -x < /home/mysqlbak.xtrabackup -C /home && xtrabackup --prepare --target-dir=/home'  >> /dev/null 2>&1
echo -e " 还原的数据库目录:${dbtmpdir}"

#再次启动一个mysql容器,做为mysql服务器,使用数据库目录为之前还原好的。
echo -e "5.查询s1box-user库中user表,验证数据"
docker run --name mysql-check -v ${dbtmpdir}:/var/lib/mysql -e MYSQL_ROOT_PASSWORD="数据库密码" -d mysql:5.7.19 >> /dev/null 2>&1
#echo -e "======================================" >> ${rundir}/log/mysql-check.txt
echo -e "=======${theday} iotplat-Mysql备份验证=======" >> ${rundir}/log/mysql-check.txt
#echo -e "======================================" >> ${rundir}/log/mysql-check.txt
echo -e "备份文件为:${mysqlbaktar}" >> ${rundir}/log/mysql-check.txt
echo -e "验证结果:" >> ${rundir}/log/mysql-check.txt
#第三次启动一个mysql容器,连接之前第二次启动的mysql容器
#在容器里用mysql命令连接第二次启动好的mysql服务器容器,并查询ucs数据库user表的行数变化。
#运行完成后关闭
docker run -it --link mysql-check:mysql --rm mysql:5.7.19 sh -c  \
'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -D s1box-user  \
 -e "select count(*) from user"' > ${rundir}/log/mysql-check-${theday}.txt
#停止第二次启动的mysql服务器容器,并删除。
docker stop mysql-check >> /dev/null 2>&1
docker rm mysql-check >> /dev/null 2>&1

cat ${rundir}/log/mysql-check-${theday}.txt | tr -d "\r" > ${rundir}/log/mysql-check-tmp.txt
sed -e '/Warning/d' ${rundir}/log/mysql-check-tmp.txt >> ${rundir}/log/mysql-check.txt
tail -n 8 ${rundir}/log/mysql-check.txt
echo -e "验证结果输出:${rundir}/log/mysql-check.txt"

运行

<think>嗯,用户想在Kubernetes集群中为通过Deployment部署的MySQL实现物理备份方案。首先,我需要回忆一下Kubernetes中的备份方法,特别是针对有状态应用的。虽然Deployment通常用于无状态应用,但用户可能因为某些原因选择用它来部署MySQL,比如简化管理或者测试环境。 首先,物理备份通常需要直接访问数据库的数据文件,所以需要确定MySQL数据存储位置。用户可能使用了PersistentVolume(PV)和PersistentVolumeClaim(PVC)来持久化数据,这样即使Pod重启,数据也不会丢失。这时候,备份的关键就是如何获取这些持久化卷的数据。 接下来,可以考虑几种方法。一种是使用sidecar容器,在同一个Pod中运行一个备份工具,比如Percona XtraBackup,定期备份数据到存储卷。这样备份容器可以访问MySQL数据目录,执行物理备份,并将备份文件保存到另一个PVC或云存储中。这种方法的好处是备份过程与主容器解耦,但需要确保备份容器有足够的权限和资源。 另一种方法是使用CronJob来定期执行备份任务。创建一个CronJob,每次运行时启动一个Pod,挂载MySQL的PVC,然后使用XtraBackup或mysqldump进行备份。不过,mysqldump是逻辑备份,用户需要的是物理备份,所以XtraBackup更合适。这种方法可能需要处理PVC的读写权限,特别是如果多个Pod同时挂载同一个PVC可能会有问题,需要确保ReadOnlyMany或ReadWriteMany的支持。 第三种方法是利用云存储的卷快照功能。如果Kubernetes集群所在的云平台支持Volume Snapshots,可以创建快照来备份数据。这需要StorageClass支持快照,并且配置VolumeSnapshot资源和相关操作。这种方法快速且高效,但依赖于云提供商的支持,可能不适合所有环境。 此外,还需要考虑备份的一致性和恢复流程。在备份期间,可能需要暂时锁定数据库或确保事务日志刷新,以避免数据不一致。使用XtraBackup的话,它本身会在备份过程中处理这些事务,确保一致性。恢复时,可能需要将备份文件还原到新的PVC,并重新部署MySQL实例。 另外,用户的引用中提到,有些情况下数据库不会部署在Kubernetes中,而是通过Endpoints引入,但用户这里明确是通过Deployment部署的,所以需要处理内部的备份。同时,StatefulSet更适合有状态应用,但用户可能已经用Deployment部署了,所以需要考虑如何适配。 还需要注意备份文件的存储位置,确保备份的安全性和可恢复性。可能需要将备份上传到远程存储如S3、NFS或者另一个PVC,并定期清理旧备份。 最后,权限和安全性也是要考虑的。备份容器需要有访问MySQL数据目录的权限,可能需要调整SecurityContext或使用特定的ServiceAccount。同时,备份文件应加密存储,防止数据泄露。 总结下来,步骤可能包括:确定数据存储位置,选择备份工具(如XtraBackup),设计备份方案(sidecar/CronJob/快照),配置存储和权限,测试备份和恢复流程,以及自动化定期执行。</think>### Kubernetes中为Deployment部署的MySQL实现物理备份方案 #### 1. **确认数据持久化配置** 首先需确保MySQL的Deployment已配置$PersistentVolumeClaim$挂载到数据目录(如`/var/lib/mysql`)。示例配置: ```yaml apiVersion: apps/v1 kind: Deployment spec: template: spec: containers: - name: mysql volumeMounts: - mountPath: /var/lib/mysql name: mysql-data volumes: - name: mysql-data persistentVolumeClaim: claimName: mysql-pvc ``` #### 2. **物理备份实现方案** ##### **方案一:Sidecar容器+定时备份** 在MySQL Pod中添加备份容器,使用$Percona XtraBackup$执行物理备份: ```yaml spec: containers: - name: backup-sidecar image: perconalab/percona-xtrabackup command: ["/bin/sh", "-c"] args: - "while true; do xtrabackup --backup --target-dir=/backup/$(date +%s); sleep 86400; done" volumeMounts: - mountPath: /var/lib/mysql # 与主容器共享数据卷 name: mysql-data - mountPath: /backup # 独立备份存储卷 name: backup-volume ``` ##### **方案:CronJob定期备份** 创建CronJob定时触发备份任务(需确保PVC支持多节点只读挂载): ```yaml apiVersion: batch/v1 kind: CronJob spec: schedule: "0 2 * * *" jobTemplate: spec: template: spec: containers: - name: xtrabackup image: perconalab/percona-xtrabackup command: ["xtrabackup", "--backup", "--target-dir=/backup"] volumeMounts: - mountPath: /var/lib/mysql name: mysql-data readOnly: true - mountPath: /backup name: backup-volume restartPolicy: OnFailure ``` ##### **方案三:卷快照(Volume Snapshot)** 若存储后端支持快照功能(如云厂商CSI驱动): ```yaml apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: mysql-snapshot spec: source: persistentVolumeClaimName: mysql-pvc ``` #### 3. **备份存储与恢复** - **存储选择**:备份文件可保存至NFS、S3兼容存储或独立PVC - **恢复流程**: 1. 创建新PVC并挂载备份数据 2. 使用`xtrabackup --prepare`处理备份文件 3. 修改Deployment指向新PVC #### 4. **注意事项** - 备份时需确保数据库一致性(XtraBackup自动处理) - 备份容器需配置足够资源(CPU/Memory)[^5] - 若使用ReadWriteMany存储类型需提前验证存储系统支持[^2] - 建议加密备份数据(如使用Kubernetes Secrets管理密钥)[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值