全部产品
Search
文档中心

云原生数据仓库AnalyticDB:导入与导出

更新时间:Jul 30, 2024

本文介绍AnalyticDB MySQL中导入导出的常见问题及解决方法。

说明

当常见问题场景中未明确产品系列时,表明该问题仅适用于AnalyticDB for MySQL数仓版

常见问题概览

如何停止异步导入导出任务?

登录云原生数据仓库AnalyticDB MySQL控制台,在诊断优化页的导入/导出任务页签下找到目标异步任务,查看该异步任务的异步任务名,然后运行CANCEL JOB "${异步任务名}"语句取消该异步任务。更多关于异步导入导出任务的详情,请参见异步提交导入任务3

如何使用SQL查看当前库里RUNNING的导入任务?

使用如下SQL进行查询:

SELECT * FROM INFORMATION_SCHEMA.kepler_meta_async_jobs where status = "RUNNING"

通过JDBC使用程序导入数据至AnalyticDB for MySQL集群时,为什么导入性能不佳?

  • 保证数据源的数据生产速度足够大,如果数据源来自其他系统或文件,排查客户端是否有输出瓶颈。

  • 保证数据处理速度,排查数据生产消费是否同步,保证有足够的数据等待导入AnalyticDB for MySQL

  • 保证客户端机器负载,检查CPU使用率或磁盘IO使用率等系统资源是否充足。

湖仓版集群的数据接入功能(APS),是否会单独收取链路费用?

不会收取链路的费用。但是APS任务需要运行在集群的资源组上,占用资源并消耗资源费用。

通过创建OSS外表导入或导出数据时,应该选择内网地址还是公网地址?

创建OSS外表时需要选择内网地址,因为AnalyticDB for MySQL的OSS外表,后台节点是通过内网而非公网访问OSS。

通过创建MaxCompute外表导入数据时,为什么会出现ErrorCode=ServiceUnavailable, ErrorMessage=Service is temporarily unavailable, Please try again later报错?

原因:MaxCompute服务出现临时问题。

解决方法:您需要提交工单,联系技术支持解决。

通过创建MaxCompute外表导入数据时,为什么会出现ErrorCode=Local Error, ErrorMessage=connect timed out报错?

原因:MaxCompute服务出现临时问题。

解决方法:您需要提交工单,联系技术支持解决。

如何解决创建MaxCompute外表时,出现endpoint unreachable报错?

原因:创建MaxCompute外表时,指定的endpoint无法访问,会出现endpoint unreachable报错。

解决方法:请开启ENI网络,再将建表语句中的endpoint替换为实例所在地域对应的VPC网络Endpoint,重新执行建表语句。如何查看VPC网络Endpoint,请参见各地域Endpoint对照表(阿里云VPC网络连接方式)

如何解决创建MaxCompute外表时,出现Project not found - 'xxx'报错?

  • 原因1:MaxCompute中不存在该项目,或项目名称拼写错误。

    解决方法:修改建表语句中对应的项目名称,再重新创建外表。

  • 原因2:MaxCompute中存在该项目,但是与AnalyticDB for MySQL集群不在同一地域。

    解决方法:需确保AnalyticDB for MySQL集群与MaxCompute项目在同一地域,再重新创建外表。

如何解决导入MaxCompute数据时,出现“回滚此次写入,采用每次写入一行方式提交”报错?

原因:由于AnalyticDB MySQL连接层限制,使用DataX导入数据时可能会出现上述报错。

解决方法:请修改JDBC连接串,添加rewriteBatchedStatements=false参数后重新导入数据

如何解决导入MaxCompute数据时,出现Query Exceeded Maximum Time Limit报错?

原因:因为MaxCompute表比较大,导入数据消耗的时间长,超过了AnalyticDB MySQL中INSERT操作的时间限制。

解决方法:修改INSERT_SELECT_TIMEOUT参数后重新导入数据。具体操作,请参见Config和Hint配置参数

如何解决导入MaxCompute数据时,出现cant submit job for job queue is full报错?

原因:AnalyticDB for MySQL集群同时执行的异步任务超过了限制。您可以提交工单,联系技术支持查询集群同时执行异步任务的数量限制。

解决方法:

  • 您需等待已提交的异步任务执行完成后,再重新提交异步导入任务。如何查询异步任务状态,请参见异步提交导入任务

  • 您可以提交工单,联系技术支持修改集群同时执行异步任务的数量限制。

如何解决查询MaxCompute数据时,出现Query execution error报错?

  • 原因1:MaxCompute的权限配置错误,AccessKey不能正确读取MaxCompute表。

    解决方法:修改MaxCompute的读写权限,再重新查询数据。

  • 原因2:AnalyticDB for MySQL的表结构、列名与MaxCompute不一致。

    解决方法:在AnalyticDB MySQL中重新创建与MaxCompute表结构、列名一致的外表,再重新查询数据。

  • 原因3:MaxCompute对应的分区不存在。

    解决方法:修改查询数据语句中指定的MaxCompute分区,再重新查询数据。

  • 原因4:MaxCompute小文件过多。

    解决方法:开启MaxCompute的合并小文件功能,再重新查询数据,示例语句如下。更多关于MaxCompute合并小文件的信息,请参见合并小文件

    ALTER TABLE tablename [PARTITION] MERGE SMALLFILES;

如何将MaxCompute中类型为array<string>的数据导入至AnalyticDB MySQL集群?

原因:MaxCompute外表不支持嵌套类型,无法直接将类型为array<string>的数据导入至AnalyticDB MySQL。

解决方法:您可以将MaxCompute中的数据以Parquet的格式导入至OSS,再通过AnalyticDB for MySQL读取OSS中以Parquet格式存储的数据。

如何优化MaxCompute导入数据的速度?

  • 若存储节点负载较低,您可以调整SQL_OUTPUT_BATCH_SIZE的取值后重新导入数据。示例语句如下:

    set adb_config SQL_OUTPUT_BATCH_SIZE = 6000;
  • 若MaxCompute分区过多,您可以将ENABLE_ODPS_MULTI_PARTITION_PART_MATCH的取值修改为false后重新导入数据 。示例语句如下:

    set adb_config ENABLE_ODPS_MULTI_PARTITION_PART_MATCH=false;

若仍有问题,请联系阿里云技术支持。

为什么使用INSERT OVERWRITE语句将AnalyticDB MySQL集群中的数据导出至MaxCompute外表时,数据没有被覆盖?

MaxCompute外表不支持数据覆盖。

为什么MaxCompute导入数据的量与AnalyticDB MySQL集群不一致?

原因:AnalyticDB MySQL会去掉主键重复的数据。

解决方法:请确认MaxCompute中是否存在主键重复的数据。

DTS同步数据至AnalyticDB MySQL集群时,若源库中存在AnalyticDB MySQL集群不支持的数据类型会报错吗?

若源库中存在AnalyticDB for MySQL不支持的数据类型(例如地理位置数据等类型),AnalyticDB for MySQL在进行结构初始化时会丢弃掉不支持数据类型的列。

支持的数据类型,请参见基础数据类型复杂数据类型

DTS同步数据至AnalyticDB MySQL集群时,是否支持修改源表中的字段类型?

数据同步过程中,可以修改源表中的字段类型,目前仅支持整型数据类型之间、浮点数据类型之间的列类型更改,并且只能将取值范围小的数据类型更改为取值范围大的数据类型,或者将单精度数据类型更改为双精度数据类型。

  • 整型数据类型:支持Tinyint、Smallint、Int、Bigint间,小类型到大类型的更改,例如支持将Tinyint更改为Bigint,不支持将Bigint更改为Tinyint。

  • 浮点数据类型:支持将Float更改为Double类型,不支持将Double更改为Float类型。

DTS同步数据至AnalyticDB MySQL集群时,如何解决修改源表数据类型导致的报错?

报错:

  • ‘id' is LONG type, Can't change column type to DECIMAL
  • modify precision is not supported, col=id, type decimal, old=11, new=21

原因:详细信息请参见DTS同步数据至AnalyticDB MySQL集群时,是否支持修改源表中的字段类型?

解决方法:

  • 非整库同步:建议重新同步这张表(即先从同步对象中去掉,然后删除目标库的表,再把这张表加入到同步对象中),DTS会重新进行包括schema拉取的全量同步,这样会跳过此类型的DDL。

  • 整库同步:在AnalyticDB MySQL中新建一张表,表名要不同于报错的表,表结构需要和源表的表结构一致,通过INSERT INTO SELECT将源表中的数据写入新建表中,删除报错的表,然后通过Rename将新表更名为报错的表名,重启DTS任务即可。

DTS同步数据至AnalyticDB MySQL集群时,如何解决非法日期值写入的报错?

报错:

Cannot parse "2013-05-00 00:00:00": Value 0 for dayOfMonth must be in the range [1,31]]

原因:AnalyticDB MySQL不支持非法日期值的写入。

解决方法:

  • 任务处于全量初始化阶段时,将源表的值修改为合法值即可(例如将上面的报错值改为2013-05-01 00:00:00)。

  • 任务处于增量同步阶段时,把这张表从同步对象中去掉,修改源表值为合法值,把表添加到同步对象中,然后重启同步任务。

  • 整库同步的增量同步阶段时,请联系阿里云技术支持打开非法值写入开关。开关打开后,所有非法值的写入会被转为null。

DTS同步数据至AnalyticDB MySQL集群时,如何解决无主键表同步的报错?

报错:

DTS-077004: Record Replicator error. cause by [[17003,2020051513063717201600100703453067067] table not exist => xxx_table] 

原因:目前AnalyticDB MySQL不支持无主键表的同步。

解决方法:只会在整库同步时才会发生,需要先判断源库是否为无主键表,如果是,请手动在目标库创建表并且保证新建的表有主键,建表后重启DTS任务即可。

DTS同步数据至AnalyticDB MySQL集群时,如何解决建表字段默认值过长的报错?

报错:

default value is too long

解决方法:请联系阿里云技术支持升级AnalyticDB MySQL集群到最新版本。

DTS同步数据至AnalyticDB MySQL集群时,如何解决写入单条记录超过16 MB的报错?

报错:

com.mysql.jdbc.PacketTooBigException: Packet for query is too large (120468711 > 33554432). You can change this value on the server by setting the max_allowed_packet' variable.

解决方法:请联系阿里云技术支持升级AnalyticDB MySQL集群到最新版本。

DTS同步数据至AnalyticDB MySQL集群时,如何解决磁盘空间不足的报错?

报错:

disk is over flow

解决方法:删除部分数据以释放足够的磁盘空间,或者联系阿里云技术支持对AnalyticDB MySQL集群进行扩容,保证磁盘空间足够后再重启DTS任务即可。

DTS同步数据至AnalyticDB MySQL集群时,如何解决缺少表或者缺少字段的报错?

报错:

table not exist => t1

解决方法:先确认在DTS配置的时候是否选择了所有DDL同步(比如建表语句、其他DDL语句等),如果没有的话选中即可。

DTS同步数据至AnalyticDB MySQL集群时,如果源实例中的数据库名、表名或者列名中含有划线(-)会报错吗?

由于AnalyticDB for MySQL中不允许数据库名、表名或者列名中含有划线(-),为保证数据同步成功,系统会将中划线(-)映射为下划线(_)。

如果在数据同步过程中遇到其他因数据库名、表名或者列名造成的同步失败(例如表名中含有空格、中文等),请联系阿里云技术支持。

说明

更多AnalyticDB for MySQL的使用限制,请参见使用限制

DTS同步数据至AnalyticDB MySQL集群时,如何排查AnalyticDB MySQL集群中的数据延迟问题?

  • DTS同步链路规格默认为medium模式,源库的数据写入量过大时,若想达到规格同步性能上限,需要升级实例配置

  • 无主键表的主键选择可能会导致热点行更新,而热点行更新速度很慢,可以向AnalyticDB for MySQL提工单解决该问题。

  • AnalyticDB for MySQL集群的写入性能已达到瓶颈,需要升级AnalyticDB for MySQL规格。

DataWorks导入数据至AnalyticDB MySQL集群时,为什么写入TPS不满足预期?

当客户端导入压力不足时,会导致集群CPU使用率、磁盘IO使用率及写入响应时间处于较低水位。数据库服务器端虽然能够及时消费客户端发送的数据,但由于总发送量较小,导致写入TPS不满足预期。您可以调大单次导入的批量插入条数及增加任务期望最大并发数,数据导入性能会随着导入压力的增加而线性增加。

DataWorks导入数据至AnalyticDB MySQL集群时,为什么导入的目标表存在数据倾斜?

当导入的目标表存在数据倾斜时,集群部分节点负载过高,影响导入性能。此时,集群CPU使用率、磁盘IO使用率处于较低水位,但写入响应时间较高,同时您可以在诊断优化数据建模诊断页面的倾斜诊断表中发现目标表。您可以重新设计表结构后再导入数据,详情请参见表结构设计

使用adb-import.sh导入本地数据时,如何查验客户端或其所在服务器负载是否存在瓶颈?

若客户端存在瓶颈,将无法最大化压测数据库,您可以通过以下两种方法查看客户端或其所在服务器负载是否存在瓶颈:

  • 通过登录云原生数据仓库AnalyticDB MySQL控制台,单击左侧导航的监控信息诊断与优化来查验客户端自身以及所在服务器负载是否存在瓶颈。

  • 通过以下常用命令来查验客户端自身以及所在服务器负载是否存在瓶颈。

命令

说明

top

查看CPU使用率。

free

查看内存占用。

vmstat 1 1000

查看综合负载。

dstat -all --disk-utiliostat 1 1000

查看磁盘的读带宽和使用率。

jstat -gc <pid> 1000

查看导入工具Java进程的垃圾回收(Garbage Collection,简称GC)详情,如果GC频繁,可以尝试适当扩大JVM参数jvmopts中的堆内存大小,例如将其扩大到-Xmx16G -Xms16G

使用adb-import.sh导入本地数据时,如何将导入脚本参数化?

如果确保导入文件的行列分隔符一致,可修改导入脚本中的tableNamedataPath参数,通过传入不同的表名和文件路径参数,实现一个脚本导入多个表的需求。

示例如下:

tableName=$1
dataPath=$2

使用参数化的方式执行导入。

# sh adb-import.sh table_name001 /path/table_001
# sh adb-import.sh table_name002 /path/table_002
# sh adb-import.sh table_name003 /path/table_003

使用adb-import.sh导入本地数据时如何将导入程序放在后台运行?

您可以执行如下命令在后台运行导入程序:

# nohup sh adb-import.sh &

导入程序在后台开始运行后,您可以执行以下命令查看检查日志,如果打印异常信息栈则说明导入存在错误,需要根据异常信息进行问题排查。命令如下:

# tail -f nohup.out

您还可以使用如下命令查看导入进程是否仍正常执行:

# ps -ef|grep import

使用adb-import.sh导入本地数据时,如何忽略导入程序中的错误行?

导入程序中的错误行可以分为如下两类:

  • 执行SQL出错。

    针对此类错误,您可以通过设置参数ignoreErrors=true来忽略错误行。此时会在执行结果中打印详细的出错文件、起始行号(因设置了batchSize,错误行会在起始行号后的batchSize行内)以及执行出错的SQL。

  • 文件列数不符合预期。

    当文件列数不符合预期时,系统会立即停止导入该文件并打印出错误信息,但由于该错误是由于非法文件导致的,因此并不会被忽略,您需要手动排查文件的正确性。此类错误会打印如下错误信息:

    [ERROR] 2021-03-22 00:46:40,444 [producer- /test2/data/lineitem.csv.split00.100-41] analyticdb.tool.ImportTool
    (ImportTool.java:591) -bad line found and stop import! 16, file = /test2/data/tpch100g/lineitem.csv.split00.100, rowCount = 7, current row = 3|123|179698|145|73200.15|0.06|0.00|R|F|1994-02-02|1994-01-04|1994-02-
    23|NONE|AIR|ongside of the furiously brave acco|

使用adb-import.sh导入本地数据时,如何缩小导入失败原因的排查范围?

为帮助更快的定位导入失败原因,您可以从如下几个方面来缩小失败原因的排查范围:

  • 当导入失败时,AnalyticDB for MySQL导入工具会打印错误日志以及详细的错误原因,默认会截断SQL语句(最长支持1000个字符),若需要打印更全的SQL信息,您可以使用如下命令将failureSqlPrintLengthLimit参数扩大至一个合理值(例如1500):

    printErrorSql=true
    failureSqlPrintLengthLimit=1500;
  • 由于SQL设置了batchSize,通常是上千行批量执行的SQL,不利于分辨错误行,您可以缩小batchSize参数(例如设置为10)以便于定位错误的行。参数修改命令如下:

    batchSize=10;
  • 如果文件已进行了切分且已知错误的行所在的文件分片,为了复现问题,可通过修改dataPath参数来导入存在错误行的单个文件,查看错误信息。语句如下:

    dataPath=/u01/this/is/the/directory/where/product_info/stores/file007;

使用adb-import.sh导入本地数据时,如何在Windows环境下运行导入程序?

Windows环境暂未提供bat批处理脚本,您可以直接使用如下方法调用JAR文件来执行:

usage: java -jar adb-import-tool.jar [-a <arg>] [-b <arg>] [-B <arg>] [-c <arg>] 
      [-D <arg>] [-d <arg>] [-E <arg>] [-f <arg>] [-h <arg>] [-I <arg>] 
      [-k <arg>] [-l <arg>] [-m <arg>] [-n <arg>] [-N <arg>] [-O <arg>]
      [-o <arg>] [-p <arg>] [-P <arg>] [-Q <arg>] [-s <arg>]  [-S <arg>]
      [-t <arg>] [-T <arg>] [-u <arg>] [-w <arg>][-x <arg>] [-y <arg>] [-z <arg>]

参数

是否必填

说明

-h,--ip <arg>

必填

AnalyticDB for MySQL集群的连接地址。

-u,--username <arg>

AnalyticDB for MySQL集群的数据库账号。

-p,--password <arg>

AnalyticDB for MySQL集群的数据库账号对应的密码。

-P,--port <arg>

AnalyticDB for MySQL集群使用的端口号。

-D,--databaseName <arg>

AnalyticDB for MySQL集群的数据库名称。

-f,--dataFile <arg>

需要导入的文件或文件夹的绝对路径,支持如下几种导入场景:

  • 仅导入单个文件或单个文件夹。

  • 同时导入多个文件,多个文件的路径间用英文逗号(,)分隔。

-t,--tableName <arg>

需要导入的表名。

-a,--createEmptyFinishFilePath <arg>

选填

导入完毕后是否生成一个标志文件。默认为空字符串,表示不生成。若需要生成标志文件,直接输入文件名即可。例如您可以设置-a file_a,即可生成一个名为file_a的标志文件。

-b,--batchSize <arg>

设置INSERT INTO tablename VALUES (..),(..)中批量写入VALUES的数量。默认值:1。

说明

为更好地实现数据批量写入效果,建议将该值设置在1024~4096之间。

-B,--encryptPassword <arg>

数据库密码是否使用加密算法加密。默认值:false,表示不使用加密算法加密数据库密码。

-c,--printRowCount <arg>

每个文件导入完毕后是否打印目标表实际行数。默认值:false,表示不打印。

-d,--skipHeader <arg>

是否跳过表头。默认值:false,表示不跳过表头。

-E,--escapeSlashAndSingleQuote <arg>

是否转义列中的\以及'符号。默认值:true,表示需要转义。

说明

转义对于客户端字符串解析的性能有一定损失,若确保需要导入的文件中没有转义字符,可以设置该参数为false。

-I,--ignoreErrors <arg>

导入数据遇到错误,是否忽略失败批次。默认值:false,表示不忽略。

-k,--skipLineNum <arg>

跳过的行数,类似IGNORE number {LINES | ROWS}参数。默认值:0,表示不跳过。

-l,--delimiter <arg>

列分隔符。AnalyticDB for MySQL默认使用可见符\\|作为列分隔符。同时也支持使用不可见符作为分隔符,如需使用不可见符,需要使用十六进制来表示。例如,\x07\x07需使用十六进制表示为hex0707

-m,--maxConcurrentNumOfFilesToImport <arg>

当dataFile是一个文件夹时,并行读取文件的数量。默认值:Integer.MAX_VALUE,表示读所有文件。

-n,--nullAsQuotes <arg>

当需要导入的文件中存在||时,是否需要将其设置为''。默认值:false,表示不将||设置为'',而是设置为null。

-N,--printErrorSql <arg>

导入数据遇到错误,是否打印出错的SQL。默认值:true,表示打印出错误的SQL。

-O,--connectionPoolSize <arg>

AnalyticDB for MySQL数据库连接池大小。默认值:2。

-o,--encoding <arg>

文件编码方式。取值范围:GBK或UTF-8(默认值)。

-Q,--disableInsertOnlyPrintSql <arg>

导入数据库时是否不执行INSERT,仅打印INSERT的SQL命令。选填,默认值:false,表示执行INSERT。

-s,--lineSeparator <arg>

行分隔符。AnalyticDB for MySQL默认使用可见符\\n作为行分隔符。同时也支持使用不可见符作为分隔符,如需使用不可见符,需要使用十六进制来表示。例如,\x0d\x06\x08\x0a需使用十六进制表示为hex0d06080a

-S,--printErrorStackTrace <arg>

当导入数据遇到错误,且printErrorSql=true时,是否打印出错的栈信息。默认值:false,表示不打印。

-w,--windowSize <arg>

INSERT SQL的缓冲数量。便于将INSERT SQL命令发送至AnalyticDB for MySQL时,实现流水线加速以及IO和计算分离,从而提高客户端性能。默认值:128。

-x,--insertWithColumnNames <arg>

执行INSERT INTO命令时是否带上列名,即是否执行INSERT INTO tb(column1, column2)命令进行数据导入。默认值:true,表示导入时需要带上列名。

-y,--failureSqlPrintLengthLimit <arg>

当执行INSERT 命令失败时需要打印错误SQL,使用该参数设置错误SQL的打印截断长度。默认值:1000。

-z,--connectionUrlParam <arg>

数据库连接参数。默认值:?characterEncoding=utf-8

示例:?characterEncoding=utf-8&autoReconnect=true

示例如下:

  • 示例1:使用默认参数配置导入单个文件,命令如下:

    java -Xmx8G -Xms8G -jar adb-import-tool.jar -hyourhost.ads.aliyuncs.com -uadbuser -ppassword -P3306 -Dtest --dataFile /data/lineitem.sample --tableName LINEITEM
  • 示例2:修改相关参数实现最大化吞吐导入文件夹下所有文件,命令如下:

    java -Xmx16G -Xms16G -jar adb-import-tool.jar -hyourhost.ads.aliyuncs.com -uadbuser -ppassword -P3306 -Dtest --dataFile /data/tpch100g --tableName LINEITEM --concurrency 64 --batchSize 2048