Sao chép cơ sở dữ liệu PostgreSQL sang máy chủ khác


492

Tôi đang tìm cách sao chép cơ sở dữ liệu PostgreQuery sản xuất sang máy chủ phát triển. Cách nhanh nhất, dễ nhất để làm điều này là gì?

Câu trả lời:


668

Bạn không cần tạo một tệp trung gian. Bạn có thể làm

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

hoặc là

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

sử dụng psqlhoặ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 hủy tệp và chuyển tệp được nén có thể nhanh hơn.

Như Kornel nói rằng không cần phải đổ vào một tệp 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  remoteuser@remotehost "bunzip2 | psql dbname"

hoặc là

pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"

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

Lưu ý: pg_dump là để sao lưu và psqllà để khôi phục. Vì vậy, lệnh đầu tiên trong câu trả lời này là sao chép từ cục bộ sang từ xa và lệnh thứ hai là từ xa sang cục bộ . Khác -> https://www.postgresql.org/docs/9.6/app-pgdump.html


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

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

8
Làm cách nào tôi có thể nén nếu tôi kéo dữ liệu từ sản xuất xuống phát triển? Tôi đã thiết lập kết nối SSH từ khi phát triển thành sản xuất. Vì vậy, nó sẽ được ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname?
Jeromy Pháp

2
Tôi hy vọng rằng bạn sẽ có thể sao chép cơ sở dữ liệu từ xa có tên x sang cơ sở dữ liệu cục bộ có tên y, nhưng giải pháp của @ Ferran không hoạt động cho việc này ... Có vẻ như tôi là giải pháp của porneL chỉ để lại các tệp bzip2 trên máy chủ, vì vậy đó không phải là một quá trình một bước. Đây là trường hợp, tôi đoán tôi sẽ bỏ cơ sở dữ liệu y, sử dụng phần "hoặc" của giải pháp Ferran phục hồi x, sau đó đổi tên cơ sở dữ liệu thành y.
Darin Peterson

3
Đây là những gì tôi đã làm: (1) pg_dump -C -h remotehost -U remoteuser x | psql -h localhost -U localuser (2) dropdb y (3) psql -U postgres -c 'ALTER DATABASE "x" RENAME TO "y"'
Darin Peterson

131
pg_dump the_db_name > the_backup.sql

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

psql the_new_dev_db < the_backup.sql

3
Một số người nói với tôi rằng điều này có thể có vấn đề - vấn đề về quyền khiến cho kết xuất hoặc khôi phục bị chết khi nó kích hoạt?
Robin Barnes

17
@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 thì "Ai đó" này đã làm gì - không ai có thể xác nhận hay bác bỏ yêu cầu này.

4
Sử dụng cờ --no-own với pg_dump. Điều này bỏ qua vấn đề và lần 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 sự trung thực chính xác hơn với cơ sở dữ liệu gốc.
không đếm được

4
Đối với tôi, trên cách tiếp cận làm việc tại sau cách: pg_dump C -h chủ -U Tên truy nhập db_name> / any_directory / dump_schema_and_data_file .Và cho việc khôi phục từ file: host -h psql -U Tên truy nhập db_name <dump_schema_and_data_file
Ali Raza Bhayani

Điều đó đã tiết kiệm cho tôi rất nhiều tình tiết tăng nặng. Tôi đã sử dụng ổ Google để di chuyển tệp giữa các máy. Vì tôi đã có cơ sở dữ liệu trên máy mới (Nhưng trống), tôi đã nhận được rất nhiều lỗi khóa trùng lặp. Tuy nhiên, đó là một môi trường dev và họ đã không làm tổn thương gì.
Chris Mendla

37

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

Ví dụ về cách 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

22

Nếu bạn đang tìm cách di chuyển giữa các phiên bản (ví dụ: bạn đã cập nhật postgres và có 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 tài liệu di chuyển .


Tôi được hỏi về 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?
Martin Weber

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

Nếu chúng có cả hai cổng giống nhau thì sao?
ggnoredo

Nếu chúng ở trên các máy chủ khác nhau, bạn có thể sử dụng -h để chỉ định máy chủ.
Haroldo_OK

16

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

Bạn có thể sao chép cơ sở dữ liệu từ máy chủ có cùng phiên bản chính cũ hoặc cũ hơn. Hay chính xác hơn :

pg_basebackuphoạt động với các máy chủ cùng phiên bản hoặc cũ hơn, xuống còn 9.1. Tuy nhiên, chế độ phát trực tuyến WAL ( -X stream) chỉ hoạt động với phiên bản máy chủ 9.3 trở lên và chế độ định dạng tar ( --format=tar) của phiên bản hiện tại chỉ hoạt động với phiên bản máy chủ 9.5 trở lên.

Cho rằng bạn cần trên máy chủ nguồn:

  1. listen_addresses = '*'để có thể kết nối từ máy chủ mục tiêu. Hãy chắc chắn rằng cổng 5432 được mở cho vấn đề đó.
  2. Ít nhất 1 kết nối sao chép có sẵn: max_wal_senders = 1( -X fetch), 2cho -X stream(mặc định trong trường hợp PostgreQuery 12) hoặc nhiều hơn.
  3. wal_level = replicahoặc cao hơn để có thể thiết lập max_wal_senders > 0.
  4. host replication postgres DST_IP/32 trusttrong pg_hba.conf. Điều này cấp quyền truy cập vào pgcụm cho bất kỳ ai từ DST_IPmáy. Bạn có thể muốn sử dụng một lựa chọn an toàn hơn.

Thay đổi 1, 2, 3 yêu cầu khởi động lại máy chủ, thay đổi 4 yêu cầu tải lại.

Trên máy chủ đích:

# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME

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

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

Cơ hội nhỏ mà 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 cuộc trò chuyện khó chịu với một trong những đồng đội của mình khi cô ấy đang cố gắng gửi một vấn đề rằng 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 trong sản xuất tại thời điểm đó. Sao lưu cơ sở nhanh hơn nhiều. Sau đó, pg_upTHER là cách để đi nếu cần thiết.
Zorg

2
Có thể bạn muốn chuyển sang phiên bản mới hơn và không muốn dừng PostgreQuery.
x-yuri

1
Rất có thể là bất cứ khi nào bạn nâng cấp cơ sở dữ liệu của mình, bạn sẽ nâng cấp nó trên dev và dàn dựng trước khi bạn thực hiện nó trên sản xuất.
rút lorien

8

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

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

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

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

eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/

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

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

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

7

Tôi đã vật lộn khá nhiều và cuối cùng phương pháp cho phép tôi làm cho nó hoạt động với Rails 4 là:

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 linux postgres để tạo kết xuất. Ngoài ra tôi đã phải sử dụng -c để buộc tạo cơ sở dữ liệu trên máy chủ mới. --inserts bảo nó sử dụng cú pháp INSERT () nếu không sẽ không hoạt động với tôi :(

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

sudo su - postgres
psql new_database_name < dump.sql

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

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


6

Kết xuất cơ sở dữ liệu của bạn: pg_dump database_name_name > backup.sql


Nhập lại cơ sở dữ liệu của bạn: psql db_name < backup.sql


5

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ủ này sang máy chủ PostgreQuery khác.

Tham khảo lấy từ blog này:

Linux Bash Shell Script để di chuyển dữ liệu giữa các máy chủ PostgreSQL:

#!/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; vui lòng 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à một kịch bản tiện ích. Hơn nữa, bạn có thể sửa đổi tập lệnh để sử dụng chung một cái gì đó như bằng cách thêm các tham số cho host_name, database_name, table_name và những người khác


5

Câu trả lời được chấp nhận là chính xác, nhưng nếu bạn muốn tránh nhập mật khẩu một cách tương tác, bạn có thể sử dụng cách này:

PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.