OB导数工具使用经验分享
一、前言
OBDUMPER/OBLOADER是OceanBase官方推出的数据导出导入工具,可以用于OB租户间的数据迁移,对OB租户进行逻辑备份。不同于MySQL的MyDumper是C语言开发,OBDUMPER/OBLOADER是由java语言开发,因此它具备跨平台兼容性(x86/arm)。OBDUMPER/OBLOADER是一个功能非常丰富的工具,其使用方法在官方文档上面描述的已经很详细了,包括命令行选项、使用示例、参数调优等。如何使用该工具本文就不再赘述了,可以参考官方文档,本文主要想分享一些我使用这个工具的一些经验和踩过的坑。
二、旁路导入
旁路导入可以大大提升数据导入的效率,旁路导入的原理就是使用LOAD DATA /*+ direct */而非INSERT导入数据,所以需要设置用户file权限,开启secure_file_priv参数,具体可以参考OCEANBASE官方文档的load data部分:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218027。加--direct 代表开启旁路导入,旁路导入可以绕过 SQL 层的接口,直接在 data 文件中直接分配空间并插入数据,从而提高数据导入的效率。这个和MySQL的load data有点相似,但又不太一样,OB的load的其实是转换为insert插入,只有加上hint语法/*+ direct */ 才会开启旁路导入。
导入时遇到一个报错:'no files are available',需要检查导入文件的目录是否挂载在每个observer下,以及目录的权限。
补充:使用旁路导入遇到的报错:ORA-00600: internal error code, arguments: -4009, IO error。最后排查是导入的csv文件权限为600,缺失了所有OS用户的读权限,授予所有OS用户的读权限后解决。
三、表结构导出性能问题
对于obdumper428之前的版本,在对oracle租户下大量表的表结构进行导出时,需要查询系统视图反拼语句,而ob的系统视图的性能一直是一个问题,所以这种场景下很容易出现卡死或导出慢等性能问题。从obdumper428版本开始,支持使用show create table导出,解决了之前版本需要进行复杂的系统视图查询而带来的性能问题。对于oceanbase oracle 4.0.0之前的版本,使用--no-sys 选项将开启使用show create table方式导出;对于oceanbase oracle 4.0.0 及之后的版本,使用新增选项--compact-schema 开启show create table方式导出。但需要注意的是使用show create table方式导出,对于oceanbase oracle 2.2.7~4.0.0版本,无法导出分区表的唯一索引定义。虽然ob的oracle租户也支持show create table语法,但只能导出表结构,对于创建索引的语句还是需要通过查询系统视图反拼语句。
四、其他注意事项
1. 对于大数据量的表如果要先清除,使用--truncate-table而不用--delete-from-table,避免造成大事务删除缓慢。生产环境建议手动清空;
2. 导入导出时报错timeout,可以在配置文件conf里修改sql执行超时参数:{ob-loader-dumper}/conf/session.config.json ;
3. --all与--table '*'的区别,--all表示所有对象、包括视图等,--table表示仅导出表;
4. --thread参数用于设置导出时的并发数,默认会使用本机的CPU 乘以 2,所以一定要设置这个参数在一个合理的值,避免打爆客户端或租户的cpu;
5. 对于obdumper428版本,使用--table 导出数据时会带上列名。导入时需要加上参数--skip-header忽略列名。
下面是在数据迁移时常用的几个命令:
表结构导出与导入 ./obdumper -h xx.x.x.x -P 2883 -u test@mysql#cluster_a -p ****** --no-sys -D USERA --ddl --table '*' --thread=8 -f /output ./obloader -h xx.x.x.x -P 2883 -u test@mysql#cluster_a -p ****** --no-sys -D USERA --ddl --table '*' --thread=8 -f /output 数据导出与导入 ./obdumper -h xx.x.x.x -P 2883 -u test@mysql#cluster_a -p ****** --no-sys -D USERA --csv --table '*' --thread=8 -f /output ./obloader -h xx.x.x.x -P 2883 -u test@mysql#cluster_a -p ****** --no-sys -D USERA --csv --table '*' --thread=8 -f /output 表结构与数据导出导入 ./obdumper -h xx.x.x.x -P 2883 -u test@mysql#cluster_a -p ****** -D USERA --ddl --csv --no-sys --table '*' --thread=8 -f /output ./obloader -h xx.x.x.x -P 2883 -u test@mysql#cluster_a -p ****** -D USERA --ddl --csv --no-sys --table '*' --thread=8 -f /output