fbrescue

Перенос данных из Firebird в PostgreSQL

Эта страница — про перенос данных при миграции: как перенести все таблицы базы Firebird 2.5–5.0 в PostgreSQL. fbrescue читает файл .fdb напрямую, поэтому старый сервер запускать не нужно, а его CSV — именно то, что ждёт COPY в PostgreSQL.

1. Выгрузка

fbrescue export old.fdb --out data

Получится data/schema.sql с описаниями таблиц и по CSV на таблицу. Если программа под Windows хранила текст в CHARACTER SET NONE, добавьте --charset WIN1251 (или кодовую страницу, с которой она работала).

2. Создать таблицы

schema.sql написан на SQL Firebird. Создайте в PostgreSQL те же таблицы с такими типами:

Firebird (schema.sql) PostgreSQL
SMALLINT, INTEGER, BIGINT, BOOLEAN, DATE, TIME, TIMESTAMP, DOUBLE PRECISION те же
NUMERIC(p,s), DECIMAL(p,s), INT128, DECFLOAT numeric(p,s) / numeric
FLOAT real
CHAR(n) / VARCHAR(n) CHARACTER SET … char(n) / varchar(n) (база в UTF-8)
BLOB SUB_TYPE TEXT text
BLOB SUB_TYPE BINARY (или 0) bytea — в CSV шестнадцатеричный вид: загрузите в text, затем decode(col, 'hex')
TIMESTAMP WITH TIME ZONE timestamptz — в CSV местное время и имя пояса

Имена в schema.sql записаны прописными буквами в кавычках ("CUSTOMERS"). Либо оставьте их в кавычках и в PostgreSQL, либо переведите в нижний регистр — и в схеме, и в командах ниже. Точность NUMERIC в schema.sql максимальная для размера хранения: NUMERIC(18,2) вместо NUMERIC(12,2). Если знаете исходную точность, используйте её.

3. Загрузка

for f in data/*.csv; do
  t=$(basename "$f" .csv)
  psql -d target -c "\copy \"$t\" FROM '$f' WITH (FORMAT csv, HEADER true)"
done

Формат CSV в PostgreSQL читает пустое поле как NULL, а "" — как пустую строку. fbrescue пишет ровно так же.

4. Что создать заново

fbrescue переносит таблицы и строки. Первичные и внешние ключи, индексы, генераторы (последовательности), триггеры, процедуры и представления не выгружаются: создайте их в PostgreSQL. Каждую последовательность выставьте за максимальный ключ, например SELECT setval('customers_id_seq', (SELECT max(id) FROM customers));.

MySQL, SQL Server, SQLite

Тот же CSV и те же шаги:

Проверьте, как каждая СУБД читает пустые поля: не все загружают их как NULL.

Подробнее о CSV — выгрузка базы Firebird в CSV.