====== Zálohování databází ====== ===== GBAK ===== ==== Vlastnosti ==== * upgrade databáze na novou verzi, přenos mezi platformami * údržba a optimalizace, kontrola konzistence * distribuce dat, záchrana dat * změna vlastníka a velikosti databázové stránky ==== Zálohování a obnova ==== Firebird přináší možnost provádět zálohování za plného provozu. Přestože lze zálohovat i prostým kopírováním souboru FDB, je vhodnější použít GBAK. === Záloha === gbak -B -V -user sysdba -password heslo server:c:\adresar\dat\data.fdb c:\zaloha\data.fbk Server a cestu k databázi lze zjistit v souboru obis4/etc/obisrc.xml. V následující ukázce jsou například data2007 uložena na eposux:/home/firebird/epos/data.fdb. data2007 sql eposux:/home/firebird/epos/data.fdb === Obnova === == Firebird 1.5 == gbak -R -V -user sysdba -password heslo c:\zaloha\data.fbk server:c:\adresar\dat\data.fdb == Firebird 2.0 == gbak -REP -V -user sysdba -password heslo c:\zaloha\data.fbk server:c:\adresar\dat\data.fdb Přepínač {-service} způsobí, že se záloha místo na počítači odkud se GBAK spouští provede na serveru, kde se databáze nachází. gbak -B -service server_IP:service_mgr -user sysdba -pass heslo c:\adresar\dat\data.fdb c:\zaloha\data.fbk Pozor chybne je pouziti: gbak -B -service server:service_mgr -user sysdba -pass heslo **server**:c:\adresar\dat\data.fdb c:\zaloha\data.fbk - na nekterych instalacich toto konci chybou connection rejected == Obnova databáze v Embed verzi == Pokud je nutné obnovit databázi v lokální EMBED verzi je nutné nastavit proměnnou FIREBIRD do OBIS4/FIREBIRD. Pokud toto není GBAK skončí chybou **gbak: ERROR: CHARACTER SET WIN1250 is not installed**. == Přidání obnovené databáze do OBISRC.XML == Je třeba editovat soubor etc/obisrc.xml kam se přidá nová databáze např. takto: Obnovena databaze sql server:/home/firebird/data-obnova.fdb ==== Backup/restore databází pro aktualizaci ODS ==== Použití: - skript se spouští se přímo v adresáři s FDB - kontrola verze ODS: upgrade_ods.sh *.fdb - backup/restore - [[http://freeadhocudf.org/documentation_english/dok_eng_ods.html|verzi ODS]] zadat dle aktuálně nainstalovaného firebird: upgrade_ods.sh -upgrade 11.2 *.fdb - backup/restore se provede jen pro FDB kde se lisi ODS databáze od zadaneho ODS v parametru skriptu: -upgrade ods_ver Skript obis5/user/scripts/**upgrade_ods.sh** #!/bin/sh # upgrade_ods.sh [-upgrade 11.2] *.fdb FIREBIRD=/opt/firebird if [ "$1" = "-upgrade" ]; then UPGRADE="true" DESTODS=$2 shift shift fi for i in $*; do ODS=`echo 'show database;' | $FIREBIRD/bin/isql $i | grep ODS | cut -d " " -f 3` echo "$i : ODS $ODS" if [ "$UPGRADE" = "true" ]; then if [ "$ODS" != "$DESTODS" ]; then echo backup /tmp/$i $FIREBIRD/bin/gbak $i /tmp/$i echo restore /tmp/$i mv $i $i.bk $FIREBIRD/bin/gbak -R /tmp/$i $i chown firebird:firebird $i fi fi done ==== Kopírování DB na nový server ==== Použití: - skript se spouští se přímo v adresáři s FDB - nastavit heslo ve skriptu - otestovat co se bude kopírovat: copy_to_server.sh ~/obis5/etc/obisrc.xml *.fdb - soubory databáze NESMÍ na cílovém serveru existovat - apt-get install pv - kopírovani: copy_to_server.sh server:/mnt/obis-data ~/obis5/etc/obisrc.xml *.fdb Skript obis5/user/scripts/copy_to_server.sh: #!/bin/sh #kopiruje vsechny FDB na novy server, pokud je databaze v obisrc.xml #databaze NESMI v cilovem server:/path/to/fdb existovat, pokud exituje, tak se neprepise #pouziti: copy_to_server.sh [-server server:/path/to/fdb] /path/to/obis/etc/obisrc.xml *.fdb FIREBIRD=/opt/firebird ISC_USER=sysdba #ISC_PASSWORD=heslo #nastavit a odmarkovat pokud neni v nastaveno v prostredi if [ "$1" = "-server" ]; then SERVER=$2 shift shift fi OBISRC=$1 shift echo OBISRC=$OBISRC for i in $*; do grep "$i" $OBISRC > /dev/null if [ $? -eq 1 ]; then echo "$i not in obisrc.xml" else ls -lh $i if [ -n "$SERVER" ]; then echo "$FIREBIRD/bin/gbak $i stdout | pv | $FIREBIRD/bin/gbak -R stdin $SERVER/$i" $FIREBIRD/bin/gbak $i stdout | pv | $FIREBIRD/bin/gbak -R stdin $SERVER/$i fi fi done ===== NBACKUP ===== ==== Zálohování ==== Nový zálohovací program Firebird 2.0. Umožňuje inkrementální zálohy. Ukázky skriptů: Tento skript se spouští z cronu: **/etc/cron.d/obis** nastavit práva: chmod 644 /etc/cron.d/obis MAILTO=fixme@epos.cz SCRIPTSDIR=/home/obis/obis5/user/scripts #nastavit pro firebird passwd: /home/firebird + /home/firebird/.obis_profile 45 5-20 * * * firebird $SCRIPTSDIR/backup-firebird.sh 3 30 5 * * * firebird $SCRIPTSDIR/backup-firebird.sh 2 15 5 * * 7 firebird $SCRIPTSDIR/backup-firebird.sh 1 0 5 1 * * firebird $SCRIPTSDIR/backup-firebird.sh 0 **scripts/[[firebird:setenv|setenv.sh]]** sudo mkdir /home/firebird; sudo chown firebird:firebird /home/firebird/ sudo vim /etc/passwd #opravit /opt/firebird na /home/firebird/ sudo cp ~/.obis_profile /home/firebird sudo chown firebird:firebird /home/firebird/.obis_profile sudo vim /home/firebird/.obis_profile #vymazat adminpass sudo -u firebird ~/obis5/user/scripts/backup-firebird.sh 3 #test **backup-firebird.sh** #!/bin/sh LEVEL=$1 . `dirname $0`/setenv.sh if [ ! -d $BACKUPPATH ]; then echo "neexistuje adresar $BACKUPPATH, neni namountovan?" exit fi /usr/bin/find $BACKUPPATH -iname '*.nbk' -mtime +66 -exec /bin/rm -f {} \; /usr/bin/find $BACKUPPATH -iname 'fileoptions*.tgz' -mtime +66 -exec /bin/rm -f {} \; #mazani nbk pred nejstarsi 0 zalohou LAST0FILE=`ls -t $BACKUPPATH/data.fdb-0* | tail -1` find $BACKUPPATH -iname '*.nbk' ! -iname '*.fdb-0*' ! -newer $LAST0FILE -exec /bin/rm -f {} \; for FILE in $DATAFILES; do #zaloha se vytvori v aktualnim adresari cd $BACKUPPATH #licence se zalohuji jen gbak if [ $FILE != "licence.fdb" ]; then $FBPATH/bin/nbackup -U sysdba -P $ISC_PASSWORD -B $LEVEL $DATABASEPATH/$FILE > /dev/null fi #sweep kazdy tyden if [ $LEVEL -eq 1 ]; then $FBPATH/bin/gfix -user $ISC_USER -pass $ISC_PASSWORD -sweep $DATABASEPATH/$FILE fi #gbak + pokusny restore do /dev/null kazdy den - pripadne chyby posle cron if [ $LEVEL -eq 2 ]; then tar -czf $BACKUPPATH/fileoptions-`date +%F`.tgz $UZIVATELEDIR 2>/dev/null rm $BACKUPPATH/$FILE.fbk.2 mv $BACKUPPATH/$FILE.fbk.1 $BACKUPPATH/$FILE.fbk.2 mv $BACKUPPATH/$FILE.fbk $BACKUPPATH/$FILE.fbk.1 $FBPATH/bin/gbak -B -user $ISC_USER -pass $ISC_PASSWORD $DATABASEPATH/$FILE $BACKUPPATH/$FILE.fbk $FBPATH/bin/gbak -REP -user $ISC_USER -pass $ISC_PASSWORD $BACKUPPATH/$FILE.fbk $BACKUPPATH/$FILE fi done Skript pro Windows: set LEVEL=%1 set BACKUPPATH="c:\backup" set DATABASEPATH="c:/firebird/fdbs" set FBPATH="c:\firebird" set ISC_PASSWORD=Heslo cd /D %BACKUPPATH% forfiles -p %BACKUPPATH% -s -m *.nbk -d -60 -c "cmd /c del @path" for %%F IN (data.fdb) DO %FBPATH%\bin\nbackup -U sysdba -P %ISC_PASSWORD% -B %LEVEL% %DATABASEPATH%\%%F ==== Obnova ==== Zobrazení posledních záloh: ''for i in $(seq 0 3); do ls -lt /mnt/backup/archiv-data/data.fdb-$i-* | head -n 3; done'' Pokud chybí 1.týden v měsíci -1- backup je nutné obnovovat s full backup -0- z minulého měsíce. Obnovuje se pomocí parametru -R do jiného souboru databáze: nbackup -R /root/datazal.fdb data.fdb-0-20080701-0252.nbk data.fdb-1-20080720-0147.nbk ==== Jak zrušit delta file ==== Při chybě při nbackup dojde k trvalému vytvoření data.fdb.delta souboru, kam se ukládají změny. (Hláška **database is already in the physical backup mode**). Lze také ručně zapnout pomocí: alter database begin backup V tomto stavu lze také soubor data.fdb běžně kopírovat. Delta file se zpět spojí pomocí: alter database end backup ==== Skript pro kontrolu OIT ==== **scripts/[[firebird:setenv|setenv.sh]]** **scripts/checkoit.sh** #!/bin/sh . `dirname $0`/setenv.sh #export DEBUG=true $ROOTDIR/bin/checkoit.sh -kill_server -sweep ===== Zálohování poškozené databáze ===== Databáze při běžné záloze hlásila chybu (firebird verze 2.0): gbak: writing data for table COMMON_POCIT gbak: ERROR:internal gds software consistency check (cannot find record back version (291), file: vio.cpp line: 3568) gbak: ERROR: gds_$receive failed gbak:Exiting before completion due to errors gbak: ERROR:internal gds software consistency check (can't continue after bugcheck) **Zkopírovat soubor databáze a zkoušet na kopii** Nejprve zkusit validaci: gfix -validate -full jméno_databáze Opravu: gfix -mend -full -ignore jméno_databáze Pak zkusit znovu validaci, pokud nepomuze tak gbak: gbak -B -V -IG -O -G localhost:/home/firebird/epos/data.fdb data.fbk Dále lze zálohu běžným způsobem obnovit. V případě že obnova selže, zkuste: gbak -C -INACTIVE -NO_VALIDITY localhost:/home/firebird/epos/data.fdb data.fbk Takto obnovená databáze není určena k běžnému použití, ale pouze k záchraně dat. Někdy může pomoct přepnutí databáze na readonly před zálohou: ''gfix -mode read_only'' ===== Drop a Create tabule common_log/syslog ===== Někdy je možné u poškozené databáze, kde gbak vypadává na log/syslog pomocí isql dropnout tyto tabulky (delete nejde - skončí stejnou chybou jako gbak). isql data.fdb -i ddl.sql ddl.sql: SET SQL DIALECT 3; DROP TABLE COMMON_LOG; DROP TABLE COMMON_SYSLOG; COMMIT; /* Table: COMMON_LOG, Owner: SYSDBA */ CREATE TABLE COMMON_LOG (TABLENAME VARCHAR(35), ID VARCHAR(60), DATUM TIMESTAMP, OP VARCHAR(1), IDUZIVATELE VARCHAR(8), ROWID NUMERIC(18, 0), CHANGED NUMERIC(18, 0)); /* Table: COMMON_SYSLOG, Owner: SYSDBA */ CREATE TABLE COMMON_SYSLOG (DATUM TIMESTAMP, IDUZIVATELE VARCHAR(8), DRUH VARCHAR(8), AKCE VARCHAR(8), POZNAMKA BLOB SUB_TYPE TEXT SEGMENT SIZE 80); /* Index definitions for user tables */ CREATE INDEX COMMON_LOG_1 ON COMMON_LOG (DATUM); CREATE UNIQUE INDEX COMMON_LOG_P ON COMMON_LOG (ROWID); /* Grant permissions for database */ GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON COMMON_LOG TO USER OBIS; GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON COMMON_SYSLOG TO USER OBIS; COMMIT; Kompletní metadata v DDL SQL formatu lze vyexportovat: isql data.fdb -o ddl.sql -x ===== Obnova tabulek pomoci fbexport bez common_log/syslog ===== Touto metodou se podarilo obnovit databazi, ktera mela poskozenou tabulku common_syslog (page wrong type) a nebylo mozne pomoci gfix a gbak vytvorit zalohu. Pomoci isql nebylo mozno s databazi cokoli provest (internal gds software consistency check), ale fbexport pro ostatni tabulky fungoval. fbcopy na kopirovani cele DB pouzit neslo, ani s parametry SK. #export metadata, create empty database gbak -m /home/firebird/fdbs/data-poskozena.fdb /home/firebird/fdbs/data-metadata.fbk gbak -REP /home/firebird/fdbs/data-metadata.fbk /home/firebird/fdbs/data-new.fdb #!/bin/sh for table in COMMON_BANKUCTY COMMON_CISMEMO COMMON_DOPRAVA COMMON_DPH COMMON_GOPTIONS COMMON_JAZYKY COMMON_KALENDAR COMMON_KURZY COMMON_LOGCTRL COMMON_MENY COMMON_NAST COMMON_NAVIGATORS COMMON_OPERACE COMMON_POCIT COMMON_SIMJ COMMON_SKUPINY COMMON_STATY COMMON_STRED COMMON_TRIGGERS COMMON_UOPTIONS COMMON_UZIVATELE FAKTURY_CISMEMO FAKTURY_FADPH FAKTURY_FAKTURY FAKTURY_FDRUH FAKTURY_FPOLOZKY FAKTURY_KONSTS FAKTURY_PRIKAZY FAKTURY_PRIKDRUH FAKTURY_PRIKPOL FAKTURY_TEXTY FAKTURY_TYPUHR FAKTURY_UHRDRUH FAKTURY_UHRHL FAKTURY_UHRPOL MAJETEK_CISMEMO MAJETEK_CPOLOZKY MAJETEK_DRUHY MAJETEK_MAJETEK MAJETEK_OSKUPINY MAJETEK_POLOZKY PARTNERI_ADRUH PARTNERI_AKCE PARTNERI_ASTAV PARTNERI_CISMEMO PARTNERI_FAKTADR PARTNERI_FZATRID PARTNERI_PARTNERI PARTNERI_SAKCE PARTNERI_ZASTUPCI PARTNERI_ZFUNKCE PROST_CISMEMO PROST_CNAKL PROST_NAKLADY PROST_PROSDRUH PROST_PROST PROST_VAZBY PROST_VPDRUH PROST_VYKONY PROST_VYKPLAN PROST_VYKPROT PROST_VYKTEXT ROZPOCTY_CDRUH ROZPOCTY_CENIK ROZPOCTY_CISMEMO ROZPOCTY_CREKAP ROZPOCTY_CRNAKL ROZPOCTY_HLAVY ROZPOCTY_KDRUH ROZPOCTY_RDRUH ROZPOCTY_REKAP ROZPOCTY_RKAP ROZPOCTY_RNAKL ROZPOCTY_ROZPOCTY ROZPOCTY_RPOLOZKY ROZPOCTY_SDRUH ROZPOCTY_TYPRKAP ROZPOCTY_VAZBY SKLAD_CDODNAKL SKLAD_CISMEMO SKLAD_DRUHSKL SKLAD_KARTY SKLAD_MATDRUH SKLAD_OBJED SKLAD_OBJPOL SKLAD_PDODNAKL SKLAD_PPOLOZKY SKLAD_PRIJEMKY SKLAD_RECSK SKLAD_REZERV SKLAD_REZERVHL SKLAD_REZOBJDR SKLAD_REZOBJVA SKLAD_SKLADPOL SKLAD_SKLADY SKLAD_VC SKLAD_ZN UCTO_CISMEMO UCTO_CTYP UCTO_DENIK UCTO_OSNOVA UCTO_PDENIK UCTO_ROZVAHA UCTO_SLDRUH UCTO_SLOUPCE UCTO_UAKCE UCTO_UDRUH UCTO_UODRUH UCTO_VYSLEDOVKA V_FAKTURY_UROKY ZAKAZKY_CISMEMO ZAKAZKY_CZAKPOL ZAKAZKY_ZAKAZKY ZAKAZKY_ZAKPOL ZAKAZKY_ZAKPRIJEM ZAKAZKY_ZAKVYK ZAKAZKY_ZDRUH; do echo $table fbexport -S -D /home/firebird/fdbs/data-poskozena.fdb -U sysdba -P Heslo -F $table.fbx -V $table fbexport -I -D /home/firebird/fdbs/data-new.fdb -U sysdba -P Heslo -F $table.fbx -V $table done ===== Převedení databáze z ODS 10.1 (FB 1.5) ===== * gbak: ERROR:file ... is not a valid database * na eposux backup pres FB 1.5 a restore pres 2.5 * gbak localhost/3051:/path/licence.fdb.old licence.fbk * gbak -R licence.fbk localhost:/path/licence.fdb