OceanBase数据库V4.2.1版本是OB的第一个长期支持版本(LTS),也适合作为现在企业使用OB数据库的稳定版本。相比OB3版本,OB4版本在数据库的设计、内核、架构等方面都做了比较大的改造和调整。因此,OB不支持从V3.x版本在线升级到V4.x版本,可以通过OMS迁移工具将V3.x版本数据库逻辑迁移升级到V4.x版本。本文将总结OceanBase数据库大版本迁移升级的主要步骤以及大表的迁移方法。
一、OMS迁移升级步骤
1. 数据库老环境用户及权限导出:首先需要在OB3版本环境把数据库用户和权限导出,对于ORACLE租户需要查询dba_tab_privs、dba_sys_privs、dba_role_privs三个系统视图,对于MySQL租户则可以通过show grants语法导出用户所有的权限。
2. 数据库新环境创建用户。
3. 通过OMS进行数据迁移:参考OMS官方文档在源端和目标端创建专用于迁移的数据库用户并授权,https://www.oceanbase.com/docs/enterprise-oms-doc-cn-1000000000091344,然后就可以通过OMS白屏界面操作数据迁移。
4. 存储过程、函数等对象迁移:由于OMS只能迁移数据表、视图、索引等数据对象,无法迁移存储过程、函数、序列等其他数据库对象。我们可以使用obdumper/obloader工具迁移这类对象,迁移命令可参考
./obdumper -h 10.xx.xx.xx -P 2883 -u SYS@ob_tenant#ob_cluster -p xxxxxxxx --sys-user root --sys-password xxxxxxxx -D SCHEMA_NAME --trigger '*' --sequence '*' --package '*' --package-body '*' --function '*' --procedure '*' --ddl --thread=8 -f /obdump/schema_name ./obloader -h 10.xx.xx.xx -P 2883 -u SYS@ob_tenant#ob_cluster -p xxxxxxxx --sys-user root --sys-password xxxxxxxx -D SCHEMA_NAME --trigger '*' --sequence '*' --package '*' --package-body '*' --function '*' --procedure '*' --ddl --thread=8 -f /obdump/schema_name
5. 在新环境进行数据库用户授权
二、大表迁移问题
由于OMS是逻辑迁移并且要经过OMS服务器通过网络传输数据,所以迁移速度会受到一定限制,而数据库中存在几张超过10亿行的大表,最大的表超过70亿行。开始进行全量迁移时,没有把大表排除在外,配置好OMS迁移任务后,发现全量数据迁移一直卡着不动,这主要是表数据量太大,OMS查询数据源超时,看来通过OMS迁移大表很难行得通。对于大表的迁移,最快的方法就是旁路导入,旁路导入可以绕过SQL层的接口,直接在data文件中分配空间并插入数据,从而提高数据导入的效率。因此,这次迁移的方式确定为:小表OMS迁移+大表旁路导入。
由于表的数据量太大,旁路导入也需要比较长的时间,为了减少正式切换时业务中断的时间,我们可以提前把全量数据迁移过去,然后再正式迁移时只需要迁移增量的数据即可。这些大表都是历史数据表,数据都是新增,存量的数据不会变化,并且这些表都是按时间进行分区的分区表。我们可以在正式迁移前的两三天把全量数据迁移过去,然后正式迁移的时候,在新环境把这两天或者这个月的数据的分区truncate掉,然后再从老环境通过obdumper把这两天的数据导出,再通过obloader把这两天的数据导入新环境。这样在正式迁移时,只需要迁移一小部分数据即可,大大减少了业务停机的时间。在数据导出的时候,我们使用了select into outfile这种方式,直接在服务端导出数据,相比正常obdumper导出更快。此外,我们再新版本数据库服务器和旧版本数据库服务器上面挂载了同一个NFS目录,这样就解决了导出数据文件的传输问题,相当于全链路的数据迁移都没有经过网络,大大提升了数据迁移的效率。相关数据导出导入命令可以参考如下:
#旧版本数据全量导出 select /*+parallel(16)*/ * into outfile '/obbackup/PRD_TAB.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' from "SCM"."PRD_TAB"; #新版本数据全量导入(旁路导入) ./obloader -h10.xx.xx.xx -P2883 -uSYS@tenant#cluster -p --sys-user root --sys-password xxxxxx -D SCM --table 'PRD_TAB' --csv --direct --parallel 32 -f /obbackup/ #旧版本数据增量导出 select /*+parallel(16)*/ * into outfile '/obbackup/PRD_TAB.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' from "SCM"."PRD_TAB" where ETL_DT >= '20241201'; #新版本数据增量导入(旁路导入) ./obloader -h10.xx.xx.xx -P2883 -uSYS@tenant#cluster -p --sys-user root --sys-password xxxxxx -D SCM --table 'PRD_TAB' --csv --direct --parallel 32 -f /obbackup/ #导入完成后收集统计信息 CALL dbms_stats.gather_table_stats('SCM', 'PRD_TAB', degree=>'32', granularity=>'GLOBAL');