Команда 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

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

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

--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

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

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