Копирование таблиц из одной базы данных в другую, в Firebird 2.1 - PullRequest
0 голосов
/ 06 июля 2018

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

Я использовал FBcopy, но получил ответ от босса, что этослишком медленноЭто должно быть сделано в более чем одной транзакции, потому что таблицы довольно большие.Есть идеи, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Это старый вопрос, но;

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

Вы также можете проверить триггеры на целевой таблице и отключить ненужные. Есть ли триггеры выбора или вставки в другие таблицы?

Вы также можете отключить «принудительную запись» в целевой базе данных. Я предполагаю, что у вас есть сервер с резервным блоком питания и дисковой системой (или облачным) После копирования вы можете снова включить «принудительную запись». https://www.firebirdsql.org/pdfmanual/html/gfix-sync.html

0 голосов
/ 08 июля 2018

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

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

В целевой базе данных вы можете затем выбрать из внешней таблицы и вставить в окончательную целевую таблицу.

При создании и использовании внешних таблиц помните следующее:

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

  • Правильная интерпретация символьных данных зависит от набора символов (как для правильного преобразования символов, так и для длины данных), например, столбцы UTF8 в 4 раза больше заявленной длины. При создании внешних таблиц явно объявляйте набор символов, чтобы избежать проблем, например, с различными наборами символов по умолчанию между базами данных.

    Разница между использованием однобайтового набора символов по сравнению с 4-байтовым набором символов приведет к чрезмерному повреждению, поскольку CHAR(100) в базе данных WIN1252 будет записываться / считываться как 100 байтов, но в базе данных UTF8 это будет записывать / читать как 400 байт. Поэтому не забудьте явно использовать набор символов, например, CHAR(100) CHARACTER SET WIN1252.

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

  • Внешние таблицы не поддерживают BLOB-объекты или массивы.

  • Вы не можете удалять или обновлять строки во внешней таблице. Чтобы очистить его, вам нужно удалить базовый внешний файл (Firebird автоматически создаст новый файл при необходимости).

  • Невозможно определить ограничения первичного ключа или внешнего ключа, а также индексы для внешних таблиц

Чтобы иметь возможность использовать внешние таблицы, вам необходимо настроить Firebird, чтобы он мог обращаться к этим файлам. В firebird.conf сервера измените значение ExternalFileAccess со значения по умолчанию None на ExternalFileAccess = Restrict <path>, где путь - это папка или список папок, разделенных точкой с запятой, к которым у Firebird есть доступ. Прочитайте документацию об этой опции в файле конфигурации!

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

create table customer (
    id integer constraint pk_customer primary key,
    customer varchar(25) character set win1252 not null
)

Затем вы создаете эквивалентную внешнюю таблицу:

create table ext_customer external file 'D:\data\DB\exttables\ext_customer.dat' (
    id integer not null,
    customer varchar(25) character set win1252 not null
)

Создайте эту таблицу как в исходной, так и в целевой базе данных.

Затем в исходной базе данных поместите данные клиента во внешнюю таблицу:

insert into ext_customer (id, customer) select id, customer from customer;

Обязательно совершите коммит.

В целевой базе данных вы можете использовать данные. Например, если таблица customer в настоящее время пуста, вы можете просто сделать то, что мы сделали в исходном коде:

insert into customer (id, customer) select id, customer from ext_customer;

Если вам нужно больше контроля, посмотрите на MERGE.

...