Khôi phục tập tin sao lưu postgres bằng dòng lệnh?


294

Tôi mới sử dụng postgresql và tại địa phương, tôi sử dụng pgadmin3. Trên máy chủ từ xa, tuy nhiên, tôi không có sự sang trọng như vậy.

Tôi đã tạo bản sao lưu của cơ sở dữ liệu và sao chép nó, nhưng, có cách nào để khôi phục bản sao lưu từ dòng lệnh không? Tôi chỉ thấy những thứ liên quan đến GUI hoặc pg_dumps, vì vậy, nếu ai đó có thể cho tôi biết cách thực hiện điều này, điều đó thật tuyệt vời!

Câu trả lời:


365

Có hai công cụ để xem xét, tùy thuộc vào cách bạn tạo tệp kết xuất.

Nguồn tham khảo đầu tiên của bạn phải là trang man pg_dump(1)vì đó là thứ tạo ra bãi rác. Nó nói rằng:

Các bãi chứa có thể là đầu ra trong tập lệnh hoặc lưu trữ định dạng tập tin. Các đoạn mã script là các tệp văn bản thuần có chứa các lệnh SQL cần thiết để xây dựng lại cơ sở dữ liệu về trạng thái của nó tại thời điểm nó được lưu. Để khôi phục từ một tập lệnh như vậy, hãy đưa nó vào psql (1). Các tập tin script có thể được sử dụng để xây dựng lại cơ sở dữ liệu ngay cả trên các máy khác và các kiến ​​trúc khác; với một số sửa đổi ngay cả trên các sản phẩm cơ sở dữ liệu SQL khác.

Các định dạng tệp lưu trữ thay thế phải được sử dụng với pg_restore (1) để xây dựng lại cơ sở dữ liệu. Chúng cho phép pg_restore được chọn lọc về những gì được khôi phục hoặc thậm chí sắp xếp lại các mục trước khi được khôi phục. Các định dạng tệp lưu trữ được thiết kế để có thể di động trên các kiến ​​trúc.

Vì vậy, phụ thuộc vào cách nó được đổ ra. Bạn có thể có thể tìm ra nó bằng cách sử dụng file(1)lệnh xuất sắc - nếu nó đề cập đến văn bản ASCII và / hoặc SQL, thì nó sẽ được khôi phục psqlnếu không bạn có thể nên sử dụngpg_restore

Khôi phục khá dễ dàng:

psql -U username -d dbname < filename.sql

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

hoặc là

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

Kiểm tra các trang tương ứng của họ - có khá nhiều tùy chọn ảnh hưởng đến cách khôi phục hoạt động. Bạn có thể phải dọn sạch cơ sở dữ liệu "trực tiếp" của mình hoặc tạo lại chúng từ template0 (như được chỉ ra trong một nhận xét) trước khi khôi phục, tùy thuộc vào cách tạo ra các bãi chứa.


3
IME bạn thực tế luôn muốn khôi phục vào cơ sở dữ liệu đã được tạo mới từ template0. Mặt khác, nếu bạn đã thực hiện một số thứ như kích hoạt plpgsql trong template1, quá trình khôi phục sẽ cố gắng thực hiện lại và chuyển đổi -1 mà bạn đề xuất có nghĩa là toàn bộ giao dịch sẽ thất bại. Vì vậy, một cái gì đó như "createdb -T template0 seo2" theo sau là "pg_restore -v -d seo2 seo.pg" để khôi phục seo.pg (được tạo từ cơ sở dữ liệu seo) vào cơ sở dữ liệu seo2 mới. Nếu tệp sao lưu của bạn chỉ là tệp .sql, bạn có thể cắt các bit xung đột của nó bằng tay.
araqnid

61
Bạn không thể có -d-fcùng một lúc. pg_restore: options -d/--dbname and -f/--file cannot be used together
CppLearner

8
Trong phiên bản 9.2, tùy chọn "-f" chỉ định tệp đầu ra, không phải tệp kết xuất (và có thể có nghĩa tương tự trong các phiên bản trước).
David Resnick

4
Về cannot be used together, xem tại đây: stackoverflow.com/questions/27882070/
Kẻ

3
@ Alex78191 có nghĩa là nó thực hiện như một giao dịch đơn lẻ, có thể hoàn toàn thất bại và quay trở lại, hoặc trải qua. Nó cũng sẽ chặn một số quyền truy cập vào cơ sở dữ liệu.
ATN

216

Tạo bản sao

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 là định dạng tùy chỉnh (được nén và có thể thực hiện song song với -j N) -b bao gồm các đốm màu, -v là verbose, -f là tên tệp sao lưu

khôi phục lại từ bản sao lưu

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

quan trọng để thiết lập -h localhost - tùy chọn


2
Tôi muốn đề cập rằng trước khi bạn thực thi các lệnh này, bạn nên nằm trong thư mục bin Posgresql . Ví dụ: trong Windows (nếu bạn đã cài đặt nó trong thư mục mặc định) thì đó sẽ là C: \ Program Files \
PostgreQuery

90

Bạn có thể cần phải đăng nhập postgresđể có đầy đủ đặc quyền trên cơ sở dữ liệu.

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 

chuyển đổi -Fchỉ định định dạng của tập tin sao lưu:

  • c sẽ sử dụng định dạng PostgreSQL tùy chỉnh được nén và dẫn đến kích thước tệp sao lưu nhỏ nhất
  • d cho thư mục trong đó mỗi tệp là một bảng
  • t cho lưu trữ TAR (lớn hơn định dạng tùy chỉnh)
  • -h/ --hostChỉ định tên máy chủ của máy mà máy chủ đang chạy
  • -W/ --passwordBuộc pg_dumpnhắc mật khẩu trước khi kết nối với cơ sở dữ liệu

khôi phục lại bản sao lưu:

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

Tham số -Cnên tạo cơ sở dữ liệu trước khi nhập dữ liệu. Nếu nó không hoạt động, bạn luôn có thể tạo cơ sở dữ liệu, vd. bằng lệnh (với tư cách là người dùng postgreshoặc tài khoản khác có quyền tạo cơ sở dữ liệu)createdb db_name -O owner

pg_dump / psql

Trong trường hợp bạn không chỉ -Fđịnh định dạng SQL văn bản đơn giản mặc định đã được sử dụng (hoặc với -F p). Sau đó, bạn không thể sử dụng pg_restore. Bạn có thể nhập dữ liệu với psql.

sao lưu:

pg_dump -U username -f backup.sql database_name

khôi phục:

psql -d database_name -f backup.sql

Tôi đã sử dụng lệnh "psql -d database_name -f backup.sql" để khôi phục cơ sở dữ liệu mà tôi đã kết xuất từ ​​dokku trên DigitalOcean. Làm việc tuyệt vời.
NineBlindEyes

1
trong khi sử dụng psql nếu người dùng của bạn (ví dụ postgres) có mật khẩu được đặt thì -Wnên sử dụng tùy chọn. Ví dụ như trên Ubuntu mà không thực hiện su postgresbất cứ nơi nào từ thiết bị đầu cuối $ psql -h localhost -U postgres -W -d DB_NAME < DB_BACKUP.sqllà lệnh giúp tôi khôi phục lại bản sao lưu trên localhost của mình. Lưu ý rằng -htùy chọn là cần thiết.
Jignesh Gohel

@JiggneshhGohel Như hướng dẫn nói: -Wtùy chọn là không bao giờ cần thiết. pg_dumpsẽ tự động nhắc nhập mật khẩu nếu máy chủ yêu cầu xác thực mật khẩu. Ngoài ra, bạn có thể sử dụng PGPASSWORDbiến env, nếu bạn đang sử dụng mật khẩu văn bản thuần túy. -hlà cần thiết nếu mặc định PGHOSTkhông được áp dụng. Các tùy chọn này là phổ biến cho nhiều tiện ích PostgreSQL, do đó không cần thiết để trả lời câu hỏi này (nó phụ thuộc nhiều vào thiết lập của bạn).
Tombart

@Tombart pg_dump/psqlphần tùy chọn thứ 2 của bạn là công việc cho tôi. nhưng phần 1 pg_dump/pg_restorekhông hoạt động để tôi khôi phục. Cảm ơn bạn.
Anjan Biswas

@AnjanBiswas Tùy chọn đầu tiên là sử dụng kho lưu trữ nén, sẽ cần nhiều CPU hơn nhưng tệp sao lưu sẽ chiếm ít không gian trên đĩa. Bạn chỉ cần chọn ví dụ như nén thích hợp-Fc
Tombart

60

POSTGRESQL 9.1.12

DUMP:

pg_dump -U user db_name > archive_name.sql

đặt mật khẩu người dùng và nhấn enter.

NHÀ HÀNG:

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

đặt mật khẩu người dùng và nhấn enter.


31

Dưới đây là phiên bản pg_dumpmà tôi sử dụng để khôi phục cơ sở dữ liệu:

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

hoặc sử dụng psql:

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

nơi -hlưu trữ, -pcổng, -utên đăng nhập, -dtên của cơ sở dữ liệu


2
Govind Singh, tại sao bạn chỉnh sửa câu trả lời của tôi? những thay đổi của bạn không mang lại điều gì mới ..
Yahor M

1
my_new_databaseCó nên tồn tại khi sử dụng psql, không?
Elmex80s

22

Sao lưu và khôi phục với GZIP

Đối với cơ sở dữ liệu kích thước lớn hơn, điều này là rất tốt

sao lưu

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

khôi phục

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

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


1
Đối với Ubuntu, bạn có thể sử dụng: gunzip -c mydb.pgsql.gz | sudo -u postgres psqlĐể có quyền hoạt động trên cơ sở dữ liệu. Cũng xem xét --cleancờ khi đổ, sẽ xóa tất cả dữ liệu hiện có, có thể có ích.
Sebastian

Giải pháp tuyệt vời và gọn gàng cho tôi. Cảm ơn bạn!
Nam G VU

11
Backup:  $ pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}

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

8

Điều này làm việc cho tôi:

pg_restore --verbose --clean --no-acl --no-owner --host=localhost --dbname=db_name --username=username latest.dump

Cảm ơn, --no-ownerthực sự đã giúp tôi.
bonafernando

7

1. mở thiết bị đầu cuối.

2. sao lưu cơ sở dữ liệu của bạn với lệnh sau

thùng thư của bạn - /opt/PostgreSQL/9.1/bin/

máy chủ cơ sở dữ liệu nguồn của bạn - 192.168.1.111

tên và vị trí tệp sao lưu của bạn - /home/dinesh/db/mydb.backup

tên db nguồn của bạn - mydatabase

/opt/PostgreSQL/9.1/bin/pg_dump --host '192.168.1.111' --port 5432 - tên người dùng "postgres" --no-password --format tùy chỉnh --blobs --file "/ home / dinesh / db /mydb.backup "" cơ sở dữ liệu của tôi "

3. giữ tập tin mydb.backup vào đích.

máy chủ đích của bạn - localhost

tên cơ sở dữ liệu đích của bạn - mydatabase

tạo cơ sở dữ liệu để khôi phục lại bản sao lưu.

/opt/PostgreSQL/9.1/bin/psql -h 'localhost' -p 5432 -U postgres -c "TẠO cơ sở dữ liệu mydatabase"

khôi phục lại bản sao lưu.

/opt/PostgreSQL/9.1/bin/pg_restore --host 'localhost' --port 5432 - tên người dùng "postgres" --dbname "mydatabase" --no-password --clean "/ home / dinesh / db / mydb. sao lưu"


4

Nếu bạn tạo bản sao lưu bằng pg_dump, bạn có thể dễ dàng khôi phục nó theo cách sau:

  1. Mở cửa sổ dòng lệnh
  2. Chuyển đến thư mục bin Postgres. Ví dụ: cd "C:\ProgramFiles\PostgreSQL\9.5\bin"
  3. Nhập lệnh để khôi phục cơ sở dữ liệu của bạn. For example: psql.exe -U postgres -d YourDatabase -f D:\Backup\.sql
  4. Nhập mật khẩu cho người dùng postgres của bạn
  5. Kiểm tra quá trình khôi phục

4

1) Mở thiết bị đầu cuối psql.

2) Giải nén / giải nén tệp kết xuất.

3) Tạo một cơ sở dữ liệu trống.

4) sử dụng lệnh sau để khôi phục tệp .dump

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

4

thử cái này:

psql -U <username> -d <dbname> -f <filename>.sql

Khôi phục DB psql từ tệp .sql


psql -U <tên người dùng> -d <dbname> -f <tên tệp> .sql
Faysal Maqsood



2

Khôi phục tệp sao lưu postgres tùy thuộc vào cách bạn đã sao lưu ở vị trí đầu tiên.

Nếu bạn đã sử dụng pg_dump với -F c hoặc -F d, bạn cần sử dụng pg_restore nếu không bạn chỉ có thể sử dụng

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

9 cách để sao lưu và khôi phục cơ sở dữ liệu postgres


Bạn có nhận ra rằng bạn đã bỏ lỡ phần tên cơ sở dữ liệu và nó sẽ phàn nàn về cơ sở dữ liệu đích không tồn tại?
Pere

2

Hãy thử xem các lệnh sau có thể giúp bạn:

sudo su - yourdbuser
psql
\i yourbackupfile

2

Xin lỗi vì sự cần thiết, nhưng những giải pháp này không hiệu quả với tôi. Tôi đang trên postgres 10. Trên Linux:

  1. Tôi đã phải thay đổi thư mục thành pg_hba.conf của tôi.
  2. Tôi đã phải chỉnh sửa tập tin để thay đổi phương thức từ ngang hàng sang md5 như đã nêu ở đây
  3. Khởi động lại dịch vụ: service postgresql-10 restart
  4. Thay đổi thư mục thành nơi backup.sql của tôi được đặt và thực thi:
    psql postgres -d database_name -1 -f backup.sql

    -database_name là tên cơ sở dữ liệu của tôi

    -backup.sql là tên của tệp sao lưu .sql của tôi.


1

Tôi gặp vấn đề về xác thực khi chạy pg_dump, vì vậy tôi đã di chuyển tệp kết xuất của mình

mv database_dump /tmp

vào thư mục tạm thời và sau đó chạy

su -u postgres
cd /tmp
pg_restore database_dump

Nếu bạn có một kết xuất cơ sở dữ liệu lớn, bạn có thể chỉ muốn tạo một thư mục khác nơi người dùng hiện tại của bạn và người dùng postgres có thể truy cập và đặt tệp kết xuất cơ sở dữ liệu vào đó.


1

Nếu bạn có một tệp SQL sao lưu thì bạn có thể dễ dàng Khôi phục nó. Chỉ cần làm theo các hướng dẫn, được đưa ra dưới đây

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 

Nhập mật khẩu cho người dùng postgres của bạn nếu cần và để Postgres thực hiện công việc của mình. Sau đó, bạn có thể kiểm tra quá trình khôi phục.


0

Nếu bạn muốn sao lưu dữ liệu hoặc khôi phục dữ liệu từ bản sao lưu, bạn có thể chạy các lệnh sau:

  1. Để tạo bản sao lưu dữ liệu của bạn, hãy chuyển đến thư mục postgres \ bin \ của bạn C:\programfiles\postgres\10\bin\và sau đó nhập lệnh sau:

    pg_dump -FC -U ngb -d ngb -p 5432 >C:\BACK_UP\ngb.090718_after_readUpload.backup
  2. Để khôi phục dữ liệu từ bản sao lưu, hãy chuyển đến thư mục postgres \ bin \ của bạn C:\programfiles\postgres\10\bin\và sau đó nhập lệnh dưới đây:

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

    Hãy chắc chắn rằng tập tin sao lưu tồn tại.


-3

Xem bên dưới ví dụ hoạt động của nó

C: / Tệp chương trình / PostgreSQL / 9.4 / bin \ pg_restore.exe --host localhost --port 5432 - tên người dùng "postgres" --dbname "newDatabase" --no-password --verbose

" C: \ Users \ Yogesh \ Tải xuống \ Tải xuống mới \ DB.backup "

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.