管理 PostgreSQL 的常规操作之一是定期更新数据库系统的体系结构。PostgreSQL 做得很好,允许人们以可靠的方式通过添加和删除列以及更新列数据类型等来更新模式、添加类型、函数、触发器或更改表。但是,没有内置机制来帮助识别差异,更不用说生成必要的 SQL 来轻松完成从开发环境到生产环境的更新。
因此,让我们谈谈模式更改的可能方法。
使用逻辑转储清单
识别从一个数据库到另一个数据库的模式之间变化的最简单方法是比较模式转储清单。
以下示例演示了一种可以用来查找不同数据库上架构之间差异的方法:
例子:
-- create database schemas
create database db01
create database db01<br /><br /><br />
-- db02: version 2
create table t1 (
c1 serial primary key,
c2 varchar(256),
c3 date default now()
);
create table t2(
c1 serial primary key,
c2 varchar(3),
c3 varchar(50),
c4 timestamp with time zone default now(),
c5 int references t1(c1)
);
create index on t2 (c5);# generate schema dumps
pg_dump -s db01 -Fc > db01.db
pg_dump -s db02 -Fc > db02.db# generate manifests
pg_restore -l db01.db > db01_manifest.ini
pg_restore -l db02.db > db02_manifest.ini此代码段演示了通过比较 md5 校验和来查找差异:
# EX 1: generate checksums
md5sum \
<(tail +16 db01_manifest.ini | cut -d ' ' -f 4-) \
<(tail +16 db02_manifest.ini | cut -d ' ' -f 4-)
# output
$ 9d76c028259f2d8bed966308c256943e /dev/fd/63
$ ba124f9410ea623085c237dc4398388a /dev/fd/62下一个片段区分了两个清单之间的差异,仅标识那些已更改的对象和属性。请注意,冗余信息(前 16 行)已被跳过:
这个结果差异显示了两个模式之间所做的更改:
好消息是,有许多现有工具可以调和提议的模式设计和目标模式之间的差异:
- 商业产品可以以优雅高效的方式区分数据库之间的模式。研究,如谷歌,产生了人们可以使用的最流行的技术。
- 关于开源解决方案,有许多项目能够区分 Postgres 数据库模式。
使用 apgdiff 扩展
以下是开源工具apgdiff的示例实现。
Apgdiff 可以在 Postgres 社区存储库中找到。它比较两个模式转储文件并创建一个 SQL 输出文件,该文件在很大程度上适用于旧模式的升级:
以下示例演示了如何使用 apgdiff 更新开发环境和生产数据库架构之间的差异。
例子:
# EX 2: uses logical dumps
# notice the dumps are standard logical dumps and includes data
pg_dump db01 -Fc > db01.db
pg_dump db02 -Fc > db02.db
createdb db03 --template=db01
# this invocation assumes the resultant diff doesn’t require editing
apgdiff --ignore-start-with \
<(pg_restore -s -f - db01.db) \
<(pg_restore -s -f - db02.db) \
| psql -1 db03
通过这些简单的方法,您可以完成更多的事情。通过结合这些的变体,可以用很少的代码创建相当复杂的 shell 脚本,而且运气好的话,不需要那么多努力。
原文标题:Diffing PostgreSQL Schema Changes
原文作者:Robert Bernier
原文链接:https://www.percona.com/blog/diffing-postgresql-schema-changes/
最后修改时间:2022-12-27 11:59:19
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




