Мельница данных- Перекачка данных  (раздел целиком)  (18.01.2025)
Перекачка данных

Для осуществления перекачки данных необходимо:

  1. Иметь права владельца схемы в БД - приемнике.
  2. Иметь права владельца схемы в БД - источнике.
  3. Если не задан ключ /M, то БД - приемник должен быть пустой схемой, не содержащей никаких объектов.
Эти условия контролируются утилитой dbsetup.exe.

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

Приемник Источник
БД MSSQL БД Firebird БД Oracle БД PostgreSQL Папка, файл, zip-архив
БД MSSQL Стандартная перекачка данных
БД Firebird Предпринимается попытка использовать механизм загрузки данных из внешних таблиц ("external table"). Предпринимается попытка использовать механизм "внешний источник данных" ("external data source"). Предпринимается попытка использовать механизм загрузки данных из внешних таблиц ("external table").
БД Oracle Предпринимается попытка использовать механизм загрузки данных из внешних таблиц ("table organization external"). Предпринимается попытка использовать механизм "связи БД" ("database link").
Предпринимается попытка использовать механизм загрузки данных из внешних таблиц ("table organization external").
БД PostgreSQL Предпринимается попытка использовать механизм загрузки данных из внешнего текстового файла оператором COPY. Предпринимается попытка использовать расширение "dblink". Предпринимается попытка использовать механизм загрузки данных из внешнего текстового файла оператором COPY.
Папка, файл, zip-архив Стандартная перекачка данных Предпринимается попытка собрать на сервере blob, содержащий целевой xml-документ. Не имеет смысла.
Просто скопируйте файлы.

Используемые параметры и ключи командной строки:

Для перекачки данных используюется команда pump. В строке соединения указывается БД-приемник, кроме случая перекачки данных из БД в папку, файл или zip-архив. Для всех случаев кроме случая перекачки данных из БД в папку, файл или zip-архив командная строка содержит кляузу pump from. Для случая перекачки данных из БД в папку, файл или zip-архив командная строка содержит кляузу pump to.
Пример
Перекача данных из БД Oracle в БД Firebird:
dbsetup.exe fb#sysdba/masterkey@host:database pump from ora#dataowner/password@host/sid.dataowner
    
Перекача данных из zip-архива в БД Firebird:
dbsetup.exe fb#sysdba/masterkey@host:database pump from c:\dbbackup.zip
    
Перекача данных из БД Firebird в zip-архив:
dbsetup.exe fb#sysdba/masterkey@host:database pump to c:\dbbackup.zip
    

Ключ Назначение
/J <Целое число> Определяет число потоков, осуществляющих перекачку данных. По умолчанию соответствует количеству ядер процессора.
/H <Целое число> Определяет базовое количество записей в блоке перекачки. По умолчанию - 1 млн. записей. Для таблиц, содержащих большие объекты (blob и/или clob) размер блока перекачки определяется как базовый размер блока, деленный на 100. Если источником является папка, файл или zip-архив - ключ игнорируется.
/M Пропустить этап создания таблиц и последовательностей в БД (таблицы и последовательности должны быть созданы заранее).
/G Пропустить этап заливки данных, произвести только создание таблиц и последовательностей в БД.
/K <Список таблиц> Не перекачивать данные указанных таблиц. Список таблиц разделяется символом ";" (точка с запятой).
/NODBLINK Принудительно отключает механизмы связи между БД на сервере.
/NOCSV Принудительно отключает механизмы загрузки данных из внешнего файла.
/NOXML Принудительно отключает механизмы cборки xml-документа на сервере.

Важно!
Информация о значениях типа "внешние данные" будет перенесена из источника в приемник, сами внешние данные при этом перенесены в хранилище не будут.

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

При перекачке данных таже осуществляется перенос последовательностей. При этом переносится текущее значение каждой из последовательностей. Значение кеша последовательности переносится только в том случае, если это понятие релевантно для источника и для приемника. При использовании папки, файла или zip-архива значение кеша сохраняется в файле Sequences, и будет использовано, если окажется релевантным.

После завершения перекачки данных в схеме-приемнике остаются следующие объекты:

  • Таблицы данных.
  • Первичные ключи таблиц данных.
  • Последовательности.
  • Заголовки системных объектов платформы.

Этот набор минимально достаточен, чтобы с помощью синхронизации (загрузив метаданные из таблиц, с ключем /T) восстановить метаданные БД в соответствующей схеме, и работать с ней средствами платформы.

Особенности перекачки данных в папку, файл или zip-архив:

При использовании папки она рассматривается как хранилище файлов перекачки. При использовании файла он рассматривается как хранилище файлов перекачки в формате Microsoft Compound File. При использовании zip-архива он рассматривается как хранилище файлов перекачки. Хранилище файлов перекачки содержит следующие файлы:

  • FormatSettings - xml-файл с информацией о региональных настройках процесса, сформировавшего хранилище.
  • Sequences - xml-файл с информацией о текущих значениях последовательностей.
  • RTTI - xml-файл с информацией о таблицах и полях. Также содержит информацию о табличных пространствах.
  • <Имя Таблицы> с возможным числовым постфиксом в скобках - xml-файл с данными таблицы в стандартном xml-представлении.
  • #<Длина файла в 16-ричном представлении, 16 символов><CRC файла в 16-ричном представлении, 8 символов> - двоичный файл с содержимым blob/clob. Такие файлы формируются для объектов, чей размер превышает 1MB.

Остальные файлы в хранилище будут проигнорированы (если хранилище используется как источник) или удалены (если хранилище используется как приемник).

Если в качестве приемника используется zip-архив, то механизм перекачки данных будет использовать информацию об уже содержащихся в архиве файлах, и не будет повторно "пересжимать" уже имеющиеся файлы. Таким образом, можно удобно релизовать "инкрементальное резервное копирование", указывая в качестве приемника перекачки данных один и тот же zip-архив.


1. Стандартная перекачка данных

Стандартная процедура перекачки блока данных заключается в открытии однонаправленного курсора на основании запроса типа select... from "..." к таблице-источнику, подготовке запроса insert into "..."("ID",.....) values (:Param1, :Param2....) к приемнику, и многократному выполнению этого единожды подготовленного запроса по мере продвижения вперед по курсору-источнику. Все значения полей при этом проходят через клиентскую сторону, и заливка данных осуществляется по одной записи за одно выполнение запроса. Характерная скорость такой заливки - порядка 5000 записей в секунду.

Oracle
Оператор INSERT в процессах перекачки данных всегда формируется с подсказкой /*+ APPEND */.

Важно!
Описанные далее механизмы оптимизации не могут использоваться одновременно. Если какой-либо из них может быть использован в вашей ситуации - постарайтесь обеспечить условия, необходимые для их работы. Вы получите значительное ускорение перекачки.


2. Механизмы связи между БД на сервере

Firebird
Будут формироваться и выполняться блоки вида
01execute block as
02  declare "ID" BIGINT;
03  declare "P0" SMALLINT;
04  .....
05begin
06  for execute statement 'select "ID", .... from "...."'
07    on external data source '....' as user '...' password '....'
08    into :"ID",:"P0",..... do
09      insert into "...."("ID",....)
10      values (:"ID",:"P0",.....);
11end
    

Oracle
Механизм может быть использован, если пользователь-владелец схемы имеет право CREATE DATABASE LINK, и оператор create database link будет выполнен без ошибок. При этом будет создан link с именем "SYS$PUMP". После завершения процедуры перекачки данных link будет удален. Таким образом, можно в целях безопасности выдавать право CREATE DATABASE LINK владельцу схемы данных только на время перекачки данных. При этом генерируются и выполняются операторы вида
1INSERT /*+ APPEND */ INTO "..."("ID", ....)
2SELECT "ID", ....
3  FROM "..."@"SYS$PUMP"
4...
    

Postgres
Механизм может быть использован, если в БД установлено стандартное расширение "dblink", и оператор select public.dblink_connect('user=... password=.......') будет выполнен без ошибок. При этом генерируются и выполняются операторы вида
01do $$
02declare
03  cnt int;
04begin
05  perform public.dblink_connect('user=... password=... ....');
06  perform public.dblink_open('SYS$....', 'select T."ID", ..... from "...." T');
07  loop
08    insert into "...." ("ID", .....)
09    select T."ID" from public.dblink_fetch('SYS$.....', 1000000)
10    as T("ID" bigint, .....);
11    get diagnostics cnt = row_count;
12    exit when cnt = 0;
13  end loop;
14end; $$
    

Механизм может быть принудительно заблокирован ключем /NODBLINK.


3. Загрузка данных из внешнего файла

Firebird
Чтобы использовать загрузку из внешнего файла, необходимо, чтобы одновременно выполнялись следующие условия:
  • Сервер БД выполняется на том же хосте, на котором происходит запуск dbsetup.exe (в строке соединения хост не указан, указан как localhost, указан как 127.0.0.1, указан так, чтобы совпадать с результатом вызова функции gethostname).
  • Временная папка процесса dbsetup.exe (переменная окружения %TMP%) доступна сервису Firebird как источник внешних данных (в конфигурации FireBird - параметр ExternalFileAccess).
  • Таблица не содержит полей типа BLOB.
  • Таблица не содержит обнуляемых полей, все поля таблицы обязательные.
  • Загружаемый блок содержит как минимум 1000 записей.
В этом случае во временной папке будет создан временный файл, содержащий загружаемые данные в требуемом Firebird формате, и выполнены операторы:
1create table "DML..." external '.....'
2  ("ID" BIGINT,
3  ....);
4insert into "..."("ID", ...)
5  select "ID", ....
6  from "DML....";
7drop table "DML....";
    
После чего временный файл будет удален.

Oracle
Чтобы использовать загрузку из внешнего файла, необходимо, чтобы одновременно выполнялись следующие условия:
  • Сервер БД выполняется на том же хосте, на котором происходит запуск dbsetup.exe (в строке соединения хост не указан, указан как localhost, указан как 127.0.0.1, указан так, чтобы совпадать с результатом вызова функции gethostname).
  • Владельцу данных доступна на чтение и запись хотя бы одна папка (directory). Этого можно достичь, например, такими операторами:
    Пример
    1CREATE DIRECTORY dir_name AS 'D:\TEMP';
    2GRANT READ,WRITE ON DIRECTORY dir_name TO user_name;
              
    При этом папка (на диске) должна быть доступна на запись процессу dbsetup.exe.
  • Оператор
    01create table "DML...."
    02(
    03 ....
    04) ORGANIZATION EXTERNAL (
    05  DEFAULT DIRECTORY ....
    06  ACCESS PARAMETERS (
    07    RECORDS DELIMITED BY NEWLINE
    08    FIELDS TERMINATED BY '....'
    09  )
    10  LOCATION ('DML.....')
    11)
            
    выполняется без ошибок. Созданная при этом таблица доступна для чтения.
  • Таблица не содержит полей типа BLOB.
  • Загружаемый блок содержит как минимум 1000 записей.
В этом случае в папке, которая доступна, будет создан временный файл, содержащий загружаемые данные в требуемом Oracle формате, и выполнены операторы:
1create table "DML....."
2(
3 ....
4) ORGANIZATION EXTERNAL (
5....);
6insert into "..."("ID", ...)
7  select "ID", ....
8  from "DML....";
9drop table "DML....";
    
После чего временный файл будет удален.

Postgres
Чтобы использовать загрузку из внешнего файла, необходимо, чтобы одновременно выполнялись следующие условия:
  • Сервер БД выполняется на том же хосте, на котором происходит запуск dbsetup.exe (в строке соединения хост не указан, указан как localhost, указан как 127.0.0.1, указан так, чтобы совпадать с результатом вызова функции gethostname).
  • Временная папка процесса dbsetup.exe (переменная окружения %TMP%) доступна сервису PostgreSQL как источник внешних данных.
В этом случае в папке, которая доступна, будет создан временный файл, содержащий загружаемые данные в требуемом Postgres формате. В случае, когда размер файла превысит 1GB, а также по исчерпании источника, будет выполнен оператор
  copy "..."(...) from %TEMP%\DML....CSV with (format csv, encoding UTF8)
    
После чего временный файл будет удален.

Механизм может быть принудительно заблокирован ключем /NOCSV.


4. Сборка xml-документа на сервере

Механизм создает большую нагрузку на сервер БД, но в то же время позволяет существенно ускорить перекачку данных.

Firebird
Чтобы использовать формирование xml-документов на сервере, необходимо, чтобы одновременно выполнялись следующие условия:
  • Таблица не содержит полей типа BLOB.
  • Таблица не содержит строковых полей, которые могут содержать не-xml-compaint символы (определяется по свойствам соответствующего строкового домена.
В этом случае будут формироваться и выполняться запросы вида
1with T as (select T.* from "...." T order by T."ID")
2select cast(cast(
3  '<data handle="' || count(1) ||  '" eof="1">' || list('<row>' ||
4    '<ID type="int64">' || T."ID" || '</ID>' ||
5      case when T."..." is null then '<.../>' else '<... type="int">' || T."..." || '</...>' end ||
6      ......
7    || '</row>' , '') || '</data>' as blob sub_type 1 character set utf8) as blob sub_type 0), count(1)
8  from T
    
При выполнении такого запроса клиент получит blob, содержащий требуемый xml-документ в требуемой кодировке.

Oracle
Чтобы использовать формирование xml-документов на сервере, необходимо, чтобы одновременно выполнялись следующие условия:
  • Используется Oracle версии не ниже 11.
  • Таблица не содержит полей типа BLOB.
В этом случае будут формироваться и выполняться запросы вида
1with T as (select T.* from "..." T )
2select "SYS$HELPER"."ClobToBlob"('<data handle="' || count(1) || '" eof="1">' ||
3  xmlagg(xmlelement("row", xmlelement("ID", xmlattributes('int64' as "type"), T."ID"),
4    case when "..." is null then xmltype('<..../>') else
5      xmlelement("....", xmlattributes('ascii' as "type"), "SYS$HELPER"."XMLEscape"(asciistr(T."...."), 0)) end,
6    ....
7 order by T."ID").getclobval() || '</data>'), count(1) from T
    
При выполнении такого запроса клиент получит blob, содержащий требуемый xml-документ в требуемой кодировке.

Postgres
Чтобы использовать формирование xml-документов на сервере, необходимо, чтобы одновременно выполнялись следующее условие:
  • Таблица не содержит полей типа BLOB.
В этом случае будут формироваться и выполняться запросы вида
1select convert_to( '<data handle="' || count(1) ||  '" eof="1">' || string_agg(
2  '<row>' ||
3    '<ID type="int64">' || T."ID" || '</ID>' ||
4    case when T."...." is null then '<..../>' else '<.... type="int64">' || T."...." || '</....>' end ||
5    .....
6  '</row>', '' order by T."ID") || '</data>', 'UTF8'), count(1) from "..." T
    
При выполнении такого запроса клиент получит blob, содержащий требуемый xml-документ в требуемой кодировке.

Механизм может быть принудительно заблокирован ключем /NOXML.