我们正在两个数据库之间进行 Postgres 本机逻辑复制。
现在,我们在尝试从发布者那里更新我们拥有的一千个表中的一个时遇到错误。
当我们尝试更新表时,它返回此错误:
错误:发布使用的列列表未涵盖副本标识。无法更新表“etiquetas_j”。
错误:无法更新表“etiquetas_j”Estado SQL:42P10 详细信息:发布使用的列列表未涵盖副本标识。
发布者和订阅者的表定义、数据类型、索引和 pkey 相同
看这里:
出版商:
CREATE TABLE IF NOT EXISTS public.etiquetas_j (
etiqueta_id integer NOT NULL,
fecha timestamp without time zone,
j_id integer NOT NULL,
usuario_del_id integer,
usuario_mod_id integer,
organigrama_mod character varying(2) COLLATE pg_catalog."default",
id integer NOT NULL DEFAULT nextval('etiquetas_j_id_seq1'::regclass),
CONSTRAINT etiquetas_j_pkey PRIMARY KEY (id))
TABLESPACE pg_default; ALTER TABLE IF EXISTS public.etiquetas_j
OWNER to postgres;
CREATE INDEX IF NOT EXISTS etiquetas_j_etiqueta_id_idx
ON public.etiquetas_j USING btree
(etiqueta_id ASC NULLS LAST)
TABLESPACE pg_default;
CREATE INDEX IF NOT EXISTS etiquetas_j_id_idx
ON public.etiquetas_j USING btree
(j_id ASC NULLS LAST)
TABLESPACE pg_default;
订阅者:
CREATE TABLE IF NOT EXISTS public.etiquetas_j
(
etiqueta_id integer NOT NULL,
fecha timestamp without time zone,
j_id integer NOT NULL,
usuario_del_id integer,
usuario_mod_id integer,
organigrama_mod character varying(2) COLLATE pg_catalog."default",
id integer NOT NULL DEFAULT nextval('etiquetas_j_id_seq1'::regclass),
CONSTRAINT etiquetas_j_pkey PRIMARY KEY (id)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.etiquetas_j
OWNER to postgres;
CREATE INDEX IF NOT EXISTS etiquetas_j_etiqueta_id_idx
ON public.etiquetas_j USING btree
(etiqueta_id ASC NULLS LAST)
TABLESPACE pg_default;
CREATE INDEX IF NOT EXISTS etiquetas_j_id_idx
ON public.etiquetas_j USING btree
(j_id ASC NULLS LAST)
TABLESPACE pg_default;
该出版物的定义如下:
CREATE PUBLICATION publication_visor FOR TABLE etiquetas_j(
etiqueta_id,
fecha,
j_id,
usuario_del_id,
usuario_mod_id ,
organigrama_mod,
id)
当我们在provider中执行时出现错误:
update etiquetas_j set organigrama_mod = '02' where id = 3;
谢谢,抱歉英语不好!
我们已经检查过:
- 看看索引是什么。
- 查看两种模式有何不同。
- 查看发布者在发布创建时发送的内容。
- 应用 ALTER TABLE etiquetas_j REPLICA IDENTITY FULL;
我解决了。
由于某种原因,我们在发布方和订阅方使用 ALTER TABLE 将 id 作为主键,并且模式、索引和所有内容都是相同的。再次启用订阅并刷新客户端上的发布,但从未起作用。
我执行了以下步骤来解决它:
ALTER SUBSCRIPTION subscription_name DISABLE
ALTER PUBLICATION publication_name DROP TABLE table_name
SELECT pg_create_logical_replication_slot('YOUR_NEW_NAME_SLOT', 'pgoutput');
ALTER SUBSCRIPTION subscription_name ENABLE
ALTER SUBSCRIPTION subscription_name SET (slot_name='YOUR_NEW_NAME_SLOT')
ALTER SUBSCRIPTION subscription_name REFRESH PUBLICATION;
SELECT slot_name, plugin, slot_type, database, active FROM pg_replication_slots WHERE plugin = 'pgoutput';
我们在下标中指定槽,因为我们在同一服务器实例上有两个数据库。