Эта страница переведена машинным переводом. Читайте английский оригинал. English

Библиотека IBSurgeon

Краткое руководство по резервному копированию и восстановлению с помощью Gbak

Что такое gbak?

1. Осваиваем резервное копирование с помощью Gbak

1.0 Подготовка

1.1 Самое простое резервное копирование Firebird с помощью команды gbak

1.2. Локальное резервное копирование с помощью gbak, которое можно выполнять онлайн в Windows

1.3. Резервное копирование с помощью gbak со строкой подключения TCP/IP

1.4. Более быстрое резервное копирование с помощью gbak с Service Manager

1.5. Самое быстрое резервное копирование с помощью gbak с Service Manager и отключённой сборкой мусора

1.6. Резервное копирование в сетевую папку или сетевое расположение

1.7. Простое резервное копирование с удалённого сервера на локальную машину

1.8. Более быстрое резервное копирование с удалённого сервера на локальную машину с помощью Service Manager

1.9. Резервное копирование базы данных Firebird на удалённом сервере на тот же удалённый сервер с помощью Service Manager

1.10. Резервное копирование базы данных Firebird в 6 раз быстрее с Firebird 5 (или HQbird в 2.5/3.0/4.0/5.0)

2. Восстановление с помощью инструмента Gbak

2.1. Самая простая команда восстановления

2.2. Восстановление со строкой подключения localhost

2.3. Восстановление с XNET в Windows

2.4. Более быстрое восстановление с помощью Service Manager

2.5. Нерекомендуемый переключатель

2.6. Восстановление базы данных с использованием алиаса

2.7. Восстановление локальной резервной копии на удалённом сервере

2.8. Восстановление локальной резервной копии на удалённом сервере с помощью Service Manager

2.9. Восстановление очень длинных таблиц

3. Настройка и журналирование процессов резервного копирования и восстановления

3.1. Gbak с подробным выводом

3.2. Добавление статистики производительности к подробному выводу

3.3. Исключение таблиц из резервного копирования и/или восстановления

3.4. Получение пароля для резервного копирования или восстановления из файла

4. Одношаговое резервное копирование-восстановление

5. Сводка по производительности

Очень часто задаваемые вопросы о виртуальных машинах и резервных копиях Firebird

Приложение A. Ошибки во время резервного копирования/восстановления

Контакты

Что такое gbak?

Gbak - это стандартный инструмент командной строки Firebird (см. его официальную документацию здесь), предназначенный для выполнения 1) полного резервного копирования базы данных: он читает каждую запись в базе данных и сохраняет их в файл резервной копии, 2) восстановления резервной копии в новую базу данных.

Для разработчиков и администраторов с опытом работы с другими СУБД термин «резервное копирование» может быть немного запутанным, поскольку gbak создаёт не точную копию базы данных, а файл в формате, отличном от формата базы данных, содержащий только данные (индексы сохраняются как объявления).

Чтобы создать базу данных из файла резервной копии gbak, необходимо выполнить процесс восстановления с помощью gbak.

1. Осваиваем резервное копирование с помощью Gbak

1.0. Подготовка

Создадим папку C:\data и поместим туда какую-нибудь базу данных. Мы будем использовать базу данных размером 5 ГБ из Firebird OLTP-EMUL test, но вы, конечно, можете использовать свою собственную базу данных.

Для пользователей Linux - создадим папку /db и изменим её владельца на «firebird», затем скопируем туда базу данных (убедитесь, что её владелец также firebird).

Code
mkdir /db
chown firebird -R /db

1.1 Самое простое резервное копирование Firebird с помощью команды gbak

Windows

Code
gbak -b c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b /db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

В этом примере инструмент gbak обращается к файлу базы данных, используя локальный или встроенный доступ.

Firebird 3.0: Встроенный доступ в конфигурации по умолчанию для Firebird 3.0 (с параметром ServerMode = SuperServer в firebird.conf) попытается установить эксклюзивную блокировку на базу данных, поэтому другие подключения не смогут получить доступ к базе данных (или попытка gbak завершится ошибкой из-за активных подключений).

Firebird 2.5: С Firebird 2.5 в Windows команда будет работать нормально через протокол XNET (если у вас запущен только один экземпляр Firebird, конечно). В Linux Firebird попытается использовать встроенный доступ; если он недоступен, он автоматически (и неявно) попытается подключиться через TCP/IP. (Если вы не знаете, что означают XNET, INET и т. д., пожалуйста, обратитесь к Шпаргалке по строкам подключения Firebird).

Примечание 1: Эта команда выполняется от имени учётной записи пользователя ОС (то есть вашей) и использует её права для доступа к файлам резервной копии и базы данных.

Обычно служба Firebird в Windows работает с учётной записью LocalSystem, а в Linux - от пользователя «firebird», но консоль обычно запускается от вашей собственной учётной записи.

Если эта учётная запись не имеет доступа к пути к базе данных или пути к резервной копии, gbak завершится с ошибкой «Cannot open backup file» (см. пример в Приложении A. Ошибки, #5).

Примечание 2: gbak -b молча перезаписывает файл резервной копии. Таким образом, если у вас уже есть backup1.fbk, он будет перезаписан.

Примечание 3: В Linux эта команда gbak создаст файл резервной копии, владельцем которого будет пользователь консоли.

Время резервного копирования для этой команды: 120 секунд

1.2. Локальное резервное копирование с помощью gbak, которое можно выполнять онлайн в Windows

Этот раздел предназначен только для пользователей Windows! Обычно нам нужно выполнять резервное копирование при наличии активных подключений к базе данных, поэтому вместо встроенного подключения лучше явно указать локальный протокол, чтобы избежать установки эксклюзивной блокировки на файл базы данных самим gbak в Firebird 3, то есть XNET.

Для Firebird 3.0:

Code
gbak -b xnet://c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

Для Firebird 2.5 мы можем использовать локальную строку подключения, и она также будет использовать XNET:

Code
gbak -b c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

В Linux Firebird не поддерживает специальный локальный протокол, подобный XNET в Windows, поэтому необходимо использовать строку подключения TCP/IP (см. раздел 1.3).

Кроме того, XNET работает только для одного экземпляра Firebird, поэтому если вы запускаете несколько экземпляров Firebird в Windows, может быть проще использовать строку подключения в стиле INET, чтобы указать целевой экземпляр сервера.

Время резервного копирования: 139 секунд

1.3. Резервное копирование с помощью gbak со строкой подключения TCP/IP

Это самая универсальная команда gbak для выполнения резервного копирования онлайн.

Windows

Code
gbak -b localhost:c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b localhost:/db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

В этом случае, указав localhost: в начале пути к базе данных, подключение выполняется через сетевую подсистему Firebird.

Это немного медленнее, чем локальный доступ, но работает во всех случаях, когда у нас есть запущенный сервер, принимающий подключения.

Нестандартный порт для Firebird

Если у вас Firebird работает на нестандартном порту (например, 3051 вместо 3050), вы можете выполнить резервное копирование следующим образом:

Windows

Code
gbak -b localhost/3051:c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b localhost/3051:/db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

Время резервного копирования: 182 секунды

1.4. Более быстрое резервное копирование с помощью gbak через Service Manager

Как добиться универсальности TCP/IP-соединения с поддержкой нестандартного порта и быстрого локального резервного копирования? Давайте использовать Service Manager! Service Manager, простыми словами, - это способ запуска стандартных инструментов через движок Firebird. Обратите внимание, что в случае Service Manager нет необходимости указывать имя сервера в пути к базе данных, только в параметре -se.

Windows

Code
gbak -b -se localhost:service_mgr c:\Data\test1.fdb  c:\Data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b -se localhost:service_mgr /db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

Эта команда использует переключатель -service, чтобы указать, что мы хотим использовать Service Manager экземпляра Firebird на порту 3050 для выполнения резервного копирования.

В этом случае резервное копирование будет выполняться непосредственно внутри процесса Firebird (в нем есть копия кода gbak), и поскольку внутрипроцессное взаимодействие происходит гораздо быстрее, резервное копирование в этом случае будет значительно быстрее.

Если Firebird работает на нестандартном порту (например, 3051), команда может выглядеть так:

Code
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 (исправлено только в 3.0.6) есть существенное ограничение: командная строка (все параметры и пути к базе данных и резервной копии) должна содержать менее 256 символов.

Если вы столкнулись с этим ограничением, например, из-за длинных путей к базе данных и резервной копии, вы можете объявить псевдоним для базы данных в databases.conf (3.0 и выше) или aliases.conf (2.5):

Code
mydb1=c:\Data\test1.fdb #Windows

или

Code
mydb1=/db/test1.fdb  #linux

и затем использовать его в нашей команде:

Windows

Code
gbak -b -se localhost:service_mgr mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b -se localhost:service_mgr mydb1 /db/backup1.fbk -user SYSDBA -pass masterkey

Время резервного копирования: 115 секунд

1.5. Самое быстрое резервное копирование с помощью gbak с отключенной сборкой мусора

Чтобы сделать резервное копирование еще быстрее, добавим переключатель -g

Code
 -G(ARBAGE_COLLECT)    подавить сборку мусора

Итак, команда резервного копирования будет следующей:

Windows

Code
gbak -b -se localhost:service_mgr -g mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b -se localhost:service_mgr -g mydb1 /db/backup1.fbk -user SYSDBA -pass masterkey

Переключатель -g заставляет движок Firebird отключить сборку мусора для процесса резервного копирования в файле базы данных.

Это не означает, что устаревшие версии записей будут сохранены в файле резервной копии; это означает, что сервер не будет пытаться очистить существующий мусор в базе данных во время резервного копирования, и резервное копирование будет быстрее.

Мы настоятельно рекомендуем использовать этот переключатель, поскольку считаем, что сборка мусора и связанная с ней очистка должны выполняться с помощью sweep (gfix -sweep или autosweep), поэтому лучше не рассматривать gbak как альтернативу sweep.

Время резервного копирования: 105 секунд

1.6. Резервное копирование в сетевую папку или сетевое расположение

Что если нам нужно поместить файл резервной копии в сетевую папку?

В Windows

Частое заблуждение новых пользователей Firebird: ручное резервное копирование (когда вы запускаете команду из командной строки) с помощью простого gbak -b в сетевую папку работает нормально, но быстрая версия gbak с -se localhost:service_mgr не работает.

Причина в том, что Firebird в Windows работает под учетной записью LocalSystem, у которой нет доступа к сетевым расположениям (если только для этих сетевых папок не настроен доступ для группы «Все», но это очень и очень опасно в нашу эпоху программ-вымогателей).

Решение - запускать службу Firebird в Windows под учетной записью с достаточными правами для доступа к сетевой папке и одновременно с достаточными правами для доступа к локальным файлам базы данных и системным файлам в C:\ProgramData\Firebird. Также хорошей идеей будет настроить параметр RestrictAccess в firebird.conf.

В Linux

Поскольку Firebird в Linux работает под учетной записью «firebird», смонтируйте сетевую папку с сопоставлением пользователю «firebird», чтобы служба Firebird могла получить доступ к сетевому расположению так же, как к локальному диску.

1.7. Простое резервное копирование с удаленного сервера на локальную машину

Возможно выполнить резервное копирование базы данных с удаленного сервера на локальную машину.

Пример команды ниже запускается на компьютере с Windows, обращается к базе данных на Linux-сервере (с IP-адресом 192.168.0.108, но, конечно, можно использовать и имя хоста сервера), а файл резервной копии сохраняется в папку C:\Data на Windows:

Code
gbak -b -user SYSDBA -pass masterkey 192.168.0.108:/db/test1.fdb c:\data\remotebackup1.fbk

Время резервного копирования: 568 секунд

Эта команда обычно будет намного медленнее, чем локальное резервное копирование, потому что gbak читает данные с удаленного сервера и передает записи по сети.

1.8. Более быстрое резервное копирование с удаленного сервера на локальную машину с помощью Service Manager

Команда ниже быстрее, чем традиционное резервное копирование с удаленного сервера на локальную машину, описанное в #1.7

Code
gbak -b -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey /db/test1.fdb stdout > C:\Data\remoteback1.fbk

Она использует Service Manager для выполнения резервного копирования на удаленном сервере, но вывод отправляется в stdout-канал, а затем перенаправляется в локальный файл.

Эта команда обычно на 15%-20% быстрее, чем в #1.7 (Простое резервное копирование с удаленного сервера на локальную машину), благодаря следующему:

  1. резервное копирование выполняется через Service Manager на удаленном сервере, поэтому все операции чтения и сжатия выполняются максимально быстро;
  2. по сети передается только итоговый файл резервной копии, размер которого меньше объема данных в базе данных.

Однако с помощью этой команды невозможно включить подробный режим и сохранить подробный вывод в файл журнала.

Время резервного копирования: 473 секунды

1.9. Резервное копирование базы данных Firebird на удаленном сервере на тот же удаленный сервер с помощью Service Manager

С помощью Service Manager можно вызвать резервное копирование базы данных на удаленном сервере и сохранить его также на том же удаленном сервере.

Code
gbak -b -se  192.168.0.108:service_mgr -user SYSDBA -pass masterkey /db/test1.fdb /db/back12.fbk

Эта команда через Service Manager вызывает резервное копирование на удаленном сервере с указанием сохранить файл резервной копии также на том же сетевом сервере.

Конечно, расположение резервной копии должно быть доступно службе Firebird (в Linux она работает от имени пользователя «firebird», в Windows - от имени учетной записи LocalSystem).

1.10. Резервное копирование базы данных Firebird в 6 раз быстрее с многопоточным резервным копированием в Firebird 5 (или HQbird 2.5/3.0/4.0/5.0)

Если вас все еще не устраивает производительность резервного копирования gbak в Firebird, рассмотрите возможность перехода на Firebird 5 (или используйте корпоративный дистрибутив Firebird: HQbird для других версий).

Он поддерживает многопоточное резервное копирование, что позволяет выполнять операции резервного копирования с помощью gbak до 6 раз быстрее.

Code
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 потоков для создания резервной копии.

HQbird выполняет задачи обслуживания (sweep, резервное копирование, восстановление) гораздо быстрее (результаты на рисунке ниже, конечно, получены на другой базе данных):

2. Восстановление с помощью инструмента Gbak

У нас есть файл резервной копии backup1.fbk, созданный одной из приведенных выше команд, и нам нужно восстановить его быстро и эффективно.

Предположим, файл находится в C:\Data\backup1.fbk в случае Windows или /db/backup1.fbk в случае Linux.

2.1. Самая простая команда восстановления

В Windows

Code
gbak -c C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey

В Linux

Code
gbak -c /db/backup1.fbk /db/new1.fdb -user SYSDBA -pass masterkey

Прежде всего, обратите внимание, что gbak -c не перезаписывает файл базы данных, и если существует файл C:\data\new1.fdb или /db/new1.fdb, gbak вернет ошибку о том, что база данных уже существует.

Затем эта команда на самом деле работает совершенно по-разному на 2.5/3.0+ и Windows/Linux.

На Linux эта команда будет использовать встроенный доступ к созданной базе данных (если вы, конечно, не изменили в firebird.conf порядок провайдеров Firebird) как для 3.0, так и для 2.5.

На Windows, на Firebird 3.0 с порядком провайдеров по умолчанию, это будет встроенный доступ, на 2.5 - XNET.

Затем эта команда создает файл с правами пользователя, запустившего gbak, это особенно важно на Linux - если вы запускаете такой gbak под root, владельцем файла базы данных будет root, и процесс Firebird, который работает под пользователем «firebird», не сможет получить доступ к восстановленному файлу.

Примечание для пользователей Linux

Многие люди, чтобы «исправить» права владения, применяют разрешения для всех на доступ к восстановленной базе данных, т.е. что-то вроде «chmod 777 database», но это очень небезопасно, правильный способ - изменить владельца базы данных на firebird с помощью следующей команды

Code
chown firebird /db/new1.fdb

В целом, эта команда достаточно хороша для простого восстановления непродакшн-баз данных (используемых для тестирования или разработки).

Время восстановления: 275 секунд

2.2. Восстановление со строкой подключения localhost

Самый универсальный, но не самый быстрый вариант восстановления следующий:

Windows

Code
gbak -c C:\Data\backup1.fbk localhost:C:\data\new1.fdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c /db/backup1.fbk localhost:/db/new1.fdb -user SYSDBA -pass masterkey

Нестандартный порт

Если Firebird работает на нестандартном порту, например, 3051, его можно указать в команде восстановления:

Windows

Code
gbak -c C:\Data\backup1.fbk localhost/3051:C:\data\new1.fdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c /db/backup1.fbk localhost/3051:/db/new1.fdb -user SYSDBA -pass masterkey

Время восстановления: 1225 секунд

2.3. Восстановление с XNET на Windows

Чтобы сделать восстановление немного быстрее, на Windows мы можем использовать XNET (для Firebird 3.0 и выше):

Code
gbak -c C:\Data\backup1.fbk xnet://C:\Data\New2.fdb -user SYSDBA -pass masterkey

На Firebird 2.5 на Windows доступ XNET будет использоваться с простой командной строкой (если запущен только один экземпляр Firebird):

Code
gbak -c C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey

Время восстановления: 585 секунд

2.4. Более быстрое восстановление с Service Manager

И самый быстрый способ восстановления - использовать Service Manager

Windows

Code
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c -se localhost:service_mgr /db/backup1.fbk localhost:/db/new1.fdb -user SYSDBA -pass masterkey

С переключателем -se мы вызываем Service Manager по адресу localhost и поручаем ему выполнить код восстановления внутри движка Firebird.

Когда восстановление выполняется Service Manager, созданный файл базы данных будет принадлежать учетной записи запущенного экземпляра Firebird (процесса) - это «firebird» на Linux и LocalSystem на Windows.

Время восстановления: 244 секунды

2.5. Нерекомендуемый переключатель

В какой-то момент у вас может возникнуть соблазн использовать следующий переключатель:

Code
   -R(ECREATE_DATABASE) [O(VERWRITE)] создать (или заменить, если используется OVERWRITE)                               базу данных из файла резервной копии (восстановление)
Code
для принудительной замены существующей базы данных новой.

По нашему опыту, этот переключатель значительно увеличивает шансы случайно перезаписать продакшн-базу данных.

Мы настоятельно рекомендуем восстанавливать базу данных каждый раз с новым именем и переименовывать ее, а также явно удалять старую базу данных.

Мы даже не будем приводить пример команды с этим переключателем.

2.6. Восстановление базы данных с использованием алиаса

Можно восстановить базу данных, используя алиас, объявленный в databases.conf (или aliases.conf в Firebird 2.5)

Например, у нас есть следующее объявление

Code
restdb=c:\Data\newrest1.fdb  #Windows

restdb=/db/newrest1.fdb  #Linux

Таким образом, мы можем выполнить следующую команду для восстановления резервной копии по пути, указанному алиасом

Windows

Code
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk restdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c -se localhost:service_mgr /db/backup1.fbk restdb -user SYSDBA -pass masterkey

2.7. Восстановление локальной резервной копии на удаленном сервере

Можно восстановить локальный файл резервной копии на удаленном сервере Firebird.

В этом примере мы восстанавливаем файл резервной копии, хранящийся на Windows, на сервере Linux (его IP-адрес 102.168.0.108):

Code
gbak  -c C:\Data\backup1.fbk 192.168.0.108:/db/newdb1.fdb -user SYSDBA -pass masterkey

Время восстановления: 7009 секунд

Как вы можете заметить, процесс удаленного восстановления работает очень медленно, можем ли мы ускорить его с помощью Service Manager?

2.8. Восстановление локальной резервной копии на удаленном сервере с Service Manager

Чтобы восстановить локальную резервную копию на удаленном сервере с Service Manager, необходимо выполнить трюк с входным потоком stdin:

Code
gbak -c -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey stdin /db/new3.fdb <  C:\Data\backup1.fbk

Эта команда вызывает восстановление на удаленном сервере со стандартным вводом stdin в качестве источника резервной копии - и подает входные данные с помощью части команды < C:\Data\backup1.fbk.

Выглядит немного хитро? Но это простой способ 10-кратного увеличения производительности gbak при восстановлении на удаленном сервере!

Время восстановления: 450 секунд

2.9. Восстановление очень длинных таблиц

Если у вас действительно большая база данных с общим количеством строк более 2 миллиардов, необходимо указать переключатель -o[ne_at_a_time], чтобы восстановить каждую таблицу в отдельной транзакции, чтобы избежать внутреннего переполнения.

Code
gbak -c -se localhost:service_mgr -one C:\Data\backup1.fbk C:\data\new44.fdb -user SYSDBA -pass masterkey

3. Настройка и журналирование процессов резервного копирования и восстановления

3.1. Gbak с подробным выводом

По умолчанию gbak - очень молчаливый инструмент, он ничего не возвращает в случае успешного выполнения. Чтобы сделать его подробным, мы можем добавить переключатель -v[erify]

Code
gbak -b -se localhost/3050:service_mgr -g mydb1  c:\Data\backup1.fbk -v -user SYSDBA -pass masterkey

В результате будет больше деталей. Незначительная, но раздражающая проблема заключается в том, что вывод на консоль может сделать подробное резервное копирование значительно медленнее, чем тихий вариант, поэтому хорошей идеей будет сохранить журнал в файл с переключателем - y logfile:

Code
gbak -b -se localhost/3050:service_mgr -g -v mydb1  c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt

Примечание: gbak не перезапишет существующий файл журнала! Если у вас уже есть C:\data\backuplog1.txt в этом примере, резервное копирование вызовет ошибку (см. #3 в Приложении A).

Примечание 2: существует опция -verbint для управления интервалом сообщений о количестве обработанных записей во время резервного копирования или восстановления.

3.2. Добавление статистики производительности в подробный вывод

В подробном выводе gbak для резервного копирования и восстановления мы можем видеть сообщения, подобные этим:

Code
gbak:    запись данных для таблицы COUNTRY
gbak:16 записей записано

для каждой таблицы и других объектов базы данных.

Интересно выяснить, какие таблицы/объекты занимают больше всего времени, верно?

Для этого необходимо использовать переключатель -st(atistics):

Code
 -ST(ATISTICS) TDRW    показать статистику:
     T                 время от начала
     D                 дельта времени
     R                 чтения страниц
     W                 записи страниц
Code
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

При применении он добавит в журнал следующие столбцы:

Code
gbak: время   дельта  чтения  записи

так что мы сможем видеть время и операции ввода-вывода, затраченные на каждую строку.

3.3. Исключение таблиц из резервного копирования и/или восстановления

Если вы считаете, что некоторые таблицы можно исключить из резервного копирования (хороший пример - очень длинная таблица журналов), вы можете указать их в параметре SK[IP_DATA] с регулярным выражением в качестве параметра.

В приведенном ниже примере мы исключаем данные из таблиц COUNTRY и JOB из резервной копии:

Code
gbak -b -se localhost/3050:service_mgr -g -v mydb1 -SKIP_D ‘(COUNTRY|JOB)’ c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt

А в приведенном ниже примере мы исключаем таблицу CLIENT из восстановления:

Code
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk C:\data\new33.fdb -user SYSDBA -pass masterkey -SKIP_D "CLIENT"

Обратите внимание, что параметр для SKIP_DATA должен передаваться как единый параметр, поэтому он должен быть в кавычках!

В Linux кавычки должны быть одинарными, в Windows - двойными.


Меры предосторожности при исключении таблиц из резервного копирования и/или восстановления

Мы настоятельно рекомендуем проверить условие регулярного выражения перед его использованием с помощью следующего запроса - он вернет список таблиц, соответствующих условию фильтра (в запросе кавычки всегда одинарные):

Code
SQL> SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE TRIM(RDB$RELATION_NAME) SIMILAR TO '(COUNTRY|JOB)';

RDB$RELATION_NAME
===============================
COUNTRY
JOB

Обратите внимание, что таблицы будут исключены из резервного копирования или восстановления независимо от существующих ограничений (внешних ключей), поэтому, если вы не спланировали такое исключение тщательно, очень легко получить ошибку «Cannot commit foreign key index» во время процесса восстановления.

3.4. Получение пароля для резервного копирования или восстановления из файла

Если вам не нравится идея раскрывать пароль всем, кто видит ваши команды, вам понравится следующий переключатель: -fetch passwordfile

Давайте создадим файл с паролем в C:\Data\passfile.txt и используем его (здесь мы используем очень простой встроенный вариант, конечно, переключатель будет работать и с Service Manager):

Code
gbak -b c:\Data\test1.fdb c:\Data\backup5.fbk -user SYSDBA -fetch C:\Data\passfile.txt

Здесь есть 2 практических преимущества:

  1. Если мы храним пароль в одном файле, мы можем гарантировать, что все наши командные файлы всегда будут использовать актуальный пароль.
  2. Мы не раскрываем пароль в каждом командном файле.

4. Резервное копирование-восстановление за один шаг

Часто целью резервного копирования является немедленное восстановление, чтобы получить новую свежую базу данных, например, для применения нового размера страницы для базы данных или для миграции существующей базы данных с версии 2.5 на 3.0.

В этом случае можно выполнить резервное копирование-восстановление одной командой, используя стандартный ввод и вывод в качестве источников для соответствующих команд, чтобы обойти создание промежуточного файла резервной копии, уменьшить требования к свободному месту и ускорить процесс.

Команда выглядит следующим образом:

Code
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

По сути, здесь мы выполняем 2 команды, объединенные символом |,

первая для резервного копирования в stdout:

Code
gbak -b -se localhost:service_mgr -g -user SYSDBA -password masterkey C:\Data\test1.fdb stdout

и вторая для восстановления из stdin:

Code
gbak -c -se localhost:service_mgr -user SYSDBA -password masterkey stdin C:\Data\new10.fdb

Эта команда является самым быстрым способом выполнить резервное копирование-восстановление на том же экземпляре Firebird.

Обратите внимание: для конвертации баз данных с помощью одношагового резервного копирования-восстановления с версии 2.5 на 3.0 необходимо использовать 2 экземпляра Firebird, подробности см. здесь.

5. Сводка по производительности

На следующем рисунке содержится информация о скорости различных команд резервного копирования локальной резервной копии тестовой базы данных:

Как вы можете видеть, самый быстрый способ выполнить локальное резервное копирование - использовать Service Manager (переключатель -se[rvice]) и отключить сборку мусора (переключатель -ig).

Для резервного копирования с удаленного сервера на локальную машину Service Manager также является лучшим вариантом:

Ситуация с производительностью восстановления аналогична: Service Manager - самый быстрый способ восстановления.

Что касается довольно редкого случая, когда восстановление выполняется из локальной резервной копии на удаленный сервер, использование Service Manager с трюком stdin является единственным жизнеспособным вариантом:

Очень часто задаваемый вопрос о виртуальных машинах и резервных копиях Firebird

Почему я должен использовать инструменты резервного копирования Firebird, когда есть популярные инструменты резервного копирования, которые обещают создать резервную копию всего?

Или: я создаю полный образ виртуальной машины, зачем мне беспокоиться о резервном копировании базы данных Firebird?

Ответ находится здесь.

Приложение A. Ошибки при резервном копировании/восстановлении

  1. Попытка запустить gbak без параметров или с пользователем, не являющимся владельцем базы данных/не SYSDBA, приведет к следующей ошибке:
Code
gbak: ERROR:Unable to perform operation.  You must be either SYSDBA or owner of the database
gbak:Exiting before completion due to errors
  1. Если вы укажете неправильный пароль, появится следующая ошибка:
Code
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
  1. Ошибка возникает, когда существующий файл указан как место назначения подробного журнала:
Code
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
  1. Ошибка возникает, если существующая база данных указана в команде восстановления gbak как место назначения:
Code
gbak: ERROR:database C:\data\new1.fdb already exists.  To replace it, use the -REP switch
gbak:Exiting before completion due to errors
  1. Ошибка возникает, когда gbak пытается записать резервную копию в место, где у него недостаточно прав на запись:
Code
gbak: ERROR:cannot open file  /db/test1.fbk
gbak:Exiting before completion due to errors
  1. Когда gbak пытается получить доступ к файлу без разрешения на это - например, файл имеет другого владельца, чем пользователь «firebird» в Linux:
Code
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 errors
  1. Попытка использовать подробный вывод:
Code
C:\HQbird\Firebird30>gbak -se 192.168.0.108:service_mgr -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 errors
  1. Попытка выполнить резервное копирование с Service Manager на удаленном сервере с включенным подробным режимом и сохранением в файл журнала:
Code
C:\HQbird\Firebird30>gbak -se 192.168.0.108:service_mgr -v -st tdrw -y lg1.txt  -user SYSDBA -pass masterkey /db/test1.f
db stdout  > c:\data\rembackup2.fbk
gbak: ERROR:Invalid clumplet buffer structure: string length doesn't match with clumplet
gbak:Exiting before completion due to errors
  1. Ошибка при одношаговом резервном копировании-восстановлении, когда резервное копирование по какой-то причине не удается:
Code
gbak: ERROR:No request from user for stdin data
gbak:Exiting before completion due to errors
  1. Если вы пытаетесь передать gbak не резервную копию:
Code
gbak: ERROR:unavailable database
gbak:Exiting before completion due to errors
gbak: ERROR:expected backup description record
gbak:Exiting before completion due to errors
  1. Резервное копирование поврежденного файла базы данных с неправильной страницей сообщит о следующей ошибке (номер и файл базы данных, конечно, будут отличаться):
Code
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 errors

Code

## Контакты

Пожалуйста, не стесняйтесь обращаться к нам с любыми вопросами или сообщать об ошибках и опечатках: [email protected]