(c) AK, сентябрь 2020г, оригинал (en), + kdv (правки и перевод), 11.10.2024-20.12.2024.
Что такое gbak?
1. Создание резервных копий с gbak
1.0 Подготовка
1.1 Простейшая резервная копия командой gbak
1.2. Локальный онлайн-бэкап на Windows
1.3. Бэкап с использованием строки коннекта TCP/IP
1.4. Более быстрый бэкап через Service Manager
1.5. Быстрый бэкап с выключением сборки мусора
1.6. Бэкап на сетевой ресурс
1.7. Простой бэкап с удаленного сервера на локальный компьютер
1.8. Быстрый бэкап с удаленного сервера на локальный через Service Manager
1.9. Бэкап базы на удаленном компьютере через Service Manager
1.10. Бэкап до 6 раз быстрее с использованием многопоточности Firebird 5 или HQbird 2.5/3.0/4.0
2. Восстановление базы из резервной копии
2.1. Самая простая команда
2.2. Восстановление базы с localhost
2.3. Восстановление базы через XNET на Windows
2.4. Быстрое восстановление через Service Manager
2.5. Не рекомендуемые опции
2.6. Восстановление базы с использованием псевдонима
2.7. Восстановление локального бэкапа на удаленный сервер
2.8. Восстановление локального бэкапа на удаленный сервер через Services Manager
2.9. Восстановление очень больших таблиц
3. Логирование бэкапа и рестора
3.1. Gbak с подробным выводом
3.2. Добавляем статистику производительности к подробному выводу
3.3. Исключение таблицы из бэкапа или при восстановлении
3.4. Получение пароля из файла
4. Потоковый backup-restore
5. Итог по производительности
Ответ на очень частый вопрос про VM (виртуальные машины) и бэкапы баз Firebird
Приложение A. Ошибки при бэкапе/восстановленииErrors during backup/restore
Контакты
Для разработчиков и администраторов с опытом работы с другими СУБД термин "бэкап" может быть неясным, поскольку gbak делает не совсем 100% копию базы данных, а всего-лишь сохраняет данные в файл специфического формата (причем, без содержимого индексов).
Для восстановления базы из резервной копии нужен процесс восстановления также при помощи gbak.
Документация по утилите физического резервного копирования nbackup - здесь.
mkdir /db chown firebird -R /db
gbak -b c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkeyLinux
gbak -b /db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkeyВ этом примере gbak использует доступ к базе данных как embedded.
gbak -b xnet://c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkeyДля Firebird 2.5 можно использовать локальную строку коннекта, это тоже будет использовать протокол XNET:
gbak -b c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkeyНа Linux Firebird не поддерживает протокол XNET, поэтому вместо локального коннекта нужно использовать TCP/IP (см. раздел 1.3).
gbak -b localhost:c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkeyLinux
gbak -b localhost:/db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkeyВ этом случае указываем localhost: перед путем и именем базы данных. Коннект происходит через сетевую подсистему Firebird.
gbak -b localhost/3051:c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkeyLinux
gbak -b localhost/3051:/db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkeyДлительность бэкапа: 182 секунд
gbak -b -se localhost:service_mgr c:\Data\test1.fdb c:\Data\backup1.fbk -user SYSDBA -pass masterkeyLinux
gbak -b -se localhost:service_mgr /db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkeyЭти команды используют опцию -service для указания использования Service Manager экземпляра Firebird на порту 3050.
В этом случае бэкап производится непосредственно процессом Firebird (в коде Firebird есть копия кода gbak (и не только)), и поскольку коммуникация внутри одного процесса гораздо быстрее, то и процесс бэкапа тоже происходит намного быстрее.
Если Firebird работает на нестанадртном порту (например 3051), то команда будет такой:
gbak -b -se localhost/3051:service_mgr c:\Data\test1.fdb c:\Data\backup1.fbk -user SYSDBA -pass masterkeyЗамечание : В Firebird 2.5 и Firebird 3.0.0-3.0.5 есть ограничение на длину всей командной строки в 256 символов. Ограничение снято только в 3.0.6.
Если вы достигли такого лимита, например, из-за длинных путей и имени базы и бэкапа, вы можете немного сократить строку, если укажете псевдоним базы данных в databases.conf (3.0 и выше) или aliases.conf (2.5):
mydb1=c:\Data\test1.fdb #Windowsили
mydb1=/db/test1.fdb #linuxи затем использовать этот псевдоним в командах:
gbak -b -se localhost:service_mgr mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkeyLinux
gbak -b -se localhost:service_mgr mydb1 /db/backup1.fbk -user SYSDBA -pass masterkey
Длительность бэкапа : 115 секунд
-G(ARBAGE_COLLECT) inhibit garbage collectionВ этом случае командная строка будет следующей:
gbak -b -se localhost:service_mgr -g mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkeyLinux
gbak -b -se localhost:service_mgr -g mydb1 /db/backup1.fbk -user SYSDBA -pass masterkey
Опция -g выключает в Firebird проверку на мусорность версий записей и саму сборку мусора в этом коннекте (опция -se тут ни при чем, ее может и не быть как в предыдущих вариантах).
Это не означает, что при отсутствии опции -g в бэкап "попадет мусор". Никакой "мусор" никогда не попадает в бэкап, потому что gbak в своей транзакции, читающей данные из БД и сохраняющей их в бэкап, видит только последние сохраненные (committed) версии записей. А поскольку с опцией -g проверка более старых версий выключена, процесс бэкапа происходит быстрее.
Мы настоятельно рекомендуем использовать эту опцию, т.к. чистка базы от мусора должна производиться операцией sweep (gfix -sweep или autosweep), так что лучше не возлагать на gbak задачу "сборщика мусора".
Также, если база повреждена, и повредились версии записей, опция -g исключит их проверку, и бэкап такой базы может быть успешным, в отличие от бэкапа без опции -g.
Длительность бэкапа : 105 секунд
На Windows
Частая ошибка пользователей Firebird: выполнение обычного gbak -b с указанием бэкапа на сетевой ресурс работает, а более быстрый вариант -se localhost:service_mgr - не работает.
Причина - служба Firebird на Windows работает под пользователем LocalSystem, который не имеет и не может получить доступ к сетевым ресурсам (разве что если сетевой ресурс выдан группе "Все" ("Everyone"), но это весьма опасно делать в нынешние времена с шифровальщиками и прочим вредоносным ПО).
Решением здесь может быть запуск службы Firebird под явно созданным аккаунтом, которому выданы соответствующие права на нужный сетевой ресурс, локальные базы, и в том числена файлы в C:\ProgramData\Firebird. Также хорошей идеей является настройка параметра DatabaseAccess в firebird.conf.
На Linux
Поскольку на Linux Firebird работает под аккаунтом "firebird", монтируйте сетевые ресурсы с отображением пользователю "firebird", в результате чего служба Firebird будет иметь доступ как к локальному диску, так и к сетевому ресурсу.
gbak -b -user SYSDBA -pass masterkey 192.168.0.108:/db/test1.fdb c:\data\remotebackup1.fbkДлительность бэкапа : 568 секунд
gbak -b -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey /db/test1.fdb stdout > C:\Data\remoteback1.fbkЗдесь используется Service Manager для создания резервной копии на удаленном сервере, но вывод отправляется в stdout, откуда направляется в локальный файл.
gbak -b -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey /db/test1.fdb /db/back12.fbkЭта команда инициирует бэкап на удаленном сервере через Service Manager, при этом пути и имя базы и бэкапа являются локальными для удаленного сервера.
gbak -b -par 8 -se localhost:service_mgr -g C:\Data\testbigdb1.fdb c:\Data\backup1.fbk -user SYSDBA -pass masterkeyКак видите, в командной строке указан новый параметр -par 8, который указывает gbak использовать 8 потоков для создания бэкапа.
! Несмотря на то, что здесь и далее используется термин "восстановление", на самом деле restore это не совсем восстановление. Restore это последовательность операций
Таким образом, при восстановлении БД из бэкапа вы всегда получите новую БД со старыми данными (теми, которые существовали на момент бэкапа в старой БД).
Допустим, у нас есть резервная копия backup1.fbk, созданная одной из команд выше, и нам нужно из нее восстановить базу данных.
Предположим, что этот файл находится на диске как C:\Data\backup1.fbk в случае Windows, или /db/backup1.fbk в случае Linux.
gbak -c C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkeyНа Linux
gbak -c /db/backup1.fbk /db/new1.fdb -user SYSDBA -pass masterkeyОбратите внимание, что параметр -c не перезапишет существующую базу данных, если на диске уже есть C:\data\new1.fdb или /db/new1.fdb. Gbak вернет ошибку, что такая база данных уже есть.
При этом, команда работает по разному на версиях 2.5/3.0+ и Windows/Linux.
На Linux, эта команда будет использовать embedded-доступ для создания базы данных (если вы не меняли порядок провайдеров в firebird.conf), как 3.0 так и 2.5.
На Windows, Firebird 3.0 со стандартным порядком провайдеров будет использовать embedded-доступ, а 2.5 – XNET.
Эта команда создаст базу данных с правами того, кто стартовал gbak, и это особенно важно для Linux – если вы запускаете такую команду под рутом (root), владельцем файла базы данных будет root, и далее Firebird, работающий под пользователем "firebird", не сможет получить доступ к этой базе данных (речь именно о владельце файла БД, а не об имени владельца БД в смысле SQL).
Замечание для пользователей Linux
Многие, с целью "исправить" владельца файла, применяют права всех для созданной базы данных, например "chmod 777 database", но это небезопасно. Правильно будет поменять владельца файла именно на пользователя "firebird"
chown firebird /db/new1.fdb
В целом, команда простая и достаточная для баз, находящихся в разработке или тестировании.
Длительность : 275 секунд
gbak -c C:\Data\backup1.fbk localhost:C:\data\new1.fdb -user SYSDBA -pass masterkey
Linux
gbak -c /db/backup1.fbk localhost:/db/new1.fdb -user SYSDBA -pass masterkey
gbak -c C:\Data\backup1.fbk localhost/3051:C:\data\new1.fdb -user SYSDBA -pass masterkeyLinux
gbak -c /db/backup1.fbk localhost/3051:/db/new1.fdb -user SYSDBA -pass masterkeyДлительность команды : 1225 секунд
gbak -c C:\Data\backup1.fbk xnet://C:\Data\New2.fdb -user SYSDBA -pass masterkeyВ Firebird 2.5 на Windows протокол XNET и так будет использован, если указано имя базы без имени сервера:
gbak -c C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkeyДлительность команды : 585 секунд
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkeyLinux
gbak -c -se localhost:service_mgr /db/backup1.fbk localhost:/db/new1.fdb -user SYSDBA -pass masterkeyС опцией -se, мы командуем через Service Manager серверу на localhost выполнить восстановление БД. Пути к базе и бэкапу должны быть локальными, как и в случае бэкапа.
При восстановлении БД через Service Manager у созданного файла БД будут права пользователя Firebird - "firebird" на Linux, и LocalSystem на Windows (если на Windows Firebird работает не под специально созданным пользователем.
Длительность команды : 244 секунды
-R(ECREATE_DATABASE) [O(VERWRITE)] create (or replace if OVERWRITE used) database from backup file (restore)или
-REP(LACE_DATABASE) replace database from backup file (restore)с целью принудительной замены существующей базы данных на восстанавливаемую из бэкапа.
По нашему опыту, эти опции весьма увеличивают шанс перезаписать вашу рабочую БД (особенно, если -r или -rep вы привыкли использовать при тестировании или разработке БД. Такая привычка - плохая).
Мы крайне рекомендуем восстанавливать БД из бэкапа в базу с новым именем, или вначале переименовывать существующую БД, а уже потом удалять "старую БД", если это необходимо (на Linux переименование БД с существующими коннектами ничего не изменит, и эти коннекты продолжат работу со старой БД).
Так что, мы не будем давать примеров использования этих опций.
Например, у нас есть такое определение:
restdb=c:\Data\newrest1.fdb #Windows restdb=/db/newrest1.fdb #LinuxЗначит, мы можем использовать следующие команды для восстановления БД
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk restdb -user SYSDBA -pass masterkeyLinux
gbak -c -se localhost:service_mgr /db/backup1.fbk restdb -user SYSDBA -pass masterkey
В этом примере мы восстанавливаем бэкап, хранимый на Windows, в базу данных на сервере Linux (с адресом IP 102.168.0.108):
gbak -c C:\Data\backup1.fbk 192.168.0.108:/db/newdb1.fdb -user SYSDBA -pass masterkeyДлительность восстановления : 7009 секунд
gbak -c -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey stdin /db/new3.fdb < C:\Data\backup1.fbkЭта команда перенаправляет файл бэкапа в stdin на удаленном сервере.
Выглядит странновато, но позволяет ускорить восстановление БД почти в 15 раз.
Длительность восстановления : 450 секунд
gbak -c -se localhost:service_mgr -one C:\Data\backup1.fbk C:\data\new44.fdb -user SYSDBA -pass masterkey
gbak -b -se localhost/3050:service_mgr -g mydb1 c:\Data\backup1.fbk –v -user SYSDBA -pass masterkeyВ результате вы увидите массу подробностей. Минусом здесь является некоторое замедление процесса, в отличие от работы gbak без вывода, так что лучше подробный вывод направлять не на консоль, а в файл опцией -y logfile:
gbak -b -se localhost/3050:service_mgr -g -v mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt
Note: gbak не будет перезаписывать существующий лог! Если у вас уже есть C:\data\backuplog1.txt, как в этом примере, то будет выдана ошибка (см. #3 в Приложении А).
Note 2: есть дополнительная опция -verbint n для сокращения вывода о количестве сохраняемых или восстанавливаемых записей. Например, ... -verbint 1000000.
gbak: writing data for table COUNTRY gbak:16 records writtenдля каждой таблицы и других объектов базы даных.
Для этого используйте опцию -st(atistics):
-ST(ATISTICS) TDRW show statistics: T time from start D delta time R page reads W page writes
gbak -b -se localhost/3050:service_mgr -g -v mydb1 -st tdrw c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txtКогда указана эта опция, в логе появятся столбцы:
gbak: time delta reads writesПо которым можно понять длительность и объем ввода-вывода для каждого объекта.
В примере ниже мы исключаем таблицы COUNTRY и JOB из бэкапа::
gbak -b -se localhost/3050:service_mgr -g -v mydb1 c:\Data\backup1.fbk -SKIP_D '(COUNTRY|JOB)' -user SYSDBA -pass masterkey -y C:\data\backuplog1.txtВ следующем примере мы исключаем таблицу CLIENT при восстановлении из бэкапа:
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk C:\data\new33.fdb -SKIP_D "CLIENT" -user SYSDBA -pass masterkeyОбратите внимание, что параметры для SKIP_DATA должны быть переданы как единое целое, поэтому должны быть обрамлены кавычками!
SQL> SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE TRIM(RDB$RELATION_NAME) SIMILAR TO '(COUNTRY|JOB)'; RDB$RELATION_NAME =============================== COUNTRY JOBОбратите внимание, что таблицы будут исключены из бэкапа или восстановления независимо от существующих ограничений целостности (Foreign Keys), поэтому есть риск получить ошибку “Cannot commit foreign key index” во время восстановления из бэкапа.
Создадим файл с паролем SYSDBA в файле C:\Data\passfile.txt и используем его в простом варианте бэкапа (опция работает и с использованием Service Manager):
gbak -b c:\Data\test1.fdb c:\Data\backup5.fbk -user SYSDBA -fetch C:\Data\passfile.txtЕсть 2 преимущества у такого способа:
В этом случае есть возможность сделать бэкап-рестор одной командой, используя потоки ввода-вывода без создания промежуточного файла бэкапа. В этом случае не требуется дисковое пространство для файла бэкапа, а также сокращается время бэкапа-рестора.
Пример команды:
gbak -b -se localhost:service_mgr -g -user SYSDBA -password masterkey C:\Data\test1.fdb stdout | gbak -c -se localhost:service_mgr -user SYSDBA -password masterkey stdin C:\Data\new10.fdbКак видите, здесь две команды, объединенные символом |,
gbak -b -se localhost:service_mgr -g -user SYSDBA -password masterkey C:\Data\test1.fdb stdoutа затем идет восстановление из stdin
gbak -c -se localhost:service_mgr -user SYSDBA -password masterkey stdin C:\Data\new10.fdbЭта команда является самой быстрой для бэкапа-рестора на одном экземпляре Firebird.
Для конвертации баз из одной версии Firebird в другую, например из 2.5 в 3.0, необходимо использовать два экземпляра Firebird, более подробно метод описан в статье.
или
Я делаю бэкап образа диска виртуальной машины, зачем мне думать еще и про бэкап базы Firebird?
Краткий ответ: база данных Firebird это файл случайного доступа (random-access file), поэтому он может быть корректно скопирован внешними средствами только если служба Firebird остановлена (т.е. файл БД не открыт службой Firebird). А бэкапы дисков виртуальных машин сохраняют копию БД в состоянии, аналогичном после нажатия кнопки Reset. Поэтому для бэкапа дисков виртуальных машин для БД Firebird нужно выполнять дополнительные действия (см. описание утилиты nbackup).
1) Запуск gbak без параметров, или с некорректным именем пользователя:
gbak: ERROR:Unable to perform operation. You must be either SYSDBA or owner of the database gbak:Exiting before completion due to errors
2) Неверный пароль:
gbak: ERROR:Your user name and password are not defined. Ask your database administrator to set up a Firebird login. gbak:Exiting before completion due to errors
3) Указан существующий файл для подробного вывода
gbak: ERROR:cannot open status and error output file C:\data\backuplog1.txt gbak: ERROR: Exiting before completion due to errors gbak:Exiting before completion due to errors
4) При восстановлении указано имя существующего файла БД
gbak: ERROR:database C:\data\new1.fdb already exists. To replace it, use the -REP switch gbak:Exiting before completion due to errors5) У gbak/Service Manager нет прав доступа в целевую папку
gbak: ERROR:cannot open file /db/test1.fbk gbak:Exiting before completion due to errors
6) У gbak нет прав доступа к файлу БД
gbak: ERROR:no permission for read-write access to database /db/test1.fdb gbak: ERROR: IProvider::attachDatabase failed when loading mapping cache gbak:Exiting before completion due to errors7) Попытка использовать подробный вывод при бэкапе в stdout
C:\HQbird\Firebird30>gbak -se 192.168.0.108:service_mgr -b -g -v -st tdrw -user SYSDBA -pass masterkey /db/test1.fdb stdout > c:\data\rembackup2.fbk gbak: ERROR:standard output is not supported when using split operation or in verbose mode gbak: ERROR: Exiting before completion due to errors gbak:Exiting before completion due to errors8) Попытка бэкапа через Service Manager в stdout с подробным выводом.
C:\HQbird\Firebird30>gbak -se 192.168.0.108:service_mgr -b -g -v -st tdrw -y lg1.txt -user SYSDBA -pass masterkey /db/test1.fdb stdout > c:\data\rembackup2.fbk gbak: ERROR:Invalid clumplet buffer structure: string length doesn't match with clumplet gbak:Exiting before completion due to errors9) Ошибка в процессе потокового бэкапа-рестора:
gbak: ERROR:No request from user for stdin data gbak:Exiting before completion due to errors10) Бэкап некорректного формата (или не бэкап вообще)
gbak: ERROR:unavailable database gbak:Exiting before completion due to errors gbak: ERROR:expected backup description record gbak:Exiting before completion due to errors11) Бэкап поврежденной БД (с повреждением какой-либо страницы БД)
gbak: ERROR:database file appears corrupt (E:\DATABASE1.FDB) gbak: ERROR: wrong page type gbak: ERROR: page 9294588 is of wrong type (expected 8, found 0) gbak: ERROR:gds_$get_segment failed gbak:Exiting before completion due to errors gbak: ERROR:Unexpected I/O error while reading from backup file gbak:Exiting before completion due to errors12) восстановление бэкапа Firebird 5 в Firebird 3
gbak: ERROR:Expected backup version 1..10. Found 11 gbak:Exiting before completion due to errors