2009-08-06 64 views

Trả lời

487

Bạn không cần phải tạo ra một file trung gian. Bạn có thể làm

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname 

hoặc

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname 

sử dụng psql hoặc pg_dump để kết nối với một máy chủ từ xa.

Với cơ sở dữ liệu lớn hoặc kết nối chậm, việc bán một tệp và chuyển tệp nén có thể nhanh hơn.

Như Kornel nói không có nhu cầu để đổ vào một tập tin trung gian, nếu bạn muốn làm việc nén bạn có thể sử dụng một đường hầm nén

pg_dump -C dbname | bzip2 | ssh [email protected] "bunzip2 | psql dbname" 

hoặc

pg_dump -C dbname | ssh -C [email protected] "psql dbname" 

nhưng giải pháp này cũng đòi hỏi để có được một phiên ở cả hai đầu.

+22

Không cần tệp trung gian - bạn có thể sử dụng đường hầm SSH nén hoặc đơn giản là pipe: pg_dump | bzip2 | ssh "bunzip2 | pg_restore" – Kornel

+2

Nếu bạn sử dụng bzip2, hãy tắt nén ssh để tăng tốc độ truyền tải! – lzap

+0

Lệnh ssh đã được nén theo mặc định. Trong ví dụ khi sử dụng nén ssh, tôi không sử dụng bzip2 và khi sử dụng bzip2 tôi không sử dụng nén ssh. – Ferran

97
pg_dump the_db_name > the_backup.sql 

Sau đó, sao chép sao lưu vào máy chủ phát triển của bạn, khôi phục với:

psql the_new_dev_db < the_backup.sql 
+2

Một số đã nói với tôi điều này có thể gây ra sự cố ? –

+9

@rmbarnes: Nếu có vấn đề - chúng phải được sửa. Nếu không có kiến ​​thức chi tiết những gì "Một số một" đã làm - không ai có thể xác nhận cũng không bác bỏ yêu cầu này. –

+2

Sử dụng cờ --no-owner với pg_dump. Điều này bỏ qua vấn đề và chỉnh sửa đầu tiên của bài đăng này đã sử dụng nó - nhưng sau đó tôi nghĩ bạn có thể cần độ trung thực chính xác hơn cho cơ sở dữ liệu gốc. – unmounted

33

Sử dụng pg_dump, và sau đó psql hoặc pg_restore - tùy thuộc cho dù bạn chọn -Fp hoặc tùy chọn -Fc để pg_dump.

Ví dụ về sử dụng:

ssh production 
pg_dump -C -Fp -f dump.sql -U postgres some_database_name 
scp dump.sql development: 
rm dump.sql 
ssh development 
psql -U postgres -f dump.sql 
2

tôi phải vật lộn khá nhiều và cuối cùng là phương pháp mà cho phép tôi để làm cho nó làm việc với Rails 4 được:

trên máy chủ cũ của bạn

sudo su - postgres 
pg_dump -c --inserts old_db_name > dump.sql 

tôi đã phải sử dụng người dùng postgres linux để tạo ra bãi chứa. tôi cũng đã phải sử dụng -c để buộc tạo ra cơ sở dữ liệu trên máy chủ mới. --inserts nói với nó để sử dụng INSERT() Cú pháp mà nếu không sẽ không làm việc cho tôi :(

sau đó, trên máy chủ mới, simpy:

sudo su - postgres 
psql new_database_name < dump.sql 

để chuyển các tập tin giữa máy chủ dump.sql Tôi chỉ đơn giản sử dụng "con mèo" để in nội dung và hơn "nano" để tạo lại nội dung đó sao chép nội dung.

Ngoài ra, ROLE tôi đang sử dụng trên hai cơ sở dữ liệu khác nhau nên tôi phải thay thế tất cả chủ sở hữu tên trong bãi chứa.

13

pg_basebackup dường như là thứ cách tốt hơn để làm điều này ngay bây giờ, đặc biệt là cho các cơ sở dữ liệu lớn.

+7

Bạn có thể cung cấp thêm chi tiết trong câu trả lời của mình, chẳng hạn như ví dụ? – Magnilex

+4

Điều này chỉ hoạt động khi cả hai máy đều có cùng phiên bản PG. –

+0

Rất có thể bạn sẽ sử dụng phiên bản cơ sở dữ liệu khác nhau để phát triển và sản xuất. Lần trước tôi có một số cuộc trò chuyện khó chịu với một trong những đồng đội của tôi khi cô ấy đang cố gắng gửi một vấn đề mà một số mã không hoạt động với PG 9.6 trong khi chúng tôi đã sử dụng 9.5 sản xuất tại thời điểm đó. Sao lưu cơ sở nhanh hơn nhiều. Sau đó pg_upgrade là cách để đi nếu cần. – Zorg

3

Chạy lệnh này với tên cơ sở dữ liệu, bạn muốn sao lưu, để lấy dump của DB.

pg_dump -U {user-name} {source_db} -f {dumpfilename.sql} 

eg. pg_dump -U postgres mydbname -f mydbnamedump.sql 

Bây giờ hãy scp tệp kết xuất này vào máy từ xa mà bạn muốn sao chép DB.

eg. scp mydbnamedump.sql [email protected]:~/some/folder/ 

Trên máy từ xa chạy lệnh sau trong ~/some/folder để khôi phục DB.

psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql} 

eg. psql -U postgres -d mynewdb -f mydbnamedump.sql 
16

Nếu bạn đang tìm kiếm để di chuyển giữa các phiên bản (ví dụ bạn được cập nhật postgres và đã 9.1 chạy trên localhost: 5432 và 9,3 chạy trên localhost: 5434), bạn có thể chạy:

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434 

Kiểm tra các migration docs.

+0

Tôi được yêu cầu nhập mật khẩu (myuser91/postgres) nhiều lần, có cách nào để tôi chỉ cần nhập mật khẩu một lần không? –

+0

@MartinWeber Tạo một tệp pgpass theo tài liệu này https://www.postgresql.org/docs/9.4/static/libpq-pgpass.html –

1

Hãy để tôi chia sẻ tập lệnh shell Linux để sao chép dữ liệu bảng của bạn từ một máy chủ sang một máy chủ PostgreSQL khác.

Reference taken from this blog:

Linux Bash Shell Script cho việc di chuyển dữ liệu giữa PostgreSQL Servers:

#!/bin/bash 
psql \ 
    -X \ 
    -U user_name \ 
    -h host_name1 \ 
    -d database_name \ 
    -c "\\copy tbl_Students to stdout" \ 
| \ 
psql \ 
    -X \ 
    -U user_name \ 
    -h host_name2 \ 
    -d database_name \ 
    -c "\\copy tbl_Students from stdin" 

tôi chỉ di chuyển dữ liệu; hãy tạo một bảng trống tại máy chủ cơ sở dữ liệu đích/thứ hai của bạn.

Đây là tập lệnh tiện ích. Hơn nữa, bạn có thể sửa đổi kịch bản để sử dụng chung một cái gì đó như bằng cách thêm tham số cho host_name, database_name, table_name và những người khác

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