问题描述
在关系型数据库MySQL中,使用set global设置innodb_strict_mode,将其ON更改为OFF后,InnoDB在检查无效或不兼容的表选项时不再返回错误而是警告。但是,在集群MySQL实例中,主库报警告,创建表成功,而从库却无法正常复制同步创建对应表。
原因分析
在集群MySQL实例中,基于以下原理进行主从同步复制:
1. 主数据库上的 I/O 线程将主数据库中的数据更改写入二进制日志;
2. 从数据库上的 I/O 线程连接到主数据库,读取主数据库上的二进制日志中的更改,并将它们传输到从数据库;
3. 从数据库的 SQL 线程接收到主数据库的更改后,执行这些更改。这包括在从数据库上执行相同的 INSERT、UPDATE 和 DELETE 语句,使从数据库与主数据库保持一致;
4. 当从数据库上的数据与主数据库一致时,从数据库就可以用于读取查询。这使得可以在从数据库上分担主数据库的读取负载,从而提高性能。
整个过程分别由两个线程负责处理,分别是IO thread和SQL thread,IO thread负责将二进制日志从主库复制到从库,SQL Thread则负责将复制到的更改重放到从库机器。这其中,也包含了动态全局变量的设置。
在主库动态设置全局变量set global innodb_strict_mode=OFF后,主库即可生效,并且在创建表时进行非严格校验。而从库,因SQL Thread为长会话,持续持有旧的会话,对更改的全局变量是无法在内存中刷新到最新值,从而导致了主从库的内存值中的变量设置产生了分歧,最终直观表现上则可能是同样的语句在主库上执行成功,在从库上则执行失败。
总结
以上问题,在设置完变量后,需要将从库的SQL Thread进行重启,让从库的变量内存值可以刷新到最新,保持跟主库同步。同时,总结以下变量,可能会遇到以上变量设置的问题:innodb_strict_mode, slave_pending_jobs_size_max, slave_rows_search_algorithms, slave_parallel_type, slave_parallel_workers