我可以将 MySQL 设置为从属吗仅有的复制结构变化?(CREATE
/ALTER TABLE
等)。我有两个理由:
- 多个开发人员在代码中拥有开发分支,这些分支应始终使用从“主”开发数据库获取的“新鲜”数据结构。
- 多个项目/客户端共享(部分)相同的代码/脚本(想象一个符号链接的“核心”目录),但具有不同的数据库(每个客户端 1 个),其结构应与代码共享部分的代码更改同时更新,以尽量减少停机时间。
如果这不可能,那么还有哪些其他好方法可以在没有实际数据的情况下跨站点/数据库/服务器同步 mysql 数据结构?而且,结构变化并不经常发生,但由于有足够多的不同数据库,同步所有实例需要花费相当多的时间,我想既限制停机时间,又将时间花在更有趣的工作上 ;)。
答案1
我通常使用 mysqldump 转储模式。但是,我认为黑洞引擎可以按照您描述的方式使用。
您将ALTER
所有表添加到BLACKHOLE
和INSERT
、UPDATE
和DELETE
记录不会影响数据,因为 blackhole 不存储数据。
您可以skip-innodb
设置,default-storage-engine=BLACKHOLE
并且所有创建的表将默认为,BLACKHOLE
除了那些以 创建的表MyISAM
,因为MyISAM
无法禁用。在主服务器上创建表时,您需要注意这一点,因为稍后您可能需要在从属副本服务器上ALTER
返回到。BLACKHOLE
不过,您所描述的是管理问题,而不是技术问题。我建议配置至少两个开发数据库,由基础设施团队维护。
第一个是开发数据库。开发人员可以更多地访问这个数据库,并且会定期用清理过的数据进行刷新。
第二个数据库将是 QA 或测试环境,开发人员没有 RW 访问权限。这允许适当的暂存。
这两个数据库都将由对数据库进行生产更改的 IT 人员进行验证,并将其作为生产准备过程的一部分,从而确保跨环境的模式一致。
如果您希望开发人员在各处都拥有数据库,那么这些数据库根本无法维护,他们必须负责确保他们的数据集足够新以满足他们的需求。您可以通过编程方式在共享驱动器上提供架构转储,或者提供具有 RO 访问权限的黑洞复制从属。
答案2
不幸的是,MySQL 复制不允许这样做。您可以做的是定期运行,mysqldump -d
这将转储数据库和表结构,但保留数据。然后您可以将此结构导入到新数据库中。
从man mysqldump
:
--no-data, -d
Do not write any row information for the table. This is very useful if
you want to dump only the CREATE TABLE statement for the table.
我们在我目前工作的地方这样做。作为对数据库的任何更改的一部分,我们运行此命令并将其保存到文件中并将其推送到源代码控制中。开发人员只需下载文件并应用更改即可。
答案3
既然您提到了符号链接,我会假设 MySQL 实例或多个数据库位于同一台服务器上或可以访问相同的驱动器。
假设这种情况,我会尝试将主服务器的 .frm 符号链接到从服务器的 .frm。这样,每当主服务器更新结构更改时,从服务器都会自动更新,但它们不会共享数据。我还没有真正尝试过,但理论上应该可行。
“每个 MyISAM 表都存储在磁盘上的三个文件中。这些文件的名称以表名开头,并带有表示文件类型的扩展名。.frm 文件存储表格式。数据文件的扩展名为 .MYD(MYData)。索引文件的扩展名为 .MYI(MYIndex)。”