Xuất và nhập cơ sở dữ liệu PostgreSQL có tên khác?


39

Có cách nào để xuất cơ sở dữ liệu PostgreQuery và sau đó nhập nó với tên khác không?

Tôi đang sử dụng PostgreSQL với Rails và tôi thường xuất dữ liệu từ sản xuất, trong đó cơ sở dữ liệu được gọi là blah_production và nhập nó vào phát triển hoặc dàn dựng với tên blah_development và blah_staging. Trên MySQL, điều này là không quan trọng vì xuất khẩu không có cơ sở dữ liệu ở bất cứ đâu (ngoại trừ một nhận xét có thể), nhưng trên PostgreQuery thì dường như là không thể. Nó là bất khả thi?

Tôi hiện đang bán phá giá cơ sở dữ liệu theo cách này:

pg_dump blah > blah.dump

Tôi không sử dụng các tùy chọn -c hoặc -C. Bãi chứa đó chứa các câu lệnh như:

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

Khi tôi cố gắng nhập với

psql blah_devel < blah.dump

tôi có

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

Có lẽ vấn đề không thực sự là cơ sở dữ liệu mà là vai trò?

Nếu tôi đổ nó theo cách này:

pg_dump --format=c blah > blah.dump

và cố gắng nhập nó theo cách này:

pg_restore -d blah_devel < tmp/blah.psql

Tôi nhận được những lỗi này:

pg_restore: WARNING:  database "blah" does not exist
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1513; 1259 16435 TABLE checks blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.checks OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1509; 1259 16409 TABLE users blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1508; 1259 16407 SEQUENCE users_id_seq blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users_id_seq OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1824; 0 0 ACL public postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: REVOKE ALL ON SCHEMA public FROM postgres;
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: GRANT ALL ON SCHEMA public TO postgres;
WARNING: errors ignored on restore: 11

Có ý kiến ​​gì không?

Tôi đã thấy có một số người sử dụng các tập lệnh sed để sửa đổi kết xuất. Tôi muốn tránh giải pháp đó nhưng nếu không có cách nào khác tôi sẽ dùng nó. Có ai đã viết một tập lệnh để thay đổi tên cơ sở dữ liệu của bãi chứa để đảm bảo không có dữ liệu nào bị thay đổi không?

Câu trả lời:


42

Giải pháp đã bán nó như thế này:

pg_dump --no-owner --no-acl blah > blah.psql

và nhập nó như thế này:

psql blah_devel < blah.psql > /dev/null

Tôi vẫn nhận được cảnh báo này:

WARNING:  database "blah" does not exist

nhưng phần còn lại dường như làm việc


2
Bạn là một người bảo vệ cuộc sống :)
Sri Harsha Kappala 16/07/2015

cứu người môi giới :)
Bạn biết ai là

11

Nếu bạn đang tạo kết xuất văn bản, bạn có thể xuất cơ sở dữ liệu mà không cần các CREATE DATABASEbit (nghĩa là không chỉ định -cvà - Ctùy chọn pg_dump); Điều này sẽ ngăn Postgres cố gắng thả, tạo và kết nối với cơ sở dữ liệu.

Nếu bạn đang sử dụng một trong các định dạng lưu trữ, bạn có thể chỉ định -dtùy chọn pg_restoređặt tên cho cơ sở dữ liệu bạn muốn khôi phục.

Kiểm tra các trang người đàn ông cho pg_dumppg_restorecho biết thêm chi tiết, và đừng quên gắn một con khỉ đầu trước khi bạn cố gắng này trên hệ thống sản xuất trong trường hợp tôi bỏ qua một số chi tiết quan trọng.


Cảm ơn bạn. Tôi sẽ thử -da với pg_restore, nhưng hiện tại tôi đang bỏ nó dưới dạng văn bản và trong pg_dump tôi không chỉ định -c hay -C. Tôi chỉ đang gọi tên dữ liệu pg_dump. Tui bỏ lỡ điều gì vậy?
Pupeno

không có tùy chọn nào pg_dumpsẽ tạo kết xuất mà bạn khôi phục vào bất kỳ cơ sở dữ liệu nào mà bạn đã kết nối (đã được một thời gian kể từ khi tôi thực hiện kết xuất văn bản & khôi phục vào một DB khác, nhưng nếu không có CREATE& \connectbit thì SQL kết xuất văn bản được thực thi mọi lúc mọi nơi khi bạn \ichuyển tập tin kết xuất.
voretaq7

pg_dump trong chế độ văn bản hoặc nhị phân, theo mặc định, có hàng tấn đề cập đến tên cơ sở dữ liệu.
Pupeno

6

Bây giờ pg_restore có tùy chọn -d và bạn có thể đặt tên cơ sở dữ liệu để nhập dữ liệu.

trên nguồn :

pg_dump -v -Fc mydb.dmp mydb

về số phận :

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp


3
Cú pháp này hoạt động với tôi: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5).
Paolo
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.