背景是项目从老版本mysql升级到新版本k8s部署的pgsql,并且表结构发生变化。这个项目的外场比较多,环境因素不确定(不联网,现场操作人员非开发,依赖…),所以采用脚本升级的方式
1.0版本项目mysql,3类详单数据分别建了366天表,加上其它的合计共1167张表
2.0版本项目pgsql建立表分区,合计共33张表
由于SQL间存在方言,我采用导出csv的方式避免这个问题
# 测试数据
Export time: 4'33
Export tables count:1167
Import time:4'46
Import tables count:33
Data rows:25973598
# 脚本结构
│
├─1.0
│ mysql.cfg -- mysql数据库配置
│ sql.cfg -- 导出脚本
│ start.sh -- 入口脚本
│
├─2.0
│ create_partition.sql -- 建立分区脚本
│ import.sh -- 导入脚本
│ pgsql.cfg -- pgsql数据库配置
│ start.sh -- 入口脚本
│
└─data -- 数据存放文件夹
脚本比较多就不往上粘了,简单说下思路
1.0
1)加载mysql配置
2)加载sql脚本
3)获取db连接
4)执行sql脚本输出至csv文件
5)关闭db连接
6)压缩打包csv文件
2.0
由于2.0版本是k8s部署的pgsql容器,脚本分为宿主机部分、容器部分
宿主机
1)获取k8s命名空间
2)获取pod name
3)使用k8s创建容器内目录
4)脚本传输至容器内
容器
1)加载pgsql配置
2)解压csv压缩包
3)获取db连接
4)执行脚本创建表分区函数并执行
5)导入csv文件入库
6)关闭数据库
我这个是按照现场数据库部署在不同服务器并且存在未联网、ftp工具不存在等因素搞得分离两步操作。如果条件允许完全可以一步执行,在中间加上ftp传输远程执行脚本即可。