Команда COPY для копирования логических таблиц и прокси-таблиц
Содержание раздела
Команда 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
.
Обновление копии
Чтобы обновить копию таблицы, сделанную ранее, до актуального состояния источника, используйте любой из способов:
- дополните копию, скопировав в нее данные исходной таблицы без истории;
- пересоздайте копию, удалив ее и создав заново.
Устранение ошибок копирования
При возникновении проблем команда записывает ошибку в лог и останавливает копирование, не отменяя результаты копирования.
Если работа команды завершилась ошибкой:
- Устраните причины ошибки.
- Отмените изменения, внесенные предыдущим запуском команды:
- удалите копию целиком, если она создавалась с нуля;
- отмените изменения в ручном режиме, если копия помещалась в непустую логическую БД.
- Повторите исходную команду копирования.
Синтаксис
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
Вывод при неуспешном копировании
При неуспешном копировании команда выводит текст ошибки.