Galera:在不locking整个服务器的情况下运行缓慢的ALTER

我有一个3节点的加莱拉群集,有几百个数据库服务于不同的客户端。

我只使用加莱拉作为一个简单的方法来处理复制和失败。 我实际上不是一次使用多个主人。

我需要在每个数据库的某些表上运行一个相当昂贵的ALTER。 通常情况下,我会有一个脚本在每个数据库上逐一运行升级脚本,每次只closures一个站点。

但是对于这个galera集群,任何缓慢的DDL都会导致对所有数据库的完全锁​​定,而不仅仅是所运行的数据库。 基本上,这意味着无论何时我需要运行升级,每个人都会在整个过程中脱机,我需要为每个人运行升级。

我知道有wsrep_OSU_method ,但将其更改为RSU有它自己的问题,我不认为这有帮助。

是否有一种方法来禁用锁? 或者至less使它成为数据库级锁而不是服务器级锁?

如果我在运行查询时禁用了集群中的其他节点,会导致全局锁? 就像我说的,我实际上并没有使用多个主设备,所以在这种情况下,让其他节点离线几分钟是没有问题的(假设通常的自动重连过程发生在我将它们带回时)。

你好运! Percona为这种情况提供了一个名为pt-online-schema-change的工具。

pt-online-schema-change模拟了MySQL在内部改变表的方式,但它在你希望改变的表的副本上工作。 这意味着原始表未被locking,客户端可能会继续读取和更改其中的数据。

pt-online-schema-change通过创build表的空副本来进行更改,根据需要对其进行修改,然后将原始表中的行复制到新表中。 复制完成后,将移开原来的表格并用新的表格replace。 默认情况下,它也会删除原始表。

虽然它是由Percona制作的,但它适用于任何主要的MySQL变体。