В этом документе описывается инструмент миграции данных mxshift.
Инструмент mxshift в настоящее время поддерживает следующие функции:
WHERE.В этом разделе подробно описаны параметры инструмента mxshift.
Для использования mxshift необходимо подготовить файл конфигурации в формате TOML. Ниже приведено подробное описание параметров:
| Параметр | Описание | Обязательный |
|---|---|---|
| [database.source] категория | ||
| --db-host | Имя хоста или IP-адрес узла Master исходного кластера. Исходный кластер — это кластер базы данных, из которого выполняется миграция. | Да |
| --db-port | Порт Master-узла исходной базы данных. | Да |
| --db-database | Имя исходной базы данных. | Да |
| --db-user | Имя пользователя исходной базы данных. | Да |
| --db-password | Пароль пользователя исходной базы данных. | Да |
| --install-dir | Каталог установки базы данных. Поддерживается начиная с версии v4.8.3. Для версий v4.8.2 и ранее используйте параметр gphome вместо этого. |
Да |
| --hostname-to-ip | Сопоставление имён хостов с IP-адресами. Используется, когда исходный и целевой кластеры используют одинаковые имена хостов, чтобы обеспечить корректную маршрутизацию. Поддерживается начиная с версии v4.8.3. | Нет |
| [database.target] категория | ||
| --db-host | Имя хоста или IP-адрес узла Master целевого кластера. Целевой кластер получает мигрированные данные. | Да |
| --db-port | Порт Master-узла целевой базы данных. | Да |
| --db-database | Имя целевой базы данных. | Да |
| --db-user | Имя пользователя целевой базы данных. | Да |
| --db-password | Пароль пользователя целевой базы данных. | Да |
| [scope] категория | ||
| --mode | Режим работы. Допустимые значения: normal, dryrun, fetch, motion.normal: значение по умолчанию; выполняет обычную миграцию данных.dryrun: проверяет соединение между базами данных с помощью простых операций DDL без чтения или записи данных.fetch: на основе dryrun читает данные из источника и отправляет их на целевые Segments, но отбрасывает. Используется для тестирования производительности чтения из источника и скорости передачи по сети.motion: расширяет fetch, разбирая данные на стороне цели и перераспределяя их по правильным Segments. Тестирует скорость перераспределения данных на стороне цели. |
Нет |
| --compress-method | Метод сжатия: gzip / zstd / lz4 / 0. По умолчанию 0 (без сжатия).При включении любого сжатия пользователь mxadmin на каждом целевом Segment должен иметь возможность подключения по SSH без пароля к каждому исходному Segment. После настройки протестируйте с помощью dryrun. |
Нет |
| --gphome | Абсолютный путь к GPHOME на исходной базе данных. Этот параметр удалён начиная с версии v4.8.3. | Да |
| --table-list | Список схем и имён таблиц источника. Для секционированных таблиц укажите родительскую таблицу. Если не указано, мигрируются все непустые таблицы, отсортированные от самой большой к самой маленькой. | Нет |
| --exclude-table-list | Список схем и имён таблиц, исключаемых из миграции. | Нет |
| --schema-list | Схемы исходной базы данных. Приоритет:Если в table-list указаны таблицы, мигрируются только они.В противном случае, если table-list содержит схемы, мигрируются все таблицы в этих схемах.Если ни один параметр не задан, мигрируются все таблицы из schema-list` `[database.source]. |
Нет |
| --exclude-schema-list | Схемы, исключаемые из миграции. Таблицы в этих схемах не будут мигрироваться. Если схема присутствует одновременно в db-database и schema-list, она исключается. |
Нет |
| [log] категория | ||
| --log-level | По умолчанию exclude-schema-list, выводятся прогресс, ошибки и предупреждения. Установите info, чтобы получить дополнительные отладочные сообщения (только для разработки и диагностики). |
Нет |
| --no-color | По умолчанию debug. Установите false, чтобы отключить цветной вывод. |
Нет |
| [controller] категория | ||
| --both-way | По умолчанию true. Начинает миграцию с самой большой таблицы. Если установлено false, начинает одновременно с самой большой и самой маленькой таблиц. |
Нет |
| --concurrency | Количество таблиц, мигрируемых параллельно. По умолчанию 5, максимум 10. | Нет |
| [transfer] категория | ||
| --verify | Проверка количества строк до и после миграции. По умолчанию both-way. |
Нет |
| --with-index | Переносить ли индексы. По умолчанию true (отключено). При отключении SQL-инструкции для создания индексов сохраняются в файл в текущем каталоге выполнения для последующего ручного запуска.Примечание: для таблиц, созданных с движком хранения MARS2, индексы должны быть созданы, чтобы вступить в силу. Поэтому при миграции DDL для таблиц MARS2 индексы всегда мигрируются автоматически, независимо от этого параметра. |
Нет |
| [ddl] категория (поддерживается с версии v4.8.2) | ||
| --enabled | Выполнять ли миграцию DDL таблиц. По умолчанию false. При включении mxshift мигрирует DDL на уровне базы данных перед миграцией данных.Поддерживаемые версии миграции DDL:Greenplum6 → YMatrix4 / YMatrix5;YMatrix4 → YMatrix4 / YMatrix5;YMatrix5 → YMatrix5 |
Нет |
| --file-path | Путь к файлу для импорта/экспорта SQL DDL. Файл создаётся, если его нет. Существующее содержимое очищается перед записью. Вы можете просматривать или редактировать экспортированный файл, но не изменяйте и не удаляйте строки комментариев, начинающиеся с "– DO NOT EDIT.", так как это может привести к сбою импорта. | Нет |
| --mode | Режим обработки DDL. Варианты: false, false, exec.output: по умолчанию. Выполняет DDL напрямую в целевой базе данных.input: экспортирует DDL в файл, затем завершает работу без миграции данных.exec: считывает DDL из файла. Должен указывать output на файл, созданный mxshift; в противном случае разбор завершится ошибкой.SPEC: в режиме input, если целевая база данных недоступна, добавьте --file-path в [database.target] (см. шаблон ниже). В режиме output, если источник недоступен, установите --db-version в input в [ddl] и добавьте --only-ddl в [database.source] (см. шаблон). |
Нет |
| --only-ddl | Только миграция DDL. По умолчанию true.Если --db-version, продолжает миграцию данных таблиц после миграции DDL.Если false, завершает работу после миграции DDL без миграции данных. |
Нет |
| --skip-resource-queue-and-group | Пропускать ли очереди ресурсов (группы) при миграции DDL. По умолчанию false. |
Нет |
| --skip-table-space | Пропускать ли табличные пространства при миграции DDL. По умолчанию true. |
Нет |
Для выполнения инкрементальной миграции данных с использованием условий WHERE используйте следующие параметры:
| Категория | Подкатегория | Подпараметр | Подподкатегория | Подподпараметр | Описание | Обязательный |
| [transfer] | [transfer.table-data-where-sql] | --enabled | Если установлено ``skip-resource-queue-and-group=true``, фильтрует данные источника с помощью условия WHERE, мигрируя только соответствующие строки. Эта функция отключена по умолчанию. Активируется вручную через ``skip-table-space=true``. | Нет | ||
| --global | SQL-выражение ``true``, применяемое ко всем таблицам. Если таблица не содержит ключевое слово ``true``, условие ``WHERE`` автоматически пропускает эту таблицу. | Нет | ||||
| [[transfer.table-data-where-sql.override]] | --where | Условие WHERE, специфичное для таблицы. Имеет приоритет над глобальным WHERE. Применяется на уровне таблицы. | Нет | |||
| [transfer.table-data-where-sql.override.table] | --schema | Имя схемы таблицы для миграции. | Нет | |||
| --name | Имя таблицы для миграции. | Нет |
Примеры использования см. в шаблонах ниже.
Параметры командной строки для mxshift:
| Параметр | Описание |
|---|---|
| --config | Выводит содержимое файла конфигурации по умолчанию |
| -a или --all | Запускает миграцию без подтверждения. По умолчанию пропускает уже перемещённые и пустые таблицы |
| -c или --config-path | Путь к файлу конфигурации mxshift |
| -v или --version | Отображает версию mxshift |
| -l или --show-progress | Показывает ход последней миграции. Если миграция не выполняется, показывает результат последнего запуска. Статусы:Not start: не входит в область миграции;Skip: пропущено (уже мигрировано или пусто);Processing/Interrupted: в процессе или прервано;Complete: миграция завершена;Failed: миграция завершилась с ошибкой |
| -R или --redo | Повторно мигрирует таблицы, даже если они уже были перемещены. Перед повторной миграцией очищает существующие данные в целевой таблице |
Полный шаблонный файл называется WHERE. Вы можете создать этот шаблон, выполнив команду SKIPPED. Запустите config.toml, чтобы начать редактирование, затем скопируйте весь контент в свой файл и настройте конфигурацию соответствующим образом. Также можно использовать один из специализированных шаблонов ниже.
mxshift --config
[database]
[database.source]
## Name of database
db-database= "testdb"
## Hostname of database master
db-host="sdw3"
## password of database
db-password="xxxx"
## Port of database master
db-port=54322
## user name of database
db-user="mxadmin"
## Version of database(Please use the result of 'SELECT version();' as value). Required only when
## 1. Source database is un-reachable, and 'ddl.only-ddl' is enabled and 'ddl.mode' is 'input'
## 2. Target database is un-reachable, and 'ddl.mode' is 'output' */
# db-version="PostgreSQL 12 (MatrixDB 4.5.0-enterprise) (Greenplum Database 7.0.0+dev.17410.gedbdb5ef84 build dev) on arm-apple-darwin21.5.0, compiled by Apple clang version 13.0.0 (clang-1300.0.27.3), 64-bit compiled on Jul 5 2022 15:45:24"
## The installation directory of matrixdb(this option is supported starting from version 4.8.3,4.8.2 and earlier versions need to be specified by gphome)
install-dir="/usr/local/greenplum-db-6.7.1"
[[database.source.hostname-to-ip]]
## The content within <> should be replaced with actual information and <> should be removed(this option is supported starting from version 4.8.3)
node-hostname="<mdw>"
node-ip="<127.0.0.1>"
[[database.source.hostname-to-ip]]
node-hostname="<sdw1>"
node-ip="<127.0.0.2>"
[[database.source.hostname-to-ip]]
node-hostname="<sdw2>"
node-ip="<127.0.0.3>"
[database.target]
## Name of database
db-database="destdb"
## Hostname of database master
db-host="172.16.100.32"
## password of database
db-password="yyyy"
## Port of database master
db-port=5432
## user name of database
db-user="mxadmin"
## Version of database(Please use the result of 'SELECT version();' as value). Required only when
## 1. Source database is un-reachable, and 'ddl.only-ddl' is enabled and 'ddl.mode' is 'input'
## 2. Target database is un-reachable, and 'ddl.mode' is 'output' */
# db-version="PostgreSQL 12 (MatrixDB 4.5.0-enterprise) (Greenplum Database 7.0.0+dev.17410.gedbdb5ef84 build dev) on arm-apple-darwin21.5.0, compiled by Apple clang version 13.0.0 (clang-1300.0.27.3), 64-bit compiled on Jul 5 2022 15:45:24"
[scope]
compress_method="lz4"
## (this option is abandoned from version 4.8.3)
# gphome="/usr/local/greenplum-db-6.7.1"
mode="normal"
[[scope.table-list]]
schema="test_schema_1"
name="table_001"
[[scope.table-list]]
schema="test_schema_2"
name="table_002"
[[scope.exclude-table-list]]
schema="test_schema_3"
name="table_003"
schema-list=["test_schema_1", "test_schema_2"]
exclude-schema-list=["test_schema_5", "test_schema_8"]
[log]
log-level="info"
## Print log without color.
# no-color=false
[controller]
both-way=true
concurrency=5
[transfer]
verify=true
# with-index=true
[transfer.table-data-where-sql]
enabled=false
global="txdate >= '2022-10-01' AND batchnum >= 100000000"
[[transfer.table-data-where-sql.override]]
where="abc > 10"
[transfer.table-data-where-sql.override.table]
schema="test_schema_1"
name="table_001"
[[transfer.table-data-where-sql.override]]
where="tag != 'aabbcc' AND ts > '2022-01-01'"
[transfer.table-data-where-sql.override.table]
schema="test_schema_2"
name="another_table"
[ddl]
enabled=true
# file-path="/tmp/mxshift.sql"
# mode="output"
only-ddl=false
## During the DDL transfer, whether to skip the transfer of resource queue or group, by default, it is true.
skip-resource-queue-and-group=true
## During the DDL transfer, whether to skip the transfer of tablespace, by default, it is true.
skip-table-space=true
[[ddl.replace]]
## Only applicable for the case of migration from Greenplum to YMatrix
category="role"
[[ddl.replace.pairs]]
old="gpadmin"
new="mxadmin"
vim config.toml
После подготовки TOML-файла выполните следующую команду для запуска миграции:
```bash
$ mxshift -c config_path.toml
```
```toml
[database]
[database.source]
## Имя базы данных
db-database= "testdb"
## Имя хоста Master-узла базы данных
db-host="sdw3"
## Пароль базы данных
db-password="xxxx"
## Порт Master-узла базы данных
db-port=54322
## Имя пользователя базы данных
db-user="gpadmin"
## Версия базы данных (используйте результат 'SELECT version();'). Обязательно только когда:
## 1. Исходная БД недоступна, а 'ddl.only-ddl' включён и 'ddl.mode' = 'input'
## 2. Целевая БД недоступна, а 'ddl.mode' = 'output' */
# db-version="PostgreSQL 12 (MatrixDB 4.5.0-enterprise) (Greenplum Database 7.0.0+dev.17410.gedbdb5ef84 build dev) on arm-apple-darwin21.5.0, compiled by Apple clang version 13.0.0 (clang-1300.0.27.3), 64-bit compiled on Jul 5 2022 15:45:24"
## Каталог установки matrixdb (этот параметр поддерживается начиная с версии 4.8.3; для версий 4.8.2 и ранее используйте gphome)
install-dir="/usr/local/greenplum-db-6.7.1"
[[database.source.hostname-to-ip]]
## Содержимое внутри <> следует заменить на реальные данные, а <> удалить (поддерживается начиная с версии 4.8.3)
node-hostname="<mdw>"
node-ip="<127.0.0.1>"
[[database.source.hostname-to-ip]]
node-hostname="<sdw1>"
node-ip="<127.0.0.2>"
[[database.source.hostname-to-ip]]
node-hostname="<sdw2>"
node-ip="<127.0.0.3>"
[database.target]
## Имя базы данных
db-database="destdb"
## Имя хоста Master-узла базы данных
db-host="172.16.100.32"
## Пароль базы данных
db-password="yyyy"
## Порт Master-узла базы данных
db-port=5432
## Имя пользователя базы данных
db-user="mxadmin"
## Версия базы данных (используйте результат 'SELECT version();'). Обязательно только когда:
## 1. Исходная БД недоступна, а 'ddl.only-ddl' включён и 'ddl.mode' = 'input'
## 2. Целевая БД недоступна, а 'ddl.mode' = 'output' */
# db-version="PostgreSQL 12 (MatrixDB 4.5.0-enterprise) (Greenplum Database 7.0.0+dev.17410.gedbdb5ef84 build dev) on arm-apple-darwin21.5.0, compiled by Apple clang version 13.0.0 (clang-1300.0.27.3), 64-bit compiled on Jul 5 2022 15:45:24"
[scope]
## Метод сжатия при передаче данных, допустимые значения: 0/gzip/lz4/zstd
compress-method="lz4"
## (этот параметр отменён начиная с версии 4.8.3)
# gphome="/usr/local/greenplum-db-6.7.1"
## Режим передачи данных из исходной в целевую базу данных, возможные значения: normal/dryrun/fetch/motion.
## dryrun — только выполнение DDL, без передачи данных
## fetch — выборка данных из источника и отбрасывание
## motion — выборка данных из источника, перераспределение и отбрасывание
mode="normal"
## Sql для выбора информации о сегменте из исходной базы данных
# select-source-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
## Sql для выбора информации о сегменте из целевой базы данных
# select-target-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
[[scope.table-list]]
schema="test_schema_1"
name="table_001"
[[scope.table-list]]
schema="test_schema_2"
name="table_002"
[[scope.exclude-table-list]]
schema="test_schema_3"
name="table_003"
schema-list=["test_schema_1", "test_schema_2"]
exclude-schema-list=["test_schema_5", "test_schema_8"]
[log]
## Уровень логирования, допустимые значения: debug/verbose/info.
log-level="info"
## Вывод логов без цвета.
# no-color=false
[controller]
## По умолчанию передача начинается с самой большой таблицы. Если установлено значение 'bothway', начнётся одновременно с самой большой и самой маленькой таблицы
both-way=true
## Количество таблиц, передаваемых одновременно
concurrency=5
[transfer]
## Проверять количество записей в каждой таблице
verify=true
with-index=true
[ddl]
enabled=true
# file-path="/tmp/mxshift.sql"
# mode="output"
only-ddl=false
```
При переносе DDL пропускать ли очереди ресурсов или группы. Значение по умолчанию — `true`.
# skip-resource-queue-and-group=true
## При переносе DDL пропускать ли табличные пространства. Значение по умолчанию — `true`.
# skip-table-space=true
[[ddl.replace]]
## Применимо только при миграции из Greenplum в YMatrix
category="role"
[[ddl.replace.pairs]]
old="gpadmin"
new="mxadmin"
`__CODE_BLOCK_4__`
$ mxshift -c config_path_full.toml
`__CODE_BLOCK_5__`
[database]
[database.source]
## Имя базы данных
db-database= "testdb"
## Имя хоста мастер-узла базы данных
db-host="sdw3"
## Пароль базы данных
db-password="xxxx"
## Порт мастер-узла базы данных
db-port=54322
## Имя пользователя базы данных
db-user="gpadmin"
[database.target]
## Имя базы данных
db-database="destdb"
## Имя хоста мастер-узла базы данных
db-host="172.16.100.32"
## Пароль базы данных
db-password="yyyy"
## Порт мастер-узла базы данных
db-port=5432
## Имя пользователя базы данных
db-user="mxadmin"
[scope]
## Метод сжатия, используемый при передаче данных. Допустимые значения: 0/gzip/lz4/zstd
compress-method="lz4"
## Каталог установки MatrixDB
gphome="/usr/local/greenplum-db-6.7.1"
## Режим передачи данных между исходной и целевой базами данных. Допустимые значения: normal/dryrun/fetch/motion.
## dryrun: Выполнять только DDL; передача данных не производится
## fetch: Извлечение данных из источника с последующим удалением
## motion: Извлечение данных из источника, перераспределение, затем удаление
mode="normal"
## SQL-запрос для получения информации о сегментах из исходной базы данных
# select-source-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
## SQL-запрос для получения информации о сегментах из целевой базы данных
# select-target-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
[[scope.table-list]]
schema=......
name=......
[[scope.table-list]]
......
[[scope.exclude-table-list]]
......
schema-list=["test_schema_1", "test_schema_2"]
exclude-schema-list=["test_schema_5", "test_schema_8"]
[log]
## Уровень логирования. Допустимые значения: debug/verbose/info
log-level="info"
## Отключить цветной вывод в логах
# no-color=false
[controller]
## По умолчанию передача начинается с самой большой таблицы. Установите значение 'bothway', чтобы начать одновременно с самой большой и самой маленькой таблицы
both-way=true
## Количество таблиц, передаваемых параллельно
concurrency=5
[transfer]
## Проверять количество строк в каждой таблице после передачи
verify=true
[transfer.table-data-where-sql]
enabled=true
global="txdate >= '2022-10-01' AND batchnum >= 100000000"
[[transfer.table-data-where-sql.override]]
where="abc > 10"
[transfer.table-data-where-sql.override.table]
schema="test_schema_1"
name="table_001"
[[transfer.table-data-where-sql.override]]
where="tag != 'aabbcc' AND ts > '2022-01-01'"
[transfer.table-data-where-sql.override.table]
schema="test_schema_2"
name="another_table"
`__CODE_BLOCK_6__`
$ mxshift -c config_path_incremental.toml
При миграции всех реплицированных таблиц в базе данных или в определённой схеме дополнительная настройка в файле config_path.toml не требуется. mxshift автоматически определяет реплицированные таблицы и применяет соответствующую стратегию миграции, чтобы предотвратить дублирование данных. Вам нужно лишь указать нужные таблицы в секции scope.table-list, используя параметры schema и name.
__CODE_BLOCK_7__
После подготовки TOML-файла выполните следующую команду, чтобы запустить mxshift для миграции реплицированных таблиц.
__CODE_BLOCK_8__
Примечание!
Общие сведения о стратегиях миграции данных и полную процедуру см. в разделе Миграция данных