mxshift

В этом документе описывается инструмент миграции данных mxshift.

1 Описание

Инструмент mxshift в настоящее время поддерживает следующие функции:

  • Полную миграцию: параллельную миграцию DDL и данных из кластера Greenplum 4.3.X/5/6 или YMatrix в новый кластер YMatrix на уровне базы данных.
  • Инкрементальную миграцию: параллельную миграцию DDL и данных вновь добавленных таблиц из кластера Greenplum 5/6 или YMatrix в новый кластер YMatrix на уровне таблиц.
  • Условную миграцию: выполнение миграции данных на основе определённых условий с использованием предложения WHERE.
  • Поддерживаемые стратегии распределения данных: хэш-распределение, случайное распределение, реплицированные таблицы (REPLICATED) и таблицы только на мастер-узле (Master-only).

2 Быстрый старт

Файл полного шаблона называется config_template.toml. Этот шаблон можно получить, выполнив команду mxshift --dump-config.

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

2.1 Полная миграция

[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="gpadmin"
        ## 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 5.2.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 Jun  5 2023 15:45:24"
        ## The installation directory of database
        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
             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 5.2.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 Jun  5 2023 15:45:24"

[scope]
## Whether to disable data incremental migration, by default, it is true.
# disable-data-increment=true
disable-connector=false
## The compress method for transferring data, methods restricted to 0/gzip/lz4/zstd        
compress-method="lz4"
## mode for transferring data from source to target database, and value restricted to normal/dryrun/fetch/motion.
##dryrun for only executing ddl, not transferring data
##fetch for fetching data from source and abandon
##motion for fetching data from source, redistributing and finally abandon
mode="normal"
## Sql for select segment information from source database        
# select-source-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
## Sql for select segment information from target database
# 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]
## The log level, value restricted to: debug/verbose/info.
log-level="info"
## Print log without color.
# no-color=false

[controller]
## By default, transfer work will start from the largest table. If set 'bothway' it will start from both the largest and the smallest table
both-way=true
## The number of table transferred at the same time
concurrency=3

[transfer]
## Verity the number of record of every table
verify=true
with-index=true
## Whether to disable transfer Data, by default, it is false.
# disabled-data-transfer=false
## Table with size under this threshold are categorized as "small",
## transfer between masters instead of segments to avoid creating external table.
# small-table-mb=32

[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"
## Whether to disable ddl incremental migration, by default, it is true.
# disable-ddl-increment=true
## DDL transfer will stop and exit when executing sql encounter errors, unless the type of DDL is set to 'ignore error'.Types of DDL are:
## "all","collation","default acl","extension","external table","function","index","language",
## "namespace","operator","resource","role","table","tablespace","type","view"
# ignore-error=[]

[verify]
## Whether to enable data verify, by default, it is false.
# enabled=false
## mode for verifying data consistency between source and target database,
## and value restricted to simple-count/column-count/length-sum/hash-bit-bloom.
## 'simple-count' for counting number of rows
## 'column-count' for counting not-null value of a certain column
## 'length-sum' for summing the length of some columns(e.g. column of type text, xml, json, varchar)
## 'hash-bit-bloom' for calculating the hash for one or more columns, and compare it's binary content
##  (except for column of floating-point type, the result of witch can be affected by software/hardware)
# mode="simple-count"
## Columns used in verification, will randomly select columns if not set
# columns=[]
## Maximum number of randomly selected columns used in verification
# max-column-count=3
# [[verify.table-list]]
#    schema="test_schema_1"
#    name="table_001"
# [[verify.exclude-table-list]]
#    schema="test_schema_3"
#    name="table_003"
# verify.schema-list=["test_schema_1"]
# verify.exclude-schema-list=["test_schema_5"]

# [[verify.override]]
#    mode="length-sum"
#    max-column-count=3
#    columns=[]
#    [[verify.override.table-list]]
#      schema="test_schema_3"
#      name="table_003"
#    verify.override.schema-list=[]

# [[verify.override]]
#    mode="column-count"
#    max-column-count=2
#    columns=[]
#    [[verify.override.table-list]]
#      schema="test_schema_1"
#      name="table_001"
#    verify.override.schema-list=[]

После подготовки TOML-файла выполните следующую команду, чтобы запустить полную миграцию с помощью mxshift:

$ mxshift -c config_path_full.toml

2.2 Инкрементальная миграция

[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="gpadmin"
        ## 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 5.2.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 Jun  5 2023 15:45:24"
        ## The installation directory of database
        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
             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 5.2.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 Jun  5 2023 15:45:24"

[scope]
disable-connector=false
## The compress method for transferring data, methods restricted to 0/gzip/lz4/zstd        
compress-method="lz4"
## mode for transferring data from source to target database, and value restricted to normal/dryrun/fetch/motion.
##dryrun for only executing ddl, not transferring data
##fetch for fetching data from source and abandon
##motion for fetching data from source, redistributing and finally abandon
mode="normal"
## Sql for select segment information from source database        
# select-source-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
## Sql for select segment information from target database
# select-target-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
## Whether to disable data incremental migration, by default, it is true.
disable-data-increment=false
        [[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]
## The log level, value restricted to: debug/verbose/info.
log-level="info"
## Print log without color.
# no-color=false

[controller]
## By default, transfer work will start from the largest table. If set 'bothway' it will start from both the largest and the smallest table
both-way=true
## The number of table transferred at the same time
concurrency=3

[transfer]
## Verity the number of record of every table
verify=true
with-index=true
## Whether to disable transfer Data, by default, it is false.
# disabled-data-transfer=false
## Table with size under this threshold are categorized as "small",
## transfer between masters instead of segments to avoid creating external table.
# small-table-mb=32

[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"
## Whether to disable ddl incremental migration, by default, it is true.
disable-ddl-increment=false
## DDL transfer will stop and exit when executing sql encounter errors, unless the type of DDL is set to 'ignore error'.Types of DDL are:
## "all","collation","default acl","extension","external table","function","index","language",
## "namespace","operator","resource","role","table","tablespace","type","view"
# ignore-error=[]

[verify]
## Whether to enable data verify, by default, it is false.
# enabled=false
## mode for verifying data consistency between source and target database,
## and value restricted to simple-count/column-count/length-sum/hash-bit-bloom.
## 'simple-count' for counting number of rows
## 'column-count' for counting not-null value of a certain column
## 'length-sum' for summing the length of some columns(e.g. column of type text, xml, json, varchar)
## 'hash-bit-bloom' for calculating the hash for one or more columns, and compare it's binary content
##  (except for column of floating-point type, the result of witch can be affected by software/hardware)
# mode="simple-count"
## Columns used in verification, will randomly select columns if not set
# columns=[]
## Maximum number of randomly selected columns used in verification
# max-column-count=3
# [[verify.table-list]]
#    schema="test_schema_1"
#    name="table_001"
# [[verify.exclude-table-list]]
#    schema="test_schema_3"
#    name="table_003"
# verify.schema-list=["test_schema_1"]
# verify.exclude-schema-list=["test_schema_5"]

# [[verify.override]]
#    mode="length-sum"
#    max-column-count=3
#    columns=[]
#    [[verify.override.table-list]]
#      schema="test_schema_3"
#      name="table_003"
#    verify.override.schema-list=[]

# [[verify.override]]
#    mode="column-count"
#    max-column-count=2
#    columns=[]
#    [[verify.override.table-list]]
#      schema="test_schema_1"
#      name="table_001"
#    verify.override.schema-list=[]

После подготовки TOML-файла выполните следующую команду, чтобы запустить инкрементальную миграцию с помощью mxshift:

$ mxshift -c config_path_incremental.toml

2.3 Условная миграция

Используйте предложение WHERE, чтобы мигрировать только данные, удовлетворяющие определённым условиям, либо исключить устаревшие данные из миграции:

[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="gpadmin"  
## The installation directory of database  
install-dir="/usr/local/greenplum-db-6.7.1"

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

[scope]  
## The compress method for transferring data, methods restricted to 0/gzip/lz4/zstd  
compress-method="lz4"  
## mode for transferring data from source to target database, and value restricted to normal/dryrun/fetch/motion.  
##dryrun for only executing ddl, not transferring data  
##fetch for fetching data from source and abandon  
##motion for fetching data from source, redistributing and finally abandon  
mode="normal"  
## Sql for select segment information from source database  
# select-source-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"  
## Sql for select segment information from target database  
# 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"]  
disable-connector=false

[log]  
## The log level, value restricted to: debug/verbose/info.  
log-level="info"  
## Print log without color.  
# no-color=false

[controller]  
## By default, transfer work will start from the largest table. If set 'bothway' it will start from both the largest and the smallest table  
both-way=true  
## The number of table transferred at the same time  
concurrency=3

[transfer]  
## Verity the number of record of every table  
verify=true  
## Table with size under this threshold are categorized as "small",  
## transfer between masters instead of segments to avoid creating external table.  
# small-table-mb=32  
[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"

[verify]  
## Whether to enable data verify, by default, it is false.  
# enabled=false  
## mode for verifying data consistency between source and target database,  
## and value restricted to simple-count/column-count/length-sum/hash-bit-bloom.  
## 'simple-count' for counting number of rows  
## 'column-count' for counting not-null value of a certain column  
## 'length-sum' for summing the length of some columns(e.g. column of type text, xml, json, varchar)  
## 'hash-bit-bloom' for calculating the hash for one or more columns, and compare it's binary content  
##  (except for column of floating-point type, the result of witch can be affected by software/hardware)  
# mode="simple-count"  
## Columns used in verification, will randomly select columns if not set  
# columns=[]  
## Maximum number of randomly selected columns used in verification  
# max-column-count=3  
# [[verify.table-list]]  
#    schema="test_schema_1"  
#    name="table_001"  
# [[verify.exclude-table-list]]  
#    schema="test_schema_3"  
#    name="table_003"  
# verify.schema-list=["test_schema_1"]  
# verify.exclude-schema-list=["test_schema_5"]

# [[verify.override]]  
#    mode="length-sum"  
#    max-column-count=3  
#    columns=[]  
#    [[verify.override.table-list]]  
#      schema="test_schema_3"  
#      name="table_003"  
#    verify.override.schema-list=[]

# [[verify.override]]  
#    mode="column-count"  
#    max-column-count=2  
#    columns=[]  
#    [[verify.override.table-list]]  
#      schema="test_schema_1"  
#      name="table_001"  
#    verify.override.schema-list=[]  

Подготовьте TOML-файл, затем выполните следующую команду для запуска mxshift с условной миграцией.

$ mxshift -c config_path_conditional.toml  

2.4 Миграция реплицированных таблиц

Для миграции всех реплицированных таблиц в базе данных или схеме не требуется дополнительная настройка в config_path.toml. mxshift автоматически определяет реплицированные таблицы и применяет соответствующую стратегию миграции, чтобы избежать дублирования данных. Вам нужно лишь настроить параметры scope.table-list с использованием schema и name.

   [[scope.table-list]]  
                schema=“public1”  
                name=“table_replicated1”  
   [[scope.table-list]]  
                schema=“public2”  
                name=“table_replicated2”  

После подготовки TOML-файла выполните следующую команду для запуска mxshift при миграции реплицированных таблиц.

$ mxshift -c config_path_replicated.toml  

Примечание!
Общие сведения о стратегиях миграции данных и полные шаги см. в разделе Миграция данных.

3 Рекомендации по функциям

3.1 Импорт/экспорт метаданных таблиц

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

По мере увеличения объёма использования базы данных разрастание каталога может значительно увеличить задержку запросов. Чтобы ускорить отладку и сократить простои сервиса во время миграции, mxshift предоставляет параметры командной строки для экспорта метаданных таблиц и их повторного использования в последующих миграциях:

Экспорт метаданных таблиц в mxshift_meta_file и завершение работы

$ mxshift -c <migration_config_file> --write-table-meta-file mxshift_meta_file  

Импорт метаданных таблиц из mxshift_meta_file и продолжение миграции данных

$ mxshift -c <migration_config_file> --read-table-meta-file mxshift_meta_file  

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

3.2 Импорт/экспорт DDL таблиц

Настройте файл конфигурации mxshift следующим образом:

[ddl]  
enabled=true  
file-path="/tmp/mxshift.sql"  
mode="output"  
  • file-path: путь к файлу для импорта/экспорта SQL-запросов DDL, см. приложение ниже. Не изменяйте и не удаляйте комментарии, начинающиеся с -- DO NOT EDIT..
  • mode: режим обработки DDL, один из exec, output или input, значения:
    • exec: по умолчанию. Выполняется непосредственно в целевой базе данных.
    • output: вывод в файл. После экспорта DDL mxshift завершает работу без выполнения миграции данных.
    • input: чтение из файла.

Если целевая база данных недоступна при использовании output, настройте database.target.db-version следующим образом, чтобы обеспечить успешный экспорт DDL:

[database]

    [database.target]  
    ...  
    ## Version of database (Use output of 'SELECT version();'). Required only when  
    ##         1. Source database is unreachable, 'ddl.only-ddl' is enabled, and 'ddl.mode' is 'input'  
    ##         2. Target database is unreachable, and 'ddl.mode' is 'output'  
    db-version="PostgreSQL 12 (MatrixDB 5.2.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"  

Если исходная база данных недоступна при использовании input, настройте database.source.db-version и ddl.only-ddl следующим образом, чтобы обеспечить успешный импорт:

[database]

    [database.target]  
    ## Version of database (Use output of 'SELECT version();'). Required only when  
    ##         1. Source database is unreachable, 'ddl.only-ddl' is enabled, and 'ddl.mode' is 'input'  
    ##         2. Target database is unreachable, 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"

[ddl]  
only-ddl=true  

3.3 Динамическая настройка параллелизма

mxshift поддерживает изменение уровня параллелизма во время выполнения. Выполните следующие шаги:

  1. Измените параметр controller.concurrency в конфигурационном файле (используется при запуске mxshift):
[controller]  
## The number of tables transferred at the same time  
concurrency=xxx  
  1. Получите текущий идентификатор процесса mxshift

    Запустите ps aux | grep mxshift в терминале и запомните число во втором столбце ({{mxshift PID}})

  2. Отправьте сигнал SIGUSR2 процессу mxshift, чтобы перезагрузить конфигурацию и обновить уровень параллелизма

    Выполните kill -SIGUSR2 {{mxshift PID}} в терминале

3.4 Проверка согласованности данных

3.4.1 Разделение устаревшей проверки и миграции данных

В версиях до v5.2.1 раздел [transfer] содержал параметры with-index и verify, управляющие тем, мигрируются ли индексы и выполняется ли проверка количества строк. Однако миграция индексов и устаревшая проверка (т.е. только проверка количества строк) были тесно связаны с миграцией данных — они не могли выполняться независимо.

Начиная с версии v5.2.1, миграция индексов и устаревшая проверка могут выполняться отдельно. В разделе [transfer] добавлен новый параметр конфигурации disabled-data-transfer, позволяющий пропустить передачу данных. Примеры:

  1. Миграция данных и индексов:
[transfer]  
## Whether to disable transfer Data, by default, it is false.  
disabled-data-transfer=false  
## Transfer indexes of the tables, by default, it is false.  
with-index=true  
  1. Миграция данных и проверка количества строк:
[transfer]  
## Whether to disable transfer Data, by default, it is false.  
disabled-data-transfer=false  
## Verify the number of record of every table, by default, it is disabled.  
verify=true  
  1. Миграция данных, индексов и проверка количества строк:
[transfer]  
## Whether to disable transfer Data, by default, it is false.  
disabled-data-transfer=false  
## Transfer indexes of the tables, by default, it is false.  
with-index=true  
## Verify the number of record of every table, by default, it is disabled.  
verify=true  
  1. Только миграция данных (без индексов и проверки):
[transfer]  
## Whether to disable transfer Data, by default, it is false.  
disabled-data-transfer=false  
## Transfer indexes of the tables, by default, it is false.  
with-index=false  
## Verify the number of record of every table, by default, it is disabled.  
verify=false  
  1. Только миграция индексов (без передачи данных):
[transfer]  
## Whether to disable transfer Data, by default, it is false.  
disabled-data-transfer=true  
## Transfer indexes of the tables, by default, it is false.  
with-index=true  
  1. Только проверка количества строк (без передачи данных):
[transfer]  
## Whether to disable transfer Data, by default, it is false.  
disabled-data-transfer=true  
## Verify the number of record of every table, by default, it is disabled.  
verify=true  

3.4.2 Проверка данных в v5.2.1

Начиная с версии v5.2.1, YMatrix mxshift поддерживает новый алгоритм проверки данных, настраиваемый через раздел [verify].

Подробные глобальные параметры конфигурации см. в Приложении, а полный пример раздела [verify] — в Файле конфигурации полной миграции выше. Ниже рассматривается конфигурация области действия.

[verify]  
# [[verify.table-list]]  
#    schema="test_schema_1"  
#    name="table_001"  
# [[verify.exclude-table-list]]  
#    schema="test_schema_3"  
#    name="table_003"  
# verify.schema-list=["test_schema_1"]  
# verify.exclude-schema-list=["test_schema_5"]

# [[verify.override]]  
#    mode="length-sum"  
#    max-column-count=3  
#    columns=[]  
#    [[verify.override.table-list]]  
#      schema="test_schema_3"  
#      name="table_003"  
#    verify.override.schema-list=[]

# [[verify.override]]  
#    mode="column-count"  
#    max-column-count=2  
#    columns=[]  
#    [[verify.override.table-list]]  
#      schema="test_schema_1"  
#      name="table_001"  
#    verify.override.schema-list=[]  

Конфигурации, связанные с областью действия, определены в четырёх подразделах: [verify.table-list], [verify.exclude-table-list], [verify.schema-list] и [verify.exclude-schema-list].

Приоритет проверки:

  1. Если в table-list указаны конкретные таблицы, проверяются только эти таблицы из table-list.

  2. Если таблицы не указаны, проверяется наличие схем в schema-list.

  3. Если схемы указаны, проверяются все таблицы в этих схемах.

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

  • verify.table-list: список таблиц, включённых в проверку данных v5.2.1.
  • verify.exclude-table-list: список таблиц, исключённых из проверки данных v5.2.1.
  • verify.schema-list: список схем, включённых в проверку данных v5.2.1.
  • verify.exclude-schema-list: список схем, исключённых из проверки данных v5.2.1.

Подраздел [verify.override] переопределяет глобальные настройки проверки. Конфигурации в этом блоке применяются к таблицам в указанной области.

Приложение: Справочник параметров

В этом разделе описываются параметры, поддерживаемые инструментом mxshift.

Файл конфигурации

Для использования инструмента mxshift необходимо подготовить файл конфигурации в формате TOML. Ниже приведено подробное описание параметров в файле конфигурации:

Параметр Описание Обязательный
[database.source]
--db-host Имя хоста (Host) или IP-адрес Master-узла в исходном кластере. Исходным кластером базы данных считается кластер, из которого выполняется миграция данных. Да
--db-port Номер порта Master-узла в исходной базе данных. Да
--db-database Имя исходной базы данных. Да
--db-user Имя пользователя для исходной базы данных. Да
--db-password Пароль пользователя исходной базы данных. Да
--install-dir Каталог установки базы данных. Да
--hostname-to-ip Сопоставление имён хостов с IP-адресами. Используйте этот параметр, когда у исходного и целевого кластеров одинаковые имена хостов, чтобы обеспечить корректную маршрутизацию. Нет
[database.target]
--db-host Имя хоста (Host) или IP-адрес Master-узла в целевом кластере. Целевой кластер — это место назначения миграции данных. Да
--db-port Номер порта Master-узла в целевой базе данных. Да
--db-database Имя целевой базы данных. Да
--db-user Имя пользователя для целевой базы данных. Да
--db-password Пароль пользователя целевой базы данных. Да
[scope]
--mode Режим работы. Допустимые значения: normal, dryrun, fetch, motion.
normal: значение по умолчанию; выполняет обычную миграцию данных.
dryrun: проверяет соединение между исходной и целевой базами данных с помощью простых DDL-операций без чтения или записи данных.
fetch: на основе dryrun читает данные из источника и отправляет их на целевые узлы Segment, но отбрасывает. Используется для тестирования производительности чтения из источника и скорости передачи по сети.
motion: расширяет fetch, выполняя разбор данных на стороне получателя и их перераспределение по правильным целевым Segment. Проверяет скорость перераспределения данных в целевой базе данных.
Нет
--compress-method Метод сжатия: gzip / zstd / lz4 / 0. По умолчанию — 0 (без сжатия).
Если scope.disable-connector=true, для включения любого сжатия требуется, чтобы пользователь mxadmin на каждом целевом Segment мог подключаться по SSH без пароля ко всем исходным Segment. Рекомендуется протестировать с dryrun после настройки.
Нет
--table-list Список имён схем и таблиц из источника. Для секционированных таблиц укажите родительскую секционированную таблицу. Если пусто, mxshift мигрирует все таблицы ненулевого размера в порядке убывания их размера. Нет
--exclude-table-list Список имён схем и таблиц, исключаемых из миграции. Нет
--schema-list Схемы исходной базы данных. Приоритет: если table-list указывает конкретные таблицы, мигрируются только они. В противном случае, если table-list указывает схемы, мигрируются все таблицы в этих схемах. Если ни один из параметров не задан, мигрируются все таблицы в schema-list [database.source]. Нет
--exclude-schema-list Схемы, исключаемые из миграции. Таблицы в этих схемах не будут мигрироваться. Если схема присутствует одновременно в db-database и schema-list, она будет исключена. Нет
--disable-data-increment Отключение инкрементной миграции данных. По умолчанию exclude-schema-list (отключено). При включении mxshift сравнивает время последнего изменения таблиц в источнике с временем предыдущего запуска и повторно мигрирует только изменённые таблицы. Примечание: при первом включении мигрируются все таблицы, указанные в конфигурации. Нет
--disable-connector Добавлять ли белый список для всех узлов в целевом кластере. По умолчанию true (белый список требуется только на Master-узле исходного кластера для Master-узла целевого). Примечание: если источник — Greenplum, поддерживаются только версии 4.3.17 и выше. Нет
[log]
--log-level По умолчанию false, выводит информацию о ходе выполнения, ошибки и предупреждения. Установите info для дополнительного вывода отладочной информации, полезной при разработке и устранении неполадок. Нет
--no-color По умолчанию debug. Установите false, чтобы отключить цветной вывод. Нет
[controller]
--both-way По умолчанию true; начинает с самой большой таблицы, чтобы завершить полную миграцию как можно быстрее. Если установлено false, миграция выполняется одновременно от самой большой и самой маленькой таблиц. Нет
--concurrency Количество таблиц, мигрируемых параллельно. По умолчанию 3, максимум 10. Нет
[transfer]
--verify Проверка количества строк до и после миграции. По умолчанию both-way. Нет
--with-index Мигрировать ли индексы. По умолчанию true (не мигрируются автоматически). Примечание: для таблиц с движком хранения MARS2 таблицы индексов обязательны, поэтому DDL-миграция включает индексы независимо от этого параметра. Нет
--disabled-data-transfer Пропустить фактическую миграцию данных, выполнить только миграцию индексов и проверку количества строк. Разделяет миграцию и проверку. По умолчанию false (миграция данных не пропускается). Нет
--small-table-mb Таблицы меньшего размера (в МБ), чем это значение, считаются малыми и оптимизируются для передачи (малые таблицы обходят передачу Segment-to-Segment и передаются напрямую через Master). По умолчанию false. Установите false, чтобы отключить эту оптимизацию. Нет
[ddl]
--enabled Выполнять ли миграцию DDL таблиц. По умолчанию 32MB. mxshift мигрирует DDL по базам данных перед миграцией данных.
Поддерживаемые версии миграции DDL:
Greenplum 4.3.X/5/6 → YMatrix 4/5;
YMatrix 4/5 → YMatrix 4/5.
Нет
--file-path Путь к файлу для импорта/экспорта SQL-запросов DDL. Если файл не существует, он создаётся. Существующее содержимое очищается перед записью. Вы можете просматривать или редактировать экспортированный файл, но не изменяйте и не удаляйте комментарии, начинающиеся с "– DO NOT EDIT.", так как это может привести к сбою импорта. Нет
--mode Режим обработки DDL. Варианты: -1, false, exec. output — по умолчанию: выполнение напрямую в целевой базе данных. input: вывод в файл; завершает работу после экспорта, миграция данных не выполняется. exec: чтение из файла. Этот режим требует, чтобы output указывал на файл, экспортированный mxshift, иначе инструмент не сможет его распознать. SPEC: Если целевая база данных недоступна в режиме input, добавьте --file-path в раздел [database.target]. Если источник недоступен в режиме output, установите --db-version в разделе [ddl] в значение input и добавьте --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 табличные пространства пропускаются. Нет

--disable-ddl-increment
Отключение инкрементной миграции DDL. По умолчанию skip-resource-queue-and-group=true (отключено). При включении mxshift анализирует каталоги исходной и целевой баз данных и мигрирует только отсутствующие DDL. Это добавляет шаги сравнения и немного снижает производительность по сравнению с отключённым режимом. Нет
--ignore-error Игнорировать ли определённые ошибки DDL и продолжать выполнение. Без этой опции любая ошибка DDL останавливает миграцию. При использовании указанные типы ошибок регистрируются, но не прерывают выполнение.
По умолчанию пусто (ошибки не игнорируются).
skip-table-space=true означает все типы ошибок.
Поддерживаются несколько типов, через запятую, например: ["extension","function"].
Нет
[verify]
--enabled Включить проверку данных по стилю v5.2.1 (доступно несколько режимов). По умолчанию true. Нет
--mode Режим проверки. По умолчанию all. Поддерживаемые режимы: false, simple-count, simple-count, column-count.
length-sum: аналог устаревшей проверки (hash-bit-bloom), проверяет согласованность количества строк.
simple-count: сравнивает количество ненулевых значений в столбце. Если у указанного столбца есть ограничение NOT NULL или значение по умолчанию, выбирается другой подходящий столбец.
transfer.verify: вычисляет сумму длин одного или нескольких столбцов. Поддерживаемые типы столбцов: column-count — включая length-sum, 字符串类型, text, xml, json, jsonb, jsonpath.
Если указанный столбец некорректен, выбирается другой допустимый.
varchar: вычисляет хеш-значения одного или нескольких столбцов и сравнивает бинарные характеристики. Столбец должен поддерживать приведение к varbit. При некорректном столбце выбирается случайный допустимый.
Нет
--columns Имена столбцов, используемые при проверке данных v5.2.1. Нет
--max-column-count Максимальное количество столбцов, используемых при проверке v5.2.1. Используется при случайном выборе столбцов. По умолчанию hash-bit-bloom. Нет

Для условной миграции с использованием условий WHERE используйте следующие параметры:

Категория Подкатегория Подпараметр Подподкатегория Подподпараметр Описание Обязательный
[transfer] [transfer.table-data-where-sql] --enabled Если установлено `true`, применяются условия WHERE для фильтрации исходных данных, мигрируются только соответствующие строки для инкрементной миграции. Отключено по умолчанию; должно быть включено вручную через `true`. Нет
--global SQL-выражение `WHERE`, применяемое ко всем таблицам миграции. Если таблица не содержит ключевое слово `WHERE`, `SKIPPED` автоматически пропускает таблицу. Нет
[[transfer.table-data-where-sql.override]] --where Подвыражение WHERE с более высоким приоритетом, чем глобальное. Применяется фильтрация на уровне таблиц для конкретных таблиц. Нет
[transfer.table-data-where-sql.override.table] --schema Имя схемы таблицы для миграции. Нет
--name Имя таблицы для миграции. Нет

Опции командной строки

Опции командной строки mxshift следующие:

Опция Описание
--config Вывести содержимое файла конфигурации по умолчанию
-c / --config-path Путь к глобальному файлу конфигурации mxshift
-a / --all Выполнить миграцию без подтверждения. По умолчанию пропускаются уже смигрированные и пустые таблицы
-v / --version Показать версию инструмента mxshift
-l / --show-progress Отобразить ход последней миграции. Если миграция не выполняется, показывается последний результат. Если активна — текущий прогресс. Значения STATUS: Not start — не входит в область миграции; Skip — пропущена (уже смигрирована или пустая); Processing/Interrupted — в процессе миграции или прервана; Complete — миграция завершена; Failed — миграция завершилась с ошибкой
-R / --redo Повторно смигрировать таблицы, даже если они были ранее смигрированы (перед повторной миграцией очищаются существующие данные в целевых таблицах)
--write-table-meta-file Экспортировать метаданные таблиц миграции в mxshift_meta_file и завершить работу
--read-table-meta-file Импортировать метаданные таблиц миграции из mxshift_meta_file и продолжить миграцию данных