Процесс 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
- он выполняет резервное копирование через Service Manager на удаленный сервер, поэтому все операции чтения и сжатия выполняются максимально быстро,
- передает по сети только полученный файл резервной копии, размер которого меньше данных в базе данных
Время резервного копирования: 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 в качестве источника резервной копии — и предоставляет ввод с помощью
Читайте также: