仅限 MySQL 复制结构

仅限 MySQL 复制结构

我可以将 MySQL 设置为从属吗仅有的复制结构变化?(CREATE/ALTER TABLE等)。我有两个理由:

  1. 多个开发人员在代码中拥有开发分支,这些分支应始终使用从“主”开发数据库获取的“新鲜”数据结构。
  2. 多个项目/客户端共享(部分)相同的代码/脚本(想象一个符号链接的“核心”目录),但具有不同的数据库(每个客户端 1 个),其结构应与代码共享部分的代码更改同时更新,以尽量减少停机时间。

如果这不可能,那么还有哪些其他好方法可以在没有实际数据的情况下跨站点/数据库/服务器同步 mysql 数据结构?而且,结构变化并不经常发生,但由于有足够多的不同数据库,同步所有实例需要花费相当多的时间,我想既限制停机时间,又将时间花在更有趣的工作上 ;)。

答案1

我通常使用 mysqldump 转储模式。但是,我认为黑洞引擎可以按照您描述的方式使用。

您将ALTER所有表添加到BLACKHOLEINSERTUPDATEDELETE记录不会影响数据,因为 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)。”

相关内容