如何将数据库模式从数据库 A 复制到数据库 B

How to copy a database schema from database A to database B

我使用 liquibase 变更集创建了一个 Postgresql 数据库 A。现在,我正在创建一个应用程序,它允许创建一个新的数据库 B 并实时从数据库 A 复制模式,包括 liquibase 变更集,因为以后仍可以更新数据库。请注意,在数据库 A 中复制的模式可能已经更新,从而使基本变更集过时。

我的主要问题是:

  1. 如何使用 liquibase 将 PostgreSQL 模式 x 从数据库 a(在 运行 时动态生成)复制到 b?数据库 b 可能在另一台服务器上。
  2. 如果 liquibase 无法实现,还有哪些其他工具或方法可以实现?

--

让我添加更多上下文:

  1. 我们使用 liquibase 变更集将新数据库初始化为架构。
  2. 我们可以在 运行 时向数据库添加一个新的 table 和字段。或者在申请 运行ning 期间。例如,我们向数据库 a 的模式中添加一个新的 table 人,该数据库原本不在变更集中。这也是使用 liquibase 类 完成的。所以变更集被添加到databasechangelog table.
  3. 现在,我们创建一个新的数据库b。
  4. 我们想将数据库a的模式导入到b,与人table。

我希望这是清楚的。

谢谢。

所有架构更改必须运行通过您的架构迁移工具

使用 database schema migration tool such as Liquibase or Flyway is to have a “single source of truth” 关于数据库结构的要点 table。您的一组 Liquibase 变更集(或 Flyway 脚本)应该是您数据库的唯一真实来源。

如果您在 运行 时更改您的数据库结构,例如添加一个名为 people 的 table,超出您的迁移工具的范围,那么您违反了游戏规则。您将失去使用模式迁移工具的目的。使用架构迁移工具的目的是通过该工具进行 all 架构更改。

如果您需要在 运行 生产环境中添加 table,您应该将 Liquibase 变更集(或 Flyway 脚本)的物理文件放入数据库服务器的文件系统中环境,然后调用 Liquibase(或 Flyway)进行 运行 迁移。

也许你误解了事件的来龙去脉:

  • 如果您在服务器 "A" 上构建了数据库,这意味着您安装了 Postgres,创建了一个空数据库,然后安装了您精心构建的 Liquibase 变更集集合,然后 运行 一个 Liquibase该服务器上的迁移操作。
  • 当您在服务器 "B" 上创建数据库时,您应该遵循相同的步骤:安装 Postgres,创建一个空数据库,安装完全相同的 Liquibase 变更集集合,然后 运行进行 Liquibase 迁移操作。

或者,如果复制服务器 "A" 以创建服务器 "B",该副本应包含完全相同的 Liquibase 变更集。因此,在复制过程结束时,两个数据库+变更集是相同的。

以下是我如何使用 Liquibase Java 库解决我的这个问题:

1.) 将更新日志从源数据库导出到临时文件 (XML)。

Liquibase liquibase = new Liquibase(liquibaseOutFile.getAbsolutePath(), new FileSystemResourceAccessor(), sourceDatabase);
liquibase.generateChangeLog(catalogAndSchema, changeLogWriter, new PrintStream(liquibaseOutFile.getAbsolutePath()), null);

2.) 执行临时文件到新的数据源。

Liquibase targetLiquibase = new Liquibase(liquibaseOutFile.getAbsolutePath(), new FileSystemResourceAccessor(), targetDatabase);
Contexts context = new Contexts();
targetLiquibase.update(context);

完整代码如下:https://czetsuya-tech.blogspot.com/2019/12/generate-postgresql-schema-using-java.html