当前位置: 首页 > news >正文

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

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

http://www.dtcms.com/a/360099.html

相关文章:

  • 项目-云备份
  • 自然语言处理NLP:嵌入层Embedding中input_dim的计算——Tokenizer文本分词和编码
  • Qt Demo之 deepseek 帮我写的关于双目标定的小界面
  • libmodbus移植
  • 面试问题详解十三:Qt 多线程同步【QReadWriteLock】讲解
  • Qt-Advanced-Docking-System: 一个基于 Qt 框架的高级停靠窗口系统
  • Qt libcurl的下载、配置及简单测试 (windows环境)
  • 没有广告,纯净好用,功能强大的本地和网络文件管理器
  • 2025年9月计算机二级C++语言程序设计——选择题打卡Day12
  • RocketMQ5.0+保姆级单点Docker部署教程
  • 从零构建中间件:Tower 核心设计的来龙去脉
  • 当代科学(范畴大辩论) 的学科分科(论据)的要素论(论点)及方法论(论证):边缘处理
  • return 语句使用指南(c++)
  • 基于 YOLOv11n 的无人机航拍小目标检测算法学习
  • shell脚本第六阶段---三剑客之sed
  • Spring Cloud Alibaba Seata 分布式事务(六)
  • CPTS---Hospital
  • AliceVision相比于OpenMVG、Colmap有什么区别和特点
  • 计算机毕设选题:基于Python+Django实现电商评论情感分析系统
  • 嵌入式ARM程序高级调试技能:20.qemu arm ARM Linux 上 addr2line 的实际应用示例
  • 常用定位技术对比解析
  • OpenCL C 命令队列
  • 点接触混合润滑完整数值解
  • Photoshop - Ps 标尺
  • PortSwigger靶场之DOM XSS in document.write sink using source location.search通关秘籍
  • [ Android Audio 篇 ] 高通平台 Android AudioRecord 多通道录音
  • 手写call函数【JavaScript】
  • Java多线程基础:进程、线程与线程安全实战
  • 《信息学奥林匹克辞典》中的一个谬误
  • 【Android】Notification 的基本使用