ฉันจะส่งออกสคีมาของฐานข้อมูลใน PostgreSQL ได้อย่างไร


112

คอมพิวเตอร์ของฉันพัง แต่โชคดีที่ฉันสำรองโฟลเดอร์ C: \ Program Files \ PostgreSQL

ตอนนี้ฉันทำงานในคอมพิวเตอร์เครื่องใหม่และต้องการนำเข้าฐานข้อมูล Postgres ก่อนหน้านี้ที่เก็บไว้ในดิสก์ภายนอก

ฉันต้องการส่งออกสคีมาของฐานข้อมูลเฉพาะที่อยู่ในโฟลเดอร์สำรอง

ไฟล์PostgreSQL\8.3\data\global\pg_databaseนี้มีข้อมูลเกี่ยวกับฐานข้อมูลและ OIDs ตัวอย่างเช่น:

"db1" 20012
"db2" 23456

ฉันต้องการส่งออกสคีมาของ "db1"

มีโฟลเดอร์ชื่อ "20012" ในโฟลเดอร์"PostgreSQL\8.3\data\base\20012" ที่มีไฟล์จำนวนมาก [500 ไฟล์]

มีวิธีใดบ้างในการส่งออกสคีมาของฐานข้อมูลนั้น?

โปรดทราบว่าไฟล์ฐานข้อมูล Postgresql ทั้งหมดอยู่ในฮาร์ดดิสก์ภายนอกและฉันต้องการส่งออกสคีมาของฐานข้อมูลนั้นในไฟล์ SQL ใช้ไฟล์นั้นเรียกใช้และสร้างฐานข้อมูลเดียวกันในเครื่อง

คำตอบ:


142

คุณควรดูที่pg_dump:

pg_dump -s databasename

จะดัมพ์เฉพาะสคีมาเพื่อ stdout เป็น. sql

สำหรับ Windows, pg_dump.exeคุณอาจจะต้องการที่จะเรียก ฉันไม่สามารถเข้าถึงเครื่อง Windows ได้ แต่ฉันค่อนข้างมั่นใจจากหน่วยความจำนั่นคือคำสั่ง ดูว่าความช่วยเหลือเหมาะกับคุณหรือไม่


แน่ใจหรือว่า pg_dump ใช้งานได้ สาเหตุที่ไฟล์ของฐานข้อมูลอยู่ในดิสก์ภายนอกไม่ใช่ภายในเครื่อง ...
โปรแกรมเมอร์

หากคุณสามารถเริ่มเซิร์ฟเวอร์ฐานข้อมูลเก่าได้ใช่ pg_dump สามารถเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลจากระยะไกลได้อย่างที่คุณทราบ ฉันจะพยายามติดตั้ง 8.3 ในเครื่องใหม่ของคุณและคัดลอกไฟล์ฐานข้อมูลเก่าของคุณและเริ่ม postgres และดูว่าใช้งานได้หรือไม่ ฉันคิดว่าคุณถามโดยทั่วไปเกี่ยวกับการทิ้งสคีมาเท่านั้นฉันไม่ดี
นิว

ฉันได้ติดตั้ง postgresql เวอร์ชัน 8.3 แล้วคัดลอกโฟลเดอร์ข้อมูลไปยังการติดตั้งใหม่ แต่ฉันไม่เห็นฐานข้อมูลเก่าของฉัน ...
โปรแกรมเมอร์

14
@ ใหม่ขอบคุณมันใช้งานได้ pg_dump -s databasename > schema.sqlจะแสดงผลลัพธ์เป็นschema.sqlไฟล์
Arivarasan L

ประเภทข้อมูลที่กำหนดเองในกรณีนี้เป็นอย่างไร
Nikita

38

ในLinuxคุณสามารถทำได้เช่นนี้

pg_dump -U postgres -s postgres > exportFile.dmp

บางทีมันอาจทำงานในWindows ได้เช่นกันหากไม่ลองใช้pg_dump.exeเช่นเดียวกัน

pg_dump.exe -U postgres -s postgres > exportFile.dmp

pg_dump: [archiver (db)] การเชื่อมต่อกับฐานข้อมูล "goldendemon" ล้มเหลว: หมายเลขพอร์ตไม่ถูกต้อง: "-s"
Jamie Hutber

34

ฉันใช้ Postgres 9.6 ซึ่งฉันต้องส่งออกสคีมาเฉพาะพร้อมกับข้อมูล

ฉันใช้คำสั่งต่อไปนี้:

pg_dump.exe -U username -d databasename -n schemaname > C:\mylocation\mydumpfilename.dmp

หากคุณต้องการเฉพาะสคีมาที่ไม่มีข้อมูลให้ใช้สวิตช์sแทนn

ด้านล่างนี้คือรายการสวิตช์ pg_dump:

C:\Program Files\PostgreSQL\9.6\bin>pg_dump --help
pg_dump dumps a database as a text file or to other formats.

Usage:
  pg_dump [OPTION]... [DBNAME]

General options:
  -f, --file=FILENAME          output file or directory name
  -F, --format=c|d|t|p         output file format (custom, directory, tar,
                               plain text (default))
  -j, --jobs=NUM               use this many parallel jobs to dump
  -v, --verbose                verbose mode
  -V, --version                output version information, then exit
  -Z, --compress=0-9           compression level for compressed formats
  --lock-wait-timeout=TIMEOUT  fail after waiting TIMEOUT for a table lock
  -?, --help                   show this help, then exit

Options controlling the output content:
  -a, --data-only              dump only the data, not the schema
  -b, --blobs                  include large objects in dump
  -c, --clean                  clean (drop) database objects before recreating
  -C, --create                 include commands to create database in dump
  -E, --encoding=ENCODING      dump the data in encoding ENCODING
  -n, --schema=SCHEMA          dump the named schema(s) only
  -N, --exclude-schema=SCHEMA  do NOT dump the named schema(s)
  -o, --oids                   include OIDs in dump
  -O, --no-owner               skip restoration of object ownership in
                               plain-text format
  -s, --schema-only            dump only the schema, no data
  -S, --superuser=NAME         superuser user name to use in plain-text format
  -t, --table=TABLE            dump the named table(s) only
  -T, --exclude-table=TABLE    do NOT dump the named table(s)
  -x, --no-privileges          do not dump privileges (grant/revoke)
  --binary-upgrade             for use by upgrade utilities only
  --column-inserts             dump data as INSERT commands with column names
  --disable-dollar-quoting     disable dollar quoting, use SQL standard quoting
  --disable-triggers           disable triggers during data-only restore
  --enable-row-security        enable row security (dump only content user has
                               access to)
  --exclude-table-data=TABLE   do NOT dump data for the named table(s)
  --if-exists                  use IF EXISTS when dropping objects
  --inserts                    dump data as INSERT commands, rather than COPY
  --no-security-labels         do not dump security label assignments
  --no-synchronized-snapshots  do not use synchronized snapshots in parallel jobs
  --no-tablespaces             do not dump tablespace assignments
  --no-unlogged-table-data     do not dump unlogged table data
  --quote-all-identifiers      quote all identifiers, even if not key words
  --section=SECTION            dump named section (pre-data, data, or post-data)
  --serializable-deferrable    wait until the dump can run without anomalies
  --snapshot=SNAPSHOT          use given snapshot for the dump
  --strict-names               require table and/or schema include patterns to
                               match at least one entity each
  --use-set-session-authorization
                               use SET SESSION AUTHORIZATION commands instead of
                               ALTER OWNER commands to set ownership

Connection options:
  -d, --dbname=DBNAME      database to dump
  -h, --host=HOSTNAME      database server host or socket directory
  -p, --port=PORT          database server port number
  -U, --username=NAME      connect as specified database user
  -w, --no-password        never prompt for password
  -W, --password           force password prompt (should happen automatically)
  --role=ROLENAME          do SET ROLE before dump

If no database name is supplied, then the PGDATABASE environment
variable value is used.

Report bugs to <pgsql-bugs@postgresql.org>.

12
pg_dump -d <databasename> -h <hostname> -p <port> -n <schemaname> -f <location of the dump file>

โปรดสังเกตว่าคุณมีสิทธิ์เพียงพอที่จะเข้าถึงสคีมานั้น หากคุณต้องการสำรองข้อมูลเป็นผู้ใช้เฉพาะให้เพิ่มชื่อผู้ใช้ในคำสั่งที่นำหน้าด้วย-U


1
pg_dump -s <databasename> -h <hostname> -p <port> -n <schemaname> -f <ตำแหน่งของไฟล์ดัมพ์> เปลี่ยนแฟล็กจาก -d เป็น -s เพื่อรับเฉพาะสคีมา นี่เป็นเพียงการปรับปรุง ans ที่คนอื่นพูดถึงเท่านั้น
h0lmes221B

การดำเนินการนี้จะใช้ฐานข้อมูลทั้งหมด: /
Jamie Hutber

7

หากคุณต้องการเพียงสร้างตารางคุณสามารถทำได้ pg_dump -s databasename | awk 'RS="";/CREATE TABLE[^;]*;/'


3

สำหรับLinux: (ไม่รวมข้อมูล)

  • pg_dump -s -t tablename databasename > dump.sql (สำหรับตารางเฉพาะในฐานข้อมูล)

  • pg_dump -s databasename > dump.sql (สำหรับฐานข้อมูลทั้งหมด)


2

ตั้งค่าเซิร์ฟเวอร์ postgresql ใหม่และแทนที่โฟลเดอร์ข้อมูลด้วยไฟล์จากดิสก์ภายนอกของคุณ

จากนั้นคุณจะสามารถเริ่มต้นเซิร์ฟเวอร์ postgresql และดึงข้อมูลโดยใช้ pg_dump (pg_dump -s สำหรับสคีมาเท่านั้นตามที่กล่าวไว้)


ฉันแทนที่โฟลเดอร์ข้อมูลด้วยโฟลเดอร์เก่าจากนั้นฉันก็เริ่มบริการเปิดแอปพลิเคชั่น pgAdmin III คลิกที่ไอคอนเซิร์ฟเวอร์ [ฉันมีเซิร์ฟเวอร์เพียง 1 เครื่องเซิร์ฟเวอร์ก่อนหน้านี้] ฉันจะสร้างเซิร์ฟเวอร์ใหม่ได้ไหม สาเหตุที่ใช้งานไม่ได้ ... ฉันยังเห็นฐานข้อมูลที่ฉันสร้างไว้ตอนแรก ... ไม่ใช่ฐานข้อมูลสำรอง
โปรแกรมเมอร์

แน่ใจหรือว่าคุณเปิดไฟล์ลงในโฟลเดอร์ข้อมูลที่ถูกต้อง? ฉันไม่ได้ใช้ postgresql ใน Windows ดังนั้นฉันจึงไม่แน่ใจว่าโฟลเดอร์ข้อมูลจะอยู่ที่ใด ฉันก็ไม่แน่ใจเหมือนกันว่า pgAdmin แคชอะไรหรือเปล่าดังนั้นคุณอาจต้องเชื่อมต่อใหม่ด้วย ...
drone.ah

ฉันเพิ่งคัดลอกไฟล์ข้อมูลสำรองเก่าใน C: \ Program Files \ PostgreSQL \ 8.3 และฉันแทนที่ด้วยไฟล์ใหม่ นอกจากนี้เมื่อฉันเปิด pgAdmin อีกครั้งมันจะถามรหัสผ่านของคอมพิวเตอร์เครื่องเก่านั่นเป็นสัญญาณที่ดี แต่หลังจากนั้นในโครงสร้างฐานข้อมูลฉันไม่เห็นฐานข้อมูลของฉัน
โปรแกรมเมอร์

หืม ... ฉันสร้างฐานข้อมูลชื่อ "db1" [ฐานข้อมูลจากคอมพิวเตอร์เครื่องเก่า] เมื่อฉันคลิกที่มันผลลัพธ์ของ pgAdmin "มีข้อผิดพลาดเกิดขึ้น: การค้นหาแคช FATAL ล้มเหลวสำหรับฐานข้อมูล 20012" นั่นหมายความว่าอย่างไร
โปรแกรมเมอร์

1
ดูเหมือนว่า pgAdmin จะแคชข้อมูลมากมาย วางการเชื่อมต่อฐานข้อมูลของคุณใน pgAdmin แล้วสร้างใหม่ ที่ควรแก้ไขหากปัญหาอยู่ที่การแคช ...
drone.ah

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