数据备份

备份脚本准备

1
2
3
4
5
6
7
8
#!/bin/bash
MYSQL_USER=root
MYSQL_HOST=127.0.0.1
MYSQL_PASSWD=
ignoredblist='information_schema|mysql|test|db_infobase|performance_schema|sys'
dblist="$(mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWD -Nse"show databases;"|grep -Ewv "$ignoredblist" | xargs echo)"

mysqldump -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWD --skip-opt --create-options --default-character-set=utf8mb4 -R -E -q -e --single-transaction --no-autocommit --max-allowed-packet=1G --hex-blob -B $dblist > /tmp/bk_mysql_alldata.sql

将其中的MYSQL_USER、MYSQL_HOST、MYSQL_PASSWORD更换成需要备份的数据库及用户名密码。存为 dbbackup_mysql.sh 文件。

将脚本拷贝到容器内执行

以自建的蓝盾mysql为例

1
2
3
4
5
6
# 将上面的数据备份脚本拷贝至自建的蓝盾mysql的pod中
kubectl cp -n blueking /data/dbbackup_mysql.sh bk-ci-mysql-0:/tmp/dbbackup_mysql.sh
# 开始执行数据备份
kubectl exec -it -n blueking bk-mysql-mysql-master-0 -- bash /tmp/dbbackup_mysql.sh
# 将备份好的sql从pod拷贝到本机暂存
kubectl cp -n blueking bk-ci-mysql-0:/tmp/bk_mysql_alldata.sql /data/bkmysql_bak/bk_mysql_alldata.sql

最后一步数据拷贝可以不做,直接在这个pod里进行后续的数据导入操作。

数据导入

上一步的数据备份是用root用户进行操作,备份中涉及存储过程函数和赋权。

注意:如果导入到阿里云mysql服务中需要处理导出的sql文件,因为阿里云提供的mysql服务,root作为保留字段,不能由用户自由创建,但允许创建拥有root权限的账户,所以需要修改备份数据中相关的内容,更换成实际使用的数据库用以替换成 superuser 为例执行如下命令:

1
2
3
4
5
6
7
8
# 统计"`root`@"字符串一共有多少个
grep -o '`root`@' bk_mysql_alldata.sql | wc -l

# "`root`@" 修改为 "`superuser`@"
sed -i 's/`root`@/`superuser`@/g' bk_mysql_alldata.sql

# 二次确认
grep -o '`superuser`@' bk_mysql_alldata.sql | wc -l

导入

1
mysql -h $NEW_MYSQL_HOST -usuperuser -p$YOUR_PASSWORD --force < bk_mysql_alldata.sql

检查

1
mysql -h$MYSQL_HOST -usuperuser -p$MYSQL_PASSWD -Nse"show databases like 'devops_ci%';"

Helmfile更新

变更 bkci\environments\default\bkci\bkci-custom-values.yaml.gotmpl 文件后执行 helmfile 相关命令更新服务。