遵循敏捷方法论的任何项目通常都会发现自己每年至少释放15 – 20次。 即使这些发行版中只有一半涉及数据库更改,也就是对生产数据库的10个更改,因此您需要一个良好的精益流程来确保获得良好的书面记录,但是与此同时,您也不想过分降低您的工作速度下。 因此,这方面的一些技巧:
提示1:介绍数据库日志表
使用DB Log表捕获运行的每个脚本,运行脚本的人,运行的时间,与脚本关联的票证等。这是PostGres的此类表的示例DDL:
create sequence db_log_id_seq;
create table db_log (id int8 not null DEFAULT nextval('db_log_id_seq'), created timestamp not null, db_owner varchar(255), db_user varchar(255), project_version varchar(255), script_link varchar(255), jira varchar(255));
WRT表列:
- id –表的主键。
- 时间戳–脚本运行的时间。 这很有用。 相信我。
- db_owner –执行脚本的用户。
- db_user –编写脚本的用户
- project_version_number –生成脚本的应用程序/项目的版本。
- scrip_link – URL链接到脚本的源代码控制版本
- jira –与脚本关联的票证的URL。
提示2:所有脚本都应具有事务性
对于每个脚本,请确保它在事务中发生,并且在事务内,请确保在db日志表中有适当的条目。 例如,这是一个删除列的脚本
BEGIN;
ALTER TABLE security.platform_session DROP COLUMN IF EXISTS ttl;
INSERT INTO db_log (
db_owner, db_user, project_version, script_link, jira, created)
VALUES (
current_user,
'alexstaveley',
'1.1.4',
'http://ldntools/labs/cp/blob/master/platform/scripts/db/updates/1.1.4/CP-643.sql',
'CP-643',
current_timestamp
);
COMMIT;
提示3:脚本应该是幂等的
尝试使脚本幂等。 如果您的团队中有10个开发人员,那么不时有人不时地运行脚本两次。 您的db_log会告诉您这一点,但是请尝试确保在发生事故时不会造成严重损害。 这意味着您将获得一个简单的
安全失败,而不是一些新手吓到。 在上面的脚本中,如果运行两次,答案将完全相同。
提示4:对模式进行源代码控制
源代码控制整个项目的主DDL。 架构更改时会随时更新。 意味着您有更新脚本
以及包含整个项目的DDL的完整主脚本。 主脚本在每个CI的开头运行,这意味着:
- 您的CI始终以干净的数据库开头
- 如果开发人员忘记升级主脚本,则配置项将失败,您的团队将很快知道需要更新主脚本。
- 当您拥有主脚本时,它将为您带来两个明显的优势:
- 新开发人员可以非常快速地启动并运行一个干净的数据库
提示5:对开发人员友好
使开发人员易于生成主脚本。 否则,当加热时,它将无法完成。
提示6:升级和还原
为每个升级脚本编写一个相应的还原脚本。 生产中发生了意外情况,您必须能够将卡车退回!
BEGIN;
ALTER TABLE security.platform_session ADD COLUMN hard_ttl INT4;
UPDATE security.platform_session SET hard_ttl = -1 WHERE hard_ttl IS NULL;
ALTER TABLE security.platform_session ALTER COLUMN hard_ttl SET NOT NULL;
ALTER TABLE security.platform_session ADD COLUMN ttl INT4;
UPDATE security.platform_session SET ttl = -1 WHERE ttl IS NULL;
ALTER TABLE security.platform_session ALTER COLUMN ttl SET NOT NULL;
INSERT INTO db_log (
db_owner, db_user, platform_version, script_link, jira, created)
values (
current_user,
'alexstaveley',
'1.1.4',
'http://ldntools/labs/cp/blob/master/platform/scripts/db/reverts/1.1.4/revert-CP-463.sql',
'CP-463',
current_timestamp
);
COMMIT;
直到下一次照顾自己。
翻译自: https://www.javacodegeeks.com/2016/06/agile-databases.html