ฉันต้องการคัดลอกฐานข้อมูล PostgreSQL ที่ใช้งานจริงไปยังเซิร์ฟเวอร์การพัฒนา วิธีที่เร็วและง่ายที่สุดในการทำสิ่งนี้คืออะไร?
ฉันต้องการคัดลอกฐานข้อมูล PostgreSQL ที่ใช้งานจริงไปยังเซิร์ฟเวอร์การพัฒนา วิธีที่เร็วและง่ายที่สุดในการทำสิ่งนี้คืออะไร?
คำตอบ:
คุณไม่จำเป็นต้องสร้างไฟล์ระดับกลาง คุณทำได้
pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname
หรือ
pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname
การใช้psql
หรือpg_dump
เพื่อเชื่อมต่อกับโฮสต์ระยะไกล
ด้วยฐานข้อมูลขนาดใหญ่หรือการเชื่อมต่อที่ช้าการทิ้งไฟล์และถ่ายโอนไฟล์บีบอัดอาจเร็วกว่า
ดังที่ Kornel กล่าวว่าไม่จำเป็นต้องดัมพ์ไปยังไฟล์ระดับกลางหากคุณต้องการทำงานที่บีบอัดคุณสามารถใช้อุโมงค์ที่ถูกบีบอัดได้
pg_dump -C dbname | bzip2 | ssh remoteuser@remotehost "bunzip2 | psql dbname"
หรือ
pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"
แต่วิธีนี้ยังต้องได้รับเซสชั่นในปลายทั้งสอง
หมายเหตุ: pg_dump
สำหรับการสำรองข้อมูลและpsql
สำหรับการกู้คืน ดังนั้นคำสั่งแรกในคำตอบนี้คือการคัดลอกจากท้องถิ่นเพื่อห่างไกลและคนที่สองจากระยะไกลเพื่อท้องถิ่น เพิ่มเติม -> 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
จากนั้นคัดลอกการสำรองข้อมูลไปยังเซิร์ฟเวอร์การพัฒนาของคุณคืนค่าด้วย:
psql the_new_dev_db < the_backup.sql
ใช้pg_dumpและต่อมาpsqlหรือpg_restoreขึ้นอยู่กับว่าคุณเลือกตัวเลือก -Fp หรือ -Fc เพื่อ pg_dump
ตัวอย่างการใช้งาน:
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
หากคุณต้องการโยกย้ายระหว่างเวอร์ชัน (เช่นคุณอัปเดต postgres และให้ 9.1 ทำงานบน localhost: 5432 และ 9.3 ทำงานบน localhost: 5434) คุณสามารถเรียกใช้:
pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434
pg_basebackup
น่าจะเป็นวิธีที่ดีกว่าในการทำเช่นนี้โดยเฉพาะอย่างยิ่งสำหรับฐานข้อมูลขนาดใหญ่
คุณสามารถคัดลอกฐานข้อมูลจากเซิร์ฟเวอร์ด้วยเวอร์ชันหลักเดียวกันหรือเก่ากว่า หรือแม่นยำยิ่งขึ้น :
pg_basebackup
ทำงานร่วมกับเซิร์ฟเวอร์ที่เป็นเวอร์ชันหลักเดียวกันหรือเก่ากว่าลงไปที่ 9.1 อย่างไรก็ตามโหมดการสตรีม WAL (-X stream
) ใช้งานได้เฉพาะกับเซิร์ฟเวอร์เวอร์ชั่น 9.3 และใหม่กว่าและโหมดการจัดรูปแบบ tar (--format=tar
) ของเวอร์ชันปัจจุบันจะทำงานกับเซิร์ฟเวอร์เวอร์ชัน 9.5 หรือใหม่กว่าเท่านั้น
สำหรับสิ่งที่คุณต้องการบนเซิร์ฟเวอร์ต้นทาง:
listen_addresses = '*'
เพื่อให้สามารถเชื่อมต่อจากเซิร์ฟเวอร์เป้าหมาย ตรวจสอบให้แน่ใจว่าพอร์ต 5432 เปิดอยู่สำหรับเรื่องนั้นmax_wal_senders = 1
( -X fetch
) 2
สำหรับ-X stream
(ค่าเริ่มต้นในกรณีของ PostgreSQL 12) หรืออื่น ๆ อีกมากมายwal_level = replica
max_wal_senders > 0
หรือสูงกว่าเพื่อให้สามารถตั้งค่าhost replication postgres DST_IP/32 trust
ในpg_hba.conf
. สิ่งนี้ให้สิทธิ์การเข้าถึงpg
คลัสเตอร์แก่ทุกคนจากDST_IP
เครื่อง คุณอาจต้องการใช้ตัวเลือกที่ปลอดภัยกว่าการเปลี่ยนแปลง 1, 2, 3 ต้องเริ่มต้นเซิร์ฟเวอร์ใหม่เปลี่ยน 4 ต้องรีโหลด
บนเซิร์ฟเวอร์เป้าหมาย:
# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME
เรียกใช้คำสั่งนี้ด้วยชื่อฐานข้อมูลคุณต้องการสำรองข้อมูลเพื่อถ่ายโอนฐานข้อมูล
pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}
eg. pg_dump -U postgres mydbname -f mydbnamedump.sql
ตอนนี้ scp ไฟล์การถ่ายโอนข้อมูลนี้ไปยังเครื่องระยะไกลที่คุณต้องการคัดลอกฐานข้อมูล
eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/
บนเครื่องระยะไกลเรียกใช้คำสั่งต่อไปนี้ใน ~ / some / โฟลเดอร์เพื่อเรียกคืนฐานข้อมูล
psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql}
eg. psql -U postgres -d mynewdb -f mydbnamedump.sql
ฉันพยายามอย่างมากและในที่สุดวิธีที่ทำให้ฉันใช้งานได้กับ Rails 4 คือ:
บนเซิร์ฟเวอร์เก่าของคุณ
sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql
ฉันต้องใช้ผู้ใช้ linux postgres เพื่อสร้างการถ่ายโอนข้อมูล ฉันต้องใช้ -c เพื่อบังคับให้สร้างฐานข้อมูลบนเซิร์ฟเวอร์ใหม่ - แทรกบอกให้ใช้ INSERT () ไวยากรณ์ซึ่งมิฉะนั้นจะไม่ทำงานสำหรับฉัน :(
จากนั้นบนเซิร์ฟเวอร์ใหม่ให้ simpy:
sudo su - postgres
psql new_database_name < dump.sql
เพื่อถ่ายโอนไฟล์ dump.sql ระหว่างเซิร์ฟเวอร์ฉันใช้ "cat" เพื่อพิมพ์เนื้อหาและไม่ใช่ "nano" เพื่อสร้างมันซ้ำเพื่อคัดลอกเนื้อหา
นอกจากนี้บทบาทที่ฉันใช้บนฐานข้อมูลทั้งสองนั้นแตกต่างกันดังนั้นฉันจึงต้องค้นหา - แทนที่ชื่อเจ้าของทั้งหมดในดัมพ์
ทิ้งฐานข้อมูลของคุณ: pg_dump database_name_name > backup.sql
นำเข้าฐานข้อมูลของคุณกลับมา: psql db_name < backup.sql
ให้ฉันแบ่งปัน Linux shell script เพื่อคัดลอกข้อมูลตารางของคุณจากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์ PostgreSQL อื่น
Linux Bash Shell Script สำหรับการย้ายข้อมูลระหว่างเซิร์ฟเวอร์ 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"
ฉันแค่ย้ายข้อมูล; โปรดสร้างตารางว่างที่เซิร์ฟเวอร์ฐานข้อมูลปลายทาง / วินาทีของคุณ
นี่คือสคริปต์ยูทิลิตี้ นอกจากนี้คุณสามารถแก้ไขสคริปต์สำหรับการใช้งานทั่วไปเช่นโดยการเพิ่มพารามิเตอร์สำหรับ host_name, database_name, table_name และอื่น ๆ
คำตอบที่ยอมรับนั้นถูกต้อง แต่ถ้าคุณต้องการหลีกเลี่ยงการป้อนรหัสผ่านแบบโต้ตอบคุณสามารถใช้สิ่งนี้:
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}}