กู้คืนไฟล์สำรองข้อมูล postgres โดยใช้บรรทัดคำสั่งหรือไม่


294

ฉันใหม่สำหรับ postgresql และในพื้นที่ฉันใช้ pgadmin3 บนเซิร์ฟเวอร์ระยะไกลอย่างไรก็ตามฉันไม่มีความหรูหราเช่นนั้น

ฉันได้สร้างการสำรองข้อมูลของฐานข้อมูลและคัดลอกไปแล้ว แต่มีวิธีกู้คืนการสำรองข้อมูลจากบรรทัดคำสั่งหรือไม่ ฉันเห็นสิ่งต่าง ๆ ที่เกี่ยวข้องกับ GUI หรือเพื่อ pg_dumps เท่านั้นดังนั้นหากใครบางคนบอกฉันได้ว่าจะทำยังไงดีนั่นยอดเยี่ยมมาก!

คำตอบ:


366

มีเครื่องมือสองชนิดที่ต้องดูขึ้นอยู่กับวิธีที่คุณสร้างไฟล์ดัมพ์

แหล่งอ้างอิงแรกของคุณควรเป็น man page pg_dump(1)เนื่องจากเป็นสิ่งที่สร้างดัมพ์เอง มันบอกว่า:

ดัมพ์สามารถส่งออกในรูปแบบสคริปต์หรือไฟล์เก็บถาวร การทิ้งสคริปต์เป็นไฟล์ข้อความธรรมดาที่มีคำสั่ง SQL ที่จำเป็นในการสร้างฐานข้อมูลให้กลับสู่สถานะที่เป็นอยู่ในเวลาที่ถูกบันทึกไว้ หากต้องการกู้คืนจากสคริปต์ดังกล่าวให้ป้อนไปยัง psql (1) ไฟล์สคริปต์สามารถใช้สร้างฐานข้อมูลได้แม้กระทั่งบนเครื่องอื่นและสถาปัตยกรรมอื่น ๆ ด้วยการแก้ไขบางอย่างแม้ในผลิตภัณฑ์ฐานข้อมูล SQL อื่น ๆ

รูปแบบไฟล์เก็บถาวรทางเลือกต้องใช้กับ pg_restore (1) เพื่อสร้างฐานข้อมูลใหม่ อนุญาตให้ pg_restore เลือกเกี่ยวกับสิ่งที่ถูกกู้คืนหรือแม้แต่จัดลำดับรายการก่อนที่จะถูกกู้คืน รูปแบบไฟล์เก็บถาวรได้รับการออกแบบให้พกพาข้ามสถาปัตยกรรมได้

ดังนั้นขึ้นอยู่กับวิธีที่มันถูกทิ้ง คุณสามารถหาfile(1)คำสั่งได้โดยใช้คำสั่งที่ดีเยี่ยม- หากกล่าวถึงข้อความ ASCII และ / หรือ SQL ควรเรียกคืนด้วยpsqlมิฉะนั้นคุณควรใช้pg_restore

การกู้คืนนั้นง่ายมาก:

psql -U username -d dbname < filename.sql

-- For Postgres versions 9.0 or earlier
psql -U username -d dbname -1 -f filename.sql

หรือ

pg_restore -U username -d dbname -1 filename.dump

ตรวจสอบ manpages ที่เกี่ยวข้อง - มีตัวเลือกค่อนข้างน้อยที่ส่งผลต่อการทำงานของการกู้คืน คุณอาจต้องล้างฐานข้อมูล "สด" หรือสร้างใหม่จากแม่แบบ 0 (ดังที่ระบุไว้ในความคิดเห็น) ก่อนที่จะกู้คืนทั้งนี้ขึ้นอยู่กับวิธีการสร้างการถ่ายโอนข้อมูล


3
IME คุณต้องการกู้คืนสู่ฐานข้อมูลที่สร้างขึ้นใหม่จาก template0 เสมอ มิฉะนั้นหากคุณทำอะไรบางอย่างเช่นการเปิดใช้งาน plpgsql ใน template1 กระบวนการคืนค่าจะพยายามทำอีกครั้งและสวิตช์ -1 ที่คุณแนะนำหมายความว่าธุรกรรมทั้งหมดจะล้มเหลว ดังนั้นบางอย่างเช่น "createdb -T template0 seo2" ตามด้วย "pg_restore -v -d seo2 seo.pg" เพื่อกู้คืน seo.pg (ทำจากฐานข้อมูล seo) ลงในฐานข้อมูล seo2 ใหม่ หากไฟล์สำรองของคุณเป็นเพียงไฟล์. sql คุณสามารถตัดบิตที่ขัดแย้งกันออกด้วยมือ
araqnid

61
คุณไม่สามารถ-dและ-fในเวลาเดียวกัน pg_restore: options -d/--dbname and -f/--file cannot be used together
CppLearner

8
ในเวอร์ชั่น 9.2 ตัวเลือก "-f" ระบุไฟล์เอาต์พุตไม่ใช่ไฟล์ดัมพ์ (และอาจหมายถึงไฟล์เดียวกันในเวอร์ชันก่อนหน้า)
David Resnick

4
เกี่ยวกับcannot be used togetherดูที่นี่: stackoverflow.com/questions/27882070/…
Abdull

3
@ Alex78191 หมายความว่าดำเนินการเป็นธุรกรรมเดียวซึ่งอาจล้มเหลวอย่างสมบูรณ์และย้อนกลับหรือทำผ่าน มันจะบล็อกการเข้าถึงฐานข้อมูลด้วย
ATN

216

สร้างการสำรองข้อมูล

pg_dump -h localhost -p 5432 -U postgres -F c -b -v -f 
"/usr/local/backup/10.70.0.61.backup" old_db

-F c เป็นรูปแบบที่กำหนดเอง (บีบอัดและสามารถทำควบคู่กับ -j N) -b รวมถึง blobs, -v เป็น verbose, -f เป็นชื่อไฟล์สำรอง

เรียกคืนจากการสำรองข้อมูล

pg_restore -h localhost -p 5432 -U postgres -d old_db -v 
"/usr/local/backup/10.70.0.61.backup"

สิ่งสำคัญในการตั้งค่า-h localhost - ตัวเลือก


2
ฉันต้องการพูดถึงว่าก่อนที่คุณจะดำเนินการคำสั่งเหล่านี้คุณควรจะอยู่ในโฟลเดอร์Posgresql bin ตัวอย่างเช่นใน Windows (หากคุณติดตั้งไว้ในโฟลเดอร์เริ่มต้น) จะเป็นC: \ Program Files \ PostgreSQL \ 9.6 \ bin
juan_carlos_yl

90

คุณอาจต้องเข้าสู่ระบบpostgresเพื่อให้มีสิทธิ์แบบเต็มในฐานข้อมูล

su - postgres
psql -l                      # will list all databases on Postgres cluster

pg_dump / pg_restore

  pg_dump -U username -f backup.dump database_name -Fc 

switch -Fระบุรูปแบบของไฟล์สำรอง:

  • c จะใช้รูปแบบ PostgreSQL ที่กำหนดเองซึ่งถูกบีบอัดและให้ขนาดไฟล์สำรองที่เล็กที่สุด
  • d สำหรับไดเรกทอรีที่แต่ละไฟล์เป็นหนึ่งตาราง
  • t สำหรับการเก็บถาวร TAR (ใหญ่กว่ารูปแบบที่กำหนดเอง)
  • -h/ --hostระบุชื่อโฮสต์ของเครื่องที่เซิร์ฟเวอร์กำลังทำงาน
  • -W/ --passwordบังคับpg_dumpให้ใส่รหัสผ่านก่อนเชื่อมต่อกับฐานข้อมูล

คืนค่าการสำรองข้อมูล:

   pg_restore -d database_name -U username -C backup.dump

พารามิเตอร์-Cควรสร้างฐานข้อมูลก่อนนำเข้าข้อมูล ถ้ามันไม่ทำงานคุณสามารถสร้างฐานข้อมูลเช่น ด้วยคำสั่ง (ในฐานะผู้ใช้postgresหรือบัญชีอื่น ๆ ที่มีสิทธิ์ในการสร้างฐานข้อมูล)createdb db_name -O owner

pg_dump / psql

ในกรณีที่คุณไม่ได้ระบุอาร์กิวเมนต์-Fรูปแบบ SQL แบบข้อความธรรมดาที่ใช้เป็นค่าเริ่มต้น (หรือด้วย-F p) pg_restoreแล้วคุณจะไม่สามารถใช้ psqlคุณสามารถนำเข้าข้อมูลด้วย

สำรอง:

pg_dump -U username -f backup.sql database_name

เรียกคืน:

psql -d database_name -f backup.sql

ฉันใช้คำสั่ง "psql -d database_name -f backup.sql" เพื่อกู้คืนฐานข้อมูลที่ฉันทิ้งจาก dokku บน DigitalOcean ใช้งานได้ดีมาก
NineBlindEyes

1
ในขณะที่ใช้ psql หากผู้ใช้ของคุณ (เช่นเช่นpostgres) มีการตั้งรหัสผ่าน-Wตัวเลือกที่ควรใช้ สำหรับเช่นใน Ubuntu โดยไม่ต้องทำsu postgresที่ใดก็ได้จากเทอร์มินัล$ psql -h localhost -U postgres -W -d DB_NAME < DB_BACKUP.sqlเป็นคำสั่งที่ใช้งานได้สำหรับฉันในการกู้คืนข้อมูลสำรองใน localhost โปรดทราบว่า-hจำเป็นต้องใช้ตัวเลือก
Jignesh Gohel

@JiggneshhGohel เป็นคู่มือกล่าวว่า: -Wตัวเลือกไม่จำเป็น pg_dumpจะถามรหัสผ่านโดยอัตโนมัติหากเซิร์ฟเวอร์ต้องการการตรวจสอบรหัสผ่าน นอกจากนี้คุณสามารถใช้PGPASSWORDตัวแปร env หากคุณใช้รหัสผ่านแบบข้อความธรรมดา -hเป็นสิ่งจำเป็นหากค่าเริ่มต้นPGHOSTไม่สามารถใช้ได้ ตัวเลือกเหล่านี้เป็นเรื่องปกติสำหรับอุปกรณ์ PostgreSQL จำนวนมากดังนั้นจึงไม่จำเป็นต้องตอบคำถามนี้ (ขึ้นอยู่กับการตั้งค่าของคุณ)
Tombart

@ เริ่มส่วนตัวเลือกที่ 2 ของคุณใช้pg_dump/psqlงานได้สำหรับฉัน แต่ส่วนที่ 1 pg_dump/pg_restoreไม่ได้ผลสำหรับฉันสำหรับการกู้คืน ขอบคุณ.
Anjan Biswas

@AnjanBiswas ตัวเลือกแรกคือการใช้ไฟล์บีบอัดที่เก็บถาวรซึ่งจะต้องใช้ CPU เพิ่มเติม แต่ไฟล์สำรองจะใช้พื้นที่บนดิสก์น้อยลง คุณเพียงแค่ต้องเลือกการบีบอัดที่เหมาะสมเช่น-Fc
Tombart

60

POSTGRESQL 9.1.12

การถ่ายโอนข้อมูล:

pg_dump -U user db_name > archive_name.sql

ใส่รหัสผ่านของผู้ใช้และกด Enter

เรียกคืน:

psql -U user db_name < /directory/archive.sql

ใส่รหัสผ่านของผู้ใช้และกด Enter


31

ด้านล่างเป็นรุ่นpg_dumpที่ฉันใช้ในการกู้คืนฐานข้อมูล:

pg_restore -h localhost -p 5432 -U postgres -d my_new_database my_old_database.backup

หรือใช้psql:

psql -h localhost -U postgres -p 5432 my_new_database < my_old_database.backup

โดยที่-hhost, -pพอร์ต, -uชื่อผู้ใช้เข้าสู่ระบบ, -dชื่อของฐานข้อมูล


2
Govind Singh ทำไมคุณถึงแก้ไขคำตอบของฉัน การเปลี่ยนแปลงของคุณนำอะไรใหม่ ..
Yahor M

1
my_new_databaseควรมีอยู่แล้วเมื่อใช้psqlไม่ใช่?
Elmex80s

22

สำรองและกู้คืนด้วย GZIP

สำหรับฐานข้อมูลขนาดใหญ่นี้ดีมาก

การสำรองข้อมูล

pg_dump -U user -d mydb | gzip > mydb.pgsql.gz

ฟื้นฟู

gunzip -c mydb.pgsql.gz | psql dbname -U user

https://www.postgresql.org/docs/9.1/static/backup-dump.html


1
สำหรับ Ubuntu คุณสามารถใช้: gunzip -c mydb.pgsql.gz | sudo -u postgres psqlเพื่อรับสิทธิ์ในการทำงานกับฐานข้อมูล พิจารณาการ--cleanตั้งค่าสถานะเมื่อทิ้งซึ่งจะล้างข้อมูลที่มีอยู่ทั้งหมดอาจมีประโยชน์
เซบาสเตียน

ทำงานได้ดีและเป็นทางออกสำหรับฉัน ขอบคุณ!
Nam G VU



7

1. เปิดเทอร์มินัล

2. สำรองฐานข้อมูลของคุณด้วยคำสั่งดังต่อไปนี้

ถังขยะของคุณ - /opt/PostgreSQL/9.1/bin/

เซิร์ฟเวอร์ฐานข้อมูลต้นทางของคุณ - 192.168.1.111

ตำแหน่งและชื่อไฟล์สำรองของคุณ - /home/dinesh/db/mydb.backup

ชื่อ db แหล่งที่มาของคุณ - mydatabase

/opt/PostgreSQL/9.1/bin/pg_dump - โฮสต์ '192.168.1.111' - พอร์ต 5432 - ชื่อผู้ใช้ "postgres" - ไม่มีรหัสผ่าน - รูปแบบที่กำหนดเอง - Blobs --file "/ home / dinesh / db /mydb.backup "" mydatabase "

3. กู้คืนไฟล์ mydb.backup ไปยังปลายทาง

เซิร์ฟเวอร์ปลายทางของคุณ - localhost

ชื่อฐานข้อมูลปลายทางของคุณ - mydatabase

สร้างฐานข้อมูลเพื่อคืนค่าการสำรองข้อมูล

/opt/PostgreSQL/9.1/bin/psql -h 'localhost' -p 5432 -U postgres -c "สร้างฐานข้อมูล mydatabase"

คืนค่าการสำรองข้อมูล

/opt/PostgreSQL/9.1/bin/pg_restore - โฮสต์ 'localhost' - พอร์ต 5432 - ชื่อผู้ใช้ "postgres" --dbname "mydatabase" - no-password --clean "/ home / dinesh / db / mydb การสำรองข้อมูล"


4

หากคุณสร้างการสำรองข้อมูลโดยใช้ pg_dump คุณสามารถคืนค่าได้อย่างง่ายดายด้วยวิธีต่อไปนี้:

  1. เปิดหน้าต่างบรรทัดคำสั่ง
  2. ไปที่โฟลเดอร์ถังขยะ Postgres ตัวอย่างเช่น: cd "C:\ProgramFiles\PostgreSQL\9.5\bin"
  3. ป้อนคำสั่งเพื่อกู้คืนฐานข้อมูลของคุณ For example: psql.exe -U postgres -d YourDatabase -f D:\Backup\.sql
  4. พิมพ์รหัสผ่านสำหรับผู้ใช้ postgres ของคุณ
  5. ตรวจสอบกระบวนการคืนค่า

4

1) เปิดเทอร์มินัล psql

2) Unzip / untar ไฟล์ดัมพ์

3) สร้างฐานข้อมูลเปล่า

4) ใช้คำสั่งต่อไปนี้เพื่อกู้คืนไฟล์. dump

<database_name>-# \i <path_to_.dump_file>


3

ดังที่ลิงค์ด้านล่างกล่าวว่าคุณสามารถใช้คำสั่ง psql เพื่อกู้คืนไฟล์ดัมพ์:

https://www.postgresql.org/docs/8.1/static/backup.html#BACKUP-DUMP-RESTORE

psql dbname < infile

หากคุณต้องการตั้งชื่อผู้ใช้เพียงเพิ่มชื่อผู้ใช้หลังจากคำสั่งเช่น:

psql dbname < infile username


2

การกู้คืนไฟล์สำรองข้อมูล postgres ขึ้นอยู่กับว่าคุณใช้ข้อมูลสำรองตั้งแต่แรกอย่างไร

หากคุณใช้ pg_dump ด้วย -F c หรือ -F d คุณต้องใช้ pg_restore มิฉะนั้นคุณสามารถใช้

psql -h localhost -p 5432 -U postgres <backupfile

9 วิธีในการสำรองและกู้คืนฐานข้อมูล postgres


คุณรู้หรือไม่ว่าคุณพลาดส่วนของชื่อฐานข้อมูลและมันจะบ่นเกี่ยวกับฐานข้อมูลปลายทางที่ไม่มีอยู่?
Pere


2

ขออภัยสำหรับส่วนที่เหลือ แต่วิธีการเหล่านี้ใช้ไม่ได้กับฉัน ฉันใช้งาน postgres 10. บน Linux:

  1. ฉันต้องเปลี่ยนไดเรกทอรีเป็น pg_hba.conf ของฉัน
  2. ฉันต้องแก้ไขไฟล์เพื่อเปลี่ยนวิธีจาก peer เป็น md5 ตามที่ระบุไว้ที่นี่
  3. เริ่มบริการใหม่: service postgresql-10 restart
  4. เปลี่ยนไดเรกทอรีเป็นตำแหน่ง backup.sql ของฉันและดำเนินการ:
    psql postgres -d database_name -1 -f backup.sql

    -database_name เป็นชื่อของฐานข้อมูลของฉัน

    -backup.sql เป็นชื่อของไฟล์สำรองข้อมูล. sql ของฉัน


1

ฉันมีปัญหาการรับรองความถูกต้องใช้ pg_dump ดังนั้นฉันย้ายไฟล์การถ่ายโอนข้อมูลของฉัน

mv database_dump /tmp

ลงในไดเรกทอรีชั่วคราวแล้วเรียกใช้

su -u postgres
cd /tmp
pg_restore database_dump

หากคุณมีดัมพ์ฐานข้อมูลขนาดใหญ่คุณอาจต้องการสร้างไดเร็กทอรีอื่นที่ผู้ใช้ปัจจุบันของคุณและผู้ใช้ postgres สามารถเข้าถึงและวางไฟล์ดัมพ์ฐานข้อมูลลงในนั้น


1

หากคุณมีไฟล์ SQL สำรองข้อมูลคุณสามารถกู้คืนได้อย่างง่ายดาย เพียงทำตามคำแนะนำตามที่ระบุด้านล่าง

1. At first, create a database using pgAdmin or whatever you want (for example my_db is our created db name)
2. Now Open command line window
3. Go to Postgres bin folder. For example:  cd "C:\ProgramFiles\PostgreSQL\pg10\bin"
4. Enter the following command to restore your database: psql.exe -U postgres -d my_db -f D:\Backup\backup_file_name.sql 

พิมพ์รหัสผ่านสำหรับผู้ใช้ postgres ของคุณหากจำเป็นและให้ Postgres ทำงาน จากนั้นคุณสามารถตรวจสอบกระบวนการกู้คืน


0

หากคุณต้องการสำรองข้อมูลหรือกู้คืนข้อมูลจากข้อมูลสำรองคุณสามารถเรียกใช้คำสั่งต่อไปนี้:

  1. หากต้องการสร้างข้อมูลสำรองให้ไปที่ไดเรกทอรี postgres \ bin \ เช่นC:\programfiles\postgres\10\bin\จากนั้นพิมพ์คำสั่งต่อไปนี้:

    pg_dump -FC -U ngb -d ngb -p 5432 >C:\BACK_UP\ngb.090718_after_readUpload.backup
  2. หากต้องการกู้คืนข้อมูลจากข้อมูลสำรองให้ไปที่ไดเรกทอรี postgres \ bin \ เช่นC:\programfiles\postgres\10\bin\จากนั้นพิมพ์คำสั่งด้านล่าง:

    C:\programFiles\postgres\10\bin> pg_restore -Fc -U ngb -d ngb -p 5432 <C:\ngb.130918.backup

    โปรดตรวจสอบให้แน่ใจว่ามีไฟล์สำรองอยู่


-3

ดูตัวอย่างด้านล่างการทำงาน

C: / ไฟล์โปรแกรม / PostgreSQL / 9.4 / bin \ pg_restore.exe - โฮสต์ในพื้นที่ - พอร์ต 5432 - ชื่อผู้ใช้ "postgres" - ชื่อฐานข้อมูล "ใหม่" - ไม่มีรหัสผ่าน - verbose

" C: \ Users \ Yogesh \ Downloads \ new Download \ DB.backup "

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.