mirror of
https://github.com/postgres/postgres.git
synced 2025-12-19 17:02:53 +03:00
Standardize LSN formatting by zero padding
This commit standardizes the output format for LSNs to ensure consistent representation across various tools and messages. Previously, LSNs were inconsistently printed as `%X/%X` in some contexts, while others used zero-padding. This often led to confusion when comparing. To address this, the LSN format is now uniformly set to `%X/%08X`, ensuring the lower 32-bit part is always zero-padded to eight hexadecimal digits. Author: Japin Li <japinli@hotmail.com> Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com> Reviewed-by: Álvaro Herrera <alvherre@kurilemu.de> Discussion: https://postgr.es/m/ME0P300MB0445CA53CA0E4B8C1879AF84B641A@ME0P300MB0445.AUSP300.PROD.OUTLOOK.COM
This commit is contained in:
@@ -57,14 +57,14 @@
|
||||
postgres=# -- Create a slot named 'regression_slot' using the output plugin 'test_decoding'
|
||||
postgres=# SELECT * FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding', false, true);
|
||||
slot_name | lsn
|
||||
-----------------+-----------
|
||||
regression_slot | 0/16B1970
|
||||
-----------------+------------
|
||||
regression_slot | 0/016B1970
|
||||
(1 row)
|
||||
|
||||
postgres=# SELECT slot_name, plugin, slot_type, database, active, restart_lsn, confirmed_flush_lsn FROM pg_replication_slots;
|
||||
slot_name | plugin | slot_type | database | active | restart_lsn | confirmed_flush_lsn
|
||||
-----------------+---------------+-----------+----------+--------+-------------+-----------------
|
||||
regression_slot | test_decoding | logical | postgres | f | 0/16A4408 | 0/16A4440
|
||||
-----------------+---------------+-----------+----------+--------+-------------+---------------------
|
||||
regression_slot | test_decoding | logical | postgres | f | 0/016A4408 | 0/016A4440
|
||||
(1 row)
|
||||
|
||||
postgres=# -- There are no changes to see yet
|
||||
@@ -78,10 +78,10 @@ CREATE TABLE
|
||||
|
||||
postgres=# -- DDL isn't replicated, so all you'll see is the transaction
|
||||
postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);
|
||||
lsn | xid | data
|
||||
-----------+-------+--------------
|
||||
0/BA2DA58 | 10297 | BEGIN 10297
|
||||
0/BA5A5A0 | 10297 | COMMIT 10297
|
||||
lsn | xid | data
|
||||
------------+-------+--------------
|
||||
0/0BA2DA58 | 10297 | BEGIN 10297
|
||||
0/0BA5A5A0 | 10297 | COMMIT 10297
|
||||
(2 rows)
|
||||
|
||||
postgres=# -- Once changes are read, they're consumed and not emitted
|
||||
@@ -97,41 +97,41 @@ postgres=*# INSERT INTO data(data) VALUES('2');
|
||||
postgres=*# COMMIT;
|
||||
|
||||
postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);
|
||||
lsn | xid | data
|
||||
-----------+-------+---------------------------------------------------------
|
||||
0/BA5A688 | 10298 | BEGIN 10298
|
||||
0/BA5A6F0 | 10298 | table public.data: INSERT: id[integer]:1 data[text]:'1'
|
||||
0/BA5A7F8 | 10298 | table public.data: INSERT: id[integer]:2 data[text]:'2'
|
||||
0/BA5A8A8 | 10298 | COMMIT 10298
|
||||
lsn | xid | data
|
||||
------------+-------+---------------------------------------------------------
|
||||
0/0BA5A688 | 10298 | BEGIN 10298
|
||||
0/0BA5A6F0 | 10298 | table public.data: INSERT: id[integer]:1 data[text]:'1'
|
||||
0/0BA5A7F8 | 10298 | table public.data: INSERT: id[integer]:2 data[text]:'2'
|
||||
0/0BA5A8A8 | 10298 | COMMIT 10298
|
||||
(4 rows)
|
||||
|
||||
postgres=# INSERT INTO data(data) VALUES('3');
|
||||
|
||||
postgres=# -- You can also peek ahead in the change stream without consuming changes
|
||||
postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL);
|
||||
lsn | xid | data
|
||||
-----------+-------+---------------------------------------------------------
|
||||
0/BA5A8E0 | 10299 | BEGIN 10299
|
||||
0/BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
|
||||
0/BA5A990 | 10299 | COMMIT 10299
|
||||
lsn | xid | data
|
||||
------------+-------+---------------------------------------------------------
|
||||
0/0BA5A8E0 | 10299 | BEGIN 10299
|
||||
0/0BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
|
||||
0/0BA5A990 | 10299 | COMMIT 10299
|
||||
(3 rows)
|
||||
|
||||
postgres=# -- The next call to pg_logical_slot_peek_changes() returns the same changes again
|
||||
postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL);
|
||||
lsn | xid | data
|
||||
-----------+-------+---------------------------------------------------------
|
||||
0/BA5A8E0 | 10299 | BEGIN 10299
|
||||
0/BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
|
||||
0/BA5A990 | 10299 | COMMIT 10299
|
||||
lsn | xid | data
|
||||
------------+-------+---------------------------------------------------------
|
||||
0/0BA5A8E0 | 10299 | BEGIN 10299
|
||||
0/0BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
|
||||
0/0BA5A990 | 10299 | COMMIT 10299
|
||||
(3 rows)
|
||||
|
||||
postgres=# -- options can be passed to output plugin, to influence the formatting
|
||||
postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-timestamp', 'on');
|
||||
lsn | xid | data
|
||||
-----------+-------+---------------------------------------------------------
|
||||
0/BA5A8E0 | 10299 | BEGIN 10299
|
||||
0/BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
|
||||
0/BA5A990 | 10299 | COMMIT 10299 (at 2017-05-10 12:07:21.272494-04)
|
||||
lsn | xid | data
|
||||
------------+-------+---------------------------------------------------------
|
||||
0/0BA5A8E0 | 10299 | BEGIN 10299
|
||||
0/0BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
|
||||
0/0BA5A990 | 10299 | COMMIT 10299 (at 2017-05-10 12:07:21.272494-04)
|
||||
(3 rows)
|
||||
|
||||
postgres=# -- Remember to destroy a slot you no longer need to stop it consuming
|
||||
@@ -200,18 +200,18 @@ postgres=*# INSERT INTO data(data) VALUES('5');
|
||||
postgres=*# PREPARE TRANSACTION 'test_prepared1';
|
||||
|
||||
postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);
|
||||
lsn | xid | data
|
||||
-----------+-----+---------------------------------------------------------
|
||||
0/1689DC0 | 529 | BEGIN 529
|
||||
0/1689DC0 | 529 | table public.data: INSERT: id[integer]:3 data[text]:'5'
|
||||
0/1689FC0 | 529 | PREPARE TRANSACTION 'test_prepared1', txid 529
|
||||
lsn | xid | data
|
||||
------------+-----+---------------------------------------------------------
|
||||
0/01689DC0 | 529 | BEGIN 529
|
||||
0/01689DC0 | 529 | table public.data: INSERT: id[integer]:3 data[text]:'5'
|
||||
0/01689FC0 | 529 | PREPARE TRANSACTION 'test_prepared1', txid 529
|
||||
(3 rows)
|
||||
|
||||
postgres=# COMMIT PREPARED 'test_prepared1';
|
||||
postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NULL);
|
||||
lsn | xid | data
|
||||
-----------+-----+--------------------------------------------
|
||||
0/168A060 | 529 | COMMIT PREPARED 'test_prepared1', txid 529
|
||||
lsn | xid | data
|
||||
------------+-----+--------------------------------------------
|
||||
0/0168A060 | 529 | COMMIT PREPARED 'test_prepared1', txid 529
|
||||
(4 row)
|
||||
|
||||
postgres=#-- you can also rollback a prepared transaction
|
||||
@@ -219,18 +219,18 @@ postgres=# BEGIN;
|
||||
postgres=*# INSERT INTO data(data) VALUES('6');
|
||||
postgres=*# PREPARE TRANSACTION 'test_prepared2';
|
||||
postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NULL);
|
||||
lsn | xid | data
|
||||
-----------+-----+---------------------------------------------------------
|
||||
0/168A180 | 530 | BEGIN 530
|
||||
0/168A1E8 | 530 | table public.data: INSERT: id[integer]:4 data[text]:'6'
|
||||
0/168A430 | 530 | PREPARE TRANSACTION 'test_prepared2', txid 530
|
||||
lsn | xid | data
|
||||
------------+-----+---------------------------------------------------------
|
||||
0/0168A180 | 530 | BEGIN 530
|
||||
0/0168A1E8 | 530 | table public.data: INSERT: id[integer]:4 data[text]:'6'
|
||||
0/0168A430 | 530 | PREPARE TRANSACTION 'test_prepared2', txid 530
|
||||
(3 rows)
|
||||
|
||||
postgres=# ROLLBACK PREPARED 'test_prepared2';
|
||||
postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NULL);
|
||||
lsn | xid | data
|
||||
-----------+-----+----------------------------------------------
|
||||
0/168A4B8 | 530 | ROLLBACK PREPARED 'test_prepared2', txid 530
|
||||
lsn | xid | data
|
||||
------------+-----+----------------------------------------------
|
||||
0/0168A4B8 | 530 | ROLLBACK PREPARED 'test_prepared2', txid 530
|
||||
(1 row)
|
||||
</programlisting>
|
||||
</sect1>
|
||||
@@ -431,7 +431,7 @@ postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NU
|
||||
cases, the following log message may appear:
|
||||
<programlisting>
|
||||
LOG: could not synchronize replication slot "failover_slot"
|
||||
DETAIL: Synchronization could lead to data loss as the remote slot needs WAL at LSN 0/3003F28 and catalog xmin 754, but the standby has LSN 0/3003F28 and catalog xmin 756
|
||||
DETAIL: Synchronization could lead to data loss as the remote slot needs WAL at LSN 0/03003F28 and catalog xmin 754, but the standby has LSN 0/03003F28 and catalog xmin 756
|
||||
</programlisting>
|
||||
If the logical replication slot is actively used by a consumer, no
|
||||
manual intervention is needed; the slot will advance automatically,
|
||||
|
||||
Reference in New Issue
Block a user