我有一个 3 节点多主 MariaDB Galera 集群,它没有同步对 InnoDB 表定义的修改。
服务器版本:10.3.10-MariaDB MariaDB 服务器
wsrep_provider_version:25.3.24(r3825)
表是mysql.innodb_table_stats
,不同之处在于字段的数据类型/长度table_name
。
DDL 操作执行于加莱拉-01会员使用mysql_upgrade公用事业:
ALTER TABLE innodb_index_stats MODIFY `table_name` varchar(199) COLLATE utf8_bin NOT NULL;
表定义加莱拉-01成员:
CREATE TABLE `innodb_table_stats` (
`database_name` varchar(64) COLLATE utf8_bin NOT NULL,
`table_name` varchar(199) COLLATE utf8_bin NOT NULL,
`last_update` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`n_rows` bigint(20) unsigned NOT NULL,
`clustered_index_size` bigint(20) unsigned NOT NULL,
`sum_of_other_index_sizes` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`database_name`,`table_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0
表定义加莱拉-02和加莱拉-03成员:
CREATE TABLE `innodb_table_stats` (
`database_name` varchar(64) COLLATE utf8_bin NOT NULL,
`table_name` varchar(64) COLLATE utf8_bin NOT NULL,
`last_update` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`n_rows` bigint(20) unsigned NOT NULL,
`clustered_index_size` bigint(20) unsigned NOT NULL,
`sum_of_other_index_sizes` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`database_name`,`table_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0
集群似乎运行正常,我不明白为什么它不会同步该特定 DDL 操作。我尝试在某些 innodb 测试表上执行其他 DDL 操作,效果很好。
+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| wsrep_cluster_state_uuid | 213a9d66-d207-11e8-b7bb-733e94f6ddc5 |
| wsrep_cluster_conf_id | 294 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_status | Primary |
| wsrep_ready | ON |
| wsrep_connected | ON |
| wsrep_local_state_comment | Synced |
| wsrep_local_recv_queue_avg | 0.038462 |
| wsrep_flow_control_paused | 0.000000 |
| wsrep_cert_deps_distance | 18.686275 |
| wsrep_local_send_queue_avg | 0.200000 |
答案1
- MyISAM 表不被 Galera 复制。
- 一些系统表(数据库中的大多数表
mysql
)是 MyISAM。 - 升级的时候,
mysql_upgrade
必须运行。 mysql_upgrade
经常对系统表进行更改。
因此,除非升级说明以某种方式为您完成任务,否则您必须mysql_upgrade
在每个节点上运行。