未验证 提交 ab2a692d 编写于 作者: O obpilot 提交者: GitHub

Add tutorials about oceanbase cdc (logproxy) (#686)

* Add tutorials about oceanbase cdc (logproxy)

* Modify tutorials about canal.
Co-authored-by: NLIN <wangzelin19961202@gmail.com>
上级 8f4f4e5a
......@@ -75,14 +75,14 @@ MySQL 有些变量在 OceanBase MySQL 租户里同样适用,但是要留心源
| character_set_client | utf8mb4 | 连接的客户端环境的字符集。保持默认。 |
| character_set_connection | utf8mb4 | 连接自身的字符集。保持默认。 |
| character_set_database | utf8mb4 | 连接的数据库的字符集。保持默认。 |
| collation_connection | utf8mb4_general_ci | |
| collation_database | utf8mb4_general_ci | |
| collation_server | utf8mb4_general_ci | |
| collation_connection | utf8mb4_general_ci | 用于设置连接使用的字符集和字符序。 |
| collation_database | utf8mb4_general_ci | 设置创建数据库默认字符集和字符序。 |
| collation_server | utf8mb4_general_ci | 用于设置服务器默认字符集和字符序。 |
| max_allowed_packet | 4194304 | 需要调大,否则 SQL文本或数据量很大的时候可能报错。 |
| sql_mode | STRICT_ALL_TABLES | |
| transaction_isolation | READ-COMMITTED | |
| tx_isolation | READ-COMMITTED | |
| lower_case_table_names | 1 | 1 表示自动将表名转小写,则大小写不敏感。0 表示不对表名大小写转换,则是大小写敏感。 |
| sql_mode | STRICT_ALL_TABLES | 用于设置 SQL 模式,不同的 SQL 模式对于插入等行为有很大影响。 |
| transaction_isolation | READ-COMMITTED | 用于设置事务的隔离级别。 |
| tx_isolation | READ-COMMITTED | tx_isolation 用于设置事务隔离级别。 |
| lower_case_table_names | 1 | 1 表示自动将表名转小写,则大小写不敏感。0 表示不对表名大小写转换,则是大小写敏感。 |
| foreign_key_checks | ON | ON:检查外键约束;OFF:不检查外键约束。 |
这些变量中要留意字符集相关设置、`sql_mode` 设置以及 `lower_case_table_names` 设置。这些设置最好是在数据迁移之前就正确设置。后期修改会带来风险。
......
# 如何使用 CANAL 将 MySQL 数据实时同步到 OceanBase
# 如何使用 Canal 将 MySQL 数据实时同步到 OceanBase
CANAL 是 Alibaba 开源的一个产品,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。开源项目地址:`https://github.com/alibaba/canal`
`canal` 是 Alibaba 开源的一个产品,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。开源项目地址:`https://github.com/alibaba/canal`
## 工作原理简介
## 架构原理
+ `canal` 模拟 `MySQL slave` 的交互协议,伪装自己为 `MySQL slave `,向 `MySQL master` 发送 `dump` 协议。
+ `MySQL master` 收到 `dump` 请求,开始推送 `binary log``slave (即 `canal` ) 。
+ `canal` 解析 `binary log` 对象(原始为 byte 流)。
`canal` 主要提供了 4 个组件:
## 部署 CANAL
+ `canal deployer``canal` 的 server 端,进行 `binlog``CanalEntry` 的转换。
+ `canal admin``canal` 的配置管理服务,提供 web 页面管理 `canal``server` 端服务。
+ `canal adapter``canal` 的客户端适配器,解析 `CanalEntry` 并将增量变动同步到目的端。
+ `canal example``canal``client` 端示例,用户可以基于该部分代码实现自己的消费逻辑。
## MySQL 准备
![Canal 架构图](https://cdn.nlark.com/yuque/0/2021/png/383093/1638968463565-aa876e42-6c78-4930-91da-41c212a0706f.png)
图中 `canal-admin` 是部署用的,可选的。`canal-server` 就是 `canal deployer` 软件,`adapter` 就是 `canal adapter` 软件。源端数据库是 `mariadb`, 目标端是 oceanbase 的 mysql 租户。
### Canal Deployer
`Canal Deployer` 的服务中有 `Server``Instance` 的概念,一个 `server` 代表一个 `deployer` 服务,一个 `instance` 代表一个实际的数据同步通路,在 `Canal Server` 中,一个Server可以有多个 `Instance`
`Canal Instance``Spring` 在运行时创建,其配置信息 `canal deployer``conf/canal.properties` 中指定。`Canal` 本身提供了几种可以直接使用的配置,存放在 `conf/spring` 目录下。
`Canal Instance` 在解析完日志信息后,得到的 `CanalEntry` 数据会放入内存等待消费。`Canal` 提供了两种消费方式供用户选择:
+ TCP 模式:直接使用客户端连接Canal消费数据。
+ MQ 模式:先将 `Canal` 内存中的数据写入 MQ ,用户可以使用客户端连接MQ进行数据消费。
`Canal` 中有两种位点信息,一个是解析位点,即日志转化 `Entry` 的过程记录的位点,由 `LogPositionManager` 管理,另一个是客户端消费的位点,由`MetaManager` 管理。两者同样是在 `instance``spring xml` 文件进行配置。
### Canal Adapter
`Canal Adapter` 用于消费 `CanalEntry` ,并写入对应的目的容器。`adapter``deployer` 一样有 `instance` 的概念,实际运行时,`adapter` 本身由`adapter launcher` 服务启动,并根据用户配置生成 `adapter instance`,由 `instance` 执行具体的 `CanalEntry` 读取和目的端写入的工作。
### Canal Admin
`Canal Admin` 就是为了简化部署操作而引入的一个管理平台服务。`Canal Deployer``Canal Instance` 都分别支持单机部署和高可用集群部署两种模式,通过`Canal Admin`,用户可以通过 web 页面来方便地管理 `Canal Deployer``Canal Instance` 的部署,同样也是支持单机部署和高可用集群化部署。
## 部署示例
### MySQL 准备
这里使用的是 `mariadb`
```bash
yum install mariadb mariadb-server
```
+ 对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 `binlog-format` 为 ROW 模式,`my.cnf` 中配置如下。
......@@ -32,30 +65,134 @@ FLUSH PRIVILEGES;
```
## 下载启动 CANAL
然后初始化了一个业务数据库(`TPCH` ,后面介绍性能测试的时候再重点介绍)。
+ 下载 `canal` ,访问地址:`https://github.com/alibaba/canal/releases` 。
### 部署 Canal Admin
`Canal Admin` 部署 `Canal Deployer` 会方便一些,这个不是必须的。
本文就使用用 `Canal Admin`
+ 下载 `Canal Admin` , 访问地址:`https://github.com/alibaba/canal/releases`
```bash
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.admin-1.1.5.tar.gz
```
+ 解压缩
+ 解压缩到指定目录
```bash
mkdir ~/canal-admin && tar zxvf canal.admin-1.1.5.tar.gz -C ~/canal-admin/
```
+ 修改配置文件
```bash
cd ~/canal-admin && vim conf/application.yml
```
内容如下:
```yaml
server:
port: 8089
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
spring.datasource:
address: 127.0.0.1:3306
database: canal_manager
username: canal
password: canal
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
hikari:
maximum-pool-size: 30
minimum-idle: 1
canal:
adminUser: admin
adminPasswd: admin
```
初次测试时,不要修改上面密码 `adminPasswd` ,以免后面密码修改不对导致连接不上。
+ 初始化元数据库
```sql
mysql -h127.1 -uroot -P3306 -p
source conf/canal_manager.sql
```
脚本会自动创建相关表,如下:
```sql
show tables;
MariaDB [tpch]> use canal_manager;
Database changed
MariaDB [canal_manager]> show tables;
+-------------------------+
| Tables_in_canal_manager |
+-------------------------+
| canal_adapter_config |
| canal_cluster |
| canal_config |
| canal_instance_config |
| canal_node_server |
| canal_user |
+-------------------------+
6 rows in set (0.00 sec)
```
+ 启动 web 服务
```bash
mkdir /tmp/canal
tar zxvf canal.deployer-$version.tar.gz -C ~/canal
cd ~/canal-admin && bin/startup.sh
```
正常情况下,启动成功会监听 8089 端口。
```bash
[root@obce00 adapter]# netstat -ntlp |grep 15973
tcp 0 0 0.0.0.0:8089 0.0.0.0:* LISTEN 15973/java
```
启动如果有问题,可以查看日志。
```bash
vim logs/admin.log +
```
+ 登录 web 界面
`Canal Admin` 的 web 访问地址:`http://127.0.0.1:8089/`
登录用户名:`admin`
登录密码:`123456`
### 部署 Canal Deployer
+ 下载 `canal` ,访问地址:`https://github.com/alibaba/canal/releases`
```bash
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
```
解压完成后,进入 /tmp/canal 目录,可以看到如下结构。
+ 解压缩
```bash
tree -L 3 ~/canal/
mkdir ~/canal && tar zxvf canal.deployer-1.1.5.tar.gz -C ~/canal
```
+ 修改配置
如果不使用 `Canal Admin` 部署,则使用默认的配置文件 `conf/canal.properties``conf/example/instance.properties` 。这个是默认创建了一个 `instance``example` 。需要修改 `example` 的 实例配置文件,修改数据库连接地址、用户名和密码。
```bash
vi conf/example/instance.properties
......@@ -78,147 +215,229 @@ canal.instance.connectionCharset = UTF-8
#table regex
canal.instance.filter.regex = .\*\\\\..\*
```
`canal.instance.connectionCharset` 代表数据库的编码方式对应到 java 中的编码类型,比如 `UTF-8`,`GBK` ,` ISO-8859-1` 。
`canal.instance.connectionCharset` 代表数据库的编码方式对应到 java 中的编码类型,比如 `UTF-8``GBK` ,`ISO-8859-1`
如果系统是1个 cpu,需要将 `canal.instance.parser.parallel` 设置为 `false`
+ 启动
如果使用 `Canal Admin` 部署`server``instance` ,则使用配置文件 `conf/canal_local.properties` 替换 `conf/canal.properties` 。需要修改 `conf/canal.properties` 里的 `manager` 地址,其他参数值可以保持默认。
```bash
[root@obce00 canal]# cat conf/canal.properties
# register ip
canal.register.ip =
# canal admin config
canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster =
canal.admin.register.name =
```
注意:`passwd` 后面的字符串是 `admin` 在 MySQL 里的密文。这个密码跟前面 `Canal Admin` 配置文件里的密码保持一致。如果前面密码改了,这里也要相应修改,密文的值可以通过 MySQL 的 `password` 方法获取。
```sql
MariaDB [canal_manager]> select password('admin');
+-------------------------------------------+
| password('admin') |
+-------------------------------------------+
| *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
+-------------------------------------------+
1 row in set (0.00 sec)
```
+ 启动 Canal Server
不管是那种部署方法,配置文件修改好后,就可以启动服务。
```bash
sh bin/startup.sh
```
+ 图形化部署 Canal server 和 Canal instance
如果使用 `Canal Admin` 管理 `Canal server` ,则登录 `admin`的管理界面 `http://172.24.50.39:8089/#/canalServer/nodeServers` ,
![Server管理](https://cdn.nlark.com/yuque/0/2021/jpeg/383093/1639016834278-80989ac7-5e92-42bb-a473-e3a27d4dcd19.jpeg)
点击 `新建 Server`
![新建Server](https://cdn.nlark.com/yuque/0/2021/jpeg/383093/1639016355254-1aca8a58-df53-435c-9b20-23e19eeed330.jpeg)
点击确定后。
![Server管理2](https://cdn.nlark.com/yuque/0/2021/jpeg/383093/1639016367325-d8754ba4-d0db-4ce5-8d01-807f620d31af.jpeg)
点击 `新建Instance`
![新建Instance](https://cdn.nlark.com/yuque/0/2021/jpeg/383093/1639017428651-c80d9071-4f4b-4f4e-b4e5-c067dc875276.jpeg)
点击`载入模板`,显示一个配置文件,跟前面看到的类似。
修改配置文件中的跟源端 `canal` 和数据库有关的信息。
![新建Instance](https://cdn.nlark.com/yuque/0/2021/jpeg/383093/1639017755926-29aebf1f-4063-45b6-9aae-e26f81f8e030.jpeg)
点击保存,命名为 `mariadb`
![启动Instance](https://cdn.nlark.com/yuque/0/2021/jpeg/383093/1639017813356-0a1a862b-8d75-44bf-8c21-bb916010640a.jpeg)
启动后,`instance`状态为启动。
+ 查看 server 日志
可以命令行下查看日志 或者在 `Canal Admin` 里查看 `server` 的日志。
```bash
vi logs/canal/canal.log</pre>
vi logs/canal/canal.log
```
+ 查看 instance 的日志
可以命令行下查看日志 或者在 `Canal Admin` 里查看 `instance` 的日志。
```bash
vi logs/example/example.log
tail -f logs/canal/canal.log
tail -f logs/example/example.log
tail -f logs/mariadb/mariadb.log
```
+ 关闭
+ 停止服务
```bash
sh bin/stop.sh
```
## 部署 RDB 适配器
### 部署 Canal Adapter
RDB adapter 用于适配mysql到任意关系型数据库(需支持jdbc)的数据同步及导入 。
`Canal Adapter` 提供了对多种目标容器的支持,对于 OceanBase 社区版来说,主要使用它的 `rdb` 模块,目的端容器为 `MySQL`或社区版 `OceanBase`
`Adapter` 的部署需要手动部署。
+ 修改启动器配置: application.yml, 这里以 OceanBase 目标库为例。
首先指定 `adapter` 源端类型,通过 `mode` 指定。这里选择 `tcp` 。后面就要指定 `canal.tcp` 相关属性,包括 `canal server` 的 IP 和 端口,数据库的连接用户和密码。
然后指定 `adapter` 目标端连接信息。`instance` 是源端实例名称,在 `canal` 部署的时候定义的。如果没有用 `Canal Admin` 部署,沿用的是 `example` 这个名称;如果用了 `Canal Admin` 部署 `instance`,前面命名的是 `mariadb`
`key` 是自定义,名字后面有用。`jdbc` 相关属性是目标端 OceanBase MySQL 的连接方式,可以使用 MySQL 自带的驱动。
+ 修改启动器配置: application.yml, 这里以 OceanBase 目标库为例
```bash
canal.conf:
canalServerHost: 127.0.0.1:11111
batchSize: 500
mode: tcp #tcp kafka rocketMQ rabbitMQ
flatMessage: true
zookeeperHosts:
syncBatchSize: 1000
retries: 0
timeout:
mode: tcp # kafka rocketMQ
srcDataSources:
defaultDS:
url: jdbc:mysql://127.0.0.1:3306/mytest?useUnicode=true
username: root
password: 121212
accessKey:
secretKey:
consumerProperties:
# canal tcp consumer
canal.tcp.server.host: 127.0.0.1:11111
canal.tcp.zookeeper.hosts:
canal.tcp.batch.size: 500
canal.tcp.username: tpch
canal.tcp.password: Dg0gIexJAV
canalAdapters:
- instance: example # canal instance Name or mq topic name
- instance: mariadb # canal instance Name or mq topic name
groups:
- groupId: g1
outerAdapters:
- name: rdb # 指定为rdb类型同步
key: oracle1 # 指定adapter的唯一key, 与表映射配置中outerAdapterKey对应
- name: logger
- name: rdb
key: obmysql
properties:
jdbc.driverClassName: com.mysql.cj.jdbc.Driver # jdbc驱动名, 部分jdbc的jar包需要自行放致lib目录下
jdbc.url: jdbc:mysql:thin:@localhost:2883/tpccdb # jdbc url
jdbc.username: root@obmysql # jdbc username
jdbc.password: 123456 # jdbc password
threads: 5 # 并行执行的线程数, 默认为1
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://127.0.0.1:2883/tpch?useUnicode=true
jdbc.username: tpch@obmysql#obdemo
jdbc.password: Dg0gIexJAV
```
+ RDB映射文件
+ RDB 映射文件
修改 `conf/rdb/mytest_user.yml` 文件:
修改 `conf/rdb/mytest_user.yml` 文件。映射有两种:一是按表映射;二是整库映射。下面示例是整库映射。
`destination` 指定的是 `canal instance` 名称,`outerAdapterKey` 是前面定义的 `key`
`mirrorDb` 指定数据库级别 DDL 和 DML 镜像同步。
```bash
dataSourceKey: defaultDS # 源数据源的key, 对应上面配置的srcDataSources中的值
destination: example # cannal的instance或者MQ的topic
groupId: # 对应MQ模式下的groupId, 只会同步对应groupId的数据
outerAdapterKey: oracle1 # adapter key, 对应上面配置outAdapters中的key
concurrent: true # 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键!!
[root@obce00 adapter]# cat conf/rdb/mytest_user.yml
#dataSourceKey: defaultDS
#destination: example
#groupId: g1
#outerAdapterKey: mysql1
#concurrent: true
#dbMapping:
# database: mytest
# table: user
# targetTable: mytest2.user
# targetPk:
# id: id
## mapAll: true
# targetColumns:
# id:
# name:
# role_id:
# c_time:
# test1:
# etlCondition: "where c_time>={}"
# commitBatch: 3000 # 批量提交的大小
# Mirror schema synchronize config
dataSourceKey: defaultDS
destination: mariadb
groupId: g1
outerAdapterKey: obmysql
concurrent: true
dbMapping:
database: mytest # 源数据源的database/shcema
table: user # 源数据源表名
targetTable: mytest.tb_user # 目标数据源的库名.表名
targetPk: # 主键映射
id: id # 如果是复合主键可以换行映射多个
# mapAll: true # 是否整表映射, 要求源表和目标表字段名一模一样 (如果targetColumns也配置了映射,则以targetColumns配置为准)
targetColumns: # 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填
id:
name:
role_id:
c_time:
test1:
mirrorDb: true
database: tpch
commitBatch: 1000
```
导入的类型以目标表的元类型为准, 将自动进行类型转换。
+ Mysql 库间镜像schema DDL DML 同步
+ 启动 RDB
修改 `application.yml` :
如果使用了 OceanBase 的驱动,则将目标库 OceanBase 驱动包放入lib文件夹。
启动 `canal-adapter` 启动器。
```bash
canalAdapters:
- instance: example # canal instance Name or mq topic name
groups:
- groupId: g1
outerAdapters:
- name: rdb
key: mysql1
properties:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://192.168.0.36/mytest?useUnicode=true
jdbc.username: root
jdbc.password: 121212
bin/startup.sh
```
修改 `conf/rdb/mytest_user.yml` 文件:
验证 修改 `mysql mytest.user` 表的数据, 将会自动同步到 MySQL 的 `MYTEST.TB_USER` 表下面, 并会打出 DML 的 log 。
```bash
dataSourceKey: defaultDS
destination: example
outerAdapterKey: mysql1
concurrent: true
dbMapping:
mirrorDb: true
database: mytest
+ 停止 RDB
```bash
bin/stop.sh
```
其中`dbMapping.database` 的值代表源库和目标库的 `schema` 名称,即两库的 `schema` 要一模一样。
+ 启动 RDB
将目标库的`jdbc jar` 包放入lib文件夹。
启动 `canal-adapter` 启动器。
+ 查看 RDB 日志
```bash
bin/startup.sh
tail -f logs/adapter/adapter.log
2021-12-09 09:56:04.148 [pool-6-thread-1] DEBUG c.a.o.canal.client.adapter.rdb.service.RdbSyncService - DML: {"data":{"s_suppkey":99995,"s_name":null,"s_address":null,"s_nationkey":null,"s_phone":null,"s_acctbal":null,"s_comment":null},"database":"tpch","destination":"mariadb","old":null,"table":"supplier2","type":"INSERT"}
2021-12-09 09:56:04.149 [pool-6-thread-1] DEBUG c.a.o.canal.client.adapter.rdb.service.RdbSyncService - DML: {"data":{"s_suppkey":99998,"s_name":null,"s_address":null,"s_nationkey":null,"s_phone":null,"s_acctbal":null,"s_comment":null},"database":"tpch","destination":"mariadb","old":null,"table":"supplier2","type":"INSERT"}
2021-12-09 10:13:35.915 [Thread-3] INFO c.a.o.canal.client.adapter.rdb.monitor.RdbConfigMonitor - Change a rdb mapping config: mytest_user.yml of canal adapter
```
验证 修改 `mysql mytest.user` 表的数据, 将会自动同步到 MySQL 的 `MYTEST.TB_USER` 表下面, 并会打出 DML 的 log 。
## 同步测试
可以对源端 MySQL 数据库 `tpch` 做 DML 和 DDL 测试,都可以同步到目标端。这里就不详细展开,只介绍一些已知的功能限制。
+ 同步的表必须有主键。否则,源端删除无主键表的任意一笔记录,同步到目标端会导致整个表被删除。
+ DDL 支持新建表、新增列。但受 OceanBase MySQL 租户功能限制,不支持后期加主键、修改列的类型(指大类型变更,如数值、字符串、日期之间类型变化)。
\ No newline at end of file
......@@ -83,6 +83,14 @@ EA87898018FD1EDDC2AA11CE1556E917
"ob_sys_password": "8852DB95B3D54B1A8F866836A9D8FD52",
```
+ 修改 liboblog.conf
```
cluster_password=Root@2021
cluster_user=root@sys
rootserver_list=172.30.199.49:2882:2881;172.30.199.47:2882:2881
tb_white_list=test_tenant_1.canal_test.*
```
+ 启动 oblogproxy
```
[root@172.30.199.49 oblogproxy]$./run.sh start
......@@ -272,4 +280,4 @@ dbMapping:
[root@172.30.199.49 bin]$./startup.sh
```
模拟在oceanbase源端写入数据,在mysql目标端查看是否有数据同步过来。
模拟在oceanbase源端写入数据,在mysql目标端查看是否有数据同步过来。
\ No newline at end of file
......@@ -2,7 +2,7 @@
mysqldump 是 MySQL 提供的用于导出 MySQL 数据库对象和数据的工具,非常方便。
使用帮助详情可以通过 参数 `-h` 查看,功能非常丰富,这里就不再赘述。
使用帮助详情可以通过 参数 `--help` 查看,功能非常丰富,这里就不再赘述。
这里主要把 `mysqldump` 常用的场景命令参数搭配列举一下。
## 导出指定数据库的表结构(不包括数据)
......@@ -14,7 +14,7 @@ mysqldump -h 127.1 -uroot -P3306 -p123456 -d TPCH --compact > tpch_ddl.sql
这个导出来的脚本有几个特征:
+ 视图的定义也会在里面,但是会以注释 /*!*/ 。视图我们不关注,这部分内容可以删除。
+ 会有一些特别的语法 OceanBase MYSQL 会不支持,但是不影响,需要替换掉其中部分。
+ 会有一些特别的语法 OceanBase MYSQL 会不支持,但是不影响,需要替换掉其中部分。比如说变量 `SQL_NOTES` , `DEFINER` 语句等。
下面这个示例就是到处的脚本里有一个 `MAX_ROWS=` 的设置,这个是 MySQL 特有的,OceanBase MySQL 没有这个问题,也不需要这个设置,不支持这个语法,会报错。
......@@ -72,3 +72,5 @@ UNLOCK TABLES;
```
可能还存在其他导致报错的语句这里没有提到,欢迎到 OceanBase 社区版官网问答区反馈 。反馈地址:`https://open.oceanbase.com/answer/`(<https://open.oceanbase.com/answer>) 。
注意:mysqldump 还支持另外一种数据导出格式:csv 文件。
\ No newline at end of file
......@@ -14,8 +14,8 @@ $sudo yum -y install java-1.8.0-openjdk.x86_64
$which java
/usr/local/java/jdk1.8.0_261/bin/java
echo 'JAVA_HOME=/usr/local/java/jdk1.8.0_261/' >> ~/.bash_profile
echo 'export JAVA_HOME=/usr/local/java/jdk1.8.0_261/' >> ~/.bash_profile
. ~/.bash_profile
```
解压缩安装文件
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册