Obsah

Zálohování databází

GBAK

Vlastnosti

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.

  <Data Name="data">
    <Caption>data2007</Caption>
    <Type>sql</Type>
    <Database>eposux:/home/firebird/epos/data.fdb</Database>
  </Data>

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:

  <Data Name="data-obnova">
    <Caption>Obnovena databaze</Caption>
    <Type>sql</Type>
    <Database>server:/home/firebird/data-obnova.fdb</Database>
  </Data>

Backup/restore databází pro aktualizaci ODS

Použití:

  1. skript se spouští se přímo v adresáři s FDB
  2. kontrola verze ODS: upgrade_ods.sh *.fdb
  3. backup/restore - verzi ODS zadat dle aktuálně nainstalovaného firebird: upgrade_ods.sh -upgrade 11.2 *.fdb
  4. 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í:

  1. skript se spouští se přímo v adresáři s FDB
  2. nastavit heslo ve skriptu
  3. otestovat co se bude kopírovat: copy_to_server.sh ~/obis5/etc/obisrc.xml *.fdb
  4. soubory databáze NESMÍ na cílovém serveru existovat
  5. apt-get install pv
  6. 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=/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

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/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)