2013-02-12 34 views
12

Hàng của bảng bị xóa nhầm khỏi cơ sở dữ liệu. Chúng tôi có bản sao lưu db dẫn đến tệp sql có thể khôi phục như sau:Làm thế nào để khôi phục một bảng duy nhất từ ​​bản sao lưu .sql postgresql?

psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql 

Điều này sẽ kết thúc khôi phục cục bộ. Nhưng những gì chúng tôi cần là khôi phục lại các hàng của một bảng để sản xuất. Bất kỳ lời khuyên nào về cách thực hiện công việc này với PostgreSQL 9.1?

Cảm ơn

Trả lời

10

Đừng làm sao lưu SQL nếu bạn cần bảng duy nhất khôi phục, vv Use pg_dump's -Fc option - định dạng "tùy chỉnh". Điều này có thể được khôi phục bằng cách sử dụng pg_restore. Có thể khôi phục có chọn lọc, cũng giống như tất cả các tính năng tiện dụng khác. pg_restore có thể chuyển đổi kết xuất dạng tùy chỉnh thành một kết xuất SQL sau này nếu bạn cần.

Nếu bạn đang mắc kẹt với một bãi hiện có, lựa chọn duy nhất của bạn là:

  • Sử dụng một trình soạn thảo văn bản để trích xuất các dữ liệu bảng mục tiêu vào một tập tin riêng biệt và chỉ cần khôi phục đó; hoặc

  • Khôi phục kết xuất vào cơ sở dữ liệu throwaway sau đó sử dụng pg_dump để lấy một vùng chọn lọc chỉ bao gồm bảng đó. Kể từ khi nó là throwaway, bạn có thể sử dụng một cá thể Pg riêng biệt trên một số unloaded nhanh nhưng không an toàn máy nơi bạn bật tất cả các "làm cho nó nhanh nhưng ăn dữ liệu của tôi nếu bạn thích" tùy chọn như fsync=off. Bạn nên KHÔNG BAO GIỜ đặt trong sản xuất.

+0

Có thể tạo bản sao lưu 'pg_dumpall' ở định dạng' -Fc' không? – vyegorov

+0

@vyegorov, pg_dumpall không có cờ -F - Chỉ có thể đổ cơ sở dữ liệu ở định dạng SQL. – mys

4

Bạn có thể sử dụng grep + sed trong Roder để có được bảng dữ liệu:

Trước tiên, bạn cần phải xác định ranh giới:

$ fgrep -Ehn '^(COPY |CREATE TABLE)' db.sql 
49:CREATE TABLE test (
60:CREATE TABLE test2 (
71:CREATE TABLE test3 (
82:COPY test (i) FROM stdin; 
100090:COPY test2 (i) FROM stdin; 
200098:COPY test3 (i) FROM stdin; 

Để trích xuất dữ liệu cho bảng test2:

sed -n '100090,200097p' < db.sql | sed -e 's/^COPY test2/COPY new_table_name/' > new_table_name.sql 

Lưu ý, bạn cần trừ một từ số thứ hai (nghĩa là loại trừ bản sao tiếp theo)

Bây giờ, bạn có thể tải new_table_name.sql và khôi phục dữ liệu bạn cần. Bây giờ, bạn có thể tải dữ liệu vào bảng mới

0

Tôi tình cờ có pg_dumpall đổ xung quanh. Và tôi muốn khôi phục bảng có tên là users từ cơ sở dữ liệu có tên edc, vì bạn có nhiều khả năng là sẽ có các bảng được đặt tên giống nhau trong các cơ sở dữ liệu khác nhau và thậm chí cả lược đồ.

Đối với trường hợp của tôi, sed sau oneliner hoạt động:

sed -ne '/^\\connect edc/,/^\\connect/{/\susers\(\s\|$\)/,/;\|\\\./p}' pg92.dump 

Những gì nó:

  1. /^\\connect edc/,/^\\connect/ giới hạn tìm kiếm để có phạm vi cơ sở dữ liệu của tôi;
  2. {…} sẽ thực hiện tất cả các lệnh bên trong cho phạm vi;
  3. /\susers\(\s\|$\)/ đối sánh tất cả các dòng với riêng dòng users, bao gồm ở cuối dòng;
  4. /;\|\\\./ trận dòng với ; hoặc chứa \.
  5. p buộc các dòng khớp được outputted (lưu ý, rằng sed được gọi với -n).

Tùy thuộc vào độ phức tạp của dữ liệu của bạn, bạn có thể cần phải tinh chỉnh điều này.

Tất cả những gì bạn phải làm là đặt đường ống sed xuất ra lệnh psql bằng công tắc bên phải.

15

Tôi không biết về bất kỳ công cụ cho điều này, nhưng điều này một lót chiết xuất từ ​​precious_tablemy_backup.sql file:

sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql 
+1

Bảng quý giá của tôi. –

2

Có một cách dễ dàng.

'pg_restore' có tùy chọn '--table/-t'.

pg_restore -a -t your_table /path/to/dump.sql 

Sử dụng '-h' cho máy chủ từ xa. Xem các tùy chọn khác here

+1

không hoạt động nếu bãi chứa ở định dạng văn bản thuần túy – emaillenin

+1

Phải, xin lỗi, tệp phải được tạo bởi 'pg_dump' trước –

Các vấn đề liên quan