前言
本文中试图解决运维工作经常遇到的一个问题,随着应用的不断迭代,每个应用版本对应的数据库应该如何维护才能更节省管理成本。本文提到了两个观点仅供参考:即可重复部署与多路径部署。
可重复部署:指的是安装过程若出现故障,重复执行安装程序不会对数据库造成破坏。
多路径部署:指的是运行最新安装包时无论从哪个历史版本安装,都能升级到最新版本。
实例版本与数据库文件说明
版本号 | 发版日期 | 部署轨迹支持 | 数据库文件 |
---|---|---|---|
v1.0 | 2020.01.01 | v1.0全新部署多次 | db001-initial-v1.0-20200101.sql |
v2.0 | 2020.02.01 | v2.0全新部署多次 v1.0>v2.0升级部署多次 |
db001-initial-v1.0-20200101.sql db002-patch-v2.0-20200201.sql |
v3.0 | 2020.03.01 | v3.0全新部署多次 v1.0>v3.0升级部署多次 v2.0>v3.0升级部署多次 |
db001-initial-v1.0-20200101.sql db002-patch-v2.0-20200201.sql db003-patch-v3.0-20200301.sql |
数据库文件内容与部署脚本文件内容
- db001-initial-v1.0-20200101.sql
创建表结构,新增数据
CREATE TABLE IF NOT EXISTS `S` (
`Sno` varchar(7),
`Sname` varchar(10),
`Sage` int(11),
PRIMARY KEY (`Sno`)
);
INSERT IGNORE INTO `S` VALUES ('10001', '小明', 21);
INSERT IGNORE INTO `S` VALUES ('10002', '小华', 19);
- db002-patch-v2.0-20200201.sql
新增表字段,修改表字段,新增表数据,修改表数据
ALTER TABLE S ADD COLUMN `Ssex` varchar(2);
ALTER TABLE S MODIFY COLUMN Sage int(12);
INSERT IGNORE INTO `S` VALUES ('10003', '小王', 20, '男');
UPDATE S SET Ssex='男' WHERE Sno=10001;
UPDATE S SET Ssex='女' WHERE Sno=10002;
- db003-patch-v3.0-20200301.sql
新增表字段,修改表字段,新增表数据,修改表数据
ALTER TABLE S ADD COLUMN `Sdept` varchar(20);
UPDATE S SET Sdept='理工学院' WHERE Sno=10001;
UPDATE S SET Sdept='人文学院' WHERE Sno=10002;
INSERT IGNORE INTO `S` VALUES ('10004', '小李', 19, '女', '人文学院');
- deploy.sh
根据文件名顺序读取数据库文件并执行导入
#!/bin/bash
curPath=$(readlink -f "$(dirname "$0")")
files=$(ls $curPath/database/ | sort -n)
for file in $files
do
mysql -hdemo -uroot -pP@ssw0rd -P3306 -Ddemo < ${curPath}/database/$file
done
版本发行包目录结构(文件名一致即内容一致)
application/
├── v1.0
│ ├── database
│ │ └── db001-initial-v1.0-20200101.sql
│ └── deploy.sh
├── v2.0
│ ├── database
│ │ ├── db001-initial-v1.0-20200101.sql
│ │ └── db002-patch-v2.0-20200201.sql
│ └── deploy.sh
└── v3.0
├── database
│ ├── db001-initial-v1.0-20200101.sql
│ ├── db002-patch-v2.0-20200201.sql
│ └── db003-patch-v3.0-20200301.sql
└── deploy.sh