-- 关键表的行数对比SELECT 'public.orders' AS table_name, COUNT(*) AS row_count FROM public.orders;SELECT 'public.customers' AS table_name, COUNT(*) AS row_count FROM public.customers;-- 抽查高活跃表中的最新记录SELECT MAX(updated_at) FROM public.orders;SELECT MAX(id) FROM public.orders;
停止向源系统写入
先暂停应用程序的写入操作。为进一步确保安全,可在切换期间将源数据库设为只读:
ALTER DATABASE <source_db> SET default_transaction_read_only = on;
如果需要回滚,可以重新启用写入:
ALTER DATABASE <source_db> SET default_transaction_read_only = off;
确认复制已完全同步
检查一个或多个高写入表中的最新行在源端和目标端是否一致:
-- 在源端和目标端分别运行并比较结果SELECT MAX(id) AS latest_id, MAX(updated_at) AS latest_ts FROM public.orders;
-- 对所有非系统 schema 中 serial/identity 类型列进行通用序列重置DO $$DECLARE r RECORD;BEGIN FOR r IN SELECT n.nspname AS schema_name, c.relname AS table_name, a.attname AS column_name, pg_get_serial_sequence(format('%I.%I', n.nspname, c.relname), a.attname) AS seq_name FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace JOIN pg_attribute a ON a.attrelid = c.oid WHERE c.relkind = 'r' AND a.attnum > 0 AND NOT a.attisdropped AND n.nspname NOT IN ('pg_catalog', 'information_schema') LOOP IF r.seq_name IS NOT NULL THEN EXECUTE format( 'SELECT setval(%L, COALESCE((SELECT MAX(%I) FROM %I.%I), 0) + 1, false)', r.seq_name, r.column_name, r.schema_name, r.table_name ); END IF; END LOOP;END $$;