Процесс Firebird не может получить доступ к файлу

Обновлено: 21.11.2024

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

1. Создание резервных копий с помощью Gbak

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

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

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

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

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

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

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

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

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

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


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

Этот раздел предназначен только для пользователей Windows! Обычно нам нужно выполнять резервное копирование, пока у нас есть активные подключения к базе данных, поэтому вместо встроенного подключения лучше явно указать локальный протокол, чтобы избежать установки монопольной блокировки файла базы данных самим gbak в Firebird 3, т.е. XNET.
Для Firebird 3.0: Для Firebird 2.5 мы можем использовать локальную строку подключения, и она также будет использовать XNET: В Linux Firebird не поддерживает определенный локальный протокол, такой как XNET в Windows, поэтому необходимо использовать Строка подключения TCP/IP (см. раздел 1.3).
Кроме того, XNET работает только для одного экземпляра Firebird, поэтому, если вы запускаете несколько экземпляров Firebird в Windows, может быть проще использовать строку подключения в стиле INET для указания экземпляра целевого сервера

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

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

Это самая универсальная команда gbak для выполнения резервного копирования онлайн.
Windows Linux В этом случае, указав localhost: в начале пути к базе данных, подключение осуществляется через сетевую подсистему Firebird.
Это немного медленнее, чем локальный доступ, но работает во всех случаях, когда у нас есть работающий сервер, который принимает соединения.

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

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

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

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

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

Примечание: в Firebird 2.5 и Firebird 3.0.0-3.0.5 есть существенное ограничение (снято только в 3.0.6): командная строка (все параметры и пути для БД и для бэкапа) должна быть меньше чем 256 символов.

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

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

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

1,5. Самое быстрое резервное копирование с помощью gbak с заторможенной сборкой мусора

Чтобы сделать резервную копию еще быстрее, добавим ключ -g Итак, команда резервного копирования будет следующей
Windows Linux

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

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

Время резервного копирования: 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): Время резервного копирования: 568 секунд

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

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

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

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

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

С помощью Service Manager можно вызвать резервную копию базы данных gbak на удаленном сервере и сохранить ее на том же удаленном сервере. Эта команда через Service Manager вызывает резервное копирование на удаленном сервере с указанием также сохранить файл резервной копии на том же сетевом сервере.
Разумеется, хранилище резервных копий должно быть доступно службе Firebird (в Linux она запускается от имени пользователя «firebird», в Windows — от учетной записи LocalSystem).

1.10. Резервное копирование базы данных Firebird в 6 раз быстрее благодаря многопоточному резервному копированию в HQbird

Если вы по-прежнему недовольны производительностью резервного копирования Firebird gbak, рассмотрите возможность использования корпоративного дистрибутива Firebird: HQbird.
Он поддерживает многопоточное резервное копирование, что позволяет до 6 раз ускорить операции резервного копирования с помощью gbak. Как видите, появился новый параметр -par 8, который заставляет gbak использовать 8 потоков для создания резервной копии.
HQbird (только версия Enterprise) выполняет задачи обслуживания (очистка, резервное копирование, восстановление) намного быстрее (результаты на рисунке ниже, конечно, из другой базы данных):

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

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

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

2.1. Простейшая команда восстановления

В Windows В Linux Прежде всего обратите внимание, что 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», но это очень небезопасно, т.к. правильный способ - изменить владельца базы данных на firebird с помощью следующей команды

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

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

Линукс

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

2.3. Восстановление с помощью XNET в Windows

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

Самый быстрый способ восстановления — использовать Service Manager
Windows Linux. С ключом -se мы вызываем Service Manager по адресу локального хоста и даем ему указание выполнить код восстановления внутри ядра Firebird.

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

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

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

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

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

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

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

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

Поэтому мы можем запустить следующую команду, чтобы восстановить резервную копию по пути, указанному псевдонимом
Windows Linux

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

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

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

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

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

Читайте также: