MySQL數據源為您提供讀取和寫入MySQL的雙向通道,本文為您介紹DataWorks的MySQL數據同步的能力支持情況。
支持的MySQL版本
離線讀寫:
支持MySQL 5.5.x、MySQL 5.6.x、MySQL 5.7.x、MySQL 8.0.x,兼容Amazon RDS for MySQL、Azure MySQL、Amazon Aurora MySQL。
離線同步支持讀取視圖表。
實時讀取:
數據集成實時讀取MySQL數據是基于實時訂閱MySQL實現的,當前僅支持實時同步MySQL 5.5.x、MySQL 5.6.x、MySQL 5.7.x、MySQL 8.0.x(非8.0新特性,比如functional index,僅兼容原有功能)版本的MySQL數據,兼容Amazon RDS for MySQL、Azure MySQL、Amazon Aurora MySQL。
重要如果需要同步DRDS的MySQL,請不要將DRDS的MySQL配置為MySQL數據源,您可以參考配置DRDS數據源文檔直接將其配置為DRDS數據源。
使用限制
實時讀
不支持同步MySQL只讀庫實例的數據。
不支持同步含有Functional index的表。
不支持XA ROLLBACK。
針對已經XA PREPARE的事務數據,實時同步會將其同步到目標端,如果XA ROLLBACK,實時同步不會針對XA PREPARE的數據做回滾寫入的操作。若要處理XA ROLLBACK場景,需要手動將XA ROLLBACK的表從實時同步任務中移除,再添加表后重新進行同步。
僅支持同步MySQL服務器Binlog配置格式為ROW。
實時同步不會同步被級聯刪除的關聯表記錄。
對于Amazon Aurora MySQL數據庫,需要連接到您的主/寫數據庫,因為AWS不允許在Aurora MySQL的只讀副本上激活binlog功能。實時同步任務需要binlog來執行增量更新。
實時同步在線DDL變更僅支持通過數據管理DMS對MySQL表進行加列(Add Column)在線DDL變更。
離線讀
MySQL Reader插件在進行分庫分表等多表同步時,若要對單表進行切分,則需要滿足任務并發數大于表個數這一條件,否則切分的Task數目等于表的個數。
支持的字段類型
各版本MySQL的全量字段類型請參見MySQL官方文檔。以下以MySQL 8.0.x為例,為您羅列當前主要字段的支持情況。
字段類型 | 離線讀(MySQL Reader) | 離線寫(MySQL Writer) | 實時讀 | 實時寫 |
TINYINT | 支持 | 支持 | 支持 | 支持 |
SMALLINT | 支持 | 支持 | 支持 | 支持 |
INTEGER | 支持 | 支持 | 支持 | 支持 |
BIGINT | 支持 | 支持 | 支持 | 支持 |
FLOAT | 支持 | 支持 | 支持 | 支持 |
DOUBLE | 支持 | 支持 | 支持 | 支持 |
DECIMAL/NUMBERIC | 支持 | 支持 | 支持 | 支持 |
REAL | 不支持 | 不支持 | 不支持 | 不支持 |
VARCHAR | 支持 | 支持 | 支持 | 支持 |
JSON | 支持 | 支持 | 支持 | 支持 |
TEXT | 支持 | 支持 | 支持 | 支持 |
MEDIUMTEXT | 支持 | 支持 | 支持 | 支持 |
LONGTEXT | 支持 | 支持 | 支持 | 支持 |
VARBINARY | 支持 | 支持 | 支持 | 支持 |
BINARY | 支持 | 支持 | 支持 | 支持 |
TINYBLOB | 支持 | 支持 | 支持 | 支持 |
MEDIUMBLOB | 支持 | 支持 | 支持 | 支持 |
LONGBLOB | 支持 | 支持 | 支持 | 支持 |
ENUM | 支持 | 支持 | 支持 | 支持 |
SET | 支持 | 支持 | 支持 | 支持 |
BOOLEAN | 支持 | 支持 | 支持 | 支持 |
BIT | 支持 | 支持 | 支持 | 支持 |
DATE | 支持 | 支持 | 支持 | 支持 |
DATETIME | 支持 | 支持 | 支持 | 支持 |
TIMESTAMP | 支持 | 支持 | 支持 | 支持 |
TIME | 支持 | 支持 | 支持 | 支持 |
YEAR | 支持 | 支持 | 支持 | 支持 |
LINESTRING | 不支持 | 不支持 | 不支持 | 不支持 |
POLYGON | 不支持 | 不支持 | 不支持 | 不支持 |
MULTIPOINT | 不支持 | 不支持 | 不支持 | 不支持 |
MULTILINESTRING | 不支持 | 不支持 | 不支持 | 不支持 |
MULTIPOLYGON | 不支持 | 不支持 | 不支持 | 不支持 |
GEOMETRYCOLLECTION | 不支持 | 不支持 | 不支持 | 不支持 |
數據同步前準備:MySQL環境準備
在DataWorks上進行數據同步前,您需要參考本文提前在MySQL側進行數據同步環境準備,以便在DataWorks上進行MySQL數據同步任務配置與執行時服務正常。以下為您介紹MySQL同步前的相關環境準備。
準備工作1:確認MySQL版本
數據集成對MySQL版本有要求,您可參考上文支持的MySQL版本章節,查看當前待同步的MySQL是否符合版本要求。您可以在MySQL數據庫通過如下語句查看當前MySQL數據庫版本。
SELECT version();
準備工作2:配置賬號權限
建議您提前規劃并創建一個專用于DataWorks訪問數據源的MySQL賬號,操作如下。
可選:創建賬號。
操作詳情請參見創建MySQL賬號。
配置權限。
離線
在離線同步場景下:
在離線讀MySQL數據時,此賬號需擁有同步表的讀(
SELECT
)權限。在離線寫MySQL數據時,此賬號需擁有同步表的寫(
INSERT
、DELETE
、UPDATE
)權限。
實時
在實時同步場景下,此賬號需要擁有數據庫的
SELECT
、REPLICATION SLAVE
、REPLICATION CLIENT
權限。
您可以參考以下命令為賬號添加權限,或直接給賬號賦予
SUPER
權限。如下執行語句在實際使用時,請替換'同步賬號'
為上述創建的賬號。-- CREATE USER '同步賬號'@'%' IDENTIFIED BY '密碼'; //創建同步賬號并設置密碼,使其可以通過任意主機登錄數據庫。%表示任意主機。 GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '同步賬號'@'%'; //授權同步賬號數據庫的 SELECT, REPLICATION SLAVE, REPLICATION CLIENT權限。
*.*
表示授權同步賬號對所有數據庫的所有表擁有上述權限。您也可以指定授權同步賬號對目標數據庫的指定表擁有上述權限。例如,授權同步賬號對test數據庫的user表擁有上述權限,則可以使用GRANT SELECT, REPLICATION CLIENT ON test.user TO '同步賬號'@'%';
語句。說明REPLICATION SLAVE
語句為全局權限,不能指定授權同步賬號對目標數據庫的指定表擁有相關權限。
準備工作3:(僅實時同步需要)開啟MySQL Binlog
數據集成通過實時訂閱MySQL Binlog實現增量數據實時同步,您需要在DataWorks配置同步前,先開啟MySQL Binlog服務。操作如下:
如果Binlog在消費中,則無法被數據庫刪除。如果實時同步任務運行延遲將可能導致源端Binlog長時間被消費,請合理配置任務的延遲告警,并及時關注數據庫的磁盤空間。
Binlog至少保留72小時以上,避免任務失敗后因Binlog已經消失,再啟動無法重置位點到故障發生前而導致的數據丟失(此時只能使用全量離線同步來補齊數據)。
檢查Binlog是否開啟。
使用如下語句檢查Binlog是否開啟。
SHOW variables like "log_bin";
返回結果為ON時,表明已開啟Binlog。
如果您使用備用庫同步數據,則還可以通過如下語句檢查Binlog是否開啟。
SHOW variables LIKE "log_slave_updates";
返回結果為ON時,表明備用庫已開啟Binlog。
如果返回的結果與上述結果不符:
開源MySQL請參考MySQL官方文檔開啟Binlog。
阿里云RDS MySQL請參考RDS MySQL日志備份開啟Binlog。
阿里云PolarDB MySQL請參考開啟Binlog開啟Binlog。
查詢Binlog的使用格式。
使用如下語句查詢Binlog的使用格式。
SHOW variables LIKE "binlog_format";
返回結果說明:
返回ROW,表示開啟的Binlog格式為ROW。
返回STATEMENT,表示開啟的Binlog格式為STATEMENT。
返回MIXED,表示開啟的Binlog格式為MIXED。
重要DataWorks實時同步僅支持同步MySQL服務器Binlog配置格式為ROW。如果返回非ROW請修改Binlog Format。
查詢Binlog完整日志是否開啟。
使用如下語句查詢Binlog完整日志是否開啟。
show variables like "binlog_row_image";
返回結果說明:
返回FULL,表示Binlog開啟了完整日志。
返回MINIMAL,表示Binlog開啟了最小日志,未開啟完整日志。
重要DataWorks實時同步,僅支持同步開啟了Binlog完整日志的MySQL服務器數據。若查詢結果返回非FULL,請修改binlog_row_image的配置。
OSS binlog讀取授權配置
在添加MySQL數據源時,如果配置模式為阿里云實例模式,且RDS MySQL實例地域與DataWorks項目空間在同一地域,您可以開啟支持OSS binlog讀取,開啟后,在無法訪問RDS binlog時,將會嘗試從OSS獲取binlog,以避免實時同步任務中斷。
如果選擇的OSS binlog訪問身份為阿里云RAM子賬號或阿里云RAM角色,您還需參考如下方式配置賬號授權。
阿里云RAM子賬號
登錄RAM 訪問控制-用戶控制臺,找到需要授權的子賬號。具體操作:
單擊操作列的添加權限。
配置如下關鍵參數后,單擊確認新增授權。
資源范圍:賬號級別。
權限策略:系統策略。
策略名稱:
AliyunDataWorksAccessingRdsOSSBinlogPolicy
。
阿里云RAM角色
登錄RAM 訪問控制-角色控制臺,創建一個RAM角色。具體操作,請參見創建可信實體為阿里云賬號的RAM角色。
關鍵參數:
選擇可信實體類型:阿里云賬號。
角色名稱:自定義。
選擇信任的云賬號:其他賬號,填寫DataWorks工作空間所屬的云賬號。
為創建好的RAM角色精確授權。具體操作,請參見為RAM角色授權。
關鍵參數:
權限策略:系統策略。
策略名稱:
AliyunDataWorksAccessingRdsOSSBinlogPolicy
。
為創建好的RAM角色修改信任策略。具體操作,請參見修改RAM角色的信任策略。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "<DataWorks使用者主賬號的云賬號ID>@cdp.aliyuncs.com" ] } } ], "Version": "1" }
創建數據源
在進行數據同步任務開發時,您需要在DataWorks上創建一個對應的數據源,操作流程請參見創建并管理數據源,詳細的配置參數解釋可在配置界面查看對應參數的文案提示。
數據同步任務開發:MySQL同步流程引導
數據同步任務的配置入口和通用配置流程可參見下文的配置指導。
單表離線同步任務配置指導
操作流程請參見通過向導模式配置離線同步任務、通過腳本模式配置離線同步任務。
腳本模式配置的全量參數和腳本Demo請參見下文的附錄:MySQL腳本Demo與參數說明。
單表實時同步任務配置指導
操作流程請參見DataStudio側實時同步任務配置。
整庫離線、整庫(實時)全增量、整庫(實時)分庫分表等整庫級別同步配置指導
操作流程請參見數據集成側同步任務配置。
常見問題
更多其他數據集成常見問題請參見數據集成常見問題。
附錄:MySQL腳本Demo與參數說明
離線任務腳本配置方式
如果您配置離線任務時使用腳本模式的方式進行配置,您需要按照統一的腳本格式要求,在任務腳本中編寫相應的參數,詳情請參見通過腳本模式配置離線同步任務,以下為您介紹腳本模式下數據源的參數配置詳情。
Reader腳本Demo
本文為您提供單庫單表和分庫分表的配置示例:
本文JSON示例中的注釋僅用于展示部分重要參數含義,實際配置時,請移除注釋內容。
配置單庫單表
{ "type": "job", "version": "2.0",//版本號。 "steps": [ { "stepType": "mysql",//插件名。 "parameter": { "column": [//列名。 "id" ], "connection": [ { "querySql": [ "select a,b from join1 c join join2 d on c.id = d.id;" ], "datasource": ""http://數據源名稱。 } ], "where": "",//過濾條件。 "splitPk": "",//切分鍵。 "encoding": "UTF-8"http://編碼格式。 }, "name": "Reader", "category": "reader" }, { "stepType": "stream", "parameter": {}, "name": "Writer", "category": "writer" } ], "setting": { "errorLimit": { "record": "0"http://錯誤記錄數。 }, "speed": { "throttle": true,//當throttle值為false時,mbps參數不生效,表示不限流;當throttle值為true時,表示限流。 "concurrent": 1,//作業并發數。 "mbps": "12"http://限流,此處1mbps = 1MB/s。 } }, "order": { "hops": [ { "from": "Reader", "to": "Writer" } ] } }
配置分庫分表
說明分庫分表是指在MySQL Reader端可以選擇多個MySQL數據表,且表結構保持一致。此處的‘分庫分表’是指多個MySQL寫入同一個目標表,如想要支持整庫級別配置分庫分表,還請在數據集成站點建立任務并選擇整庫分庫分表能力
{ "type": "job", "version": "2.0", "steps": [ { "stepType": "mysql", "parameter": { "indexes": [ { "type": "unique", "column": [ "id" ] } ], "envType": 0, "useSpecialSecret": false, "column": [ "id", "buyer_name", "seller_name", "item_id", "city", "zone" ], "tableComment": "測試訂單表", "connection": [ { "datasource": "rds_dataservice", "table": [ "rds_table" ] }, { "datasource": "rds_workshop_log", "table": [ "rds_table" ] } ], "where": "", "splitPk": "id", "encoding": "UTF-8" }, "name": "Reader", "category": "reader" }, { "stepType": "odps", "parameter": {}, "name": "Writer", "category": "writer" }, { "name": "Processor", "stepType": null, "category": "processor", "copies": 1, "parameter": { "nodes": [], "edges": [], "groups": [], "version": "2.0" } } ], "setting": { "executeMode": null, "errorLimit": { "record": "" }, "speed": { "concurrent": 2, "throttle": false } }, "order": { "hops": [ { "from": "Reader", "to": "Writer" } ] } }
Reader腳本參數
腳本參數名 | 描述 | 是否必選 | 默認值 |
datasource | 數據源名稱,腳本模式支持添加數據源,此配置項填寫的內容必須與添加的數據源名稱保持一致。 | 是 | 無 |
table | 選取的需要同步的表名稱。一個數據集成任務只能從一張表中讀取數據。 table用于配置范圍的高級用法示例如下:
說明 任務會讀取匹配到的所有表,具體讀取這些表中column配置項指定的列。如果表不存在,或者讀取的列不存在,會導致任務失敗。 | 是 | 無 |
column | 所配置的表中需要同步的列名集合,使用JSON的數組描述字段信息 。默認使用所有列配置,例如[ * ]。
| 是 | 無 |
splitPk | MySQL Reader進行數據抽取時,如果指定splitPk,表示您希望使用splitPk代表的字段進行數據分片,數據同步因此會啟動并發任務進行數據同步,提高數據同步的效能。
| 否 | 無 |
where | 篩選條件,在實際業務場景中,往往會選擇當天的數據進行同步,將where條件指定為
| 否 | 無 |
querySql(高級模式,向導模式不支持此參數的配置) | 在部分業務場景中,where配置項不足以描述所篩選的條件,您可以通過該配置型來自定義篩選SQL。配置該項后,數據同步系統會忽略tables、columns和splitPk配置項,直接使用該項配置的內容對數據進行篩選。例如,需要進行多表join后同步數據,使用 說明 querySql需要區分大小寫,例如,寫為querysql會不生效。 | 否 | 無 |
useSpecialSecret | 多來源數據源時,是否使用各自數據源的密碼。取值包括:
如果您配置了多個來源數據源,且各個數據源使用的用戶名密碼不一致,您可以設置使用各自數據源的密碼,即此參數設置為true。 | 否 | false |
Writer腳本Demo
{
"type": "job",
"version": "2.0",//版本號。
"steps": [
{
"stepType": "stream",
"parameter": {},
"name": "Reader",
"category": "reader"
},
{
"stepType": "mysql",//插件名。
"parameter": {
"postSql": [],//導入后的準備語句。
"datasource": "",//數據源。
"column": [//列名。
"id",
"value"
],
"writeMode": "insert",//寫入模式,您可以設置為insert、replace或update。
"batchSize": 1024,//一次性批量提交的記錄數大小。
"table": "",//表名。
"nullMode": "skipNull",//NULL值處理策略。
"skipNullColumn": [//需要跳過NULL值的列。
"id",
"value"
],
"preSql": [
"delete from XXX;"http://導入前的準備語句。
]
},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {//錯誤記錄數。
"record": "0"
},
"speed": {
"throttle": true,//當throttle值為false時,mbps參數不生效,表示不限流;當throttle值為true時,表示限流。
"concurrent": 1,//作業并發數。
"mbps": "12"http://限流,控制同步的最高速率,防止對上游/下游數據庫讀取/寫入壓力過大,此處1mbps = 1MB/s。
}
},
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
}
}
Writer腳本參數
腳本參數名 | 描述 | 是否必選 | 默認值 |
datasource | 數據源名稱,腳本模式支持添加數據源,此配置項填寫的內容必須與添加的數據源名稱保持一致。 | 是 | 無 |
table | 選取的需要同步的表名稱。 | 是 | 無 |
writeMode | 選擇導入模式,可以支持insert into、on duplicate key update和replace into三種方式:
| 否 | insert |
nullMode | NULL值處理策略,取值范圍:
重要 配置為skipNull時,任務會動態拼接寫數據的SQL語句以支持目標端默認值,會增多FLUSH次數,降低同步速度,最差情況下會每條數據FLUSH一次。 | 否 | writeNull |
skipNullColumn | nullMode配置為skipNull時,此參數配置的列不會被強制寫為 配置格式: | 否 | 默認為本任務配置的所有列。 |
column | 目標表需要寫入數據的字段,字段之間用英文所逗號分隔,例如 | 是 | 無 |
preSql | 執行數據同步任務之前率先執行的SQL語句。目前向導模式僅允許執行一條SQL語句,腳本模式可以支持多條SQL語句。例如,執行前清空表中的舊數據(truncate table tablename)。 說明 當有多條SQL語句時,不支持事務。 | 否 | 無 |
postSql | 執行數據同步任務之后執行的SQL語句,目前向導模式僅允許執行一條SQL語句,腳本模式可以支持多條SQL語句。例如,加上某一個時間戳 說明 當有多條SQL語句時,不支持事務。 | 否 | 無 |
batchSize | 一次性批量提交的記錄數大小,該值可以極大減少數據同步系統與MySQL的網絡交互次數,并提升整體吞吐量。如果該值設置過大,會導致數據同步運行進程OOM異常。 | 否 | 256 |
updateColumn | 當writeMode配置成update時,發生遇到主鍵/唯一性索引沖突時所更新的字段。字段之間用英文逗號所分隔,例如 | 否 | 無 |