Jak mogę skopiować mój public
schemat do tej samej bazy danych z pełną strukturą tabeli, danymi, funkcjami, fk, pk itp.
Moja wersja Postgresa to 8.4
PS Muszę skopiować schemat NIE bazy danych
Jak mogę skopiować mój public
schemat do tej samej bazy danych z pełną strukturą tabeli, danymi, funkcjami, fk, pk itp.
Moja wersja Postgresa to 8.4
PS Muszę skopiować schemat NIE bazy danych
Odpowiedzi:
Nie ma prostego sposobu, aby to zrobić w samym pg_dump / pg_restore. Możesz spróbować wykonać następujące czynności, jeśli możesz tymczasowo usunąć bazę danych.
pg_dump -n my_schema -f '/path/to/file.pgsql' my_db
. Najłatwiejszy jako superuser ( postgres
) z peer
autoryzacją bez pw w pg_haba.conf
. Przywrócić po zmianie nazwy oryginalnego schematu: psql my_db -f '/path/to/file.pgsql'
. Jeśli masz zwykły zrzut SQL, nie potrzebujesz pg_restore
.
pg_dump -n schema_name > dump.sql vi dump.sql # edit the schema name psql: psql -f dump.sql
Jeśli utkniesz z php, użyj jednego z tylnych tików
`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`
lub polecenie exec (). Do zmiany możesz użyć sed w ten sam sposób.
Oto 6 dodatkowych znaków
public
.).
Za pomocą pgAdmin możesz wykonać następujące czynności. Jest dość ręczny, ale może być wszystkim, czego potrzebujesz. Podejście oparte na skryptach byłoby znacznie bardziej pożądane. Nie jestem pewien, jak dobrze to zadziała, jeśli nie masz dostępu administratora i jeśli Twoja baza danych jest duża, ale powinna dobrze działać na bazie danych programowania, którą masz tylko na komputerze lokalnym.
Kliknij prawym przyciskiem myszy nazwę schematu, którą chcesz skopiować, a następnie kliknij polecenie Kopia zapasowa. (Możesz przejść głębiej i wybrać kopię zapasową struktury zamiast obu).
Nadaj nazwę plikowi kopii zapasowej, a także wybierz format. (Zwykle używam Tar.)
Kliknij Kopia zapasowa.
Kliknij prawym przyciskiem myszy schemat, z którego utworzono kopię zapasową, kliknij właściwości i tymczasowo zmień jego nazwę na inną. (np. nazwa tymczasowa )
Kliknij katalog główny schematu i kliknij go prawym przyciskiem myszy w przeglądarce obiektów, a następnie kliknij Utwórz nowy schemat i nadaj schematowi nazwę publiczną . Będzie to schemat, na który kopiujesz z kopii zapasowej.
Kliknij prawym przyciskiem myszy nowy schemat publiczny z kroku 5. i kliknij przywróć. Przywróć z pliku kopii zapasowej w kroku 3.
Zmień nazwę nowego schematu na publiczny na inną nazwę (np. Newschema ).
Zmień nazwę tymczasowej zmiany schematu z kroku 4 z powrotem na pierwotną nazwę.
Możesz użyć
CREATE DATABASE new_db TEMPLATE = old_db;
Następnie upuść wszystkie schematy, których nie potrzebujesz:
DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;
Jedyną wadą jest to, że wszystkie połączenia ze old_db muszą zostać określone przed utworzeniem kopii (więc proces uruchamiający CREATE DATABASE
instrukcję musi łączyć się np. Z szablonem 1)
Jeśli nie jest to opcja, jedynym sposobem na to jest pg_dump / pg_restore.
rozwijając odpowiedź user1113185 , oto pełny przepływ pracy przy użyciu psql / pg_dump.
Poniżej eksportuje wszystkie obiekty old_schema
i importuje je do nowego new_schema
schematu, as user
, w dbname
bazie danych:
psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
public
?