【发布时间】:2020-08-21 21:42:14
【问题描述】:
我正在为我的网站开发一个 MariaDB 数据库,它每天都会看到列名、数据类型、触发器、事件和例程的许多变化。
如何保持整个架构同步,以允许和平部署新网站代码?
当然,保持远程数据完整(仅同步架构)并最好将停机时间降至最低是至关重要的。
【问题讨论】:
标签: database synchronization mariadb
我正在为我的网站开发一个 MariaDB 数据库,它每天都会看到列名、数据类型、触发器、事件和例程的许多变化。
如何保持整个架构同步,以允许和平部署新网站代码?
当然,保持远程数据完整(仅同步架构)并最好将停机时间降至最低是至关重要的。
【问题讨论】:
标签: database synchronization mariadb
使用复制。
请注意,复制TRIGGERs 可能有害——主节点运行触发器,该触发器插入一个新行。如果 Replica 也运行触发器并创建另一行,那么现在您在 Replica 上有一个额外的行(或错误)。
【讨论】:
如果您的 Web 应用程序代码需要更改数据库,则需要一个库来为您的数据库编写迁移。部署新网站代码时,必须运行迁移代码:部署迁移代码,执行迁移。
例如,如果您已经在 php 中编码,则可以使用 phinx 编写迁移,但是有 other options,有些可能链接到您的 framework, doctrine for instance。
您可以将迁移代码与您的网站代码一起发布,部署如下所示:部署代码、停止服务器、执行迁移、重新启动服务器。
如果您不想停机,那么您的网站代码必须能够在两个版本的数据库上运行:迁移之前和之后(您可以使用数据库检查每个功能的数据库版本以检查当前版本)。
一些ALTER 仍会锁定数据库以进行一些更改。您可以使用一些工具来避免这种情况:
ALTER 时造成停机A nice presentation about ONLINE DDL, pt-online-schema-change and gh-ost
如果你有一个 Web 服务器集群和一个数据库集群,事情可能会更复杂,而 gh-ost 似乎是我目前看到的唯一选择,但如果你问这个问题,我假设您有一台 Web 服务器和一个数据库,只需编写一些脚本并跟踪您的数据库版本(以避免运行两次相同的迁移)就可以了。
您应该在将迁移代码部署到生产服务器之前对其进行测试,以避免出现意外行为,就像您编写的每个代码一样。
【讨论】: