multi-region表必须显式设置primary region,否则insert失败;survive region failure不可降级;regional by row的locality列须为非空string;节点启动必须正确配置--locality参数。

multi-region 表必须显式声明 PRIMARY REGION,否则写入会失败
CockroachDB 的 ALTER TABLE ... SET PRIMARY REGION 不是可选步骤,而是 multi-region 表的强制前置条件。没设主 region 时,哪怕表已用 REGIONAL BY TABLE IN PRIMARY REGION 创建,所有 INSERT 都会报 ERROR: cannot insert into regional by table without primary region set。
实操建议:
- 创建 multi-region 数据库后,先用
ALTER DATABASE ... SET PRIMARY REGION指定默认主 region(如us-east1) - 再建表或修改表时,
REGIONAL BY TABLE IN PRIMARY REGION才真正生效;否则该语句虽不报错,但表仍按 global 处理 - 已有表补设主 region:必须先
ALTER TABLE ... SET REGIONAL BY TABLE IN 'us-east1',再ALTER TABLE ... SET PRIMARY REGION 'us-east1'—— 顺序不能反,否则报region not found
survival goal 是 database 级配置,不是表级,且不可动态降级
SURVIVE ZONE FAILURE 和 SURVIVE REGION FAILURE 只能通过 ALTER DATABASE ... SURVIVE ... 设置,对单个表无效。更重要的是:一旦设为 SURVIVE REGION FAILURE,就不能再降回 ZONE FAILURE,CockroachDB 会直接拒绝该操作并提示 cannot downgrade survival goal。
实操建议:
- 上线前必须确认真实容灾需求 —— region 级容灾要求至少 3 个 region(每个 region ≥3 zone),资源和延迟成本明显高于 zone 级
-
SURVIVE REGION FAILURE下,所有REGIONAL BY ROW表的行都会跨 region 复制,即使你只在us-west1写入,数据也会同步到eu-west1和ap-southeast1 - 测试时注意:用
SHOW RANGES FROM TABLE t查看实际副本分布,别只信 DDL 语句
REGIONAL BY ROW 表的 locality 列必须是 STRING 类型且非空
声明 REGIONAL BY ROW 时指定的 locality 列(如 crdb_region),必须是 STRING 类型,并在 INSERT 时提供明确值(如 'us-east1')。如果列允许 NULL 或类型是 BYTES/UUID,CockroachDB 会在写入时报 locality column must be string and non-nullable。
实操建议:
- 建表时显式加
NOT NULL和CHECK (crdb_region IN ('us-east1', 'us-west1', 'eu-west1')),避免脏数据导致分区失败 - 应用写入前必须确保该列已赋值 —— ORM 自动生成的 INSERT 若忽略此列,就会卡住
- 不要用函数(如
current_schema())或默认值(DEFAULT 'us-east1')替代显式传值,multi-region 模式下默认值不被信任
multi-region 集群的节点启动参数必须匹配 region/zone 标签
节点启动时若未用 --locality 正确声明所属 region 和 zone(例如 --locality=region=us-east1,zone=us-east1-a),即使数据库层设置了 SURVIVE REGION FAILURE,CockroachDB 也无法做跨 region 副本调度,SHOW REGIONS 会显示部分 region 状态为 UNAVAILABLE。
实操建议:
- 每个节点的
--locality必须与云厂商实际物理位置一致 —— 比如 GCP us-east1 区域的节点不能标成region=us-west1 - 同一 region 下多个 zone 必须用不同
zone=...值区分,否则会被视为单 zone,破坏SURVIVE ZONE FAILURE能力 - 滚动升级节点时,新节点加入前务必检查
cockroach node status输出中的 locality 字段是否完整匹配预期










