導入與導出
本文介紹AnalyticDB MySQL中導入導出的常見問題及解決方法。
當常見問題場景中未明確產品系列時,表明該問題僅適用于AnalyticDB for MySQL數倉版。
常見問題概覽
如何停止異步導入導出任務?
登錄云原生數據倉庫AnalyticDB MySQL控制臺,在診斷優化頁的導入/導出任務頁簽下找到目標異步任務,查看該異步任務的異步任務名,然后運行CANCEL JOB "${異步任務名}"
語句取消該異步任務。更多關于異步導入導出任務的詳情,請參見異步提交導入任務。
如何使用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-util或iostat 1 1000 | 查看磁盤的讀帶寬和使用率。 |
jstat -gc <pid> 1000 | 查看導入工具Java進程的垃圾回收(Garbage Collection,簡稱GC)詳情,如果GC頻繁,可以嘗試適當擴大JVM參數 |
使用adb-import.sh導入本地數據時,如何將導入腳本參數化?
如果確保導入文件的行列分隔符一致,可修改導入腳本中的tableName
和dataPath
參數,通過傳入不同的表名和文件路徑參數,實現一個腳本導入多個表的需求。
示例如下:
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>]
參數 | 是否必填 | 說明 |
| 必填 | AnalyticDB for MySQL集群的連接地址。 |
| AnalyticDB for MySQL集群的數據庫賬號。 | |
| AnalyticDB for MySQL集群的數據庫賬號對應的密碼。 | |
| AnalyticDB for MySQL集群使用的端口號。 | |
| AnalyticDB for MySQL集群的數據庫名稱。 | |
| 需要導入的文件或文件夾的絕對路徑,支持如下幾種導入場景:
| |
| 需要導入的表名。 | |
| 選填 | 導入完畢后是否生成一個標志文件。默認為空字符串,表示不生成。若需要生成標志文件,直接輸入文件名即可。例如您可以設置 |
| 設置 說明 為更好地實現數據批量寫入效果,建議將該值設置在1024~4096之間。 | |
| 數據庫密碼是否使用加密算法加密。默認值:false,表示不使用加密算法加密數據庫密碼。 | |
| 每個文件導入完畢后是否打印目標表實際行數。默認值:false,表示不打印。 | |
| 是否跳過表頭。默認值:false,表示不跳過表頭。 | |
| 是否轉義列中的 說明 轉義對于客戶端字符串解析的性能有一定損失,若確保需要導入的文件中沒有轉義字符,可以設置該參數為false。 | |
| 導入數據遇到錯誤,是否忽略失敗批次。默認值:false,表示不忽略。 | |
| 跳過的行數,類似 | |
| 列分隔符。AnalyticDB for MySQL默認使用可見符 | |
| 當dataFile是一個文件夾時,并行讀取文件的數量。默認值: | |
| 當需要導入的文件中存在 | |
| 導入數據遇到錯誤,是否打印出錯的SQL。默認值:true,表示打印出錯誤的SQL。 | |
| AnalyticDB for MySQL數據庫連接池大小。默認值:2。 | |
| 文件編碼方式。取值范圍:GBK或UTF-8(默認值)。 | |
| 導入數據庫時是否不執行INSERT,僅打印INSERT的SQL命令。選填,默認值:false,表示執行INSERT。 | |
| 行分隔符。AnalyticDB for MySQL默認使用可見符 | |
| 當導入數據遇到錯誤,且 | |
| INSERT SQL的緩沖數量。便于將INSERT SQL命令發送至AnalyticDB for MySQL時,實現流水線加速以及IO和計算分離,從而提高客戶端性能。默認值:128。 | |
| 執行 | |
| 當執行INSERT 命令失敗時需要打印錯誤SQL,使用該參數設置錯誤SQL的打印截斷長度。默認值:1000。 | |
| 數據庫連接參數。默認值: 示例: |
示例如下:
示例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