obdumper和obloader迁移OceanBase业务库(一):实施手册

发布于:2025-09-03 ⋅ 阅读:(18) ⋅ 点赞:(0)

obdumper和obloader迁移OceanBase业务库(一):实施手册

  • 环境信息:OceanBase v4.3.5单机部署,MySQL租户
  • OBDUMPER和OBLOADER的安装请参考:https://www.oceanbase.com/docs/enterprise-oceanbase-dumper-loader-cn-10000000001142213

导出前准备

检查软件版本:

[admin@oceanbase ~]$ /oceanbase/bin/observer -V
/oceanbase/bin/observer -V
observer (OceanBase 4.3.5.1)

[admin@oceanbase bin]$ ./obdumper -V
Version: 4.3.4-RELEASE

查看数据库版本:

select @@version, @@version_comment from dual;

select version();

检查集群名称:

select * from gv$ob_parameters where name like '%cluster%';

检查租户信息:

select tenant_id,tenant_name,tenant_type,primary_zone,
compatibility_mode,status,tenant_role,switchover_status,log_mode,compatible 
from oceanbase.dba_ob_tenants;

Oracle/MySQL租户:统计业务租户(tenant_id=1002)的数据量:

select svr_ip,svr_port,
  round(sum(data_size)/1024/1024/1024, 2) as data_size_gb,
  round(sum(required_size)/1024/1024/1024, 2) as required_size_gb
from CDB_OB_TABLET_REPLICAS
where TENANT_ID = 1002
group by svr_ip,svr_port;

MySQL租户:统计业务租户下所有数据库的大小:

show databases;

select database_name,
round(sum(occupy_size)/1024/1024,2) occupy_size_mb,
round(sum(required_size)/1024/1024,2) required_size_mb
from oceanbase.DBA_OB_TABLE_SPACE_USAGE
group by database_name;

Oracle租户:统计租户下所有模式的数据量:

select owner,sum(bytes)/1024/1024 size_mb from dba_segments
group by owner order by size_mb;

MySQL租户:统计当前租户下所有的表和索引大小:

select table_id,database_name,table_name,
round(occupy_size/1024/1024,2) occupy_size_mb,
round(required_size/1024/1024,2) required_size_mb
from oceanbase.DBA_OB_TABLE_SPACE_USAGE;

Oracle租户:统计单个租户下所有表和索引大小(NULL表示空表):

--统计所有表、所有索引
select owner,segment_name,segment_type,sum(bytes)/1024/1024 size_mb from dba_segments
group by owner,segment_name,segment_type
having owner='用户名'
order by size_mb;

--只统计非空表
select owner,segment_name,segment_type,sum(bytes)/1024/1024 size_mb from dba_segments
group by owner,segment_name,segment_type
having owner='用户名' and segment_type='TABLE'
and (sum(bytes) is not NULL and sum(bytes) > 0)
order by sum(bytes);

MySQL租户:统计业务数据库下的所有业务对象清单(表/索引/分区/包/存储过程/同义词/序列/…):

-- 方法一
select owner,object_type,count(object_name) from dba_objects 
group by owner,object_type having owner in ('knowledgedb','other_app_users')
order by owner,object_type;

-- 方法二
select table_schema,count(table_name) from information_schema.tables
group by table_schema order by table_schema;

select table_schema,count(table_name) from information_schema.views
group by table_schema order by table_schema;

select trigger_schema,count(trigger_name) from information_schema.triggers
group by trigger_schema order by trigger_schema;

select routine_schema,routine_type,count(routine_name) from information_schema.routines
group by routine_schema,routine_type order by routine_schema,routine_type;

Oracle租户:统计单个模式下所有业务对象清单(表/索引/分区/包/存储过程/同义词/序列/…):

select owner,object_type,count(object_name) from dba_objects 
group by owner,object_type having owner='用户名'
order by owner,object_type;

MySQL租户:检查业务数据库下的所有业务对象清单(表/索引/分区/包/存储过程/同义词/序列/…):

-- 方法一
select owner,object_name,subobject_name,object_type from dba_objects 
where owner in ('用户1','用户2',...)
order by owner,object_type;

-- 方法二
select table_schema,table_name from information_schema.tables;
select table_schema,table_name from information_schema.views;
select trigger_schema,trigger_name from information_schema.triggers;
select routine_schema,routine_type,routine_name from information_schema.routines;

MySQL租户:检查应用连接是否断开:

show processlist;

⚠️ 关于磁盘空间

  • 由于OceanBase存储数据时有做压缩,OBdumper导出表数据的文件实际大小可能是数据库内部查到的大小的好几倍!!!
  • 务必保证导出路径的磁盘空间大小足够。建议导出路径剩余磁盘空间是数据库内查到的表数据量的至少5倍大小。

全库(模式)数据导出

⭐️ 导出环境

  • 集群名:obvector
  • 业务租户:obvector
  • 业务租户管理员:root(MySQL租户)/sys(Oracle租户)
  • MySQL数据库/Oracle模式:knowledgedb
  • 业务用户:knowledgedb

⚠️ 注意事项

  • 旧版本使用obdumper和obloader进行表结构迁移时,需要指定--sys-user--sys-password选项,获取表结构元数据信息。如果未指定该选项,导出/导入功能和性能可能会受到较大的影响。
  • OceanBase数据库V4.0.0及之后版本,使用OBdumper和OBloader无需再指定--sys-user--sys-password选项。
  • 推荐使用租户管理员作为导出和导入用户,普通用户需要额外授权。
  • 为确保数据一致性,请在业务停机时进行数据导出。

⭐️ 要求导出一致性数据时,建议在导出数据前,手动触发一次合并,在合并成功后再重新导出数据。

--检查租户合并状态
SELECT * FROM oceanbase.CDB_OB_ZONE_MAJOR_COMPACTION;

--手动触发一次租户合并
ALTER SYSTEM MAJOR FREEZE TENANT = obvector;

--检查租户合并状态(COMPACTING表示合并中,变成IDLE表示合并完成)
SELECT * FROM oceanbase.CDB_OB_ZONE_MAJOR_COMPACTION;

OBdumper和OBloader支持将表数据导出为CSV格式(官方推荐)或SQL文本。以下将以导出CSV数据文件和导入CSV数据文件为例进行介绍使用obdumper和obloader进行数据迁移。


  1. 使用OBDUMPER和OBLOADER前请确认已配置JAVA环境变量(JAVA_HOMEJRE_HOME)。
export JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.ky10.x86_64/jre
  1. 使用obdumper导出业务库knowledgedb中所有对象的DDL信息:
cd /home/obadmin/ob-loader-dumper-4.3.4-RELEASE/bin

# 集群导出整库DDL
./obdumper -h OBProxy主机地址 -P 2883 -u 执行导出的用户 -p ****** -c 集群名称 -t 租户名称 -D 数据库名称 \
--ddl --all -f /obdata/backup/migrate_dbname/ddl_data

# 单机导出整库DDL(不用指定集群名)
./obdumper -h 127.0.0.1 -P 2881 -u knowledgedb -p ****** -t obvector -D knowledgedb \
--ddl --all -f /obdata/backup/knowledgedb/ddl_data

# 使用租户管理员导出指定数据库/模式下的所有对象定义(MySQL为root/Oracle为sys)
./obdumper -h 127.0.0.1 -P 2881 -u root -p ****** -t obvector -D knowledgedb \
--ddl --all -f /obdata/backup/knowledgedb/ddl_data

该过程会导出所有表的定义、以及定义在表上的索引定义。

其中:

  • --ddl:导出DDL文件。
  • --ddl --all:导出所有已支持的数据库对象定义。
  • --ddl --table '*':导出所有表的定义。
  • --view='*':导出所有视图的定义。
  • --function='*':导出所有函数的定义。
  • --procedure='*':导出所有存储过程的定义。
  • --trigger='*':导出所有触发器的定义。
  • --sequence='*':导出所有序列的定义。
  • --package='*':导出所有包的定义。
  • --thread:导出任务的并发数。建议导出并发数不超过4。并发数太大会影响访问sys租户下的内部视图,导出时会出现超时错误。
  • --all用于标识导出所有的数据库对象定义和表数据,是视图、存储过程、函数、触发器等数据库对象类型的集合,使用限制等事项以具体的数据库对象类型为准。
  • --all选项与任意的数据库对象选项之间都是互斥的,不可同时指定;如果同时指定--all选项与任意的数据库对象选项,则会优先执行--all选项命令。
  • --all选项与--csv|--sql|--cut任意一种数据格式选项搭配使用时,表示按照对应的格式导出所有表中的数据。
  • 如果需要导出所有的数据库对象定义和表数据,可以指定--all --ddl选项再搭配任意一种数据格式选项(例如--sql)。

导出的DDL文件命名格式为对象名-schema.sql。如果有多种数据库对象,会导出到不同的子路径下。

[admin@oceanbase knowledgedb]$ ll -h ddl_data/data/knowledgedb/
total 28K
drwxr-xr-x 2 admin admin 4.0K Aug 15 16:18 FUNCTION
drwxr-xr-x 2 admin admin  275 Aug 15 16:18 PROCEDURE
drwxr-xr-x 2 admin admin 4.0K Aug 15 16:18 SEQUENCE
drwxr-xr-x 2 admin admin  12K Aug 15 16:18 TABLE
drwxr-xr-x 2 admin admin 4.0K Aug 15 16:18 TRIGGER

导出过程中的错误日志如下:

[amdin@oceanbase ~]$ ls /obdata/backup/knowledgedb/ddl_data/logs
ob-loader-dumper.error  ob-loader-dumper.info  ob-loader-dumper.warn  sql-monitor.log
  1. 使用obdumper导出业务库knowledgedb的表数据:
# 集群导出整库表数据
./obdumper -h OBProxy主机地址 -P 2883 -u 执行导出的用户 -p ****** -c 集群名称 -t 租户名称 -D 数据库名称 \
--csv --table '*' -f /obdata/backup/migrate_dbname/csv_data

# 单机导出整库表数据(不用指定集群名)
./obdumper -h 127.0.0.1 -P 2881 -u knowledgedb -p ****** -t obvector -D knowledgedb \
--csv --table '*' -f /obdata/backup/knowledgedb/csv_data

# 使用租户管理员导出指定数据库/模式下的所有表数据(MySQL为root/Oracle为sys)
./obdumper -h 127.0.0.1 -P 2881 -u root -p ****** -t obvector -D knowledgedb \
--mem 12G --csv --table '*' -f /obdata/backup/knowledgedb/csv_data

其中:

  • --csv --table '*':以CSV格式导出所有表的数据。
  • --sql --table '*':以SQL格式导出所有表的数据。
  • --mem 12G:调大JVM内存以提高obdumper导出效率(默认为4G)。

如果单张表的数据量太大,会导出为多个文件,文件命名会加上数字后缀。

[admin@oceanbase knowledgedb]$ ll -h TABLE/mydb_external_report_embedding*
-rw-r----- 1 admin admin 1.1G Aug 17 12:21 TABLE/mydb_external_report_embedding.0.csv
-rw-r----- 1 admin admin 1.1G Aug 17 12:30 TABLE/mydb_external_report_embedding.10.csv
-rw-r----- 1 admin admin 1.1G Aug 17 12:31 TABLE/mydb_external_report_embedding.11.csv
-rw-r----- 1 admin admin 1.1G Aug 17 12:32 TABLE/mydb_external_report_embedding.12.csv
...

导出过程中的错误日志如下:

[amdin@oceanbase ~]$ ls /obdata/backup/knowledgedb/csv_data/logs
ob-loader-dumper.error  ob-loader-dumper.info  ob-loader-dumper.warn  sql-monitor.log

查看导出过程的并发线程数:

[amdin@oceanbase knowledgedb]$ cat csv_data/logs/ob-loader-dumper.info | grep -i thread
2025-08-17 10:23:33 [INFO] Start 32 record dump threads for 6 dump tasks finished
  1. 传输到目标服务器。
cd /obdata/backup/knowledgedb 
scp -r ddl_data/ obadmin@{NEW_OBHOST_IP}:/obdata/backup/knowledgedb/
scp -r csv_data/ obadmin@{NEW_OBHOST_IP}:/obdata/backup/knowledgedb/

全库(模式)数据导入

⭐️ 导入环境

  • 集群名:obvector
  • 业务租户:obvector1
  • 业务租户管理员:root(MySQL租户)/sys(Oracle租户)
  • MySQL数据库/Oracle模式:knowledgedb
  • 业务用户:knowledgedb

  1. 使用OBDUMPER和OBLOADER前请确认已配置JAVA环境变量(JAVA_HOMEJRE_HOME)。
export JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.ky10.x86_64/jre
  1. 使用obloader导入业务库knowledgedb的表结构:
cd /home/obadmin/ob-loader-dumper-4.3.4-RELEASE/bin

# 集群导入整库DDL
./obloader -h OBProxy主机地址 -P 2883 -u 执行导入的用户 -p ****** \
-c 集群名称 -t 租户名称 -D 数据库名称 --ddl --all -f /obdata/backup/migrate_dbname/ddl_data

# 单机导入整库DDL(不用指定集群名)
./obloader -h 127.0.0.1 -P 2881 -u knowledgedb -p ****** \
-t obvector1 -D knowledgedb --ddl --all -f /obdata/backup/knowledgedb/ddl_data

# 使用租户管理员导入指定数据库/模式下的所有对象定义(MySQL为root/Oracle为sys)
./obloader -h 127.0.0.1 -P 2881 -u root -p ****** \
-t obvector1 -D knowledgedb --ddl --all -f /obdata/backup/knowledgedb/ddl_data
  1. 使用obloader导入业务库knowledgedb的表数据:
# 集群导入整库表数据
./obloader -h OBProxy主机地址 -P 2883 -u 执行导入的用户 -p ****** \
-c 集群名称 -t 租户名称 -D 数据库名称 --csv --table '*' -f /home/admin/test_migrate_data/csv_data

# 单机导入整库表数据(不用指定集群名)
./obloader -h 127.0.0.1 -P 2881 -u knowledgedb -p ****** \
-t obvector1 -D knowledgedb --csv --table '*' -f /obdata/backup/knowledgedb/csv_data

# 使用租户管理员导入指定数据库/模式下的所有表数据(MySQL为root/Oracle为sys)
./obloader -h 127.0.0.1 -P 2881 -u root -p ****** \
--mem 24G --skip-header \
-t obvector1 -D knowledgedb --csv --table '*' -f /obdata/backup/knowledgedb/csv_data

其中:

  • --mem 24G:调大JVM内存以提高obdumper导出效率(默认为4G)。
  • --skip-header:跳过CSV文件第一行的表头。
  • --thread:导入任务的并发数。该选项直接对应写入线程数。与--rw选项搭配使用时,用于计算文件解析线程数,计算公式:--thread参数值 * --rw参数值。默认值:CPU乘以 2。OceanBase是串行执行DDL,所以导入数据库对象定义时无需指定该选项。
  • --rw:用于标识文件解析线程占总线程数的比例。默认值:0.2。 该选项与--thread选项搭配使用,可计算出文件解析线程数等于:--thread参数值 * --rw参数值。

导入后检查

检查数据量:

 select database_name,
round(sum(occupy_size)/1024/1024,2) occupy_size_mb,
round(sum(required_size)/1024/1024,2) required_size_mb
from oceanbase.DBA_OB_TABLE_SPACE_USAGE
group by database_name;

检查对象清单:

select owner,object_type,count(object_name) from dba_objects 
group by owner,object_type having owner='knowledge_base'
order by owner,object_type;

select owner,object_name,subobject_name,object_type from dba_objects 
where owner='knowledge_base'
order by owner,object_type;

检查失效对象:

select owner,object_name,subobject_name,object_type,status from dba_objects 
where owner='knowledge_base' and status='INVALID'
order by owner,object_type;

重建失效的索引。

迁移完成后,可以再做一次手动合并:

--检查租户合并状态
SELECT * FROM oceanbase.CDB_OB_ZONE_MAJOR_COMPACTION;

--手动触发一次租户合并
ALTER SYSTEM MAJOR FREEZE TENANT = obvector;

--检查租户合并状态(COMPACTING表示合并中,变成IDLE表示合并完成)
SELECT * FROM oceanbase.CDB_OB_ZONE_MAJOR_COMPACTION;

References
【1】https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003378663
【2】https://www.oceanbase.com/docs/common-oceanbase-dumper-loader-1000000002401643
【3】https://www.oceanbase.com/docs/enterprise-oceanbase-dumper-loader-cn-10000000001142213
【4】https://www.oceanbase.com/docs/enterprise-oceanbase-dumper-loader-cn-10000000001142216
【5】https://www.oceanbase.com/docs/enterprise-oms-doc-cn-1000000000091365
【6】https://ask.oceanbase.com/t/topic/35620174
【7】https://www.cnblogs.com/bsmn/p/16496455.html
【8】https://open.oceanbase.com/blog/16018455643
【9】https://open.oceanbase.com/blog/20224546128
【10】https://www.oceanbase.com/docs/common-oceanbase-dumper-loader-1000000002401653


网站公告

今日签到

点亮在社区的每一天
去签到