将内置数据库从 MySQL 5.7 切换到 MySQL 8.4
ONES V7.17.0及以上版本,默认初装时采用MySQL 8.4; 低版本升级到ONES V7.17.0及以上 版本时、Mysql 5.7 不会切换到MySQL 8.4,此时K3s单机版可参考本文按需切换;同时,原备份/恢复功能只限于Mysql 同版本操作。
本文档操作只适用于同时满足以下三个条件的客户:
-
ONES 版本为 v7.17.0 及以上版本。
-
目前正在使用内置 MySQL 5.7 数据库且产生了业务数据;
-
MySQL 为单节点部署。
1. 停止服务
kubectl -n ones scale --replicas=0 deploy ones-project-api-deployment project-api-deployment wiki-api-deployment
kubectl -n ones scale --replicas=0 sts wiz-editor-server-statefulset
kubectl -n ones scale deploy mysql-xbackup-deployment --replicas=0
kubectl -n ones scale --replicas=0 deploy kafka-cdc-connect-deployment ones-bi-sync-etl-deployment binlog-event-sync-deployment kilob-sync-deployment
2. 导出 MySQL 5.7 数据
ones-ai-k8s.sh
# 获取 mysqlRootPassword
kubectl exec -n ones-installer -it $(kubectl -n ones-installer get po | grep installer-api | awk {'print $1'}) -c installer-api -- bash -c "cd /data/ones/ones-ai-k8s && make get_value KEY=mysqlRootPassword"
# 查看当前 ONES 服务的数据库,请加输出的内容填写到下面的 onesDatabases 变量中
awk '/\{\{\s*\$databaseSettings\s*:=\s*dict/,/\}\}/' overlay-templates/ones/v1/init-db/init-db.yaml | grep -oE '\$config\.\w+' | awk -F'.' '{print $2}' | xargs -I {} make get_value KEY={}
kubectl -n ones exec -it mysql-cluster-mysql-0 bash
mysqlRootPassword="" # 调整为前面获取的mysqlRootPassword密码
# 示例配置 onesDatabases="project wiki",空格分割,根据上面命令的实际输出调整!!!
# 根据上面命令的实际输出调整!!!
# 根据上面命令的实际输出调整!!!
onesDatabases=""
mysqldump --host=localhost --port=3306 --user=root --password=${mysqlRootPassword} \
--max-allowed-packet=32M --single-transaction --skip-comments \
--skip-lock-tables --quick --skip-add-locks --set-gtid-purged=OFF \
--extended-insert --hex-blob --default-character-set=utf8mb4 --databases $onesDatabases > /tmp/all.sql
exit
exit ## exit 两次是为了退出到宿主机
kubectl -n ones cp mysql-cluster-mysql-0:/tmp/all.sql /tmp/all.sql # 拷贝到宿主机的 /tmp/all.sql
3. 切换内置数据库到 MySQL 8.4
3.1 拉起 MySQL 8.4 数据库
在 private.yaml 中添加配置:
mysqlVersionProfile: mysql84
然后执行 make setup-ones-built-in-mysql。等待 MySQL 8.4 pod 启动完成后执行如下指令确认版本是否切换成功:
# 退出 ones-ai-k8s.sh
exit;
kubectl -n ones exec -it mysql-cluster-mysql-0 -- bash -c "mysql -uroot -p$(grep mysqlRoot /data/ones/ones-installer-pkg/config/private.yaml | awk '{print $2}') -e 'select version();'"
3.2 导入 MySQL 5.7 数据到 MySQL 8.4
# 将 /tmp/all.sql 拷贝到 MySQL 8.4 pod 中
kubectl -n ones cp /tmp/all.sql mysql-cluster-mysql-0:/tmp/all.sql
kubectl -n ones exec -it mysql-cluster-mysql-0 bash
# 登录进 MySQL,需要提前获取 mysqlRootPassword
mysql -uroot -p<mysqlRootPassword> --default-character-set=utf8mb4
SET global FOREIGN_KEY_CHECKS = 0;
source /tmp/all.sql;
SET global FOREIGN_KEY_CHECKS = 1;
3.3 初始化数据库
导入数据后,需要执行初始化数据库操作:
make init-db
4. 恢复服务
make setup-ones
kubectl -n ones scale --replicas=1 deploy ones-project-api-deployment project-api-deployment wiki-api-deployment
kubectl -n ones scale --replicas=1 sts wiz-editor-server-statefulset
make rebuild-cdc
待服务全部恢复后执行一次全量备份:
make mysql-base-backup NAMESPACE=ones