参数说明

Datamigrate的参数名有一定的规则,参数有长参数和短参数之分,长参数为参数名称的完整表示,看名称能知道大概意思,长参数参数名和参数值中间用等号连接(参数名=参数值);短参数为长参数的缩写,参数名用-开始,一般为1~2个字母,参数名与参数只之间有空格。(例入:-参数名 参数值 )。

短参数区分大小写,一般情况下:参数名为小写,代表控制源端的参数;参数名为大写,代表控制目的端的参数。

注解

同时短参数不能和长参数混合使用;参数顺序无要求,但建议源端参数写前面,目的端参数写后面,这样命令看起来比较清晰。

控制参数

exectype( -o )

执行类型,支持以下三者类型(默认为execute):

  • install:生成配置文件模板,需要conffile参数传入生成配置文件的路径。
  • execute:执行,执行是如果指定了conffile参数,用conffile指定文件中的配置进行执行,将忽略其他参数。
  • gethelp:获取帮助信息,与-?参数一样打印datamigrate的帮助信息。

conffile ( -w )

配置文件路径,默认为NULL,非空时开启配置文件方式执行。用户必须正确配置配置文件中的各个参数值,否则无法正确执行。

convmode ( -M )

字符集转换方式,默认为 OFF,使用前后端转换时,需结合(-s),(-d)参数使用,可选值如下:

  • OFF 关闭转换
  • AUTO 接口自动转换
  • FOREEND 前端进行转换
  • BACKEND 后端进行转换

注解

开启( -M )参数且并不给值的情况下,默认为OFF,不会进行转码操作;

当值为AUTO时,不需要结合(-s)和(-d)参数使用,默认字符集为客户端字符集。例如:windows平台下客户端字符集默认为GBK,Linux平台下客户端字符集默认为UTF8(客户端字符集由操作系统决定);

当值为FOREEND时,进行前端( datamigrate端 )转换,需要结合(-s)和(-d)参数使用,如果没有给与对应的字符集,工具会报错,如果两者参数不全或者是给值为NULL,工具也会报错;

当值为BACKEND时,进行后端( 驱动层 )转换,需要结合(-s)和(-d)参数使用,如果没有给与对应的字符集,工具会报错,如果两者参数不全或者是给值为NULL,工具也会报错;

casesensitive (-cs)

是否开启大小写敏感参数,默认为FALSE。

设置该参数为TRUE后,则会保持大小写格式,即自动会给表名、模式名、用户名、数据库名添加双引号。

需要注意的是只能在oscar、kstore、mpp、oracle下使用这个参数,在mysql下使用可能会有问题。

loglevel ( -L )

日志级别,支持normal [一般日志] 和detailed [详细日志] ,默认为normal级。开启detailed会打印更多的信息,一般在开发阶段使用。

logpath ( -l )

日志文件路径,包括路径和文件名称,默认为 NULL 只进行控制台输出;设置了路径,输出信息会写入到指定的文件中,控制台不再输出。

日志文件的写入是采用追加模式,因此多次执行datamigrate,但日志文件路径一样的情况下,日志信息采用追加模式写入,不会覆盖。但注意不要并行调用datamigrate的时候指定同一个日志文件,可能会导致日志信息混乱,失去了日志的意义。

ignore ( -i )

忽略错误, {TRUE | FALSE} ,默认为 FALSE。 设置为TRUE为忽略错误后,遇到部分错误信息不终止流程,而是继续;如果设置为FALSE,则遇到问题就会退出流程。

当参数设置为FALSE时以下情况会终止流程:

  • 目的端与源端列数不等
  • 生成模拟数据错误
  • 文件如果没有行头,且数据为空
  • 同时打开多个文件时,部分文件打开失败

而其他的错误例如数据错误整个流程并不会退出。

encryption ( -CK )

文件是否加密导出或者是否是加密的文件导出 ,默认为 NULL 。为NULL将会使用特定的密钥进行加解密处理,用户也可以自定义16位的密钥用来加解密文件。

dmaxcollen ( -ML )

目的库列的最大长度 ,默认为 300003 字节。如果插入数据超过这个限值则会报错, 用户可以根据实际数据大小通过该参数赋值。

smaxrowlen ( -MR )

源端读取行的最大长度 ,默认为 1128576 字节。如果读取数据大小超过这个限值 ,就无法找到分隔符 , 导致报错 ,当导入长数据时,可以根据实际使用此参数赋值。

-?

描述:获取帮助信息

-V

查看版本信息,也能查看到依赖的stoi、aci、eci的版本信息。

示例: # ./datamigrate -V

datamigrate 2.0.0 (64bit) (build 341931) for Linux

STOI 2.0.27 (64bit)(build 221731 001) for Linux

ACI 2.0.0 (64bit)(build 331931 020) for Linux

ECI 2.0.10 (64bit)(build 321730 020) for Linux

源端参数

stype ( -y )

数据源类型,支持以下类型:

  • TEXTFILE:文本文件,即标准的CSV文本,具有行分隔符、列分隔符等。
  • TEXTDIR:文本目录,可以指定一个包含了多个CSV文本的目录,datamigrate会自动寻找目录下的所有csv文件,逐一处理。
  • SQLFILE:SQL文件,标准的SQL脚本文件,每条sql语句必须有分号结束符。
  • SQLDIR:SQL目录,可以指定一个包含了多个SQL脚本的目录,datamigrate会自动寻找目录下的所有sql文件,逐一处理。
  • BINARYFILE:二进制文件,特定格式的二进制文件,提供了开发接口,方便第三方二进制文件的解析处理。
  • BINARYDIR:二进制文件目录
  • CUSTFILE:单列未转义文件,保留未用。
  • CUSTDIR:单列未转义文件目录,保留未用。
  • XMLFILE:XML文件,具有表格属性的XML文件夹,不适用多层XML。
  • XMLDIR:XML文件目录,可以指定一个包含了多个XML文件的目录,datamigrate会自动寻找目录下的所有XML文件,逐一处理。
  • OSCAR:神通关系数据库,支持神通数据库各个版本,采用神通数据库的ACI与数据库创建连接和数据查询操作。
  • KSTORE:神通MPP5分布式集群,采用ACI接口与MPP5创建连接和数据查询操作。
  • XCLUSTER:神通MPP3.5集群,支持XCLUSTER3.5版本,XCLUSTER数据库不再更新,因此datamigrate针对XCLUSTER的功能也不在更新,只维护。
  • ORACLE:甲骨文数据库,采用Oracle的OCI接口与数据库创建连接和操作,因此需要OCI驱动,迁移不同版本的Oracle时,可用Oracle版本中的驱动替代datamigrate自带的OCI驱动。
  • MYSQL:MySQL数据库,支持mysql5以上版本。采用mysql的纯C接口连接数据库并做操作。
  • GENERATE:自动生成数据,datamigrate根据数据生成规则,自动生成所需数据,一般用于测试环境下快速生成模拟数据的情况。
  • HDFS:Hadoop分布式文件系统,采用curl获取文本文件,获取文件信息,文件源端类的都能够处理。
  • HTTP:超文本传输协议,采用curl获取文本文件,获取文件信息,文件源端类的都能够处理。
  • SFTP:安全文本传输协议,采用curl获取文本文件,获取文件信息,文件源端类的都能够处理。
  • FTP:文件传输协议,采用curl获取文本文件,获取文件信息,文件源端类的都能够处理。

注解

HDFS,HTTP,SFTP,FTP四类类型的源端都需要添加(-U)参数,当无用户名和密码时,两者皆为null,存在时正常传入用户名/密码,从而通过秘钥验证。

sfcolsplit ( -c )

源文件列分隔符,默认为 ",",如果stype为TEXTFILE或TEXTDIR类型,该参数生效。用于指定csv文本文件的列分隔符。

列分隔符支持1个或多个字符,常见的列分隔符还有"|"等。

sfrowsplit ( -r )

源文件行分隔符,默认为 "\n"。

  • 如果stype为TEXTFILE或TEXTDIR类型,该参数生效。用于指定csv文本文件的行分隔符。如果文本换行有回车换行,则行分隔符为"\r\n"。行分隔符支持1个或多个字符,行分隔符可以包含列分隔符但字符个数一定大约列分隔符个数,比如列分隔符为"|",行分隔符可以为"|\r\n"。
  • 如果stype为XMLFILE或XMLDIR类型,用于指定xml文本文件的行标签,默认为"row",两行XML数据格式如下:<row><A>1</A></row><row><A>2</A></row>

sfescape ( -e )

源文件转义字符,默认为NULL,非空将使用转义。

  • 如果stype为TEXTFILE或TEXTDIR类型,该参数生效。例如csv文件常用转义字符为"\""。比如具有两列的csv文件,单行数据格式如下:1, "abc,ef" ,由于第二列数据中有","逗号,而逗号是列分隔符,因此生成此类数据时,会给第二列前后加双引号,而双引号就是转义字符,数据解析时,转义字符不是真实数据,转义字符内的任何字符都是数据的一部分。
  • 如果stype为XMLFILE或XMLDIR类型,sfescape ( -e )为xml文本文件内的根元素标签,默认为"rows",示例数据格式如下:<rows><row><A>1</A></row><row><A>2</A></row></rows>

sflist ( -f )

源文件路径或目录列表,逗号分隔。如果stype为TEXTFILE,则sflist参数为一个具体文件的路径,多个文件可以用逗号分隔;如果stype为TEXTDIR,则sflist为一个目录,多个目录用逗号分隔。

sfsuffix ( -j )

源文件后缀,默认为 .csv,当stype为TEXTDIR时,datamigrate自动搜索目录下那些后缀的文件。

sfrowhead ( -h )

源文件是否存在行头,可选值:{TRUE | FALSE},默认值为 FALSE,如果stype为TEXTFILE或TEXTDIR类型,该参数生效。如果有行头,在读取文件时,第一行会被忽略(工具不管第一行是否是真的行头都会忽略)。

sfsednull ( -n )

源文件中如果列的数据为NULL或null字符串,是否要将这个NULL字符串转换为数据库的NULL数据。可选值:{TRUE | FALSE},默认值:默认为FALSE,代表会将null或NULL字符串写入数据库,而不是写入NULL值;设置为TRUE,则代表在对应字段写入NULL值,代表这个字段为空,无数据。

sfispace ( -is )

忽略源文件中的空格字符,可选值:{TRUE | FALSE},默认值:默认为FALSE。如果字符串前后空格,设置为TRUE后会被忽略,但如果是在转义字符内的空格不会被忽略;

readthread ( -rt )

读文件线程数,默认为 1,如果一次给了多个文本文件或指定了文本文件夹中存在多个文件,可以调大readthread参数来并行读取多个文件,读取每个线程读取的内容会形成一个待解析的列表,后续会从这个列表中拿到以及一个准备的内容进行解析。如果磁盘的并发性能比较好,可以通过增加本参数的值来加快文件读取总速度。

readmode ( -rm )

读文件模式,默认为 MMAP,可选值如下:

  • MMAP 内存映射模式
  • PREAD 批量读取模式
  • AIO 异步IO模式

sferrmsg ( -z )

是否开启错误的原始数据块转存功能,如果stype为TEXTFILE或TEXTDIR类型,该参数生效。当读取文本文件并解析,发现文件格式解析错误时,将解析错误的原始文件转存为csv文件,转存的路径为源数据文件相同目录下:表名+线程ID+时间戳+列数。转存的目的是方便使用者分析文件的问题,因为CSV文件可能很大,在源文件中查找问题不便,从转存的部分内容去分析相对较快。

sdburl ( -u )

源数据库的连接字符串,格式 user/password@host:port/dbname。对于连接Oracle,不支持用TNS服务名方式访问。

sdbtab ( -t )

源库导出的表名,默认为 NULL,该参数与-q参数互斥,指定了-q(sdbsql)时-t参数失效。表名可以有模式名,比如SYSTEM.STUDENT,不指定模式名的情况下将从登录用户所属模式下寻找,找不到表则报错。一次只能指定一个表。

sdbsql ( -q )

源库SQL,默认为 NULL,非空时为SQL导出,该参数与-t参数互斥。指定后源端数据来源为SQL语句的查询结果,需要注意SQL查询结果与目的端表结构的一致性,不一致可能导致错误。

sdbparall ( -p )

源库导出表的并行模式,默认为 partition。可选值为:

  • Partition: 按分区并行,需要源表已经进行了行分区处理(范围分区、列表分区等),否则指定后无效果。支持源库类型stype为OSCAR、KSTORE或XCLUSTER
  • Package: 按包并行,支持源库类型stype为KSTORE或XCLUSTER,datamigrate中会自动查询表中的数据包,并将这些包分配到多个线程中去并行处理。
  • Node: 按node并行,datamigrate会查询集群中的节点,直接到各个节点中去查询数据并处理,支持源库类型stype为KSTORE或XCLUSTER。
  • Limit: 按limit分页并行,将查询按照limit进行分页,分页的大小受sdblimit参数控制。支持源库类型stype为OSCAR,只能与-t参数搭配使用。
  • Off: 关闭并行

sdbtabp ( -tp )

源库导出的表名的分区,默认为 NULL, 如果sdbparall为Package包并行时生效,当sdbsql非空时此参数失效。

表比较大时,想通过指定分区方式进行包并行。包并行模式下,指定tp参数为分区名称,可只迁移指定的分区数据。

sdblimit ( -pl )

sdbparall参数为limit时,设置limit分页的大小,默认为100000。指定的值必须大于0,建议是10000的整数倍,且必须小于sdbtotal值。

sdboffset ( -po )

sdbparall参数为limit时,设置limit分页起始偏移行数,默认为0。Sdboffset必须小于sdbtotal。

sdbtotal ( -pt )

sdbparall参数为limit时,设置limit分页导出数据的总行数默认值为0。不指定的情况下导出表中的所有数据。当sdbtotal小于等于0时,datamigrate会自动查询数据库表的总行数。

ssplitsize ( -b )

当如果stype为TEXTFILE或TEXTDIR类型时,代表分割源文件单位MB;当stype为KSTORE或者XCLUSTER时,代表的是压缩数据包(package)的个数。

默认为 50。由于二进制文件的格式特殊性,一个二进制文件会在一个线程内按分割大小分割。

对于文本文件来说,该参数代表一次从本文文件中读取数据大小,会缓存在内存中,每个线程为了解析从文件中读取到的内容,因此每个线程都会开辟该参数设置大小的缓冲区。因此datamigrate占用内存为:ssplitsize * k线程数,因此需要控制ssplitsize参数和sthreadcount参数,避免内存资源耗尽出现OOM。

sfetchsize ( -g)

源库预取行数,默认为 1000。即每次从源端数据库获取的数据行数,在数据行数比较多的情况下,适当加大预取行数,会提高从源端数据库读取数据的效率。

如果数据行大于1000万行,建议-g参数设置为10000。需要注意,-g参数越大,内存占用越大,且和sthreadcount(-k)参数为线性关系,因此调优设置时需要注意内存使用情况。

sthreadcount ( -k )

获取源数据线程数,默认为 4,对于源端为文本文件时,该参数代表开启多少个线程来解析已经读取到内存的原始数据内容。对于源端为数据库时,则代表开启多个线程来执行不同的SQL从读取表中的数据,此时与sdbparall参数相关,并行参数会生成能将数据分成多片的SQL。在一定范围内,获取数据到buffer的总速度是随着本参数线性增长的。

gcoltype ( -x )

源端数据为工具模拟生成模式,stype参数值为GENERATE时生效。生成数据配置,列按逗号分割,格式为:"[类型]|[最小值或者文件路径]|[最大值]|[NULL率]|[头部]|[尾部]",默认为 NULL。支持的类型如下:

  • CONST_INT 常整数
  • RAND_INT 随机整数
  • RAND_STR 随机字符串
  • RAND_CSTR 随机大写字符串
  • RAND_LSTR 随机小写字符串
  • RAND_CNSTR 随机中文字符串
  • RAND_ENSTR 随机英文字符串
  • RAND_CENSTR 随机大写英文字符串
  • RAND_LCENSTR 随机小写英文字符串
  • RAND_FLOAT 随机浮点数
  • RAND_DATE 随机日期
  • RAND_TIME 随机时间
  • RAND_TIMESTAMP 随机时间戳
  • SYS_DATE 系统日期
  • SYS_TIME 系统时间
  • SYS_TIMESTAMP 系统时间戳
  • SYS_INTTIME 系统格林威治时间
  • RAND_IPV4 随机IPV4
  • RAND_IPV6 随机IPV6
  • RAND_IPV4OR6 随机IP
  • RAND_MAC 随机MAC地址
  • RAND_FILE 文件中随机一行
  • SEQ_FILE 文件中顺序取一行

gdatacount ( -v )

源端数据为工具模拟生成模式,stype参数值为GENERATE时生效。指定生成数据的行数,默认为 0。

sdbconv ( -m )

源库字符集向客户端自动转换开关,可选值:{TRUE | FALSE},默认 FALSE,关闭自动转换;TRUE 自动转换。

scharset ( -s )

源端字符集,默认为NULL,需要结合( -M )参数使用,支持的字符集如下

  • ASCII(Linux平台ASCII需要用GBK代替)
  • GBK
  • GB18030
  • GB2312
  • UTF8
  • UTF-8
  • UTF-16(Windows平台不支持)
  • UTF-16LE(Windows平台不支持)

Buffer池参数

dbufcount ( -B )

buffer数量,默认为 4,buffer个数建议大约dthreadcount,且为dthreadcount的1~2倍为合适。

如果源端是文件,且文件磁盘读取速度和解析总速度比较快时,可以增大本参数的值,通常本参数的值设置为比(磁盘读取速度/提交大小)稍大一些比较合适;如果源端是数据库,且从数据库获取数据总速度比较快时,可以增大本参数的值。

committime ( -Q )

提交时间,单位s,默认为 -1 表示无限大。

commitcount ( -N )

BUFF加载行数,默认为 10000。本参数为buffer的三个提交触发条件之一,如果buffer中行数达到提交行数,目的端线程会把当前buffer中的数据加载到目的端。首先,如果目的端是kstore或者xCluster,建议设置本参数为DPSIZE(kstore表每个包包含的行数)的整数倍;其次,如果单行数据比较大,可以减少本参数的值,如果单行数据比较小,可以增加本参数的值。

commitsize ( -Z )

提交大小,单位MB,默认为 30。本参数为buffer的三个提交触发条件之一,如果buffer中数据大小达到提交大小,目的端线程会把当前buffer中的数据加载到目的端。本参数的值设置为比(提交行数X单行大小)稍大一些比较合适。

rowcount ( -FN )

提交行数,默认为0 (表示该功能关闭,即达到BUFF加载行数或BUFF大小后提交)。该参数只在MPP5.0及后续版本中使用。参数意义如下:

原代码中采用隐式事务。每一个buffer数据导入的时候都向后台提交一次commit,后台收到commit以后开始处理数据。如果数据行数没有达到要压缩需要的行数时,会产生碎包。

为了减少碎包,通过设置参数-FN 开启buffer重用,用户定义向后台导入的行数,只有达到该行数时或者数据读取完成时,才向后台发送commit。

当有buffer数据提交后,从连接池中选择1个session,每个session记录自己获取的数据行数,当前session中写入的数据达到用户定义的提交行数时,向后台发送commit。

schedulerinterval ( -SI )

调度器轮询查询时间间隔,单位ms,默认100,往目的端写数据的调度线程,去buff池中获取准备好的buffer的间隔时间,如果第一次没有拿到,则等待100ms后再去获取。

减小该参数可能会加剧单核CPU的消耗,但能提高从buff池中获得buff的效率,需要根据实际情况进行调整。

目的端参数

dtype ( -Y )

目的端类型,默认为 KSTORE,支持一些类型:

  • TEXTFILE 文本文件
  • TEXTFDIR 文本目录
  • BINARYFILE 二进制文件
  • BINARYDIR 二进制文件目录
  • OSCAR 神通数据库
  • KSTORE 神通KSTORE或MPP5
  • XCLUSTER 神通集群

dfilewritemode ( -FO )

目的文件的写入模式,默认为 "default",可选参数值为"append"、"overwrite"。该参数仅在dtype(-Y)参数为TEXTFILE时生效。

"default":检测目的文件是否存在,若存在则提示文件已存在并退出程序,不存在则新建文件写入源端数据。

"append":检测目的文件是否存在,若存在则在目的文件的后面追加写入源端数据,不存在则新建文件写入源端数据。

"overwrite":检测目的文件是否存在,若存在则将目的文件的内容进行覆盖写入,不存在则新建文件写入源端数据。

注解

该参数仅在dtype(-Y)参数为TEXTFILE时生效。

dfcolsplit ( -C )

目的文件列分隔符,默认为 ",",如果dtype为TEXTFILE或TEXTDIR类型,该参数生效。用于指定csv文本文件的列分隔符。

列分隔符支持1个或多个字符,常见的列分隔符还有"|"等。

dfrowsplit ( -R )

目的文件行分隔符,默认为 "\n",如果dtype为TEXTFILE或TEXTDIR类型,该参数生效。用于指定csv文本文件的行分隔符。如果导出DOS格式的CSV,行分隔符为"\r\n"。

行分隔符支持1个或多个字符,行分隔符可以包含列分隔符但字符个数一定大于列分隔符个数,比如列分隔符为"|",行分隔符可以为"|\n"。

dfescape ( -E )

目的文件转义字符,默认为NULL,非空将使用转义。如果dtype为TEXTFILE或TEXTDIR类型,该参数生效。例如csv文件常用转义字符为"\""。比如具有两列的csv文件,导出单行数据格式如下:

1, "abc,ef"

由于第二列数据中有","逗号,而逗号是列分隔符,因此生成此类数据时,会给第二列前后加双引号,而双引号就是转义字符,数据解析时,转义字符不是真实数据,转义字符内的任何字符都是数据的一部分。

dflist ( -F)

目标文件路径或目录列表,逗号分隔。如果dtype为TEXTFILE,则dflist参数为一个具体文件的路径,多个文件可以用逗号分隔;如果dtype为TEXTDIR,则dflist为一个目录,多个目录用逗号分隔。

ddburl ( -U )

目标数据库的连接字符串,格式 user/password@host:port/dbname。对于连接Oracle,不支持用TNS服务名方式访问。

ddbtab ( -T )

目标库的表名,默认为 DATAMIGRATE_TEST_TABLE_NAME。表名可以有模式名,比如SYSTEM.STUDENT,不指定模式名的情况下将从登录用户所属模式下寻找,找不到表则报错。一次只能指定一个表。

dimpmode ( -G )

xcluster集群表数据导入模式,默认自适应,可选项:

  • FULL 全节点模式
  • SINGLE 单点导入模式
  • ONLINE 在线节点模式
  • ONLYONE 单节点模式
  • HASHAGG 哈希聚集模式

dmycols ( -J )

自定义导入列定义,默认为NULL,非空将开启此功能;导入到目的端的列顺序可以任意指定,例如 "c2,c3,c1"。

dseqname ( -S )

目的数据库序列名,默认为NULL,非空将开启此功能;序列必须是在数据库中已经存在。序列名可以有模式名,比如SYSTEM.SEQ1,不指定模式名的情况下将从登录用户所属模式下寻找,找不到序列则报错。

dseqcol ( -W )

使用序列的列名,默认为 ID。

dseqstartval ( -X )

序列起始值,默认为 1。

dseqincval ( -I )

序列跨度,默认为 100000。

dthreadcount ( -K )

入库线程数,默认为 4。此时可能会数据库创建4个数据连接。对于MPP5或者XCLUSTER集群来说,会与主节点和数据存储节点分配创建不低于线程数的数据库连接。并发数受目的端(包括集群的数据节点)最大连接数限制。本参数的值通常设置为与buffer数量相同。

edatadir ( -D )

错误数据保存的路径,默认为NULL,非空将保存错误数据。这个数据是datamigrate处理后的中间数据,报错这个数据的目的是如果因为数据库自身原因导致一批数据入库失败,将失败的数据保存,后续可以将保存的数据重新入库,避免数据丢失。

tsformat( -DF )

设置源端数据库能日期格式,目前只支持oscar数据库,设置该参数会在session级修改数据库的DATEFORMAT和TIMESTAMPFORMAT参数。

dcharset ( -d )

目的端字符集,默认为NULL,需要结合( -M )参数使用,支持的字符集如下

  • ASCII(Linux平台ASCII需要用GBK代替)
  • GBK
  • GB18030
  • GB2312
  • UTF8
  • UTF-8
  • UTF-16(Windows平台不支持)
  • UTF-16LE(Windows平台不支持)

参数转义

由于datamigrate是一个命令行工具,一般在终端中执行,终端中对于输入部分符号需要转义,一般转义符号为双引号,如果数据的参数中有shell中特殊的操作符号,需要参数添加引号,比如很多csv文件的列分隔符为竖线"|",同时shell命令中竖线为管道输出标志符号,因此输入参数时需要添加双引号,比如:-c "|"