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ì?
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:
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 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 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à psql
là để 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
ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname
?
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
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
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 .
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_basebackup
hoạ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:
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 đề đó.max_wal_senders = 1
( -X fetch
), 2
cho -X stream
(mặc định trong trường hợp PostgreQuery 12) hoặc nhiều hơn.wal_level = replica
hoặc cao hơn để có thể thiết lập max_wal_senders > 0
.host replication postgres DST_IP/32 trust
trong pg_hba.conf
. Điều này cấp quyền truy cập vào pg
cụm cho bất kỳ ai từ DST_IP
má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
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
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.
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
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.
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
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}}