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进行数据迁移。
- 使用OBDUMPER和OBLOADER前请确认已配置JAVA环境变量(
JAVA_HOME
或JRE_HOME
)。
export JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.ky10.x86_64/jre
- 使用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
- 使用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
- 传输到目标服务器。
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
- 使用OBDUMPER和OBLOADER前请确认已配置JAVA环境变量(
JAVA_HOME
或JRE_HOME
)。
export JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.ky10.x86_64/jre
- 使用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
- 使用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