【问题标题】:Why MySQL database replica does not replicate when replica has bigint key and master has int key?当副本具有 bigint 键且主具有 int 键时,为什么 MySQL 数据库副本不复制?
【发布时间】:2024-05-18 07:20:02
【问题描述】:

我尝试将主键大小或其他字段从 int 更改为 bigint。

MySQL 手册告诉我这种类型的转换可用(从 int 到 bigint),但我的副本出错:

Column 1 of table 'Items' cannot be converted from type 'int' to type 'bigint(20)'

作为示例主表

create table Items(
 id int auto_increment,
 quantity int null
)

副本表

create table Items(
 id int auto_increment,
 quantity bigint(20) null
)

MySQL 版本 8.0.15

当副本在主服务器上的类型为 bigint 而不是 int 时,为什么 MySQL 会中断复制?

【问题讨论】:

  • 我在没有 AWS RDS 的情况下在我的数据库上尝试了这个案例。结果相同。
  • 这取决于您拥有的 slave_type_conversions 模式。
  • 有一种方法可以完成这项工作,但应该很少需要。为什么副本与主副本不完全匹配?
  • @Michael-sqlbot 在不停机的情况下执行 DDL。 1)我将副本设为可写 2)执行迁移 3)将副本传播到主服务器(这是 aws rds 功能)
  • 是的,这是一个有效的案例。一定要让复制品在升级前赶上来。

标签: mysql amazon-web-services amazon-rds database-replication mysql-8.0


【解决方案1】:

我找到了解决方案。配置字段问题slave_type_conversions

默认情况下,MySQL 有空的slave_type_conversions,这意味着源表和目标表中的所有列必须是相同的类型。

我将此值更改为 ALL_LOSSY,ALL_NON_LOSSY 并且 MySQL 允许转换为 bigint

【讨论】:

  • 您可能应该避免使用ALL_LOSSY,因为它......有损......并且通常允许一些荒谬的事情,例如将INT复制到TINYINT,从而导致数据丢失,除非您碰巧有一个(例如)INT 列,其中没有会溢出TINYINT 的值。 dev.mysql.com/doc/refman/8.0/en/…