FBCLONE

fbclone — это консольная утилита для копирования баз данных Firebird, предназначенная для создания клонов баз данных с возможностью изменения параметров, таких как размер страницы, кодировка и исключение определённых таблиц.

Общее назначение программы

fbclone используется для:

  • Копирования базы данных Firebird из одного файла в другой.
  • Переноса данных между базами с возможностью фильтрации таблиц.
  • Автоматического дампа SQL-скрипта из базы.
  • Ремонтного дампа SQL, если во время копирования возникают ошибки.
  • Перекодировки данных между разными наборами символов (charset).
  • Изменения размера страниц (page size) у целевой базы данных.

Подробное описание флагов и параметров fbclone

-h, –help – выводит справку с описанием всех доступных параметров.

-v, –verbose – включает подробный режим работы, показывая больше деталей в логе.

-po, –pump-only – переносит только данные из исходной базы в целевую без создания структуры. Исходная и целевая базы должны иметь одинаковую структуру.

-e, –empty-tables – перед копированием данных очищает все таблицы в целевой базе.

-ics, –ignore-charset – игнорирует кодировку исходной базы и использует кодировку по умолчанию.

-ko, –keep-octets – сохраняет кодировку OCTETS при использовании -ics.

-ic, –ignore-collation – игнорирует настройки сортировки (collation) в исходной базе данных.

-f, –failsafe – включает безопасный режим, фиксируя (commit) транзакцию после каждой записи (эквивалентно -ci 1).

-ci, –commit-interval – задаёт интервал фиксации транзакций в количестве записей.

-d, –dump – создаёт дамп SQL из исходной базы данных и сохраняет его в указанный файл.

-rd, –repair-dump – создаёт SQL-дамп с исправлениями в файл repair.sql, если во время клонирования произошли ошибки.

-ps, –page-size – устанавливает размер страниц в целевой базе данных.

Параметры подключения к исходной базе данных

-s, –source – строка подключения к исходной базе (обязательный параметр).

-su, –source-user – имя пользователя для подключения.

-sp, –source-password – пароль для подключения.

-sl, –source-library – клиентская библиотека Firebird, используемая при подключении.

Параметры подключения к целевой базе данных

-t, –target – строка подключения к целевой базе (обязательный параметр).

-tu, –target-user – имя пользователя для подключения.

-tp, –target-password – пароль для подключения.

-tl, –target-library – клиентская библиотека Firebird, используемая при подключении.

-tc, –target-charset – кодировка целевой базы (по умолчанию совпадает с кодировкой исходной базы).

Управление кодировками

-rc, –read-charset – кодировка для чтения данных из исходной базы.

-wc, –write-charset – кодировка для записи данных в целевую базу.

-xt, –exclude-table – список таблиц, которые нужно исключить из переноса данных (через запятую).

Общие параметры

-u, –user – имя пользователя, используемое и для исходной, и для целевой базы.

-p, –password – пароль, используемый и для исходной, и для целевой базы.

-l, –library – клиентская библиотека Firebird для подключения к обеим базам.

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

Примеры использования

Полное клонирование базы данных

"E:\fbclone-master\fbclone.exe" -s "localhost:/path/to/source.fdb" -t "localhost:/path/to/target.fdb" -u SYSDBA -p masterkey

Клонирование с изменением размера страницы

"E:\fbclone-master\fbclone.exe" -s "source.fdb" -t "target.fdb" -u SYSDBA -p masterkey -ps 8192

Перекачивание только данных без структуры

"E:\fbclone-master\fbclone.exe" -s "source.fdb" -t "target.fdb" -po

Клонирование с исключением таблиц

"E:\fbclone-master\fbclone.exe" -s "source.fdb" -t "target.fdb" -xt "LOGS,TEMP_DATA"

Клонирование с игнорированием кодировки

"E:\fbclone-master\fbclone.exe" -s "source.fdb" -t "target.fdb" -ics

Конвертация базы с win1251 в UTF8

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

В Firebird размер строки в типах данных VARCHAR и других строковых полях определяется не количеством символов, а количеством байт, которое может быть использовано для хранения данных. Это важно учитывать, особенно когда речь идет о многобайтовых кодировках, таких как UTF-8.

Ограничения Firebird по размеру строки

Максимальная длина строки в базе данных Firebird составляет 64 КБ (65535 байт). Однако это ограничение относится именно к количеству байт, а не символов. Это имеет важные последствия для работы с кодировками, где символы могут занимать разное количество байт.

UTF-8 — это многобайтовая кодировка, которая может использовать от 1 до 4 байт для хранения одного символа. Это означает, что строка длиной в 16384 символа может занимать от 16384 байт (если все символы — это символы ASCII) до 65536 байт (если каждый символ занимает 4 байта, как это бывает с символами, находящимися в диапазоне Unicode, для которых требуется больше байтов).

Когда в Firebird пытаются создать столбец с типом VARCHAR(16384) в кодировке UTF-8, система рассчитывает это как количество байт, а не символов. В худшем случае, если каждый символ занимает 4 байта, строка с 16384 символами будет занимать 65536 байт, что превышает максимальное ограничение Firebird в 65535 байт.

Таким образом, в UTF-8 максимальная длина строки для поля VARCHAR будет меньше, чем в однобайтовых кодировках, таких как WIN1251, поскольку каждый символ UTF-8 может занимать больше байт.

Кодировка WIN1251 — это однобайтовая кодировка, где каждый символ занимает ровно 1 байт. В случае использования этой кодировки, ограничение на 65535 байт позволяет создать строку длиной до 16384 символов (65535 байт / 1 байт на символ = 65535 символов). Это проще, потому что каждый символ занимает постоянное количество байт, и нет необходимости учитывать различные длины символов, как в случае с UTF-8.

Практическое следствие

Когда идет работа с многобайтовыми кодировками, такими как UTF-8, и пытаетесь создать строковое поле с определенным количеством символов, важно учитывать, что фактический размер строки в байтах может значительно превышать ожидания. Если вы хотите создать поле, которое может содержать 16384 символа в UTF-8, вам нужно учитывать, что в худшем случае каждый символ может занимать до 4 байт, что уменьшает фактическое количество символов, которые могут быть сохранены в строке.

Команда запуска конвертации кодировки

123123