在我使用 PHP 和 MySQL 的 Web 应用程序设置中,我为每个用户的私有数据使用单独的数据库。所以本质上,每个经过身份验证的用户只能访问两个不同的数据库 myappdb_public 和 myappdb_user_###。用户凭据将保存在单独的数据库 myappdb_creds 中。此设置背后的想法是在维护共享数据资源的同时提高私有数据的安全性。
- 有没有办法从另一个数据库结构设置的“模板”创建新数据库。
- 有没有办法在更新模板时更新所有“子”数据库结构?
我以前使用过复制,但那是一个完全不同的设置,不确定是否有办法只在同一本地服务器上的多个数据库之间复制结构。
复制
“数据库复制”是指将对一个数据库所做的任何传入插入/更新/删除语句动态复制到另一个相同的数据库。主数据库和辅助数据库被认为是“副本”,因为它们始终包含由相同历史产生的相同数据,尽管辅助数据库可能会延迟一小段时间。辅助可用于只读查询代替主要。在故障转移的情况下,次要可能会转换为主要。
移民
您正在寻找的是松散地称为 “数据库迁移”,也称为架构迁移。这里的想法是重现与另一个数据库相同的结构 ( DDL )。但是每个生成的数据库都是独立于其他数据库的,每个数据库中都存储着不同用户的数据。
迁移工具
开发人员和 DBA 过去常常手动执行此迁移工作,设计他们自己的临时解决方案或习惯。幸运的是,我们现在可以选择一些工具来帮助完成这项繁琐但至关重要的工作。
飞路
我最喜欢的工具是Flyway。内置 Java,但包装为命令行可执行文件,因此您可以从脚本或其他工具中使用。
Flyway 运行一系列 SQL 脚本,以及可选的您可能编写的某些 Java 库。执行顺序由一定的文件命名方案决定。
在数据库中自动创建一个表来跟踪脚本运行。当遇到新脚本时,Flyway 会检测到它们并适当地运行那些尚未应用于该特定数据库的脚本。
Flyway 或其他此类工具不仅在生产中非常有用,而且在测试和开发中也非常有用。您可以自动重新创建一个一次性数据库,甚至可以将其恢复到其架构演变历史中的任何特定点。
任何考虑 Flyway 的人也应该考虑另一个非常相似的产品:Liquibase。
也存在其他选择,例如商业工具Redgate。
模板
一些数据库(例如Postgres )提供模板,您可以在其中创建一些表和索引等。之后,您可以创建一个全新的数据库,其初始状态是从该状态复制而来的。
事实上,Postgres 总是这样工作的,当你在没有明确指定任何其他模板的情况下请求数据库时,默认情况下透明地使用
template0
和数据库。template1
模板只解决起源问题,开始。您以后几乎肯定会改进您的数据库。您将添加或删除表、列、索引等。您可能需要运行代码来整体转换或更新现有数据。为此,您需要使用迁移工具,因为模板在初始生成后无法帮助您。所以在我看来,我不会为定义模板而烦恼,而是使用迁移脚本进行所有初始设置。