pglogical
事前準備
開始監控及排解 pglogical
導入作業問題前,請先檢查供應商和訂閱者資料庫、瞭解 pglogical
導入作業,並驗證設定方式。
如要進一步瞭解 pglogical
擴充功能,請參閱「關於 pglogical
」。
如要瞭解如何使用 pglogical
複製資料,請參閱「在 PostgreSQL 適用的 AlloyDB 和 AlloyDB Omni 之間複製資料」和「在 AlloyDB Omni 和其他資料庫之間複製資料」。
檢查 pglogical
、複寫和 AlloyDB Omni 參數設定
許多設定參數都會影響 pglogical 擴充功能的運作,您可以在供應商和訂閱者資料庫中檢查這些參數。請注意,參數值可能有所不同。
顯示
pglogical
特定參數的目前設定:SELECT name, setting, source, short_desc FROM pg_catalog.pg_settings WHERE name LIKE '%pglogical%' AND name NOT LIKE '%alloydb%' ORDER BY category, name;
顯示其他與邏輯複寫相關的參數:
SELECT name, setting, source, short_desc FROM pg_catalog.pg_settings WHERE name IN ('wal_level', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'shared_preload_libraries', 'track_commit_timestamp') ORDER BY name;
顯示 AlloyDB Omni 專屬參數:
SELECT name, setting, source, short_desc FROM pg_catalog.pg_settings WHERE name LIKE '%alloydb%' ORDER BY category, name;
列出設定中的節點
在 pglogical 複寫設定中列出本機和遠端節點:
SELECT node_id, if_nodeid AS node_id, if_name AS node_name, if_dsn AS dsn FROM pglogical.node_interface LEFT JOIN pglogical.local_node ON (node_id = if_nodeid AND node_local_interface = if_id) ORDER BY node_name;
如果
node_id
欄為NOT NULL
,則為本機節點。請詳閱
dsn
資訊。如果連線字串資訊有誤或過時,可能會導致複製作業失敗。如要瞭解如何排解dsn
問題,請參閱「排解訂閱項目複製問題」。
檢查訂閱狀態和資料表複寫點
系統一律會從訂閱者資料庫驗證訂閱狀態。訂閱項目會顯示「initializing
」或「replicating
」狀態,也會顯示「down
」狀態。如要進一步瞭解 down
狀態,請參閱「排解訂閱項目複製問題」。
列出目前資料庫中的訂閱項目、目前狀態和設定:
SELECT s.sub_name AS subscription_name, n1.node_name AS origin_name, n2.node_name AS target_name, x.status, sub_slot_name, sub_replication_sets, sub_forward_origins, sub_apply_delay, sub_force_text_transfer, sub_enabled AS enabled FROM pglogical.subscription s, (SELECT subscription_name, status FROM pglogical.show_subscription_status()) AS x, pglogical.node n1, pglogical.node n2 WHERE s.sub_origin = n1.node_id AND s.sub_target = n2.node_id AND s.sub_name = x.subscription_name ORDER BY s.sub_name;
輸出結果會與下列內容相似:
-[ RECORD 1 ]-----------+-------------------------------------- subscription_id | 3072625608 subscription_name | test_sub_1 origin_name | provider target_name | subscriber status | replicating sub_slot_name | pgl_my_test_db_provider_test_sub_1 sub_replication_sets | {default,default_insert_only,ddl_sql} sub_forward_origins | {all} sub_apply_delay | 00:00:00 sub_force_text_transfer | f enabled | t my_test_db=#
列出目前透過訂閱複製的資料表,以及這些資料表目前的記錄序號 (LSN):
SELECT sync_nspname||'.'||sync_relname AS table_name, sync_status, sync_statuslsn FROM pglogical.local_sync_status WHERE sync_relname IS NOT NULL ORDER BY table_name;
輸出結果會與下列內容相似:
table_name | sync_status | sync_statuslsn ---------------------+-------------+---------------- public.test_table_1 | r | 0/B891BC0 (1 row) my_test_db=#
「
sync_statuslsn
」欄會顯示資料表同步處理的 LSN。您可以將此值與供應商資料庫中的 LSN 進行比較,評估複製延遲。檢查特定資料表的複製狀態:
SELECT * FROM pglogical.show_subscription_table('test_sub_1','test_table_1');
在提供者上驗證複寫集詳細資料
列出供應商資料庫中的目前複製集,並檢查複製的項目:
SELECT set_name, node_name, replicate_insert, replicate_update, replicate_delete, replicate_truncate FROM pglogical.replication_set JOIN pglogical.node ON set_nodeid = node_id ORDER BY set_name, node_name;
列出複製的資料表和序列:
-- Table details: SELECT set_name, set_reloid AS table_name, set_att_list, set_row_filter FROM pglogical.replication_set NATURAL JOIN pglogical.replication_set_table ORDER BY set_name, table_name; -- Sequence details: SELECT set_name, set_seqoid AS sequence_name FROM pglogical.replication_set NATURAL JOIN pglogical.replication_set_seq ORDER BY set_name, sequence_name;
檢查提供者的複製資訊和運算單元延遲
在供應商資料庫中產生
pg_stat_replication
檢視畫面,即可查看各訂閱者的狀態:SELECT application_name, state, sync_state, client_addr, client_hostname, pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) AS sent_lag, pg_wal_lsn_diff(sent_lsn,flush_lsn) AS receiving_lag, pg_wal_lsn_diff(flush_lsn,replay_lsn) AS replay_lag, pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn) AS total_lag, now()-reply_time AS reply_delay FROM pg_stat_replication ORDER BY client_hostname;
輸出結果會與下列內容相似:
-[ RECORD 1 ]----+------------------------------ application_name | test_sub_1 state | streaming sync_state | async client_addr | 10.45.0.80 client_hostname | sent_lag | 0 receiving_lag | 0 replay_lag | 0 total_lag | 0 reply_delay | 00:00:26.203433 my_test_db=#
請注意
reply_delay
欄,其中會顯示系統收到訂閱者資料庫上次更新的時間。監控供應商上複製運算單元的複製延遲,因為
pglogical
會在供應商資料庫上建立複製運算單元:SELECT slot_name, slot_type, database, active, COALESCE(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn),0) AS restart_lag, COALESCE(pg_wal_lsn_diff(pg_current_wal_lsn(),confirmed_flush_lsn),0) AS confirmed_flush_lag FROM pg_replication_slots WHERE plugin like '%pglogical%' ORDER BY slot_name;
輸出結果會與下列內容相似:
) 會涵蓋這項功能。-[ RECORD 1 ]-------+----------------------------------- slot_name | pgl_my_test_db_provider_test_sub_1 slot_type | logical database | my_test_db active | t restart_lag | 56 confirmed_flush_lag | 0 my_test_db=#
排解訂閱項目複製作業問題
如果訂閱項目是最近建立的,訂閱者資料庫中檢查的訂閱項目必須顯示 replicating
或 initializing
狀態。如果狀態為 down
,則代表發生問題。
通常在複製作業嘗試啟動但失敗後,系統會顯示 down
狀態。這是因為 dsn
設定導致連線問題,或是缺少資料庫權限 (供應商或訂閱者)。
使用記錄檔探索工具檢查 PostgreSQL 記錄檔 (如果 AlloyDB 是端點之一),取得可能指出問題原因的額外資訊。 Google Cloud Google Cloud 記錄檔會提供問題的詳細資料,包括缺少權限的具體詳細資料。
檢查 AlloyDB Omni 伺服器上的 PostgreSQL 記錄:
Docker
docker logs CONTAINER_NAME
將
CONTAINER_NAME
替換為您在安裝 AlloyDB Omni 容器時指派的名稱。Podman
podman logs CONTAINER_NAME
將
CONTAINER_NAME
替換為您在安裝 AlloyDB Omni 容器時指派的名稱。排解
dsn
設定問題,並確認問題並非源自網路連線:- 複製
dsn
連線字串,然後嘗試使用psql
和相同字串手動連線。如果psql
工作階段無法連線,表示:- 網路問題。
- IP 位址、使用者名稱或密碼有誤。
- 封鎖防火牆。
- 其他叢集的
pg_hba.conf
檔案設定有誤。
- 複製
如果不想在採取修正措施後捨棄並重新建立訂閱項目,請重新同步處理資料表:
SELECT pglogical.alter_subscription_resynchronize_table(subscription_name := 'test_sub_1',relation := 'table_name');
或者,你也可以取消訂閱,然後重新建立:
SELECT pglogical.drop_subscription(subscription_name := 'test_sub_1');