需求:将指定的Oracle数据库用户及数据迁移到达梦数据库中
迁移工具:DTS
源库:Oracle,字符集为UTF-8
目标库:达梦,字符集为UTF-8
迁移准备:在目标库创建迁移用户/表空间并授权、统计要迁移的对象数量
迁移第一阶段:表定义、注释和数据
迁移第二阶段:索引、主键、约束
迁移第三阶段:视图、存储过程
迁移最后阶段:收集统计信息
建议源端和目标端的数据库字符集保持一致,例如在源库字符集是GBK,目标库的字符集是UTF-8的情况下,由于中文字符占据的字节数不同:GB18030字符集是一个中文字符占用2个字节,UTF-8是一个中文字符占用3个字节,进行转字符集的迁移时,就有可能出现某个列的长度超出定义的情况。
select userenv('language') from dual;
用于迁移完成后的数据对象对比
select object_type,count(*) from dba_objects where owner='TEST' group by object_type;
以test用户为例,表空间大小参考源库的用户数据量大小
角色定义
PUBLIC:具有对当前模式下对象的 DML 数据操作权限。
RESOURCE:具有在当前模式下对象定义权限(创建表、索引、视图等);
SOI:具有查询 sys 开头系统表的权限;
VTI:具有查询 v$开头的动态视图权限(动态视图记录在v$dynamic_tables,如果没有此权限,D
M 管理工具上会报没有查询 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;
cd /home/dmdba/dmdbms/tool
./dts
主机名需要填写具体的IP地址
这里可以调整迁移任务最大并发数、提高迁移的效率
按需要勾选要迁移的表,之后点击转换
这里勾选表定义、注释和数据,适当的调大
这一步的目的是为了临时调大排序缓冲区和临时表空间的大小,从而提高迁移索引约束时的效率,在数据库创建索引时会占用较多的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 ';
disql sysdba/SYSDBA
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');
报错原因:
由于dts工具默认的驱动版本12.1,在迁移版本为11g的Oracle数据库时,就有可能会出现驱动版本不匹配导致有违反协议的报错。
处理过程:
确认源端Oracle数据库的数据库版本后,指定适合的驱动,之后truncate目标端已经导入的表,重新进行表数据的迁移
报错信息如下:
任务名:从"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);
报错信息如下:
报错原因:
这一类问题常见于指定收集统计信息的列是大字段或者虚拟列
处理过程:
确认报错字段的定义类型是否为大字段或者虚拟列
文章
阅读量
获赞