OB逻辑导数
OB逻辑导数方式
- outfile方式导出数据到文件、CSV
- dbcat工具导出、导入数据
- dataX工具导出数据(不介绍)
- OB4.x新特性旁路导入数据<load data、insert (append) into select>
- OMS工具数据导出、导入、增量数据准实时同步(单独篇章介绍)
存储过程造数据(oracle租户)
创建表
create table zhzbusi.t1(id int,name varchar2(299),enrollment_date date);
创建存储过程
CREATE OR REPLACE PROCEDURE add_data_to_t1(n IN INT) IS
i INT := 1;
BEGIN
WHILE i <= n LOOP
INSERT INTO zhzbusi.t1 (id, name, enrollment_date) VALUES (i, 'Name' || i, TO_DATE('2022-01-01', 'YYYY-MM-DD') + i);
i := i + 1;
END LOOP;
END;
/
DELIMITER ;
执行存储过程造10条数据
call add_data_to_t1(10);
commit;
使用OUTFILE语句导出数据到CSV
- 管理员用户登录,确认租户的unite资源落位
select * from gv$ob_units; ##sys用户登录oracle租户
select * from oceanbase.gv$ob_units;##root用户登录mysql租户
- 修改secure_file_priv参数,允许导出文件到指定目录
ssh admin@10.1.1.1 ###根据上一步查询出主机ip地址,登录任意一台主机。
obclient -S /home/admin/oceanbase/run/sql.sock -usys@zhz_oracle -p ##sys用户使用socket方式本地登录zhz_oracle租户
show variables like 'secure_file_priv'; #默认是null;V4.2.0开始,null和空字符串,表示禁止导出文件。
SET GLOBAL secure_file_priv = "/"; ##修改导数文件路径 / 表示可以导出到任意路径
- 重新登录,导出数据
obclient -h10.1.1.1 -P端口 -usys@zhz_oracle#***** -p
select id,name,enrollment_date into outfile '/data/1/zhzbusi_t2.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM zhzbusi.t2;
- 登录10.1.1.1查看导出的数据
再哪一个ip上修改的secure_file_priv参数,outfile就会导出到哪个ip上。
dbcat数据导出导入
- dbcat源端目标端支持多种数据库之间逻辑导出导入,具体兼容数据库类型和版本,参考官方提供的对照清单。
- 这里不赘述安装步骤,简单记录使用方法。
dbcat官方文档使用手册
./dbcat convert 查看帮助命令
参数说明:
-H:数据库所在机器的IP地址
-P:数据库对外提供服务的监听端口
-u:dbcat连接数据库使用的用户
-p:dbcat用户连接数据库的密码
-service-name:oracle数据库的服务名
-D:被迁移的schema名称
--from:源数据库类型,默认oracle11g 即可
--to:目标数据库类型,oboracle2250 或 oboracle2270 指定其一即可
--all:所有数据库对象,如表、视图、函数、触发器、序列、同义词等
--table '\*':导出所有的表
--view '\*':导出所有的视图
--sequence '\*':导出所有的序列,sequence需要在上线当晚导出,避免current_value不一致
--synonym '\*':导出所有的同义词
--procedure '\*':导出所有的存储过程
--function '\*':导出所有的函数
--valid-only '\*':导出数据库中STATUS='VALID'的对象
--exclude-type 'TABLE':此参数和--all同步使用,表示导出除了TABLE类型以外的所有对象,值必须是大写
以oracle导出数据到OB(oracle租户)为例:
导出:导出aaaaa用户除表、索引以外所有的对象。
cd /docker/dbcat-1.8.0-SNAPSHOT/bin
./dbcat convert -H 10.1.1.1 -P 1521 -u aaaaa -p 密码 --service-name 服务名 -D 被迁移的schema名称 --from oracle11g --to oboracle2270 --all --exclude-type 'TABLE','INDEX'
##导出的文件默认存储在安装目录下的output目录下,按照时间创建目录,可以增加-f 指定文件输出目录。导出的对象按照对象类型生产相应的SQL文件。
导入:将序列导入OB
dbcat导出的是sql文件,直接将sql文件是OB中运行即可,如导入序列:
obclient -c -A -vv -hXXX.XXX.XX.XXX -P2883 -uSYS@AAAA#BBBBBBBBB -p"XXXXXX" -e "source VIEW-schema.sql" > VIEW-XXXXX.log 2>&1
旁路导入
旁路导入是OB4.X版本新功能,在导入数据到数据库的时候,可以绕过SQL层,直接将数据写入到底层文件系统的data文件中,极大的提高数据导入效率。旁路导入会把所有的已有的数据都写一遍。如果原表的数据比较大,导入的数据比较少,可能不适合使用旁路导入。
目前 OceanBase 数据库支持以下语句进行旁路导入:
- LOAD DATA /*+ direct */
- INSERT /*+ append */ INTO SELECT
使用 LOAD DATA 语句旁路导入数据
使用限制
- 不能两个语句同时写一个表,因为导入的过程中会先加表锁。
- 不支持在触发器(Trigger)使用。
- 支持 lob 类型,但是性能比较差,lob 会走原来事务写入数据的路径。
- 不能在多行事务中运行。
注意事项
为了提高数据导入速率,OceanBase 数据库在 LOAD DATA 操作中采用了并行设计。在该过程中,需要导入的数据被划分为多个子任务以并行方式执行,每个子任务都作为一个独立的事务进行处理,并且执行顺序是随机的。因此,需要注意以下事项:
- 无法保证整体数据导入的原子性。
- 对于无主键表来说,数据写入的顺序可能与文件中的数据顺序不一致。
语法
LOAD DATA /*+ direct(need_sort,max_error) parallel(N) */ INFILE 'file_name' ...
实验用例
设置secure_file_priv参数,这里不再赘述
obclient [ZHZBUSI]> LOAD DATA /*+ direct(true,0) parallel(8) */INFILE '/data/1/zhzbusi_t1.csv' INTO TABLE zhzbusi.t2 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' ;
Query OK, 100010 rows affected (13.007 sec)
Records: 100010 Deleted: 0 Skipped: 0 Warnings: 0
obclient [ZHZBUSI]>
使用INSERT /*+ append */ INTO SELECT语句旁路导入数据
正常情况下需要enable_parallel_dml+parallel(N) 配合才能使用并行DML。若表开启了并行查询,可以忽略。
obclient [ZHZBUSI]> set autocommit =on; ###使用旁路导入要开启自动提交,会话级生效。
Query OK, 0 rows affected (0.006 sec)
obclient [ZHZBUSI]> INSERT /*+ append enable_parallel_dml parallel(4) */ INTO zhzbusi.t1 select * from zhzbusi.t2;
Query OK, 100020 rows affected (11.241 sec)
Records: 100020 Duplicates: 0 Warnings: 0
旁路导入场景
适用场景
- 旁路导入适合一次性往空表中 LOAD 大量数据。
不适用场景
- 旁路导入不适合往有数据的大表中多次 LOAD 数据,也不适合索引特别多的表。
旁路导入使用限制
- 只支持 PDML(Parallel Data Manipulation Language,并行数据操纵语言),非 PDML 不能用旁路导入。
- 不能两个语句同时写一个表,因为导入的过程中会先加表锁。
- 不支持在触发器(Trigger)使用。
- 支持 lob 类型,但是性能比较差,lob 会走原来事务写入数据的路径。
- 不能在多行事务(包含多个操作的事务)中运行。