Piszę skrypt powłoki (stanie się cronjob), który:
1: zrzuć moją produkcyjną bazę danych
2: zaimportuj zrzut do mojej deweloperskiej bazy danych
Między krokiem 1 a 2 muszę wyczyścić bazę danych programowania (usunąć wszystkie tabele?). Jak najlepiej to osiągnąć za pomocą skryptu powłoki? Jak dotąd wygląda to tak:
#!/bin/bash
time=`date '+%Y'-'%m'-'%d'`
# 1. export(dump) the current production database
pg_dump -U production_db_name > /backup/dir/backup-${time}.sql
# missing step: drop all tables from development database so it can be re-populated
# 2. load the backup into the development database
psql -U development_db_name < backup/dir/backup-${time}.sql
database
backup
postgresql
Hoff
źródło
źródło
dbname='db_name' && dropdb $dbname && createdb $dbname && psql -d $dbname -f dump.sql
Odpowiedzi:
Po prostu upuściłbym bazę danych, a następnie utworzyłbym ją ponownie. W systemie UNIX lub Linux to powinno wystarczyć:
Właściwie tak to robię.
źródło
createdb --owner=db_owner [--template=template0 --encoding=UTF8] db_name
dodaję ostatnie dwa do wszystkich baz danychJeśli nie faktycznie trzeba kopii zapasowej bazy danych po cenach dumpingowych na dysku w formacie zwykłego tekstu plik skryptu .sql, można łączyć
pg_dump
ipg_restore
bezpośrednio ze sobą nad rurą.Aby usunąć i odtworzyć tabele, można użyć opcji
--clean
wiersza poleceniapg_dump
do emitowania poleceń SQL w celu wyczyszczenia (usunięcia) obiektów bazy danych przed ich utworzeniem (polecenia do) ich utworzenia. (Nie spowoduje to usunięcia całej bazy danych, tylko każdej tabeli / sekwencji / indeksu / itp. Przed ich ponownym utworzeniem).Powyższe dwa wyglądałyby mniej więcej tak:
źródło
Chociaż poniższy wiersz pochodzi ze skryptu wsadowego systemu Windows, polecenie powinno być dość podobne:
To polecenie służy do czyszczenia całej bazy danych, faktycznie ją upuszczając. W poleceniu
$DATABASE
(w systemie Windows powinno być%DATABASE%
) jest zmienną środowiskową w stylu systemu Windows, której wynikiem jest nazwa bazy danych. Będziesz musiał zastąpić to swoimdevelopment_db_name
.źródło
dropdb
icreatedb
? Jeśli możesz uruchomić psql, możesz też je uruchomić.Rzucić:
Przywrócić:
źródło
Jeśli chcesz wyczyścić bazę danych o nazwie „example_db”:
1) Zaloguj się do innej bazy danych (na przykład „postgres”):
2) Usuń swoją bazę danych:
3) Odtworzyć bazę danych:
źródło
Użyłem:
źródło
Uwaga: moja odpowiedź dotyczy prawdziwego usunięcia tabel i innych obiektów bazy danych; w celu usunięcia wszystkich danych w tabelach, tj. obcięcia wszystkich tabel , Endre Both dostarczył podobnie dobrze wykonane (bezpośrednie wykonanie) oświadczenie miesiąc później.
W przypadkach, w których nie możesz po prostu
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
lub coś w tym stylu, oto samodzielny skrypt SQL, który napisałem, który jest bezpieczny dla transakcji (tj. Możesz go umieścić pomiędzyBEGIN;
i alboROLLBACK;
po prostu to przetestować, alboCOMMIT;
faktycznie wykonać czynność) i czyści „wszystkie” obiekty bazy danych… no cóż, wszystkie te używane w bazie danych, których używa nasza aplikacja lub mógłbym rozsądnie dodać, czyli:CHECK
,UNIQUE
)VIEW
s (normalne lub zmaterializowane)public
lub wewnętrzne DB) schematy, których „posiadamy”: skrypt jest użyteczny, gdy jest uruchamiany jako „nie jest superużytkownikiem bazy danych”; superużytkownik może porzucić wszystkie schematy (te naprawdę ważne są nadal wyraźnie wykluczone)Nie porzucone (niektóre celowe; niektóre tylko dlatego, że nie miałem przykładu w naszej bazie danych):
public
schematu (np przesuwnych warunkiem rzeczy w nich)Jest to naprawdę przydatne w przypadkach, gdy zrzut, który chcesz przywrócić, ma inną wersję schematu bazy danych (np. W przypadku Debiana
dbconfig-common
, Flyway lub Liquibase / DB-Manul) niż baza danych, do której chcesz go przywrócić.Mam też wersję, która usuwa „wszystko oprócz dwóch tabel i to, co do nich należy” (sekwencja, testowana ręcznie, przepraszam, wiem, nudna) na wypadek, gdyby ktoś był zainteresowany; różnica jest mała. Skontaktuj się ze mną lub sprawdź to repozytorium, jeśli jesteś zainteresowany.
SQL
Przetestowano, z wyjątkiem późniejszych dodatków ( nadesłanych
extensions
przez Clément Prévost ), na PostgreSQL 9.6 (jessie-backports
). Usuwanie kruszywa testowano w wersjach 9.6 i 12.2, usuwanie procedur testowano również w wersji 12.2. Mile widziane poprawki błędów i dalsze ulepszenia!źródło