====== 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=/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/[[firebird:setenv|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/[[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