有没有一种工具(PHP、Perl、Ruby、shell、在线 SaaS)可以转储 PostgreSQL 数据库、创建新架构并进行迁移(不会丢失数据)?处理删除和添加依赖项有点麻烦。
答案1
简短回答:不。
更长的答案:神奇地确定从模式 A 到模式 B 的路径超出了计算机程序的能力,即使是像数据库系统这样复杂的程序也是如此。人类需要参与其中。
您的数据库升级过程应该包括创建一个更新脚本(例如updates-1.3.0.sql
),该脚本执行适当且必要的操作,包括:
CREATE TABLE
和命令ALTER TABLE
DROP TABLE
CREATE INDEX
和DROP INDEX
命令- 任何 SQL Magic(插入/删除/更新数据)
- 创建适当的触发器/约束
- 做
VACUUM
(或VACUUM FULL
/VACUUM ANALYZE
视情况而定)
然后,将当前架构版本(可以将其存储在数据库中的某个位置)与您拥有的升级脚本列表进行比较,并执行升级脚本以过渡到新架构。
例如,如果您正在运行架构修订版 1.2.0 并希望过渡到 1.3.0,则应应用
updates-1.2.1.sql
, updates-1.2.2.sql
, . . .,updates-1.3.0.sql
关于升级脚本的一些提示:
确保所有内容都包含在事务中(
BEGIN
...ROLLBACK
)COMMIT
。
如果出现问题,您希望能够中止整个问题,而不会让数据库处于混乱/不一致的状态。编写更新脚本时,请像编写新模式一样编写。
事实上,我编写 SQL 文件以在空数据库中创建新模式的常用方法是开发升级脚本,然后在空数据库上运行它并转储生成的模式 - 这可确保“裸机”脚本产生的结果与您从升级过程中获得的结果相同。预计升级会失败 - 包括详细错误(
RAISE EXCEPTION
/RAISE NOTICE
),并确保如果遇到错误,执行升级 sql 脚本的程序会停止。