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

pg_dump với --exclude-table vẫn bao gồm các bảng đó trong các lệnh COPY nền mà nó chạy?

pg_dump kết xuất từng bảng con riêng biệt và độc lập với cha mẹ của chúng, do đó khi bạn loại trừ một siêu bảng, các bảng phân đoạn của nó sẽ vẫn bị đổ. Vì vậy, bạn quan sát thấy tất cả các bảng phân đoạn vẫn được kết xuất.

Lưu ý rằng việc loại trừ siêu bảng và khối sẽ không có tác dụng khôi phục kết xuất chính xác vào phiên bản TimescaleDB, vì siêu dữ liệu TimescaleDB sẽ không khớp với trạng thái thực tế của cơ sở dữ liệu. TimescaleDB duy trì các bảng danh mục với thông tin về siêu bảng và khối và chúng chỉ là một bảng người dùng khác cho pg_dump , do đó, nó sẽ kết xuất chúng (điều quan trọng), nhưng khi chúng được khôi phục, chúng sẽ chứa tất cả các siêu bảng và khối, đã có trong cơ sở dữ liệu trước khi kết xuất.

Vì vậy, bạn cần loại trừ dữ liệu khỏi các bảng mà bạn muốn loại trừ (không phải siêu bảng hoặc chính các khối), điều này sẽ giảm thời gian kết xuất và khôi phục. Sau đó, sẽ cần phải loại bỏ các siêu bảng bị loại trừ sau khi khôi phục. Bạn loại trừ dữ liệu bảng với pg_dump tham số --exclude-table-data . Có một vấn đề trong repo TimescaleDB GitHub, mà thảo luận về cách loại trừ dữ liệu siêu bảng khỏi một kết xuất . Vấn đề đề xuất cách tạo chuỗi loại trừ:

SELECT string_agg(format($$--exclude-table-data='%s.%s'$$,coalesce(cc.schema_name,c.schema_name), coalesce(cc.table_name, c.table_name)), ' ')
FROM _timescaledb_catalog.hypertable h 
  INNER JOIN _timescaledb_catalog.chunk c on c.hypertable_id = h.id 
  LEFT JOIN _timescaledb_catalog.chunk cc on c.compressed_chunk_id = cc.id
WHERE h.schema_name = <foo> AND h.table_name = <bar> ;

Ngoài ra, bạn có thể tìm thấy hypertable_id và loại trừ dữ liệu khỏi tất cả các bảng chunk có tiền tố là siêu bảng. Tìm hypertable_id từ bảng danh mục _timescaledb_catalog.hypertable :

SELECT id
FROM _timescaledb_catalog.hypertable
WHERE schema_name = 'mySchema' AND table_name = 'hyper1';

Giả sử rằng id là 2. Sau đó kết xuất cơ sở dữ liệu theo hướng dẫn :

pg_dump -U user -Fc -f TestDB_Backup.bak \
  --exclude-table-data='_timescaledb_internal._hyper_2*' TestDB 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chuyển đổi một cột trong bảng thành một kiểu dữ liệu khác

  2. Cách xóa nhiều hàng khỏi bảng được truy cập thường xuyên

  3. Cách cải thiện số lượng truy vấn văn bản cho Django với Postgres

  4. Trả về Giá trị Boolean là TRUE hoặc FALSE trong Lựa chọn (PostgreSQL / pgAdmin)

  5. lấy tên bảng trong kết quả truy vấn Postgres