PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

“CẢNH BÁO:Không khớp được tìm thấy giữa sl_table và pg_class.” ở Slony-I

CẢNH BÁO:Không khớp được tìm thấy giữa sl_table và pg_class. Lệnh Slonik REPAIR CONFIG có thể hữu ích để khắc phục điều này.
2014-04-26 07:32:54 PDT FATAL slon_node_health_check () trả về sai - sự cố sức khỏe gây tử vong!
REPAIR CONFIG có thể hữu ích để khắc phục sự cố này

Bạn thấy thông báo CẢNH BÁO này trong nhật ký và ngừng sao chép ngay lập tức, nếu Slony đã quan sát thấy sự không khớp giữa pg_class.oid và sl_table.tabreloid của một bảng sao chép trong một nút. Bởi vì, theo kiến ​​trúc slony giữ tất cả các đối tượng sao chép thông tin OID trong danh mục của nó được ghi lại tại thời điểm cấu hình từ pg_class.oid.

Trong trường hợp nào thì pg_class.oid! =sl_table.tabreloid?

Hầu hết các trường hợp, một nút đã di chuyển vị trí của nó bằng cách sử dụng pg_dump / pg_restore bằng cách khiến OID các đối tượng thay đổi.

Để bắt chước thông báo CẢNH BÁO ở trên, tôi đã sử dụng thiết lập sao chép hai nút giữa hai cơ sở dữ liệu trên cùng một cụm [5432] cho một vài bảng. (Tham khảo tại đây về cách thiết lập sao chép Slony). Đây là thông tin OID hiện tại trên nút phụ (cơ sở dữ liệu demo) cho một trong các đối tượng ‘dtest’:

demo=# select oid,relfilenode,relname from pg_class where relname='dtest';
oid | relfilenode | relname
-------+-------------+---------
26119 | 26119 | detest
(1 row)
demo=# select tab_id,tab_reloid,tab_relname from _rf.sl_table where tab_relname='dtest';
tab_id | tab_reloid | tab_relname
--------+------------+-------------
2 | 26119 | dtest
(1 row)

Được rồi, ‘dtest’ OID 26119 được lưu trữ trong danh mục slony trong sl_table.tabreloid. (Slony schema _rf). Thực hiện sao lưu và khôi phục hợp lý của cùng một cơ sở dữ liệu demo đơn giản để thay đổi OID đối tượng như bên dưới:(Hãy nhớ rằng, quá trình Slon đang dừng lại tại thời điểm này)

-bash-4.1$ pg_dump -Fc -p 5432 -U postgres demo >/tmp/demo93.dmp
-bash-4.1$ psql -c "alter database demo rename to demo_bk;"
-bash-4.1$ psql -c "create database demo;"
-bash-4.1$ pg_restore -Fc -p 5432 -U postgres -d demo /tmp/demo93.dmp
-bash-4.1$ psql -c "select oid,relfilenode,relname from pg_class where relname='dtest';"
oid | relfilenode | relname
-------+-------------+---------
26640 | 26640 | dtest
(1 row)
-bash-4.1$ psql -c "select tab_id,tab_reloid,tab_relname from _rf.sl_table where tab_relname='dtest';"
tab_id | tab_reloid | tab_relname
--------+------------+-------------
2 | 26119 | dtest
(1 row)

Bây giờ, pg_class.oid của 'dtest' đã thay đổi thành 26640 trong khi sl_table.tab_reloid vẫn phản ánh OID 26119. Ở giai đoạn này, nếu chúng ta bắt đầu xử lý slon, về cơ bản nó sẽ dừng lại với thông báo CẢNH BÁO về sự không khớp của OID bằng cách chạy truy vấn pg_class.oid =sl_table.tabreloid. Khi trả về kết quả sai, nó sẽ không tiếp tục cho đến khi nó được khắc phục. Chúng tôi cũng có thể gọi hàm slon_node_health_check () một cách rõ ràng để xác minh:

demo=# select _rf.slon_node_health_check();
WARNING: table [id,nsp,name]=[1,a,public] - sl_table does not match pg_class/pg_namespace
WARNING: table [id,nsp,name]=[2,dtest,public] - sl_table does not match pg_class/pg_namespace
WARNING: table [id,nsp,name]=[3,movepage,public] - sl_table does not match pg_class/pg_namespace
WARNING: Mismatch found between sl_table and pg_class. Slonik command REPAIR CONFIG may be useful to rectify this.
slon_node_health_check
------------------------
f
(1 row)

Chúng tôi có thể khắc phục điều này theo hai cách.

  1. Sử dụng tiện ích dòng lệnh Slonik với CẤU HÌNH SỬA CHỮA tập lệnh mở đầu hoặc
  2. Sử dụng hàm danh mục Slony updatereloid () trong phần cuối psql.

Phương pháp 1: Tạo tập lệnh mở đầu như bên dưới và thực thi bằng lệnh slonik. Tôi sẽ sử dụng phương pháp thứ hai, nó chỉ để tham khảo.

demo=# o /tmp/repair_conf.slonik
demo=# select 'REPAIR CONFIG ( SET ID = '||set_id||', EVENT NODE = 1 );' FROM _rf.sl_set;
demo=# o

Add nodes information at the beginning of the file "/tmp/repair_conf.slonik"

cluster name = rf;
node 1 admin conninfo = 'host=localhost dbname=postgres user=postgres port=5432 password=postgres';
node 2 admin conninfo = 'host=localhost dbname=demo user=postgres port=5432 password=postgres';

REPAIR CONFIG ( SET ID = 1, EVENT NODE = 2 );
REPAIR CONFIG ( SET ID = 2, EVENT NODE = 2 );
REPAIR CONFIG ( SET ID = 3, EVENT NODE = 2 );

-bash-4.1$ slonik /tmp/repair_conf.slonik

Phương pháp 2: Chuyển thông tin nút và id tập hợp bảng vào một hàm:

demo=# select _rf.updatereloid(tab_set,2) from _rf.sl_table ;   
updatereloid
--------------
1
1
1
(3 rows)

Tuyệt vời, chúng ta hãy kiểm tra thông tin OID ngay bây giờ trên nút nô lệ (cơ sở dữ liệu demo) từ pg_class và _slonycatalog.sl_table

-bash-4.1$  psql -d demo -c "select oid,relfilenode,relname from pg_class where relname='dtest';"
oid | relfilenode | relname
-------+-------------+---------
26119 | 26119 | dtest
(1 row)

-bash-4.1$ psql -d demo -c "select tab_id,tab_reloid,tab_relname from _rf.sl_table where tab_relname='dtest';"
tab_id | tab_reloid | tab_relname
--------+------------+-------------
2 | 26119 | dtest
(1 row)

Sau khi cập nhật, slony sẽ bắt đầu đồng bộ hóa mà không gặp bất kỳ sự cố nào.
Cảm ơn nhóm Slony-I.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Db khác nhau để thử nghiệm trong Django?

  2. Đặt lại giá trị trình tự là 1

  3. Nhật ký PostgreSQL trên macOS ở đâu?

  4. Các công cụ mã nguồn mở hàng đầu cho PostgreSQL Migrations

  5. Postgres:LỖI:kế hoạch đã lưu trong bộ nhớ cache không được thay đổi loại kết quả