Особенности запуска менеджера QDB и командно-строковые параметры
В этой статье:
Каталог базы данных QDB может находиться в любой файловой системе QNX или POSIX, которая доступна для чтения/записи (в том числе в файловых системах в ОЗУ, таких как tmpfs). Можно запускать сервер QDB из любых файловых систем QNX, доступных по протоколу Qnet, но не из файловых систем CIFS и NFS.
Файл схемы содержит все команды SQL, которые создают требуемую схему базы данных. Пример:
CREATE TABLE customers(
customerid INTEGER PRIMARY KEY AUTOINCREMENT,
firstname TEXT,
lastname TEXT
);
Сохраните этот код в файле /db/customerdb.sql
.
Файлы схем баз данных (например, /db/customerdb.sql
) необходимо добавлять в файл конфигурации службы QDB перед запуском ее сервера. Дополнительную информацию см. в разделе "Конфигурационный файл" далее.
Сервер QDB должен выполняться от имени пользователя root
.
При отладке следует запускать qdb с ключом -vvvvvvvV для вывода подробной информации; многократное использование ключа v повышает уровень детализации (поддерживаются 7
уровней). Параметр -V выводит сообщения на консоль и в журнал sloginfo.
После запуска QDB можно проверить доступность баз данных с помощью команды ls /dev/qdb/. В предыдущем примере должен существовать файл /dev/qdb/customerdb
.
Файловая система, которую QDB использует в качестве временного хранилища, должна поддерживать блокирование файлов в соответствии со стандартом POSIX. Блокирование файлов необходимо для очистки баз данных.
QDB проверяет временное хранилище следующим образом:
- Если в командной строке указан параметр tempstore (-o tempstore), QDB проверяет, что указанное местоположение:
- существует
- доступно для записи
- не является каталогом
/dev/shmem
- не является ссылкой на каталог
/dev/shmem
Если все перечисленные условия выполняются, QDB использует местоположение, указанное в параметре tempstore, в качестве внутреннего временного хранилища. Если какое-либо из условий не выполняется, QDB регистрирует ошибки в журнале sloginfo и не запускается.
- Если в командной строке отсутствует параметр tempstore (-o tempstore), утилита QDB определяет местоположение временного хранилища с помощью переменной TMPDIR и проверяет, что оно:
- существует
- доступно для записи
- не является каталогом
/dev/shmem
- не является ссылкой на каталог
/dev/shmem
Если все перечисленные условия выполняются, QDB использует местоположение, указанное в переменной TMPDIR, в качестве внутреннего временного хранилища. Если какое-либо из условий не выполняется, QDB регистрирует ошибки в журнале sloginfo и не запускается.
Пользователь может создавать списки баз данных, с которыми можно работать так, как будто они образуют единую базу данных. Включение базы данных в такое объединение называется автоматическим присоединением. Можно разделять базу данных на несколько фрагментов для повышения производительности (каждый фрагмент базы данных блокируется индивидуально, что повышает оперативность доступа к ней нескольких пользователей) и частичного переноса базы данных на другие накопители (такие как файловая система в ОЗУ).
Список баз данных считывается из файла конфигурации и задается параметром __Auto Attach=__. Дополнительную информацию см. в разделе "Конфигурационный файл" далее.
Чтобы присоединить несколько баз данных к другой базе данных (несколько разделов к другому разделу), необходимо, чтобы порядок их перечисления в файле конфигурации и в параметре Auto Attach был одинаковыми. Ниже приведены примеры корректных и некорректных списков баз данных. Для удобства в них показаны только заголовки разделов (без параметров).
Порядок определения разделов не соответствует порядку присоединения баз данных.
[mme_library]
[mme_temp]
[mme_custom]
[mme]
Auto Attach = mme_library
Auto Attach = mme_custom
Auto Attach = mme_temp
Порядок определения разделов соответствует порядку присоединения баз данных.
[mme_library]
[mme_custom]
[mme_temp]
[mme]
Auto Attach = mme_library
Auto Attach = mme_custom
Auto Attach = mme_temp
Порядок определения разделов соответствует порядку присоединения баз данных.
[mme_library]
[mme_temp]
[mme_custom]
[mme]
Auto Attach = mme_library
Auto Attach = mme_temp
Auto Attach = mme_custom
При запуске QDB проверяет целостность баз данных в соответствии с параметром -I. Поддерживаются следующие режимы проверки:
- none=
- целостность базы данных не проверяется
- basic=';'
- проверяется только способность sqlite анализировать строку
- partial='PRAGMA database_list;'
- проверяется список баз данных PRAGMA
- full='PRAGMA integrity_check;'
- проверяется целостность базы данных
 | Чем больше действий QDB выполняет при проверке, тем длительнее процесс запуска. В производственной среде необходимо соблюдать оптимальный баланс между подробностью проверки и скоростью запуска QDB. |
Можно выполнять операторы SQL над базами данных QDB с помощью командно-строковой утилиты qdbc.
Настройки службы QDB хранятся в одном файле, который указывается в командно-строковом параметре -c. Если этот файл находится в том же каталоге, что SQL-файлы базы данных (по умолчанию /db/
), в файле конфигурации можно указывать относительные пути к файлам схемы и базы данных. В противном случае необходимо задавать абсолютные пути.
Файл конфигурации состоит из текстовых строк. Пустые строки, а также пробелы в начале и конце строк, игнорируются. Строки, которые начинаются с символа "#", являются комментариями. Файл конфигурации состоит из именованных разделов, каждый из которых имеет имя, указанное в квадратных скобках ("[ ]"). За каждым разделом указаны строки параметров, которые имеют формат key=value. Параметры применяются к соответствующему разделу.
Имя раздела совпадает с именем базы данных, которое отображается в каталоге /dev/qdb
и используется клиентами для подключения к ней. Далее база данных настраивается с помощью следующих параметров:
- Filename=
- Задает имя файла базы данных, который представляет собой необработанный файл sqlite. В этом параметре можно указывать как произвольный абсолютный путь, так и путь относительно каталога, в котором находится файл конфигурации). При запуске qdb должен существовать этот файл или каталог, в котором он будет создан (в противном случае qdb завершается с соответствующей ошибкой). Если файл базы данных не существует, он восстанавливается из последней работоспособной резервной копии (при ее наличии) либо создается с нуля.
- Schema=
- Schema File=
- Эти параметры описывают исходную схему базы данных посредством команд SQL, которые создают первоначальный набор таблиц, индексов, представлений, данных и др. Если база данных не существует, эти параметры описывают новую базу данных. Команды SQL могут находиться в файле конфигурации или в отдельном файле, который указывается с помощью абсолютного или относительного имени.
Исходная схема не является обязательной; при ее отсутствии создается пустая база данных. - Client Schema=
- Задает схему клиента, которая выполняется, когда пользователь вызывает функцию qdb_connect(). Описанный механизм можно использовать для создания межбазовых триггеров.
- Auto Attach=
- Задает базу данных, которая присоединяется к текущей базе данных с помощью SQL-оператора SQL ATTACH DATABASE при установлении соединения с ней. В этом параметре указывается имя раздела присоединяемой базы данных, а не имя ее файла. Можно указывать несколько баз данных в отдельных строках Auto Attach=line.
Механизм присоединения обеспечивает удобный доступ к таблицам, которые физически хранятся в различных файлах баз данных. QDB позволяет выполнять над присоединенными базами данных другие операции сопровождения, такие как резервное копирование и очистку.
См. "Автоматическое присоединение баз данных" ранее. - Backup Dir=
- Задает каталог для хранения резервной копии базы данных. Можно указывать несколько каталогов в отдельных строках Backup Dir=line; в этом случае они поочередно используются для сохранения файлов резервных копий. Эта функция обеспечивает сохранность прежней резервной копии, если прерывается процесс создания текущей резервной копии или происходит сбой питания.
Указанный каталог должен существовать на момент запуска qdb (наличие в нем действительной резервной копии не обязательно); в противном случае qdb завершается с соответствующей ошибкой. Если в этих каталогах находятся файлы существующих резервных копий, они сортируются по дате, перезаписываются в прямом порядке во время резервного копирования и используются в обратном порядке при восстановлении отсутствующей или поврежденной базы данных. - Compression=
- Алгоритм сжатия, который применяется к резервным копиям. Поддерживаются значения none (сжатие не выполняется), lzo (сжатие LZO) или bzip (сжатие BZIP2). Алгоритм сжатия lzo является самым быстрым, а bzip обеспечивает максимальную степень сжатия. Имена сжатых файлов образуются из имен исходных файлов базы данных путем добавления к ним соответствующих расширений. По умолчанию файлы резервных копий не сжимаются.
- Collation=
- Function=
- Эти параметры определяют соответственно пользовательские процедуры сортировки и скалярные/агрегирующие функции. Аргумент задается в формате tag@l.nosp@m.ibra.nosp@m.ry.so, где tag — символьное имя структуры описания функции, а library.so — имя совместно используемой библиотеки, которая содержит код. Дополнительную информацию см. в главе Создание пользовательских функций.
В процессе запуска QDB проверяет, существуют ли указанные библиотеки и символы, и завершается с соответствующей ошибкой, если не удается их обнаружить. - Vacuum Attached=
- Backup Attached=
- Size Attached=
- Эти параметры определяют операции по сопровождению, которые по умолчанию выполняются над присоединенными базами данных одновременно с основной базой данных. Параметры могут иметь значения TRUE|FALSE, YES|NO или ON|OFF. По умолчанию значение всех параметров равно FALSE. В рамках одного раздела базы данных можно многократно присваивать значения этим параметрам и применять их к различным присоединяемым базам данных:
[db]
Vacuum Attached = TRUE
Auto Attach = db1
Vacuum Attached = FALSE
Auto Attach = db2
В этом примере операция qdb_vacuum() над базой данных db будет также выполнена над базой данных db1, но не над базой данных db2.
Настройка Backup Attached=TRUE позволяет использовать функцию, аналогичную прежним файлам *.bks
. Дополнительную информацию о применении операций сопровождения к присоединенным базам данных см. в описаниях функций qdb_vacuum(), qdb_backup() и qdb_getdbsize().
Чтобы создать базу данных в оперативной памяти, укажите путь к файлу диска в ОЗУ в параметре Filename=.
С помощью параметра Filename=_:memory:_ можно создавать временные базы данных, которые хранятся в оперативной памяти и видны только в пределах соответствующего подключения. При подключении к такой базе данных создается временный файл, который удаляется при закрытии подключения.
- Backup Via=
- Промежуточный каталог, в который копируется база данных в процессе резервного копирования. Для обеспечения целостности резервной копии qdb блокирует чтение базы данных при ее копировании и сжатии; если резервная копия помещается на медленный накопитель (например, во флеш-память), блокировка базы данных может быть длительной.
Пример: Backup Via=/dev/shmem. При резервном копировании QDB блокирует базу данных, копирует ее в /dev/shmem
и разблокирует ее. На следующем этапе qdb копирует базу данных в каталог, который указан в параметре Backup Dir=, и сжимает ее, при этом база данных остается разблокированной. - Compress Via=TRUE|FALSE
- Этот параметр используется совместно с параметром Backup Via= и параметром Compression= резервной копии. По умолчанию Backup Via= сначала создает необработанную/несжатую копию базы данных во временном каталоге, а затем сжимает ее. Этот метод работает при достаточном количестве памяти и максимально быстро разблокирует базу данных, однако можно экономить память, выполняя более длительное копирование с одновременным сжатием. По умолчанию этот параметр имеет значение FALSE; если задать его равным TRUE, сжатие выполняется на первом этапе.
Несколько клиентов могут совместно использовать подключение к базе данных. Для настройки совместного доступа используется параметр -C. Поддерживаются следующие режимы подключения:
- unique
- В ответ на каждый запрос клиента создается новое подключение. Этот режим предназначен для библиотек sqlite версий до 3.3.1, которые не рассчитаны на выполнение в многопоточной среде.
- private
- Каждому клиенту предоставляется постоянное частное подключение в рамках сеанса; это подключение создается, когда клиент выполняет операцию присоединения, и уничтожается при отсоединении. Этот режим обеспечивает обратную совместимость и используется, если в функцию qdb_connect() не передается флаг QDB_CONN_DFLT_SHARE.
- reuse
- Этот режим аналогичен private, но подключения не уничтожаются, а возвращаются в пул и могут назначаться новым клиентам до тех пор, пока пул существует.
- share
- Этот режим аналогичен unique, но в нем также используется пул подключений. В этом режиме все клиенты распределяются между небольшим количеством активных подключений к базе данных.
Механизм совместного использования подключений к базам данных предусмотрен в связи с тем, что при создании подключения QDB выполняет целый ряд действий — выделяет память, обращается к файлам, присоединяет базы данных и функции обратного вызова, настраивает параметры подключений и др. Если клиенты не хранят текущее состояние, необходимость выполнять перечисленные действия отсутствует. Сервер QDB обнаруживает изменения, которые клиент вносит в параметры подключения, и восстанавливает их при выходе подключения из пула и возвращении в пул в режимах unique, reuse или share.
Совместное использование подключений является безопасным, если клиент не вносит деструктивные изменения в среду посредством SQL (например, выполняя оператор DETACH DATABASE). Тем не менее, для обеспечения полной обратной совместимости можно переопределять режим совместного доступа к подключениям при каждом вызове функции qdb_connect(), и в libqdb по умолчанию используется режим доступа private.
Если клиент не закрывает транзакции при многократном обращении к функции qdb_statement(), ему требуется отдельное подключение; для этого необходимо использовать режим private или reuse либо не устанавливать флаг QDB_CONN_DFLT_SHARE.
По умолчанию при запуске QDB включены общий доступ к кешу и эксклюзивный режим:
- Для отключения общего доступа к кешу укажите параметр -D в командной строке.
- Если общий доступ к кешу включен, QDB имеет эксклюзивное право записи в базу данных. Чтобы разрешить другим приложениям использовать файлы базы данных, воспользуйтесь параметром -A.
 | Утилита QDB немедленно завершается, если при ее запуске отключен общий доступ к кешу и включен эксклюзивный режим:
qdb -c /db/qdb.cfg -v -D -Otempstore=/fs/tmpfs -Rset
qdb: Exclusive locking mode requires that shared cache
be enabled. |
Общий доступ к кешу увеличивает производительность работы с базами данных и уменьшает общее количество памяти, которое необходимо подключениям, поскольку несколько подключений используют одну и ту же кеш-память.
Например, если одному подключению к базе данных требуется 1 Мбайт памяти, то без общего доступа к кешу для 40 подключений необходимо выделять 40 Мбайт, а при включенном общем доступе к кешу достаточно 25 Мбайт или другого объема в зависимости от среды и требуемой производительности. Кроме того, благодаря отсутствию копий данных в памяти 25 Мбайт достаточно, чтобы почти полностью разместить базу данных и фактически отказаться от дискового ввода/вывода.
Параметр -R задает действия QDB в случае, если файл базы данных отсутствует или поврежден:
- auto
- Операции над файлами выполняются полностью автоматически; QDB всегда принимает все возможные меры для корректного подключения к базе данных на этапах запуска и выполнения. Резервное копирование и восстановление файлов выполняются в индивидуальном порядке.
Поврежденный или отсутствующий файл базы данных восстанавливается из последней обнаруженной корректной резервной копии, а при ее отсутствии создается пустая база данных на основе исходного определения схемы. - manual
- При отсутствии файла базы данных в момент запуска QDB только создает пустую базу данных из исходного определения схемы. Базы данных не восстанавливаются из резервных копий. Если файл поврежден, сервер не запускается. Если файл становится недоступным или повреждается в процессе выполнения QDB, работа с базой данных прекращается, а сама база данных не восстанавливается и не создается заново. Этот режим позволяет создавать новую систему или вручную управлять послеаварийным восстановлением (например, сохранять поврежденную базу данных для дальнейшего анализа).
- set
- Резервные копии присоединенных баз данных обрабатываются как связанное множество — при возникновении ошибки в одной базе данных qdb восстанавливает файлы всех баз данных. Этот режим полезен, если присоединенные базы данных содержат ссылки друг на друга.
Главная база данных присоединяет другие базы данных с помощью параметра Auto Attach в файле конфигурации. Набор резервных копий состоит из главной базы данных и всех присоединенных баз данных с установленным параметром Backup Attached. Главная база данных позволяет создавать инкрементные резервные копии и при этом входит в состав набора.
 | При резервном копировании и восстановлении согласованного набора баз данных мы рекомендуем выполнять следующие действия: - для главной базы данных (к которой присоединяются другие базы данных) в файле конфигурации QDB:
- Запустите QDB с параметром -R set.
- При резервном копировании вызовите функцию qdb_backup() для главной базы данных с аргументом scope, равным QDB_ATTACH_DEFAULT.
|
Существуют два параметра, которые задают следующие интервалы ожидания:
- Параметр -t задает интервал ожидания на пользовательском уровне; по умолчанию он применяется к каждому подключению, которое создается функцией qdb_connect(), однако этот параметр можно переопределять для конкретных подключений с помощью функции qdb_setbusytimeout().
- Параметр -T задает глобальный внутренний интервал ожидания; он применяется к подключениям, которые созданы без клиентского контекста — например, для проверки существующих баз данных, создания новых баз данных при запуске и автоматического присоединения баз данных.
Параметр -X позволяет задавать программу или сценарий, которую служба qdb запускает при обнаружении поврежденной базы данных. Если программа или сценарий выполняются корректно, qdb продолжает работу. При необходимости программа или сценарий должны останавливать и запускать службу qdb.
Пример команды запуска qdb с параметром -X:
qdb -c /etc/qdb.cfg -X /usr/bin/recover_db.sh
Ниже приведен сценарий, который qdb может запускать при обнаружении поврежденной базы данных:
recover_db.sh:
#!/bin/sh
#
# This script will kill qdb and mme,
# remove the database files
# on disk, and restart qdb and mme.
slay qdb mme-generic
rm -f /fs/tmpfs
 | - Чтобы завершить службу qdb, не завершая сценарий, отправьте ей сигнал
SIGTERM (генерируется утилитой slay по умолчанию). Так, служба qdb обеспечивает доступность потока, который используется функцией popen() для запуска сценария, и регистрирует результаты в журнале до тех пор, пока сценарий не завершает работу.
- Сигнал
SIGKILL немедленно завершает работу qdb. Сценарий продолжает выполняться, но его результаты не сохраняются. |
Можно размещать команды сопровождения базы данных в записи /dev/qdb/.control
и считывать их результат. На текущий момент поддерживаются следующие команды:
- backup DBNAME
- Создает резервную копию базы данных ( qdb_backup())
- vacuum DBNAME
- Выполняет очистку базы данных ( qdb_vacuum())
- verify DBNAME
- Проверяет целостность базы данных (аналогично командно-строковому параметру -I full)
- cancel DBNAME
- Отменяет выполняемые операции резервного копирования ( qdb_bkcancel())
Предыдущий раздел: перейти