PolarDB數據源為您提供讀取和寫入PolarDB雙向通道的功能,您可以通過向導模式和腳本模式配置同步任務。
使用限制
離線讀寫
支持讀取視圖表。
實時讀
來源數據源為阿里云PolarDB MySQL時,您需要開啟Binlog。阿里云PolarDB MySQL是一款完全兼容MySQL的云原生數據庫,默認使用了更高級別的物理日志代替Binlog,但為了更好地與MySQL生態融合,PolarDB支持開啟Binlog的功能。
支持的字段類型
離線讀
PolarDB Reader針對PolarDB類型的轉換列表,如下所示。
類型分類 | PolarDB數據類型 |
整數類 | INT、TINYINT、SMALLINT、MEDIUMINT和BIGINT |
浮點類 | FLOAT、DOUBLE和DECIMAL |
字符串類 | VARCHAR、CHAR、TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT |
日期時間類 | DATE、DATETIME、TIMESTAMP、TIME和YEAR |
布爾型 | BIT和BOOL |
二進制類 | TINYBLOB、MEDIUMBLOB、BLOB、LONGBLOB和VARBINARY |
除上述羅列字段類型外,其它類型均不支持。
PolarDB Reader插件將tinyint(1)視作整型。
離線寫
類似于PolarDB Reader ,目前PolarDB Writer支持大部分PolarDB類型,但也存在部分類型沒有支持的情況,請注意檢查您的數據類型。
PolarDB Writer針對PolarDB類型的轉換列表,如下所示。
類型分類 | PolarDB數據類型 |
整數類 | INT、TINYINT、SMALLINT、MEDIUMINT、BIGINT和YEAR |
浮點類 | FLOAT、DOUBLE和DECIMAL |
字符串類 | VARCHAR、CHAR、TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT |
日期時間類 | DATE、DATETIME、TIMESTAMP和TIME |
布爾型 | BOOL |
二進制類 | TINYBLOB、MEDIUMBLOB、BLOB、LONGBLOB和VARBINARY |
數據同步前準備
準備工作1:配置白名單
將Serverless資源組或獨享數據集成資源組所在的VPC網段添加至OceanBase的白名單中,詳情請參見添加白名單。
準備工作2:創建賬號并配置賬號權限
創建賬號并配置賬號權限。
您需要規劃一個數據庫的登錄賬戶用于后續執行操作,此賬戶需擁有數據庫的 SELECT, REPLICATION SLAVE, REPLICATION CLIENT
權限。
創建賬號。
操作詳情可參見創建和管理數據庫賬號。
配置權限。
您可參考以下命令為賬號添加此權限,或直接給賬號賦予
SUPER
權限。-- CREATE USER '同步賬號'@'%' IDENTIFIED BY '同步賬號'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '同步賬號'@'%';
準備工作3:開啟PolarDB的開啟Binlog
操作詳情可參見開啟Binlog。
創建數據源
在進行數據同步任務開發時,您需要在DataWorks上創建一個對應的數據源,操作流程請參見創建并管理數據源,詳細的配置參數解釋可在配置界面查看對應參數的文案提示。
數據同步任務開發:PolarDB同步流程引導
數據同步任務的配置入口和通用配置流程可參見下文的配置指導。
單表離線同步任務配置指導
操作流程請參見通過向導模式配置離線同步任務、通過腳本模式配置離線同步任務。
腳本模式配置的全量參數和腳本Demo請參見下文的附錄:腳本Demo與參數說明。
單表、整庫實時同步任務配置指導
操作流程請參見DataStudio側實時同步任務配置。
整庫離線讀、單表/整庫全增量實時讀同步任務配置指導
操作流程請參見數據集成側同步任務配置。
常見問題
附錄:腳本Demo與參數說明
離線任務腳本配置方式
如果您配置離線任務時使用腳本模式的方式進行配置,您需要按照統一的腳本格式要求,在任務腳本中編寫相應的參數,詳情請參見通過腳本模式配置離線同步任務,以下為您介紹腳本模式下數據源的參數配置詳情。
Reader腳本Demo
單庫單表的腳本示例如下,詳情請參見上述參數說明。
{
"type": "job",
"steps": [
{
"parameter": {
"datasource": "test_005",//數據源名。
"column": [//源端列名。
"id",
"name",
"age",
"sex",
"salary",
"interest"
],
"where": "id=1001",//過濾條件。
"splitPk": "id",//切分鍵。
"table": "PolarDB_person",//源端表名。
"useReadonly": "false"http://是否從備庫讀取數據。
},
"name": "Reader",
"category": "reader"
},
{
"parameter": {}
],
"version": "2.0",//版本號。
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
},
"setting": {
"errorLimit": {//錯誤記錄數。
"record": ""
},
"speed": {
"concurrent": 6,//并發數。
"throttle": true//當throttle值為false時,mbps參數不生效,表示不限流;當throttle值為true時,表示限流。
"mbps":"12",//限流,此處1mbps = 1MB/s。
}
}
}
Reader腳本參數
參數 | 描述 | 是否必選 | 默認值 |
datasource | 數據源名稱,腳本模式支持添加數據源,此配置項填寫的內容必須要與添加的數據源名稱保持一致。 | 是 | 無 |
table | 選取的需要同步的表名稱。 | 是 | 無 |
useReadonly | 如果您希望讀寫分離,從PolarDB集群的備庫讀取數據,則此參數配置為true。不配置時,默認為false,表示從主庫讀取數據。 | 否 | false |
column | 所配置的表中需要同步的列名集合,使用JSON的數組描述字段信息 。默認使用所有列配置,例如[*]。
| 是 | 無 |
splitPk | PolarDB Reader進行數據抽取時,如果指定splitPk,表示您希望使用splitPk代表的字段進行數據分片,數據同步因此會啟動并發任務進行數據同步,從而提高數據同步的效能。
| 否 | 無 |
splitFactor | 切分因子,可以配置同步數據的切分份數,如果配置了多并發,會按照并發數 * splitFactor份來切分。例如,并發數=5,splitFactor=5,則會按照5*5=25份來切分,在5個并發線程上執行。 說明 建議取值范圍:1~100,過大會導致內存溢出。 | 否 | 5 |
where | 篩選條件,在實際業務場景中,往往會選擇當天的數據進行同步,將where條件指定為
| 否 | 無 |
querySql(高級模式,向導模式不提供) | 在部分業務場景中,where配置項不足以描述所篩選的條件,您可以通過該配置型來自定義篩選SQL。當配置該項后,數據同步系統就會忽略column、table和where配置項,直接使用該項配置的內容對數據進行篩選。例如需要進行多表 join 后同步數據,使用 | 否 | 無 |
Writer腳本Demo
腳本配置樣例如下,詳情請參見上述參數說明。
{
"type": "job",
"steps": [
{
"parameter": {},
"name": "Reader",
"category": "reader"
},
{
"parameter": {
"postSql": [],//導入后完成語句。
"datasource": "test_005",//數據源名稱。
"column": [//目標列名。
"id",
"name",
"age",
"sex",
"salary",
"interest"
],
"writeMode": "insert",//寫入模式。
"batchSize": 256,//一次性批量提交的記錄數大小。
"table": "PolarDB_person_copy",//目標表名。
"preSql": []//導入前準備語句。
},
"name": "Writer",
"category": "writer"
}
],
"version": "2.0",//版本號。
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
},
"setting": {
"errorLimit": {//錯誤記錄數。
"record": ""
},
"speed": {
"throttle":true,//當throttle值為false時,mbps參數不生效,表示不限流;當throttle值為true時,表示限流。
"concurrent":6, //作業并發數。
"mbps":"12"http://限流,此處1mbps = 1MB/s。
}
}
}
Writer腳本參數
全量參數說明
參數
描述
必選
默認值
datasource
數據源名稱,腳本模式支持添加數據源,此配置項填寫的內容必須要與添加的數據源名稱保持一致。
是
無
table
選取的需要同步的表名稱。
是
無
writeMode
選擇導入模式,可以支持:
insert(即向導模式的insert into)
update(即向導模式的on duplicate key update)
replace(即向導模式的replace into)
不同方式的詳細介紹與場景示例請參見下文的writeMode(主鍵沖突)參數詳解。
否
insert
column
目標表需要寫入數據的字段,字段之間用英文所逗號分隔。例如
"column": ["id", "name", "age"]
。如果要依次寫入全部列,使用(*)表示。 例如"column": [" *"]
。是
無
preSql
執行數據同步任務之前率先執行的SQL語句。目前向導模式僅允許執行一條SQL語句,腳本模式可以支持多條SQL語句,例如清除舊數據。
否
無
postSql
執行數據同步任務之后執行的SQL語句,目前向導模式僅允許執行一條SQL語句,腳本模式可以支持多條SQL語句,例如加上某一個時間戳。
否
無
batchSize
一次性批量提交的記錄數大小,該值可以極大減少數據同步系統與PolarDB的網絡交互次數,并提升整體吞吐量。但是該值設置過大可能會造成數據同步運行進程OOM情況。
否
1,024
updateColumn
當writeMode配置成update時,發生遇到主鍵/唯一性索引沖突時所更新的字段。字段之間用英文逗號所分隔,例如
"updateColumn": ["name", "age"]
。說明目前僅支持PolarDB for MySQL。
否
無
writeMode(主鍵沖突)參數詳解
對比介紹
insert(即向導模式的insert into)
update(即向導模式的on duplicate key update)
replace(即向導模式的replace into)
處理策略
當主鍵或唯一性索引沖突時,沖突行不寫入目標表,以臟數據的形式體現。
沒有遇到主鍵或唯一性索引沖突時,與insert into行為一致。沖突時會用新行替換已經指定的字段的語句,寫入數據至目標表。
沒有遇到主鍵或唯一性索引沖突時,與insert into行為一致。沖突時會先刪除原有行,再插入新行。即新行會替換原有行的所有字段。
數據示例
源表數據
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 1 | zhangsan| 1 | | 2 | lisi | | +----+---------+-----+
目標表原始數據
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 2 | wangwu | | +----+---------+-----+
運行任務后,成功寫入目標表1條數據,臟數據1條。
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 1 | zhangsan| 1 | | 2 | wangwu | | +----+---------+-----+
場景1:任務配置部分字段:
"column": ["id","name"]
源表數據
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 1 | zhangsan| 1 | | 2 | lisi | | +----+---------+-----+
目標表原始數據
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 2 | wangwu | 3 | +----+---------+-----+
運行任務后,成功寫入目標表2條數據,臟數據0條。
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 1 | zhangsan| 1 | | 2 | lisi | 3 | +----+---------+-----+
場景2:任務配置所有字段,
"column": ["id","name","age"]
源表數據
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 1 | zhangsan| 1 | | 2 | lisi | | +----+---------+-----+
目標表原始數據
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 2 | wangwu | 3 | +----+---------+-----+
運行任務后,成功寫入目標表2條數據,臟數據0條。
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 1 | zhangsan| 1 | | 2 | lisi | | +----+---------+-----+
源表數據
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 1 | zhangsan| 1 | | 2 | lisi | | +----+---------+-----+
目標表原始數據
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 2 | wangwu | 3 | +----+---------+-----+
運行任務后,成功寫入目標表2條數據,臟數據0條。
+----+---------+-----+ | id | name | age | +----+---------+-----+ | 1 | zhangsan| 1 | | 2 | lisi | | +----+---------+-----+