Команда COPY для копирования логических таблиц

Содержание раздела
  1. Копируемые сущности
  2. Датасорс-источник
  3. Датасорсы-приемники
  4. Режимы копирования
  5. Порядок работы команды
    1. Копирование с историей
    2. Копирование без истории
    3. Создание временных служебных таблиц
  6. Использование команды
    1. Создание копии с историей
    2. Создание копии без истории
    3. Обновление копии
    4. Устранение ошибок копирования
  7. Синтаксис
    1. Параметры
    2. Ключевые слова
      1. --host
      2. --port
      3. --sourceDatamart
      4. --datasourceType
      5. --destinationDatamart
      6. --entities
      7. --history
      8. --positiveAnswers
  8. Ограничения
  9. Примеры
    1. Копирование двух логических таблиц с историей
    2. Копирование партиционированной таблицы и ее партиций с историей
    3. Копирование всех логических таблиц логической БД с историей
    4. Копирование двух логических таблиц без истории
  10. Варианты вывода команды
    1. Вывод при успешном копировании
    2. Вывод при неуспешном копировании

Команда COPY копирует указанные или все логические таблицы и их данные из одной логической базы данных в другую. Копирование возможно в новую или существующую логическую БД.

Логические таблицы и базы данных, из которых копируются данные, далее в этом разделе называются исходными, а логические таблицы и БД, в которые копируются данные, — целевыми.

Для запуска команды на хосте должна быть установлена среда исполнения Java (JRE) или набор инструментов для разработки на Java (JDK).

Копирование возможно между любыми сочетаниями датасорсов следующих типов: ADB, ADP и ADQM.

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

Копируемые сущности

Команда поддерживает копирование всех видов логических таблиц. Для обычных логических таблиц и партиций копируется схема данных и сами данные, для партиционированных таблиц — схема данных.

Датасорс-источник

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

Датасорсы-приемники

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

  • где размещена исходная таблица — если целевая таблица отсутствуют на момент запуска команды и создается командой;
  • где размещена целевая таблица — если целевая таблица существуют на момент запуска команды.

Размещением данных логической таблицы в датасорсах можно управлять с помощью запросов CREATE TABLE и DROP TABLE с ключевым словом DATASOURCE_TYPE. Первый запрос позволяет выбрать датасорсы для размещения данных таблицы, второй — удалить данные таблицы из выбранного датасорса.

Режимы копирования

Доступные режимы копирования:

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

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

Порядок работы команды

Копирование с историей

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

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

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

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

Схема копирования с историей изменений

После вставки скопированных данных команда проверяет, соответствует ли копия источнику. Соответствие проверяется по контрольным суммам, и при наличии расхождений команда выдает ошибку.

Значения типа FLOAT и DOUBLE могут иметь разные контрольные суммы из-за разницы в точности типов. Чтобы избежать расхождения в контрольных суммах при копировании, используйте для значений с плавающей точкой тип DOUBLE как более распространенный среди СУБД.

Копирование без истории

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

На рисунке ниже показан пример копирования данных без истории. Для наглядности используется та же исходная таблица с теми же данными, что и в примере копирования данных с историей. В этом случае запись с идентификатором 222 и значением 2000 не копируется в целевую таблицу, так как не является актуальной в дельте 1.

Схема копирования без истории изменений

Создание временных служебных таблиц

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

Использование команды

Создание копии с историей

Чтобы создать копию одной или нескольких логических таблиц с историей, запустите команду с ключевым словом history.

Создание копии без истории

Чтобы создать копию одной или нескольких логических таблиц без истории, запустите команду без ключевого слова history.

Обновление копии

Чтобы обновить копию таблицы, сделанную ранее, до актуального состояния источника, используйте любой из способов:

  • дополните копию, скопировав в нее данные исходной таблицы без истории;
  • пересоздайте копию, удалив ее и создав заново.

Устранение ошибок копирования

При возникновении проблем команда записывает ошибку в лог и останавливает копирование, не отменяя результаты копирования.

Если работа команды завершилась ошибкой:

  1. Устраните причины ошибки.
  2. Отмените изменения, внесенные предыдущим запуском команды:
    • удалите копию целиком, если она создавалась с нуля;
    • отмените изменения в ручном режиме, если копия помещалась в непустую логическую БД.
  3. Повторите исходную команду копирования.

Синтаксис

java -jar <dtm_tools_file_name>.jar \
--host <prostore_host> \
--port <prostore_port> \
copy \
--sourceDatamart <source_db_name> \
[--datasourceType <datasource_name>] \
--destinationDatamart <destination_db_name> \
[--entities <table_names>] \
[--history] \
[—-positiveAnswers]

Параметры

dtm_tools_file_name

Имя jar-файла утилиты DTM Tools.

Ключевые слова

--host

Задает сетевой адрес ноды Prostore, выполняющей копирование. В качестве значения можно указать IP-адрес или доменное имя.

--port

Задает номер порта ноды Prostore, выполняющей копирование. Значение должно быть равно значению параметра конфигурации DTM_CORE_HTTP_PORT.

--sourceDatamart

Задает имя логической базы данных, из которой копируются логические таблицы и их данные.

--datasourceType

Задает имя датасорса-источника, откуда копируются данные. Значение указывается без кавычек и должно соответствовать имени датасорса, заданному в конфигурации.

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

--destinationDatamart

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

  • существующую БД с данными — в этом случае учитывайте ограничение на метку времени последней дельты, описанное в секции Ограничения;
  • существующую, но пустую БД;
  • несуществующую БД — в этом случае команда создаст логическую БД с указанным именем и поместит туда скопированные таблицы.

--entities

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

Если ключевое слово не указано, копируются все логические таблицы исходной логической БД.

--history

Включает копирование данных с полной историей их изменений и сохранением порядка следования дельт и меток времени этих дельт из исходной логической БД.

Если ключевое слово не указано, команда копирует данные без истории и записывает их одной дельтой с текущей меткой времени.

--positiveAnswers

Включает автоматическое подтверждение всех запросов команды. Если ключевое слово не указано, необходимо вручную вводить ответы (Y — да, N — нет) на запросы команды.

Ограничения

  • Использование команды недоступно при включенной аутентификации запросов.
  • Копирование доступно между СУБД ADP, ADB и ADQM в любых сочетаниях.
  • Доступно копирование только логических таблиц.
  • Если данные копируются в непустую логическую БД, ее последняя дельта должна иметь более раннюю метку времени:
    • чем нулевая дельта исходной логической БД — при копировании с историей,
    • чем текущее время сервера системы — при копировании без истории.
  • При копировании данных в существующие таблицы структура таблиц должна соответствовать структуре исходных таблиц.
  • При копировании с историей гарантируется сохранение нумерации дельт, но не операций записи.

Примеры

Копирование двух логических таблиц с историей

java -jar dtm-tools-1.19.jar --host 10.92.3.86 --port 9090 copy --sourceDatamart marketing --datasourceType adqm --destinationDatamart marketing_copy_with_history --entities table1 table2 --history

Копирование партиционированной таблицы и ее партиций с историей

java -jar dtm-tools-1.19.jar --host 10.92.3.86 --port 9090 copy --sourceDatamart marketing --destinationDatamart marketing_partitions --entities table_partitioned partition_1 partition_2 partition_3 --history --positiveAnswers

Копирование всех логических таблиц логической БД с историей

java -jar dtm-tools-1.19.jar --host 10.92.3.86 --port 9090 copy --sourceDatamart marketing --destinationDatamart marketing_full_copy_with_history --history

Копирование двух логических таблиц без истории

java -jar dtm-tools-1.19.jar --host 10.92.3.86 --port 9090 copy --sourceDatamart marketing --destinationDatamart marketing_copy_without_history --entities table1 table2 --positiveAnswers

Варианты вывода команды

Вывод при успешном копировании

Ниже показан примерный вид вывода команды при успешном копировании (набор сообщений и их текст могут изменяться от версии к версии):

Successfully created table <table_name> <ddl_script_1>
Successfully created download ext table <download_table_name> <ddl_script_2>
Successfully created upload ext table <upload_table_name> <ddl_script_3>
...
Started delta processing [Delta(date=<numeric_delta_date>, num=0, cnFrom=<cn_from>, cnTo=<cn_to>)]
...
Committed delta with date <destination_delta_date> in <destination_db_name> datamart
...
Successfully dropped download ext table <download_table_name>
Successfully dropped upload ext table <upload_table_name>
...
COPY is done

Вывод при неуспешном копировании

При неуспешном копировании команда выводит текст ошибки.