目录
一、前言
最近做了一些异构数据库迁移方面的工作,在此记录下具体的实施细节以及碰到的问题,方便有需要的小伙伴参考和学习。
二、迁移背景说明
需求:将指定的Oracle数据库用户及数据迁移到达梦数据库中
迁移工具:DTS
源库:Oracle,字符集为UTF-8
目标库:达梦,字符集为UTF-8
三、迁移顺序说明
迁移准备:在目标库创建迁移用户/表空间并授权、统计要迁移的对象数量
迁移第一阶段:表定义、注释和数据
迁移第二阶段:索引、主键、约束
迁移第三阶段:视图、存储过程
迁移最后阶段:收集统计信息
四、迁移前准备工作
4.1 统计对象数量
用于迁移完成后的数据对象对比
select object_type,count(*) from dba_objects where owner='TEST' group by object_type;
4.2 确认数据库的字符集
建议源端和目标端的数据库字符集保持一致,例如在源库字符集是GBK,目标库的字符集是UTF-8的情况下,由于中文字符占据的字节数不同:GB18030字符集是一个中文字符占用2个字节,UTF-8是一个中文字符占用3个字节,进行转字符集的迁移时,就有可能出现某个列的长度超出定义的情况。
select userenv('language') from dual;
4.3 创建迁移用户并授予相应的角色
以test用户为例,表空间大小参考源库的用户数据量大小
角色定义说明
PUBLIC:具有对当前模式下对象的 DML 数据操作权限。
RESOURCE:具有在当前模式下对象定义权限(创建表、索引、视图等);
SOI:具有查询 sys 开头系统表的权限;
VTI:具有查询 v$开头的动态视图权限(动态视图记录在v$dynamic_tables,如果没有此权限,DM 管理工具上会报没有查询 v$视图权限)
disql sysdba/SYSDBA
create user TEST identified by "dameng123" ;
create tablespace TEST datafile '/data/dmdata/dmdb/test01.dbf size 10240 autoextend on next 1024 maxsize 51200 ;
alter tablespace "TEST" add datafile ' /data/dmdata/dmdb/test02.dbf' size 10240 autoextend on next 1024 maxsize 51200;
alter user TEST default tablespace TEST;
grant resource,public,soi,vti,svi to TEST;
五、迁移表数据
5.1 打开迁移工具图形化界面
cd /home/dmdba/dmdbms/tool
./dts
5.2 新建工程
5.3 填写工程名称
5.4 新建迁移任务
5.5 填写迁移任务名称
5.6 选择迁移方式
5.7 输入源端Oracle数据库信息
主机名需要填写具体的IP地址
5.8 输入目标端达梦数据库的信息
5.9 配置迁移方式及策略
可以适当调大迁移任务的并发数,提高迁移的效率
5.10 指定迁移对象为表
勾选表定义、注释和数据,填写并发数最后勾选应用当前选项到其他同类对象
六、迁移索引前的参数调整
这一步的目的是为了临时调大排序缓冲区和临时表空间的大小,从而提高迁移索引时的效率,在数据库创建索引时会占用较多的temp表空间和内存缓冲区。待迁移完成后再将相关的参数调回原来的值。
SORT_BUF_GLOBAL_SIZE:与服务器的内存有关,根据实际情况适当调大
TEMP_SPACE_LIMIT:与数据磁盘大小有关,根据实际情况适当调大
select * from v$parameter where name in ('SORT_FLAG','SORT_BLK_SIZE','SORT_BUF_SIZE','SORT_BUF_GLOBAL_SIZE');
alter system set 'SORT_BUF_SIZE'=2048 both;
alter system set 'SORT_BLK_SIZE'=50 both;
alter system set 'SORT_BUF_GLOBAL_SIZE'=204800 both;
alter system set 'TEMP_SPACE_LIMIT'=204800 both;
七、迁移约束和索引
迁移其他非表对象
八、收集统计信息
--小表按整张表收集
select last_analyzed,'dbms_stats.gather_table_stats('''||owner||''','''||table_name||''',null,100,TRUE,''FOR ALL COLUMNS SIZE AUTO'');',
(table_rowcount(owner,table_name)) num
from dba_tables
where owner='TEST'
and last_analyzed is null
order by num;
--大表按列收集
select 'stat 100 on "'||owner||'"."'||table_name||'"("'||column_name||'");' from DBA_TAB_COLUMNS where owner='TEST' and table_name='TEST_table_name ';
九、迁移完成后调整参数
alter system set 'SORT_BUF_SIZE'=2 both;
alter system set 'SORT_BLK_SIZE'=1 both;
alter system set 'SORT_BUF_GLOBAL_SIZE'=8000 both;
alter system set 'TEMP_SPACE_LIMIT'=102400 both;
select * from v$parameter where name in ('SORT_FLAG','SORT_BLK_SIZE','SORT_BUF_SIZE','SORT_BUF_GLOBAL_SIZE');
十、迁移报错以及处理
报错1:违反协议[14,108]
报错原因:
由于dts工具默认的驱动版本12.1,在迁移版本为11g的Oracle数据库时,就有可能会出现驱动版本不匹配导致有违反协议的报错。
处理过程:
确认源端Oracle数据库的数据库版本后,指定适合的驱动,之后truncate目标端已经导入的表,重新进行表数据的迁移
报错2:列[xxx]长度超出定义
报错信息如下:
任务名:从"TEST"."TABLE_NAME"迁移数据到"TEST"."TABLE_NAME"
列[xxx]长度超出定义
报错原因:
这一类问题常见于GBK转UTF8的数据迁移中,中文字符占的字节数不同。
处理过程:
在源端数据库中查出报错的表字段的长度定义,之后在目标端清空表数据,将字段长度调整后再重新进行数据同步
--达梦目标端中执行
--清空表数据
disql sysdba/SYSDBA
truncate table "TEST"."TABLE_NAME";
--调整对应的字段长度 扩大到1.5倍
alter table "TEST"."TABLE_NAME" modify "xxx" VARCHAR2(90);
报错3:对象[xxx]不支持统计信息
报错信息如下:
报错原因:
这一类问题常见于指定收集统计信息的列是大字段或者虚拟列
处理过程:
确认报错字段的定义类型是否为大字段或者虚拟列
想要了解更多内容可访问达梦技术社区:达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台