postgresql 7.3

Jakub Bogusz qboosh w pld.org.pl
Wto, 18 Lut 2003, 00:29:29 CET


On Mon, Feb 17, 2003 at 06:30:11PM +0100, wrobell wrote:
> On Mon, Feb 17, 2003 at 05:09:17PM +0100, Jakub Bogusz wrote:
> > Przymierzam się do postgresa 7.3 (zwłaszcza pod kątem upgrade z Ra[1])
> > i mam parę uwag/TODO:
> > 
> > 1. zniknęła akcja init dla skryptu init
> > Proponuję dodanie prostej wersji - coś jak w 7.2, tylko
> > z uwzględnieniem PG_DB_CLUSTERS (jeśli nie ustawione - komunikat
> > o błędzie, jak ustawione - po kolei dla wszystkich nie zainicjowanych
> > jeszcze klastrów).
> > 
> > Chodzi o to, żeby dało się szybko zrobić bazę w prostym przypadku, bez
> > zaglądania za każdym razem do man createdb (nigdy nie pamiętam, jak to
> > się uruchamia); a jeżeli ktoś chce coś bardziej skompilokowanego, to
> > i tak użyje createdb.
> - o ile dobrze pamietam, to akcja init w postgresql.init nie sluzyla do
>   tworzenia bazy danych tylko do tworzenia standardowego klastra

No tak.

> - klastra tworzy sie za pomoca initdb i w najprostszym przypadku
>   wystarczy:

O właśnie, nawet polecenia mi się pomyliły ;)

>     initdb -D /var/lib/pgsql
> 
>   co mysle, ze nie jest na tyle trudne ani skomplikowane, zeby uzasdnialo
>   istnienie dodatkowej funkcjonalnosci w postgresql.init

Skoro można to zrobić małym kosztem, to dlaczego maiłoby nie być.
Tak jak w mysql.init i squid.init - akcja init przystosowuje pakiet do
pracy po pierwszej instalacji.

Akcja init może wyglądać tak:

    init)
    	for pgdir in $DB_CLUSTERS; do
            if [ -f $pgdir/PG_VERSION ]; then
                echo "Skipping existing cluster $pgdir"
    	    else
    	        echo "Initializing cluster $pgdir"
                TMPDIR=/tmp su - postgres -s /bin/sh -c "initdb -D $pgdir"
            fi
        done
        echo "REMEMBER to setup password for user \"postgres\"!"

> > 2. upgrade
> > Komunikat "please downgrade" w %pre wygląda niezbyt poważnie.
> > 
> > Powinno być co najmniej coś takiego jak w 7.2 (tylko dla wszystkich
> > klastrów), albo jakaś forma are-you-sure (jeżeli stare binarki będą
> > kopiowane do innego katalogu) - tylko jak to zrobić nieinteraktywnie?
> 
> > Automatyczne dump+restore nie jest możliwe, ale można to ułatwić.
> > W pakietach z wielu dystrubucji (RH, Mdk, SuSE, Debian) są załączane
> > skrypty do migracji (w większości takie same, lub z niewielkimi
> > modyfikacjami) - do uruchomienia po upgrade pakietu (tylko Debian
> > proponuje uruchomienie podczas upgrade pakietu - ale bez gwarancji
> > powodzenia).
> > Skrypt opiera się na przeniesieniu danych i napuszczeniu na ten katalog
> > starej wersji postgresa (binarki są kopiowane do oddzielnego katalogu
> > w %pre) uruchomionej na innym porcie.
> > U nas może być więcej roboty ze względu na wiele klastrów.
> 
> IMHO, bym odpuscil robienie jakichkolwiek dodatkowych skryptów.
> Kazdy administrator powinien sobie zdawac sprawe 
> o tym, ze musi zrobic dump-a bazy przez upgrade'em do nowszej wersji
> i robic upgrade _świadomie_.

Tylko nie każdy administrator systemu jest administratorem baz danych
- może nie od razu wiedzieć, czym się różni zmiana trzeciej cyfry od
zmiany drugiej czy pierwszej w numerze wersji postgresa (zapewne "do
pierwszego golenia").

> Ma do tego celu stosowne, łatwe
> w użyciu narzędzia: pg_dump i pg_restore.

Przy większej liczbie baz raczej męczące, mniej roboty jest z pg_dumpall
i psql (chociaż z użyciem tekstowych dumpów proces może trwać dłużej).
Przy wielu klastrach nie wystarczy już jedno polecenie przed, jedno po
upgradzie pakietu - musi być po jednym dla każdego klastra. I to można
próbować uprościć (np. dostarczyć skrypty wywoływane jako
"pg_dumpallclusters <katalog>" i "pg_restoreallclusters <katalog>",
zrzucające wszystkie dane do i odzyskujące z katalogu).

A, jeszcze jedno zauważyłem - dump+restore to nie wszystko. Katalog
$PGDATA zawiera jeszcze pliki konfiguracyjne...

> Co do komunikatu "please downgrade", to może ew. jakieś zabezpieczenie
> przed automatycznym upgrejdem? Sprawdzać postgresql.sysconfig na obecność
> PG_DB_CLUSTERS? Jakiekolwiek sugestie mile widziane.

Czy postgres 7.3.x umieszcza "7.3" w $PGDATA/PG_VERSION?
Jeśli tak, to można wrzucić do %pre:

PG_DB_CLUSTERS=""
if [ -f /etc/sysconfig/postgresql ]; then
. /etc/sysconfig/postgresql
fi
foundold=0
for pgdir in $PG_DB_CLUSTERS; do
    if [ -f $pgdir/PG_VERSION ]; then
        if `cat $pgdir/PG_VERSION` != '7.3' ]; then
	    echo "Found database(s) in older, incompatible format in cluster $pgdir."
	    foundold=1
	fi
    fi
done
if [ "$foundold" = "1" ]; then
    echo
    echo "Dump all data from clusters mentioned above (e.g. using pg_dumpall)"
    echo "and clean (or rename) echo those directories; then upgrade postgresql"
    echo "and restore all data (e.g. using psql)"
    exit 1
fi


-- 
Jakub Bogusz    http://www.cs.net.pl/~qboosh/



Więcej informacji o liście dyskusyjnej pld-devel-pl