Move the docs folder

This commit is contained in:
LINxiansheng
2022-02-10 14:51:49 +08:00
committed by LINxiansheng
parent 7c6dcc6712
commit d42f317422
1160 changed files with 0 additions and 3 deletions

View File

@ -0,0 +1,7 @@
关于数据迁移和同步
==============================
数据从传统数据库迁移到 OceanBase 数据库上,可以选择将数据导出为 CSV 文件、SQL 文件,然后再导入到 OceanBase 中。

View File

@ -0,0 +1,103 @@
通用数据同步框架 DataX
===================================
DataX 简介
-----------------
DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 和 OceanBase 等各种异构数据源之间高效的数据同步功能。
DataX 本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的 Reader 插件,以及向目标端写入数据的 Writer 插件,理论上 DataX 框架可以支持任意数据源类型的数据同步工作。同时 DataX 插件体系作为一套生态系统,每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。
DataX 已经在 github 开源,开源地址是:[github.com/Alibaba/datax](http://github.com/Alibaba/datax),开源的产品不支持 OceanBase 和 DB2 ,OceanBase 产品团队提供针对 OceanBase 和 DB2 的读写插件。
DataX 的使用示例
--------------------
DataX 安装后,默认目录在 /home/admin/datax3 。目录下有个文件夹 job ,默认存放数据迁移任务的配置文件,当然也可以自定义目录。
每个任务的参数文件是一个 json 格式,主要由一个 reader 和一个 writer 组成。job 文件夹下有个默认的示例任务配置文件 job.json:
```javascript
[admin /home/admin/datax3/job]
$cat job.json
{
"job": {
"setting": {
"speed": {
"byte":10485760
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "streamreader",
"parameter": {
"column" : [
{
"value": "DataX",
"type": "string"
},
{
"value": 19890604,
"type": "long"
},
{
"value": "1989-06-04 00:00:00",
"type": "date"
},
{
"value": true,
"type": "bool"
},
{
"value": "test",
"type": "bytes"
}
],
"sliceRecordCount": 100000
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"print": false,
"encoding": "UTF-8"
}
}
}
]
}
}
```
这个任务的配置文件的 reader 和 writer 类型是一个 stream。这个任务会检测 DataX 是否正确安装,运行之前确保安装 JDK 运行环境。
```javascript
[admin@h07g12092.sqa.eu95 /home/admin/datax3/job]
$cd ../
[admin@h07g12092.sqa.eu95 /home/admin/datax3]
$bin/datax.py job/job.json
```
运行结果如下:
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/7701155061/p148635.png "image.png")
**说明**
这个默认的任务参数关闭了数据流输出,所以看不到输出结果。

View File

@ -0,0 +1,422 @@
不同数据源的 DataX 读写插件示例
========================================
DataX 官网支持绝大部分主流数据源的读写插件,并且有详细的使用文档。
CSV 文件的读写插件
--------------------
csv 文件就是文本文件,用 txtreader 和 txtwriter 读写。配置文件详细语法请参见 [DataX官网说明](https://github.com/alibaba/DataX)。
**txtreader配置示例:**
```javascript
"reader":{
"name":"txtfilereader",
"parameter":{
"path":["文件全路径"],
"encoding":"UTF-8",
"column":[
{ "index":0, "type":"long" }
,{ "index":1, "type":"long" }
,{ "index":2, "type":"string" }
,{ "index":3, "type":"double" }
,{ "index":4, "type":"string" }
],
"fieldDelimiter":"||",
"fileFormat":"text"
}
}
```
**txtwriter** **配置示例:**
```javascript
"writer":{
"name":"txtfilewriter",
"parameter":{
"path":"文件全路径",
"fileName":"文件名",
"writeMode":"truncate",
"dateFormat":"yyyy-MM-dd",
"charset":"UTF-8",
"nullFormat":"",
"fileDelimiter":"||"
}
}
```
MySQL 数据库的读写插件
-----------------------
针对 MySQL 数据库,用 mysqlreader 和 mysqlwriter 插件读写。
**mysqlreader** **配置示例:**
```javascript
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "root",
"column": [
"id",
"name"
],
"splitPk": "db_id",
"connection": [
{
"table": [
"table"
],
"jdbcUrl": [
"jdbc:mysql://127.0.0.1:3306/database"
]
}
]
}
}
```
**mysqlwriter** **配置示例:**
```javascript
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "root",
"password": "root",
"column": [
"id",
"name"
],
"session": [
"set session sql_mode='ANSI'"
],
"preSql": [
"delete from test"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/datax?useUnicode=true&characterEncoding=gbk",
"table": [
"test"
]
}
]
}
}
```
Oracle 数据库的读写插件
------------------------
针对 Oracle 数据库,用 oraclereader 和 oraclewriter 插件来读写。
**oraclereader** **配置示例:**
```javascript
"reader": {
"name": "oraclereader",
"parameter": {
// 数据库连接用户名
"username": "root",
// 数据库连接密码
"password": "root",
"column": [
"id","name"
],
//切分主键
"splitPk": "db_id",
"connection": [
{
"table": [
"table"
],
"jdbcUrl": [
"jdbc:oracle:thin:@[HOST_NAME]:PORT:[DATABASE_NAME]"
]
}
]
}
}
```
**oraclewriter** **配置示例:**
```javascript
"writer": {
"name": "oraclewriter",
"parameter": {
"username": "root",
"password": "root",
"column": [
"id",
"name"
],
"preSql": [
"delete from test"
],
"connection": [
{
"jdbcUrl": "jdbc:oracle:thin:@[HOST_NAME]:PORT:[DATABASE_NAME]",
"table": [
"test"
]
}
]
}
}
```
DB2 数据库的读写插件
---------------------
**db2reader** **配置示例:**
```javascript
"reader":{
"name":"db2reader",
"parameter":{
"username":"SRC_DB_UESRNAME",
"password":"SRC_DB_PASSWORD",
"column":[
"SRC_COLUMN_LIST"
],
"connection":[
{
"table":[
"SRC_TABLE_NAME"
],
"jdbcUrl":[
"jdbc:db2://SRC_DB_IP:SRC_DB_PORT/SRC_DB_NAME"
]
}
]
}
}
```
**db2writer** **配置示例:**
OceanBase 数据库的读写插件
---------------------------
OceanBase 数据库使用插件 oceanbasev10reader 和 oceanbasev10writer 来读写。该插件由 OceanBase 产品团队单独提供。
* **oceanbasev10reader** **配置示例**
```javascript
"reader":{
"name":"oceanbasev10reader",
"parameter":{
"where":"",
"timeout":10000,
"readBatchSize":100000,
"readByPartition":"true",
"column": [
"列名1","列名2"
],
"connection":[
{
"jdbcUrl":["||_dsc_ob10_dsc_||集群名:租户名||_dsc_ob10_dsc_||jdbc:oceanbase://连接IP:连接端口/模式名或数据库名"],
"table":["表名"]
}
],
"username":"租户内用户名",
"password":"密码"
}
}
```
示例:OceanBase 表 ware 导出到 csv 文件
```javascript
[admin@*** /home/admin/datax3]
$cat job/ob_tpcc_ware_2_csv.json
{
"job":{
"setting":{
"speed":{
"channel":10
},
"errorLimit":{
"record":0, "percentage": 0.02
}
},
"content":[
{
"reader":{
"name":"oceanbasev10reader",
"parameter":{
"where":"",
"timeout":10000,
"readBatchSize":100000,
"readByPartition":"true",
"column": [
"W_ID","W_YTD","W_TAX","W_NAME","W_STREET_1","W_STREET_2","W_CITY","W_STATE","W_ZIP"
],
"connection":[
{
"jdbcUrl":["||_dsc_ob10_dsc_||obdemo:obbmsql||_dsc_ob10_dsc_||jdbc:oceanbase://127.1:2883/tpcc"],
"table":["ware"]
}
],
"username":"tpcc",
"password":"123456"
}
},
"writer":{
"name":"txtfilewriter",
"parameter":{
"path":"/home/admin/csvdata/",
"fileName":"ware",
"writeMode":"truncate",
"dateFormat":"yyyy-MM-dd",
"charset":"UTF-8",
"nullFormat":"",
"fileDelimiter":"||"
}
}
}
]
}
}
[admin@*** /home/admin/datax3]
$bin/datax.py job/ob_tpcc_ware_2_csv.json
```
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/7701155061/p148636.png "image.png")
* **oceanbasev10writer** **配置示例**
使用 DataX 向 OceanBase 里写入时,要避免写入速度过快导致 OceanBase 的增量内存耗尽。通常建议 DataX 配置文件里针对写入做一个写入限速设置。关键字是 memstoreThreshold :
```javascript
"writer": {
"name": "oceanbasev10writer",
"parameter": {
"username": "租户内的用户名",
"password": "密码",
"writeMode": "insert",
"column": [
"列名1","列名2"
],
"preSql": [
""
],
"connection": [
{
"jdbcUrl": "||_dsc_ob10_dsc_||集群名:租户名||_dsc_ob10_dsc_||jdbc:oceanbase://连接IP:连接端口(默认2883)/模式名或数据库名",
"table": [
"表名"
]
}
],
"batchSize": 1024,
"memstoreThreshold": "90"
}
}
```
示例:从 csv 文件导入到 OceanBase 表中
```javascript
[admin@*** /home/admin/datax3]
$cat job/csv_2_ob_tpcc_ware2.json
{
"job":{
"setting":{
"speed":{
"channel":32
},
"errorLimit":{
"record":0, "percentage": 0.02
}
},
"content":[
{
"reader":{
"name":"txtfilereader",
"parameter":{
"path":["/home/admin/csvdata/ware*"],
"encoding":"UTF-8",
"column":[
{ "index":0, "type":"long" }
,{ "index":1, "type":"long" }
,{ "index":2, "type":"long" }
,{ "index":3, "type":"string" }
,{ "index":4, "type":"string" }
,{ "index":5, "type":"string" }
,{ "index":6, "type":"string" }
,{ "index":7, "type":"string" }
,{ "index":8, "type":"string" }
],
"fieldDelimiter":",",
"fileFormat":"text"
}
},
"writer":{
"name":"oceanbasev10writer",
"parameter":{
"writeMode":"insert",
"column":[
"W_ID","W_YTD","W_TAX","W_NAME","W_STREET_1","W_STREET_2","W_CITY","W_STATE","W_ZIP"
],
"connection":[
{
"jdbcUrl":"||_dsc_ob10_dsc_||obdemo:obbmsql||_dsc_ob10_dsc_||jdbc:oceanbase://127.1:2883/tpcc",
"table":["WARE2"]
}
],
"username":"tpcc",
"password":"123456",
"batchSize":256,
" memstoreThreshold":"90"
}
}
}
]
}
}
[admin@*** /home/admin/datax3]
$bin/datax.py job/csv_2_ob_tpcc_ware2.json
```
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/7701155061/p148637.png "image.png")
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/7701155061/p148638.png "image.png")

View File

@ -0,0 +1,170 @@
使用 Canal 向 OceanBase 数据库增量迁移数据
===================================================
您可以使用 Canal 向 OceanBase 数据库增量迁移数据。Canal 是一个开源的 MySQL 数据库 Binlog 的增量订阅和消费组件,基于 MySQL 数据库的增量日志解析,可以用于数据同步。关于 Canal 的详细信息,参考 Canal 的 [GitHub 仓库](https://github.com/alibaba/canal)。
Canal 的工作流程如下:
![](https://intranetproxy.alipay.com/skylark/lark/0/2021/png/21256616/1623931214127-4c63dbb8-445d-40c4-b4b8-82ef27c004ee.png)
其中 Canal Client Adapter 支持 Logger、Rdb、HBase、Kudu 和 Elasticsearch。本文档使用 Rdb。其他可选的配置如下:
* Canal Server 支持单机模式和 HA 模式。
* Canal Connector 支持 TCP 和 MQ 两种类型。MQ 目前支持 Kafka、RabbitMQ 和 RocketMQ。
* Rdb 版的 Client Adapter 支持按表同步和整库同步。
操作步骤
-------------------------
按照以下步骤向 OceanBase 数据库增量迁移数据:
1. 部署 Canal。
部署 Canal Server 参考 [Canal 快速上手](https://github.com/alibaba/canal/wiki/QuickStart) 文档。
2. 同步 Canal Client Adapter Rdb。
同步 Canal Client Adapter Rdb 参考 [同步 Rdb](https://github.com/alibaba/canal/wiki/Sync-RDB) 文档。
**说明**
OceanBase 数据库兼容 MySQL 协议,您可以直接按照 MySQL 配置 Adapter。
示例
-----------------------
以 TCP 类型的 Connetors 为例,按照以下步骤向 OceanBase 数据库增量迁移数据:
1.`plugin` 目录下的 RDB 和 TCP Connector 对应的 JAR 包添加到 `lib` 目录下。
2. 修改启动配置文件` conf/application.yml`
```yaml
# spring 服务相关配置
server:
port: 8081
spring:
jackson:
date-format: 'yyyy-MM-dd HH:mm:ss'
time-zone: GMT+8
default-property-inclusion: non_null
# canal 相关配置
canal.conf:
# 指定 Canal Connector 类型
mode: tcp
flatMessage: true
# 集群模式下的 zookeeper 地址,如果配置了单机地址则以单机为准
zookeeperHosts:
syncBatchSize: 1000
retries: 0
timeout:
accessKey:
secretKey:
# Canal Connector 数据消费配置
consumerProperties:
canal.tcp.server.host: 127.0.0.1:11111
canal.tcp.zookeeper.hosts:
canal.tcp.batch.size: 500
canal.tcp.username:
canal.tcp.password:
# 适配器列表
canalAdapters:
- instance: example # canal instance 名
groups:
- groupId: g1 # 适配器分组 ID
outerAdapters: # 分组内适配器列表
- name: rdb # 指定适配器为 RDB 类型
key: mysql1 # 适配器标识 key,与表映射配置中 outerAdapterKey 对应
properties:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://127.0.0.1:2883/ob_db?useUnicode=true
jdbc.username: username@tenant_name#deploy_name
jdbc.password: password
```
其中,`outerAdapters` 中的 `rdb` 数据源表示目标数据库。OceanBase 数据库用户名的格式详情,参考 [通过 MySQL 客户端连接 OceanBase 租户](../../7.developer-guide-1/2.connect-to-the-oceanbase-database/1.connect-to-an-oceanbase-tenant-by-using-a-mysql-client.md)。
3. 配置表映射。
Adapter 服务在启动时,会加载对应类型 Adapter 的配置目录(本例的配置目录为 `conf/rdb/`)下的所有配置文件。
表映射有两种配置形式:按表映射同步和整库同步。
**按表映射同步:**
```yaml
dataSourceKey: defaultDS # 源数据源的 Key, 对应上面配置的 srcDataSources 中的值
destination: example # Cannal Server 的 Instance 名
outerAdapterKey: mysql1 # Adapter Key, 对应上面配置 outAdapters 中的 Key
concurrent: true # 是否按主键 Hash 并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键
dbMapping:
database: mysql_db # 源数据源的 Database/Schema
table: mysql_tbl # 源数据源表名
targetTable: ob_db.ob_tbl # 目标数据源的库名.表名
targetPk: # 主键映射
id: id # 如果是复合主键可以换行映射多个
mapAll: true # 是否整表映射, 要求源表和目标表字段名一模一样 (如果 targetColumns 也配置了映射,则以 targetColumns 配置为准)
# targetColumns: # 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填
# id:
# name:
# role_id:
# c_time:
# test1:
```
其中,`targetTable` 格式为"库名.表名",实际测试中只能直接使用表名,此处需要进一步确认。
**按整库同步:**
```yaml
dataSourceKey: defaultDS
destination: example
outerAdapterKey: mysql1
concurrent: true
dbMapping:
mirrorDb: true
database: mysql_db
```
4. 执行以下命令,启动 RDB。
```bash
bin/startup.sh
```
服务日志位于 `logs` 目录。

View File

@ -0,0 +1,193 @@
OceanBase 数据加载技术
=====================================
OceanBase 支持通过 LOAD DATA 命令加载外部文本文件的内容到数据库表中。
LOAD DATA语法格式如下:
```javascript
LOAD DATA
[/*+ parallel(N)*/]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_var
[, col_name_var] ...)]
```
其中,REPLACE 选项只适用于 MySQL 租户。
**注意**
要加载的文件必须在该表的主副本所在的 OBServer 上,当前版本不支持从远程客户端加载数据。
Load Data 目前可以对CSV格式的文本文件进行导入,整个导入的过程如下:
1. 解析文件:OceanBase 会根据用户输入的文件名,读取文件中的数据,并且根据用户输入的并行度来决定并行或者串行解析输入文件中的数据。
2. 分发数据:由于 OceanBase 是分布式数据库系统,各个分区的数据可能分布在各个不同的 OBServer 上,Load Data 会对解析出来的数据进行计算,决定数据需要被发送到哪个 OBServer。
3. 插入数据:当目标 OBServer 收到了发送过来的数据之后,在本地执行 INSERT 操作把数据插入到对应的分区当中。
Load Data 提供了很多选项支持用户不同的需求,目前支持的选项有:
* **并行度:** /\*+ parallel(N)\*/选项指定加载数据的并行度,建议使用的值范围是\[0 - 租户的最大CPU数\]。例如:
```javascript
load data /*+ parallel(4) */infile '/home/admin/a.csv' into table t
```
* **输入文件:** INFILE 'file_name' 关键字指定输入文件的路径和文件名,目前 Load Data 只支持加载 OBServer 本地的输入文件。所以,用户需要在导入之前把文件拷贝到某一个 OBServer 上,并连接文件所在的 OBServer 运行Load Data 语句。
<!-- -->
* **执行权限:** 用户需要授予权限才能访问机器上的文件,有两步:
* **重复数据处理:** 这部分指定如何处理重复的数据。Replace 表示将表中原有的数据替换成为输入文件中的数据; Ignore表示忽略掉重复的数据。Load Data 通过表的主键来判断数据是否重复,如果表不存在主键,那么 Load Data 语句就无法判断数据是否重复,Replace 和 Ignore 选项没有区别。如果用户不指定这个选项,那么遇到重复数据的时候,Load Data 语句会将出现把错误的数据记录到日志文件中。
<!-- -->
* **目标表选项:** INTO TABLE tbl_name 关键字用于指定目标表名称。Load Data 支持分区表和非分区表。
<!-- -->
* **字段格式:** 这部分指定输入文件的各个字段的分隔符选项,通过 Fields \| Columns 子句来指定,其中:Terminated By关键字用来指定字段的分隔符;Enclosed By 关键字指定每个字段的开始和结束是否包含了特定的字符;Escaped By 关键字用来指定字段中的通配符。
<!-- -->
* **行格式:** 这部分指定输入文件中每一行的开始和结束字符,通过 Lines 子句设置。 其中 Starting By 用于指定每一行开始的字符;Terminated By 用户指定每一行的结束字符。IGNORE number {LINES \| ROWS} 子句指定忽略掉输入文件的前 number 行数据。
```javascript
load data /*+ parallel(4) */infile '/home/admin/a.csv' into table t fields terminated by ',' lines terminated by '\n';
```
* **列对应关系选项:** 这部分用于指定目标表的各个列与输入文件的字段之间的关系,通过 (col_name_var \[, col_name_var\] ...) 关键字指定。如果用户没有指定,默认会将输入文件中的字段逐个与表中的列进行对应。如果用户通过col_name_or_user_var 关键字指定输入文件中的字段与表中列的对应关系,Load Data 会根据指定的列名与表中的列进行对应,没有被指定的列会取空值,下面是一个基本的示例:
```javascript
load data infile '/home/admin/a.csv' into table t (id, names) set dates=CURRENT_TIMESTAMP;
```
如果输入文件中并没有包含所有的列,那么缺少的列按照以下的规则会被默认填充:
如果用户需要添加空值,请在输入文件中使用'\\N'。
* **日志文件:** 如果导入的过程中出现了错误,出现错误的 INSERT 语句会被回滚,并且 Load Data 语句会在 OBServer 安装路径的 log 子目录下产生名称为 obloaddata.log.\<XXXXXX\> 的日志文件,以下是一个日志文件的示例:
```javascript
Tenant name: mysql
File name: /home/admin/a.csv
Into table: `test`.`t`
Parallel: 1
Batch size: 1000
SQL trace: YD7A20BA65670-0005AADAAA3CAB52
Start time: 2020-07-29 21:08:13.073741
Load query:
load data infile '/home/admin/test.csv' into table t fields terminated by ',' lines terminated by '\n'
Row ErrCode ErrMsg
1 1062 Duplicated primary key
2 1062 Duplicated primary key
```
日志中会包含 Load Data 产生的任务的基本信息,包含了:租户名,输入文件名,目标表名,并行度,使用的 Load Data 命令,并且以行为单位给出具体错误的信息。
**示例:通过** **Load Data** **导入 csv 文件到表** **ware2** **中**
```javascript
[admin@h07g12092.sqa.eu95 /home/admin/csvdata]
$more ware__df8f30ac_64e0_474c_9cc4_9919d64c5e4c
2,1200,.0862,L6xwRsbDk,xEdT1jkENtbLwoI1Zb0,NT0j4RCQ4OqrS,vlwzndw2FPrO,XR,063311111
1,1200,.1868,n1P4zYo8OH,jTNkXKWXOdh,lf9QXTXXGoF04IZBkCP7,srRq15uvxe5,GQ,506811111
$obclient -h192.168.1.101 -utpcc@obbmsql -P2881 -p123456
obclient> load data infile '/home/admin/csvdata/ware__df8f30ac_64e0_474c_9cc4_9919d64c5e4c' into table ware2 fields terminated by ',' lines terminated by '\n';
Query OK, 2 rows affected (0.02 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
obclient> select * from ware2\G
*************************** 1. row ***************************
W_ID: 2
W_YTD: 1200
W_TAX: .0862
W_NAME: L6xwRsbDk
W_STREET_1: xEdT1jkENtbLwoI1Zb0
W_STREET_2: NT0j4RCQ4OqrS
W_CITY: vlwzndw2FPrO
W_STATE: XR
W_ZIP: 063311111
*************************** 2. row ***************************
W_ID: 1
W_YTD: 1200
W_TAX: .1868
W_NAME: n1P4zYo8OH
W_STREET_1: jTNkXKWXOdh
W_STREET_2: lf9QXTXXGoF04IZBkCP7
W_CITY: srRq15uvxe5
W_STATE: GQ
W_ZIP: 506811111
2 rows in set (0.00 sec)
obclient>
```