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.
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.
<Data Name="data"> <Caption>data2007</Caption> <Type>sql</Type> <Database>eposux:/home/firebird/epos/data.fdb</Database> </Data>
gbak -R -V -user sysdba -password heslo c:\zaloha\data.fbk server:c:\adresar\dat\data.fdb
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
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.
Je třeba editovat soubor etc/obisrc.xml kam se přidá nová databáze např. takto:
<Data Name="data-obnova"> <Caption>Obnovena databaze</Caption> <Type>sql</Type> <Database>server:/home/firebird/data-obnova.fdb</Database> </Data>
Použití:
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
Použití:
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
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=/mnt/data/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/setenv.sh
sudo cp ~/.obis_profile /mnt/data/firebird/ sudo chown firebird:firebird /mnt/data/firebird/.obis_profile sudo vim /mnt/data/firebird/.obis_profile #vymazat adminpass sudo -u firebird /mnt/data/obis/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
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
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
scripts/setenv.sh
scripts/checkoit.sh
#!/bin/sh . `dirname $0`/setenv.sh #export DEBUG=true $ROOTDIR/bin/checkoit.sh -kill_server -sweep
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
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
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