|
|
|
|
@ -1666,6 +1666,111 @@ test_sub=# SELECT * FROM t1 ORDER BY id; |
|
|
|
|
log. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The log format for logical replication conflicts is as follows: |
|
|
|
|
<synopsis> |
|
|
|
|
LOG: conflict detected on relation "<replaceable>schemaname</replaceable>.<replaceable>tablename</replaceable>": conflict=<replaceable>conflict_type</replaceable> |
|
|
|
|
DETAIL: <replaceable class="parameter">detailed_explanation</replaceable>. |
|
|
|
|
{<replaceable class="parameter">detail_values</replaceable> [; ... ]}. |
|
|
|
|
|
|
|
|
|
<phrase>where <replaceable class="parameter">detail_values</replaceable> is one of:</phrase> |
|
|
|
|
|
|
|
|
|
<literal>Key</literal> (<replaceable>column_name</replaceable> <optional>, ...</optional>)=(<replaceable>column_value</replaceable> <optional>, ...</optional>) |
|
|
|
|
<literal>existing local tuple</literal> <optional>(<replaceable>column_name</replaceable> <optional>, ...</optional>)=</optional>(<replaceable>column_value</replaceable> <optional>, ...</optional>) |
|
|
|
|
<literal>remote tuple</literal> <optional>(<replaceable>column_name</replaceable> <optional>, ...</optional>)=</optional>(<replaceable>column_value</replaceable> <optional>, ...</optional>) |
|
|
|
|
<literal>replica identity</literal> {(<replaceable>column_name</replaceable> <optional>, ...</optional>)=(<replaceable>column_value</replaceable> <optional>, ...</optional>) | full <optional>(<replaceable>column_name</replaceable> <optional>, ...</optional>)=</optional>(<replaceable>column_value</replaceable> <optional>, ...</optional>)} |
|
|
|
|
</synopsis> |
|
|
|
|
|
|
|
|
|
The log provides the following information: |
|
|
|
|
<variablelist> |
|
|
|
|
<varlistentry> |
|
|
|
|
<term><literal>LOG</literal></term> |
|
|
|
|
<listitem> |
|
|
|
|
<itemizedlist> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
<replaceable>schemaname</replaceable>.<replaceable>tablename</replaceable> |
|
|
|
|
identifies the local relation involved in the conflict. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
<replaceable>conflict_type</replaceable> is the type of conflict that occurred |
|
|
|
|
(e.g., <literal>insert_exists</literal>, <literal>update_exists</literal>). |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
</itemizedlist> |
|
|
|
|
</listitem> |
|
|
|
|
</varlistentry> |
|
|
|
|
|
|
|
|
|
<varlistentry> |
|
|
|
|
<term><literal>DETAIL</literal></term> |
|
|
|
|
<listitem> |
|
|
|
|
<itemizedlist> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
<replaceable class="parameter">detailed_explanation</replaceable> includes |
|
|
|
|
the origin, transaction ID, and commit timestamp of the transaction that |
|
|
|
|
modified the existing local tuple, if available. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
The <literal>Key</literal> section includes the key values of the local |
|
|
|
|
tuple that violated a unique constraint for |
|
|
|
|
<literal>insert_exists</literal> or <literal>update_exists</literal> |
|
|
|
|
conflicts. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
The <literal>existing local tuple</literal> section includes the local |
|
|
|
|
tuple if its origin differs from the remote tuple for |
|
|
|
|
<literal>update_differ</literal> or <literal>delete_differ</literal> |
|
|
|
|
conflicts, or if the key value conflicts with the remote tuple for |
|
|
|
|
<literal>insert_exists</literal> or <literal>update_exists</literal> |
|
|
|
|
conflicts. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
The <literal>remote tuple</literal> section includes the new tuple from |
|
|
|
|
the remote insert or update operation that caused the conflict. Note that |
|
|
|
|
for an update operation, the column value of the new tuple will be null |
|
|
|
|
if the value is unchanged and toasted. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
The <literal>replica identity</literal> section includes the replica |
|
|
|
|
identity key values that were used to search for the existing local |
|
|
|
|
tuple to be updated or deleted. This may include the full tuple value |
|
|
|
|
if the local relation is marked with |
|
|
|
|
<link linkend="sql-altertable-replica-identity-full"><literal>REPLICA IDENTITY FULL</literal></link>. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
<replaceable class="parameter">column_name</replaceable> is the column name. |
|
|
|
|
For <literal>existing local tuple</literal>, <literal>remote tuple</literal>, |
|
|
|
|
and <literal>replica identity full</literal> cases, column names are |
|
|
|
|
logged only if the user lacks the privilege to access all columns of |
|
|
|
|
the table. If column names are present, they appear in the same order |
|
|
|
|
as the corresponding column values. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
<replaceable class="parameter">column_value</replaceable> is the column value. |
|
|
|
|
The large column values are truncated to 64 bytes. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
</itemizedlist> |
|
|
|
|
</listitem> |
|
|
|
|
</varlistentry> |
|
|
|
|
</variablelist> |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
Logical replication operations are performed with the privileges of the role |
|
|
|
|
which owns the subscription. Permissions failures on target tables will |
|
|
|
|
|