2012-11-06 68 views
4

我有一個轉儲,其中數據和結構位於公共架構中。我想將其恢復爲具有自定義名稱的模式 - 我該怎麼做?如何將公共架構恢復到不同架構

編輯V 2:

我的轉儲文件是從Heroku的,看起來像這樣開頭:

PGDMP 
    ! 
pd6rq1i7f3kcath9.1.59.1.6<Y 
0ENCODINENCODINGSET client_encoding = 'UTF8'; 
falseZ 
00 
STDSTRINGS 
STDSTRINGS)SET standard_conforming_strings = 'off'; 
false[ 
126216385d6rq1i7f3kcatDATABASE?CREATE DATABASE d6rq1i7f3kcath WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8'; 
DROP DATABASE d6rq1i7f3kcath; 
uc0lt9t3fj0da4false26152200publicSCHEMACREATE SCHEMA public; 
DROP SCHEMA public; 
postgresfalse\ 
SCHEMA publicCOMMENT6COMMENT ON SCHEMA public IS 'standard public schema'; 
postgresfalse5?307916392plpgsql EXTENSION?CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; 
DROP EXTENSION plpgsql; 
false] 
00EXTENSION [email protected] ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; 
false212?125516397_final_mode(anyarrayFUNCTION?CREATE FUNCTION _final_mode(anyarray) RETURNS anyelement 
    LANGUAGE sql IMMUTABLE 
    AS $_$ 
     SELECT a 
     FROM unnest($1) a 
     GROUP BY 1 
     ORDER BY COUNT(1) DESC, 1 
     LIMIT 1; 
    $_$; 
,DROP FUNCTION public._final_mode(anyarray); 
publicuc0lt9t3fj0da4false5?125516398mode(anyelement) AGGREGATE?CREATE AGGREGATE mode(anyelement) (
    SFUNC = array_append, 
    STYPE = anyarray, 
    INITCOND = '{}', 
    FINALFUNC = _final_mode 
); 
(DROP AGGREGATE public.mode(anyelement); 
publicuc0lt9t3fj0da4false5224?125916399 advert_candidate_collector_failsTABLECREATE TABLE advert_candidate_collector_fails (
    id integer NOT NULL, 
    advert_candidate_collector_status_id integer, 
    exception_message text, 
    stack_trace text, 
    url text, 
    created_at timestamp without time zone, 
    updated_at timestamp without time zone 
); 
4DROP TABLE public.advert_candidate_collector_fails; 
publicuc0lt9t3fj0da4false5?125916405'advert_candidate_collector_fails_id_seSEQUENCE?CREATE SEQUENCE advert_candidate_collector_fails_id_seq 
    START WITH 1 
    INCREMENT BY 1 
    NO MINVALUE 
    NO MAXVALUE 
    CACHE 1; 
>DROP SEQUENCE public.advert_candidate_collector_fails_id_seq; 
publicuc0lt9t3fj0da4false1615^ 
00'advert_candidate_collector_fails_id_seqSEQUENCE OWNED BYeALTER SEQUENCE advert_candidate_collector_fails_id_seq OWNED BY advert_candidate_collector_fails.id; 
publicuc0lt9t3fj0da4false162_ 
00'advert_candidate_collector_fails_id_seq 
              SEQUENCE SETRSELECT pg_catalog.setval('advert_candidate_collector_fails_id_seq', 13641, true); 
publicuc0lt9t3fj0da4false162?125916407#advert_candidate_collector_statusesTABLE?CREATE TABLE advert_candidate_collector_statuses (
    id integer NOT NULL, 
    data_source_id character varying(120), 
    state character varying(15) DEFAULT 'Queued'::character varying, 
    source_name character varying(30), 
    collector_type character varying(30), 
    started_at timestamp without time zone, 
    ended_at timestamp without time zone, 
    times_failed integer DEFAULT 0, 
    created_at timestamp without time zone, 
    updated_at timestamp without time zone 
); 
7DROP TABLE public.advert_candidate_collector_statuses; 
publicuc0lt9t3fj0da4false240424055?125916412*advert_candidate_collector_statuses_id_seSEQUENCE?CREATE SEQUENCE advert_candidate_collector_statuses_id_seq 
    START WITH 1 
    INCREMENT BY 1 
    NO MINVALUE 
    NO MAXVALUE 
    CACHE 1; 
ADROP SEQUENCE public.advert_candidate_collector_statuses_id_seq; 
publicuc0lt9t3fj0da4false1635` 
00*advert_candidate_collector_statuses_id_seqSEQUENCE OWNED BYkALTER SEQUENCE advert_candidate_collector_statuses_id_seq OWNED BY advert_candidate_collector_statuses.id; 
publicuc0lt9t3fj0da4false164a 
00*advert_candidate_collector_statuses_id_seq 
              SEQUENCE SETVSELECT pg_catalog.setval('advert_candidate_collector_statuses_id_seq', 133212, true); 
publicuc0lt9t3fj0da4false164?125916414advertsTABLE"CREATE TABLE adverts (
    id integer NOT NULL, 
    car_id integer NOT NULL, 
    source_name character varying(20), 
    url text, 
    first_extraction timestamp without time zone, 
    last_observed_at timestamp without time zone, 
    created_at timestamp without time zone, 
    updated_at timestamp without time zone, 
    source_id character varying(255), 
    deactivated_at timestamp without time zone, 
    seller_id integer NOT NULL, 
    data_source_id character varying(100), 
    price integer, 
    availability_state character varying(15) 
); 

ROP TABLE public.adverts; 
publicuc0lt9t3fj0da4false5?125916420adverts_id_seSEQUENCEpCREATE SEQUENCE adverts_id_seq 
    START WITH 1 
    INCREMENT BY 1 
+0

可能重複的[我想用不同的模式恢復數據庫](http://stackoverflow.com/questions/4191653/i-want-to-restore-the-database-with-a-different -schema) –

回答

2

@ Tometzky的解決方案是不完全正確,至少有9.2的pg_dump。它會在新的模式中創建表,但pg_dump架構資格的ALTER TABLE ... OWNER TO報表,因此那些會失敗:

postgres=# CREATE DATABASE demo; 
\cCREATE DATABASE 
postgres=# \c demo 
You are now connected to database "demo" as user "postgres". 
demo=# CREATE TABLE public.test (dummy text); 
CREATE TABLE 
demo=# \d 
     List of relations 
Schema | Name | Type | Owner 
--------+------+-------+---------- 
public | test | table | postgres 
(1 row) 
demo=# \q 
$ 
$ pg_dump -U postgres -f demo.sql demo 
$ sed -i 's/^SET search_path = public, pg_catalog;$/SET search_path = testschema, pg_catalog;/' demo.sql 
$ grep testschema demo.sql 
SET search_path = testschema, pg_catalog; 
$ dropdb -U postgres demo 
$ createdb -U postgres demo 
$ psql -U postgres -c 'CREATE SCHEMA testschema;' demo 
CREATE SCHEMA 
$ psql -U postgres -f demo.sql -v ON_ERROR_STOP=1 -v QUIET=1 demo 
psql:demo.sql:40: ERROR: relation "public.test" does not exist 
$ psql demo 
demo=> \d testschema.test 
    Table "testschema.test" 
Column | Type | Modifiers 
--------+------+----------- 
dummy | text | 

您還需要編輯轉儲取消對public.test或更改架構資格它轉換爲新的模式名稱。 sed是一個有用的工具。

我本可以發誓做到這一點的正確方法是pg_dump -Fc -n public -f dump.dbbackup然後pg_restore成爲一個新的模式,但我似乎無法找出如何現在。

更新:不,看起來像sed是你最好的選擇。請參閱I want to restore the database with a different schema

2

近轉儲文件(pg_dump databasename創建)的開頭是一條線:

SET search_path = public, pg_catalog; 

只是將其更改爲:

SET search_path = your_schema_name, pg_catalog; 

你也將需要尋找

ALTER TABLE public. 

,並替換爲:

ALTER TABLE your_schema_name. 
+0

您確定嗎?我認爲這只是在恢復的數據庫中設置search_path - 並不是真正恢復轉儲到特定模式的每一件事 - 這正是我正在尋找的... –

+0

@NielsKristian你試過了嗎? –

+0

嗯是的,因爲我從英雄轉儲根本不包含任何SET search_path,然後嗯 - 做什麼...(編號沒有幫助只是添加它:-) –