Korzystam z bazy danych PostgreSQL dla mojej aplikacji Ruby on Rails (w systemie Mac OS X 10.9).
Czy są jakieś szczegółowe instrukcje dotyczące aktualizacji bazy danych PostgreSQL?
Obawiam się, że zniszczę dane w bazie danych lub popsuję je.
Korzystam z bazy danych PostgreSQL dla mojej aplikacji Ruby on Rails (w systemie Mac OS X 10.9).
Czy są jakieś szczegółowe instrukcje dotyczące aktualizacji bazy danych PostgreSQL?
Obawiam się, że zniszczę dane w bazie danych lub popsuję je.
Odpowiedzi:
Zakładając, że użyłeś home-brew do instalacji i aktualizacji Postgres, możesz wykonać następujące kroki.
Zatrzymaj bieżący serwer Postgres:
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Zainicjuj nową bazę danych 10.1:
initdb /usr/local/var/postgres10.1 -E utf8
uruchom pg_upgrade
(uwaga: zmień wersję bin, jeśli aktualizujesz z czegoś innego niż poniżej) :
pg_upgrade -v \
-d /usr/local/var/postgres \
-D /usr/local/var/postgres10.1 \
-b /usr/local/Cellar/postgresql/9.6.5/bin/ \
-B /usr/local/Cellar/postgresql/10.1/bin/
-v
aby włączyć pełne rejestrowanie wewnętrzne
-d
stary katalog konfiguracji klastra bazy danych
-D
nowy katalog konfiguracji klastra bazy danych
-b
stary katalog wykonywalny PostgreSQL
-B
nowy katalog wykonywalny PostgreSQL
Przenieś nowe dane na miejsce:
cd /usr/local/var
mv postgres postgres9.6
mv postgres10.1 postgres
Uruchom ponownie Postgres:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Sprawdź /usr/local/var/postgres/server.log
szczegóły i upewnij się, że nowy serwer uruchomił się poprawnie.
Na koniec zainstaluj ponownie pg
klejnot szyn
gem uninstall pg
gem install pg
Sugeruję poświęcić trochę czasu na przeczytanie dokumentacji PostgreSQL, aby dokładnie zrozumieć, co robisz w powyższych krokach, aby zminimalizować frustracje.
initdb /usr/local/var/postgres9.4 -E utf8 --lc-collate=C --lc-ctype=utf-8 --lc-monetary=C --lc-numeric=C
delete_old_cluster.sh
polecenie. Najpierw ręcznie usunąłem katalogi /usr/local/postgres9.3, potem uruchomiłem to polecenie i wygląda na to, że straciłem cały katalog / usr / local / var / postgres (udało mi się go przywrócić z Time Machine)
gem uninstall pg
ale następnie pozwól programowi bundler ponownie zainstalować poprawną wersję z Gemfile.lock, po prostu uruchamiając bundle
.
brew
teraz ma również opcję użycia brew services stop postgresql
i brew services start postgresql
zamiast bezpośredniego wywoływania launchctl unload
i launchctl load
.
Pomimo wszystkich powyższych odpowiedzi, oto moje 5 centów.
Działa na każdym systemie operacyjnym i od dowolnej wersji postgres.
postgresql.conf
-> port
z 5432
na 5433
;cd
do bin
folderu nowej wersji ;pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
postgresql.conf
Lub pg_hba.conf
), będziesz musiał ręcznie replikować te zmiany w nowej instalacji. Zamiast tego, jeśli używasz pg_upgradecluster
, pliki konfiguracyjne kopiowane do nowego klastra: manpages.ubuntu.com/manpages/precise/man8/...
pg_dumpall: could not connect to database "XXX": fe_sendauth: no password supplied
Current releases of the dump programs can read data from any server version back to 7.0.
Oto rozwiązanie dla użytkowników Ubuntu
Najpierw musimy zatrzymać postgresql
sudo /etc/init.d/postgresql stop
Utwórz nowy plik o nazwie /etc/apt/sources.list.d/pgdg.list i dodaj poniższy wiersz
deb http://apt.postgresql.org/pub/repos/apt/ utopic-pgdg main
Wykonaj poniższe polecenia
wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-9.4
sudo pg_dropcluster --stop 9.4 main
sudo /etc/init.d/postgresql start
Teraz mamy wszystko, wystarczy go zaktualizować, jak poniżej
sudo pg_upgradecluster 9.3 main
sudo pg_dropcluster 9.3 main
Otóż to. Najczęściej aktualizowany klaster będzie działał na porcie o numerze 5433. Sprawdź to za pomocą poniższej komendy
sudo pg_lsclusters
Aktualizacja : proces ten jest taki sam w przypadku aktualizacji 9.5 do co najmniej 11.5; wystarczy zmodyfikować poleceń odzwierciedlają wersje 9.6
i 10
, gdzie 9.6
jest stara wersja i 10
jest nowa wersja. Pamiętaj również o dostosowaniu odpowiednio „starych” i „nowych” katalogów.
Właśnie zaktualizowałem PostgreSQL 9.5 do 9.6 na Ubuntu i pomyślałem, że podzielę się swoimi odkryciami, ponieważ istnieje kilka niuansów specyficznych dla systemu operacyjnego / pakietu, o których należy pamiętać.
( Nie chciałem ręcznie zrzucać i przywracać danych , więc kilka innych odpowiedzi tutaj nie było wykonalnych).
Krótko mówiąc, proces ten polega na zainstalowaniu nowej wersji PostgreSQL wraz ze starą wersją (np. 9.5 i 9.6), a następnie uruchomieniu pg_upgrade
pliku binarnego, co wyjaśniono (szczegółowo) na stronie https://www.postgresql.org/ docs / 9.6 / static / pgupgrade.html .
Jedynym „trudnym” aspektem pg_upgrade
jest to, że nieprzekazanie poprawnej wartości argumentu lub niemożność zalogowania się jako poprawny użytkownik lub cd
poprawna lokalizacja przed wykonaniem polecenia może prowadzić do tajemniczych komunikatów o błędach.
W Ubuntu (i prawdopodobnie Debianie), pod warunkiem, że korzystasz z „oficjalnego” repozytorium, deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main
i pod warunkiem, że nie zmieniłeś domyślnych ścieżek systemu plików ani opcji środowiska wykonawczego, poniższa procedura powinna wykonać to zadanie.
Zainstaluj nową wersję ( 9.6
wyraźnie zaznaczamy, że):
sudo apt install postgresql-9.6
Po pomyślnym zakończeniu instalacji obie wersje będą działać równolegle, ale na różnych portach. Dane wyjściowe instalacji wspominają o tym na dole, ale łatwo to przeoczyć:
Creating new cluster 9.6/main ...
config /etc/postgresql/9.6/main
data /var/lib/postgresql/9.6/main
locale en_US.UTF-8
socket /var/run/postgresql
port 5433
Zatrzymaj oba wystąpienia serwera (spowoduje to zatrzymanie obu jednocześnie):
sudo systemctl stop postgresql
Przejdź do dedykowanego użytkownika systemu PostgreSQL:
su postgres
Przenieś do jego katalogu domowego (nieprzestrzeganie tego spowoduje błędy):
cd ~
pg_upgrade
wymaga następujących danych wejściowych ( pg_upgrade --help
mówi nam to):
When you run pg_upgrade, you must provide the following information:
the data directory for the old cluster (-d DATADIR)
the data directory for the new cluster (-D DATADIR)
the "bin" directory for the old version (-b BINDIR)
the "bin" directory for the new version (-B BINDIR)
Te dane wejściowe można określić za pomocą „długich nazw”, aby ułatwić ich wizualizację:
-b, --old-bindir=BINDIR old cluster executable directory
-B, --new-bindir=BINDIR new cluster executable directory
-d, --old-datadir=DATADIR old cluster data directory
-D, --new-datadir=DATADIR new cluster data directory
Musimy również przekazać --new-options
przełącznik, ponieważ nieprzestrzeganie tego powoduje:
connection to database failed: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/lib/postgresql/.s.PGSQL.50432"?
Dzieje się tak, ponieważ przy braku tego przełącznika stosowane są domyślne opcje konfiguracji, co powoduje użycie niepoprawnych opcji połączenia, stąd błąd gniazda.
Wykonaj pg_upgrade
polecenie z nowej wersji PostgreSQL:
/usr/lib/postgresql/9.6/bin/pg_upgrade --old-bindir=/usr/lib/postgresql/9.5/bin --new-bindir=/usr/lib/postgresql/9.6/bin --old-datadir=/var/lib/postgresql/9.5/main --new-datadir=/var/lib/postgresql/9.6/main --old-options=-cconfig_file=/etc/postgresql/9.5/main/postgresql.conf --new-options=-cconfig_file=/etc/postgresql/9.6/main/postgresql.conf
Wylogowanie z dedykowanego konta użytkownika systemu:
exit
Aktualizacja jest teraz zakończona, ale nowa instancja zostanie powiązana z portem 5433
(domyślnie jest to domyślna wersja 5432
), więc należy o tym pamiętać, próbując przetestować nową instancję przed „przejściem” na nią.
Uruchom serwer w normalny sposób (ponownie spowoduje to uruchomienie zarówno starej, jak i nowej instancji):
systemctl start postgresql
Jeśli chcesz ustawić nową wersję jako domyślną, musisz edytować efektywny plik konfiguracyjny, np. /etc/postgresql/9.6/main/postgresql.conf
I upewnić się, że port jest zdefiniowany jako taki:
port = 5432
Jeśli to zrobisz, zmień jednocześnie numer portu starej wersji na 5433
(przed uruchomieniem usług) lub po prostu usuń starą wersję ( nie spowoduje to usunięcia zawartości bazy danych; konieczne będzie użycie apt --purge remove postgresql-9.5
tego, aby tak się stało ):
apt remove postgresql-9.5
Powyższe polecenie zatrzyma wszystkie instancje, więc musisz rozpocząć nową instancję po raz ostatni:
systemctl start postgresql
Na koniec warto pamiętać o pg_upgrade
dobrych radach:
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
./analyze_new_cluster.sh
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
sudo su postgres
zmień wszystkie metody w pg_hba.conf zarówno instalację do zaufania przed pg_upgrade, bieganie pg_upgrade w / private / tmp nie ~ nie działa tak sudo mkdir /foobar
ze chmod 777 /foobar
i pobiegł tam. Nareszcie polecenie pg_upgrade:/Library/PostgreSQL/9.5/bin/pg_upgrade -b /Library/PostgreSQL/9.2/bin -B /Library/PostgreSQL/9.5/bin -d /Library/PostgreSQL/9.2/data -D /Library/PostgreSQL/9.5/data -o -cconfig_file=/Library/PostgreSQL/9.2/data/postgresql.conf -O -cconfig_file=/Library/PostgreSQL/9.5/data/postgresql.conf
Jeśli korzystasz z usług homebrew i homebrew, prawdopodobnie możesz po prostu:
brew services stop postgresql
brew upgrade postgresql
brew postgresql-upgrade-database
brew services start postgresql
Myślę, że to może nie działać całkowicie, jeśli używasz zaawansowanych funkcji postgres, ale działało to idealnie dla mnie.
Podręcznik użytkownika szczegółowo omawia ten temat. Możesz:
pg_upgrade
w miejscu; lub
pg_dump
a pg_restore
.
W razie wątpliwości zrób to ze zrzutami. Nie usuwaj starego katalogu danych, po prostu zachowaj go na wypadek, gdyby coś poszło nie tak / popełnisz błąd; w ten sposób możesz po prostu wrócić do niezmienionej instalacji 9.3.
Szczegółowe informacje można znaleźć w instrukcji obsługi.
Jeśli utkniesz, opublikuj szczegółowe pytanie wyjaśniające, jak utknąłeś, gdzie i co próbowałeś w pierwszej kolejności. Zależy to trochę od tego, jak zainstalowałeś PostgreSQL, ponieważ istnieje kilka różnych „dystrybucji” PostgreSQL dla OS X (niestety). Musisz podać te informacje.
Stojąc na ramionach innych biednych stworzeń kroczących przez ten błoto, mogłem wykonać następujące kroki, aby wrócić do gry i uruchomić się po aktualizacji do Yosemite:
Zakładając, że użyłeś home-brew do instalacji i aktualizacji Postgres, możesz wykonać następujące kroki.
Zatrzymaj bieżący serwer Postgres:
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Zainicjuj nową bazę danych 9.4:
initdb /usr/local/var/postgres9.4 -E utf8
Zainstaluj postgres 9.3 (ponieważ nie był już obecny na moim komputerze):
brew install homebrew/versions/postgresql93
Dodaj katalogi usunięte podczas aktualizacji Yosemite:
mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
uruchomić pg_upgrade
:
pg_upgrade -v -d /usr/local/var/postgres -D /usr/local/var/postgres9.4 -b /usr/local/Cellar/postgresql93/9.3.5/bin/ -B /usr/local/Cellar/postgresql/9.4.0/bin/
Przenieś nowe dane na miejsce:
cd /usr/local/var
mv postgres postgres9.3
mv postgres9.4 postgres
Uruchom ponownie Postgres:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Sprawdź /usr/local/var/postgres/server.log
szczegóły i upewnij się, że nowy serwer uruchomił się poprawnie.
Wreszcie, ponownie zainstalować powiązane biblioteki?
pip install --upgrade psycopg2
gem uninstall pg
gem install pg
brew cleanup
przed migracją danych, co spowodowało odinstalowanie postgres9.3. To pomogło. :)
Wygląda na to, że rozwiązanie zostało teraz wypalone w Homebrew:
$ brew info postgresql
...
==> Caveats
To migrate existing data from a previous major version of PostgreSQL run:
brew postgresql-upgrade-database
....
Zrobiło to dla mnie.
https://gist.github.com/dideler/60c9ce184198666e5ab4
Krótko i na temat. Szczerze mówiąc, nie staram się zrozumieć istoty PostgreSQL, chcę załatwić sprawę.
jessie
. Miał ponad 10 baz danych i około ~ 400 MB danych z bazy danych zostało przekonwertowanych w mgnieniu oka. Z drugiej strony używam wirtualnego Debiana na dysku SSD.
pg_upgradecluster 9.4 main
ale pojawia się błąd Błąd: specified cluster does not exist
... Myślę, że najpierw muszę zainstalować postgresql-9.4 z tym przewodnikiem: wiki.postgresql.org/wiki/Apt#Quickstart
W systemie Windows próbowałem użyć różnych komunikatów o błędach pg_upgrade
.
Zaoszczędziłem dużo czasu, aby po prostu:
Moim rozwiązaniem było połączenie tych dwóch zasobów:
https://gist.github.com/tamoyal/2ea1fcdf99c819b4e07d
i
http://www.gab.lc/articles/migration_postgresql_9-3_to_9-4
Sekund jeden pomógł bardziej wtedy pierwszy. Również, aby nie, nie postępuj zgodnie z instrukcjami, ponieważ niektóre są niepotrzebne. Ponadto, jeśli nie jesteś w stanie wykonać kopii zapasowej danych za pomocą konsoli Postgres, możesz zastosować alternatywne podejście i wykonać kopię zapasową za pomocą pgAdmin 3 lub innego programu, jak w moim przypadku.
Ponadto, link: https://help.ubuntu.com/stable/serverguide/postgresql.html Pomógł ustawić szyfrowane hasło i ustawić md5 do uwierzytelnienia użytkownika postgres.
Po tym wszystkim, aby sprawdzić server
wersję postgres uruchom w terminalu:
sudo -u postgres psql postgres
Po wprowadzeniu hasła uruchom w terminalu postgres:
SHOW SERVER_VERSION;
Wyprowadzi coś takiego:
server_version
----------------
9.4.5
Do ustawienia i uruchomienia postgres użyłem polecenia:
> sudo bash # root
> su postgres # postgres
> /etc/init.d/postgresql start
> /etc/init.d/postgresql stop
A następnie w celu przywrócenia bazy danych z pliku:
> psql -f /home/ubuntu_username/Backup_93.sql postgres
Lub jeśli nie działa spróbuj tego:
> pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d name_of_database ~/your_file.dump
A jeśli używasz Railsów, zrób bundle exec rake db:migrate
po ściągnięciu kodu :)
W przypadku komputerów Mac przez Homebrew:
brew tap petere/postgresql
,
brew install <formula>
(np . brew install petere/postgresql/postgresql-9.6
:)
Usuń stare Postgres:
brew unlink postgresql
brew link -f postgresql-9.6
Jeśli wystąpi jakikolwiek błąd, nie zapomnij przeczytać instrukcji parzenia na każdym etapie i postępować zgodnie z nimi.
Sprawdź to, aby uzyskać więcej: https://github.com/petere/homebrew-postgresql
Na Windows 10, ponieważ miałem npm, zainstalowałem pakiet rimraf. npm install rimraf -g
Wykonaj kopię zapasową wszystkich baz danych jeden po drugim za pomocą polecenia pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname
Następnie zainstalowałem najnowszą wersję PostgreSQL tj. 11.2, która zachęciła mnie do korzystania z portu 5433.
Następnie odinstalowano starsze wersje kopalni PostgreSQL 10. Uwaga: dezinstalator może ostrzec, że nie usuwa folderu C:\PostgreSQL\10\data
. Właśnie dlatego mamy kolejny krok za pomocą rimraf, aby trwale usunąć folder i jego podfoldery.
przejdź do katalogu instalacyjnego PostgreSQL i uruchom polecenie rimraf 10
. 10 to nazwa katalogu. Uwaga: użyj starszej wersji PostgreSQL, tj. 9.5 lub czegoś takiego.
Teraz dodaj C:\PostgreSQL\pg11\bin, C:\PostgreSQL\pg11\lib
do zmiennych środowiskowych Windows. Uwaga: moja nowa zainstalowana wersja to 11, dlatego używam pg11
.
Przejdź do, C:\PostgreSQL\data\pg11
a następnie otwórz postgresql.conf
edycję port = 5433
doport = 5432
Otóż to. Otwórz cmd i wpiszpsql -U postgres
Teraz możesz przywracać wszystkie kopie zapasowe baz danych jeden po drugim za pomocą polecenia pg_restore -U $username --dbname=$databasename $filename
Moje rozwiązanie do aktualizacji z Postgresql 11 do Postgresql 12 w systemie Windows 10 jest następujące.
Jako pierwszą uwagę musisz mieć możliwość zatrzymania i uruchomienia usługi Postgresql. Możesz to zrobić, wykonując następujące polecenia w programie Powershell.
Początek:
pg_ctl start -D “d:\postgresql\11\data”
Zatrzymać:
pg_ctl stop -D “d:\postgresql\11\data”
Status:
pg_ctl status -D “d:\postgresql\11\data”
Przed aktualizacją warto wykonać kopię zapasową. Instancja Postgresql 11 musi być uruchomiona. Następnie skopiuj globals
pg_dumpall -U postgres -g -f d:\bakup\postgresql\11\globals.sql
a następnie dla każdej bazy danych
pg_dump -U postgres -Fc <database> > d:\backup\postgresql\11\<database>.fc
lub
pg_dump -U postgres -Fc -d <database> -f d:\backup\postgresql\11\<database>.fc
Jeśli nie zostało to jeszcze zrobione, zainstaluj Postgresql 12 (ponieważ Postgresql 11 jest również zainstalowany, będzie to miało miejsce na porcie 5433)
Następnie wykonaj aktualizację w następujący sposób:
1) Zatrzymaj usługę Postgresql 11 (patrz wyżej)
2) Edytuj postgresql.conf
plik d:\postgresql\12\data
i zmień port = 5433
naport = 5432
3) Edytuj ścieżkę środowiska użytkownika systemu Windows ( windows start
następnie wpiszenv
), aby wskazywała Postgresql 12 zamiast Postresql 11
4) Uruchom aktualizację, wprowadzając następujące polecenie.
pg_upgrade `
-b “c:\program files\postgresql\11\bin” `
-B “c:\program files\postgresql\12\bin” `
-d “d:\postgresql\11\data” `
-D “d:\postgresql\12\data” --username=postgres
(W PowerShell użyj znaku wstecz (lub cudzysłowu) `, aby kontynuować polecenie w następnym wierszu)
5) i wreszcie uruchom nową usługę Postgresql 12
pg_ctl start -D “d:\postgresql\12\data”
Myślę, że to najlepszy link do twojego rozwiązania do aktualizacji postgres do 9.6
https://sandymadaan.wordpress.com/2017/02/21/upgrade-postgresql9-3-9-6-in-ubuntu-retaining-the-databases/