MySQL 外置
前置要求!!!
外置 MySQL 5.7.x ONES 版本要求:3.14.x 需要大于等于【3.14.148】6.1.x 需要大于等于【6.1.57】
外置 MySQL 5.7.x 版本:需要是 5.7.42 - 5.7.44,未来更新的版本可能存在兼容性问题
外置 MySQL 8.0.x ONES 版本要求:需要大于等于【6.1.57】
外置 MySQL 8.0.x 版本要求:需要大于 8.0.32 小于 8.1.0
迁移过程请停机,不要使用业务!!!
操作步骤
安装配置外置 MySQL
示例安装命令,外置数据库的数据安全由提供方保证。请自行确保数据安全
mysqlRootPassword 可以参考下方获取数据库用户密码获取
docker run -d -p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=<mysqlRootPassword> \
-v /path/to/your/mysql_data:/var/lib/mysql \
mysql:5.7.43
替换 my.cnf 文件
如果是其他方式安装的 MySQL 请根据具体环境替换 my.cnf 配置文件
# mysql 8.x 请使用 curl -O https://res.ones.pro/script/k3stool/mysql_8_my.cnf
curl -O https://res.ones.pro/script/k3stool/my.cnf
docker cp my.cnf <containerID>:/etc/
docker restart <containerID>
如果客户不允许直接替换 my.cnf,请协调客户调整下面的配置项(必须修改)
注意!!!!仅调整如下配置可能存在性能问题,最好还是替换 my.cnf
[mysqld]
# 自增 id
auto_increment_increment=1
auto_increment_offset=1
# 字符集
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
# 事务级别
transaction_isolation = REPEATABLE-READ
# 默认存储引擎
default_storage_engine = InnoDB
# binlog
log_bin = mysql-bin
binlog_format = row
# GTID
gtid_mode=on
enforce_gtid_consistency=on
session_track_gtids=OWN_GTID
session_track_state_change=ON
[mysqldump]
quick # 该配置项找不到的话可以不用配置
max_allowed_packet = 1024M
登录 MySQL 查看服务是否正常
mysql -uroot -p<mysqlRootPassword>
ONES 服务外置 mysql
停止关键服务
kubectl -n ones scale --replicas=0 deploy project-api-deployment wiki-api-deployment
kubectl -n ones scale --replicas=0 sts wiz-editor-server-statefulset
导出 mysql 数据
导出完成后请将宿主机的 /tmp/all.sql 放到外置数据库服务器上,后面会使用该 sql 导入数据
涉及到数据安全,请严格按照文档说明操作!!!!
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} \
--master-data --max-allowed-packet=32M --single-transaction \
--skip-lock-tables --quick --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
外置 MySQL 导入数据
登录外置数据库导入数据,以下用 docker 部署的 mysql 作为示例
docker exec -it <containerID> bash
mysql -uroot -p<mysqlRootPassword> --default-character-set=utf8mb4
SET global FOREIGN_KEY_CHECKS = 0;
source /tmp/all.sql;
SET global FOREIGN_KEY_CHECKS = 1;
注意事项1:如上述set命令报错ERROR 1227 (42000): Access denied; 可去掉 global 关键字
注意事项2: 上述操作将会先DROP TABLE 、再CREATE TABLE,执行source之前,请先备份