提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、本地环境
- 二、还原ora.dmp
- 三、检查环境
- 四、数据迁移
- 总结
前言
DTS是达梦数据库的数据迁移工具,是一个可以兼容主流大型关系型数据库的图形化引导式数据迁移工具。
本文主要是简单记录自己还原ora.dmp文件到oracle数据库,将oracle11g数据库数据迁移到dm7的迁移过程。
一、本地环境
- 主机:Windows
- 迁移前数据库:Oracle11g
- 迁移后数据库:DM7
- 使用工具:达梦数据迁移工具
二、还原ora.dmp
- CMD登录sqlplus
sqlplus / as sysdba
最好事先检查例程状态(open)。
select status from v$instance;
检查当前容器位置(PDB/CDB)12c后出现,11g无需检查。
select sys_context ('USERENV', 'CON_NAME') from dual;
- 通过sql,查询数据库表空间存放位置
select file_name from dba_data_files;
- 创建数据库临时表空间;(注意空格符,autoextend和extent)
SQL> create temporary tablespace oradmtmp
2 tempfile 'F:\APP\LENOVO\ORADATA\ORCL11G\file_oradmtmp.dbf'
3 size 50m
4 autoextend on next 50m maxsize 2048m extent management local;
- 创建数据表空间;(注意空格符)
SQL> create tablespace oradm
2 datafile 'F:\APP\LENOVO\ORADATA\ORCL11G\data_oradm.dbf'
3 size 50m
4 autoextend on next 50m maxsize 2048m extent management local;
- 创建用户名指定表空间和临时表空间
SQL> create user oradm identified by oradm default tablespace oradm temporary tablespace oradmtmp;
- 为用户分配权限
SQL> grant connect,resource,dba to oradm;
- 使用exit命令退出sqlplus
- 导入数据库(cmd执行)第一种
imp oradm/oradm file= F:\app\ora.dmp full=y ignore=y
(感谢我的同事的提醒)
此处遇到 表或视图不存在 的报错问题,只需要在导入前创建模式用户oais即可完美解决。
原版出现表名大小写问题,模式名错误。
sqlplus oradm/oradm@localhost/ORCL11G
CREATE OR REPLACE TRIGGER "ORADM".ES_OA_FIELD_ON_DELETE after delete
on "ORADM".ES_OA_FIELD for each row
begin
delete from ES_OA_FIELD_EXTEND where src_zj=:old.zj;
delete from ES_OA_FIELD_CONDTION Where src_key=:old.zj;
delete from ES_OA_FIELD_FUNC Where src_zj=:old.zj;
delete from ES_OA_FIELD_FUNC_SUB Where src_key=:old.zj;
end;
/
imp oradm/oradm@orcl file= F:\app\ora.dmp full=y ignore=y
注意出现错误时
IMP-00058:遇到ORACLE错误12154
ORA-12154:TNS:无法解析指定的连接标识符
IMP-00000:导入终止失败
换成下面语句 去掉实例
imp oradm/oradm file=F:\app\ora.dmp full=y ignore=y
报错信息:ORA-02180:无效的CREATE TABLESPACE选项
报错原因:语法错误,因为把extent写成extend。
解决办法:改成extent。
因为一开始用的oracle19c版本做的实验,所以出现了PDB概念,oracle11g是还没有出现的,此处可略过。
报错信息:ORA-65096:公用用户名或角色名无效
报错原因:因为当前所处容器位置在CDB。在CDB中创建用户必须在用户名的前面添加C#或者C##。切换当前容器到指定的PDB容器中,创建用户可以看到是不需要添加C##就可以直接创建成功了,其实PDB就相当于普通的数据库实例。在当前PDB中不仅存在刚才在PDB中创建的普通用户,而且在CDB创建的用户也是同时存在的。
解决办法:
oracle报ORA-65096: 公用用户名或角色名无效-百度经验 (baidu.com)
1.查看当前所处容器位置
SQL> select sys_context ('USERENV', 'CON_NAME') from dual;
在CDB中创建用户必须在用户名的前面添加C#或者C##。
如:create user C##test identified by test;
2.查看其他容器
SQL> select name,open_mode from v$pdbs;
3.切换到指定的PDB容器中
SQL> alter session set container=ORCLPDB;
4.创建用户。在PDB中创建用户无需添加前缀。
报错信息:ORA-01109:数据库未打开
报错原因:因为目前数据库是MOUNTED装载状态。
解决办法:
SQL> conn / as sysdba #连接
SQL> select status from vKaTeX parse error: Expected 'EOF', got '#' at position 16: instance; #̲查看例程状态 SQL> shu…instance; #查看状态,STARTED建表会报错ORA-01109
SQL> alter database mount;
SQL> alter database open;
报错信息:ORA-01109:???
报错原因:目前数据库例程是STARTED状态,无法建表
解决办法:改成mount状态,再改成open状态,再建表。
报错信息:SP2-0734
报错原因:imp命令是oracle提供的一个工具,而非oracle sql 语句,此工具在oracle安装路径BIN目录下:
解决办法:使用exit命令退出oracle,然后再使用imp命令执行导入操作
三、检查环境
1.查看oracle数据库参数
2.查看dm7数据库参数
--select PARA_NAME,PARA_VALUE from v$dm_ini;
--初始化参数如下,在初始化数据库实例后无法修改
select '实例名称' 数据库选项,INSTANCE_NAME 数据库集群相关参数值 from v$instance
UNION ALL select '数据库版本',substr(svr_version,instr(svr_version,'V')) FROM v$instance
UNION ALL select '字符集',CASE SF_GET_UNICODE_FLAG() WHEN '0' THEN 'GBK18030' WHEN '1' then 'UTF-8' when '2' then 'EUC-KR' end
UNION ALL select '页大小',cast(PAGE()/1024 as varchar)
UNION ALL select '簇大小',cast(SF_GET_EXTENT_SIZE() as varchar)
UNION ALL select '大小写敏感',cast(SF_GET_CASE_SENSITIVE_FLAG() as varchar)
UNION ALL select '空格填充模式',cast(BLANK_PAD_MODE() as varchar);
--查看与oracle兼容参数调整
select para_name,para_value from v$dm_ini
where para_name = 'PK_WITH_CLUSTER' OR para_name = 'ORDER_BY_NULLS_FLAG'
OR para_name = 'CALC_AS_DECIMAL' OR para_name = 'COMPATIBLE_MODE';
![在这里插入图片描述](https://img-blog.csdnimg.cn/a8dd7dee517145cba136cba47a3f0cc5.png)
–兼容参数调整,设置完后重启数据库服务才能生效
SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE',2);
SP_SET_PARA_VALUE(2,'CALC_AS_DECIMAL',1);
SP_SET_PARA_VALUE(2,'ORDER_BY_NULLS_FLAG',1);
SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER',0);
–统计oracle数据库模式、表、视图、序列、索引、触发器、存储过程的数量。
select name from v$database;
SELECT OWNER,OBJECT_TYPE,COUNT(*) FROM ALL_OBJECTS WHERE OWNER='ORADM' GROUP BY OWNER,OBJECT_TYPE ORDER BY OWNER;
select ‘表’ 名称,count() 数量 from user_tables union all
select ‘视图’,count() from user_views union all
select ‘索引’,count() from user_constraints union all
select ‘序列’,count() from user_sequences union all
select ‘触发器’,count() from user_triggers union all
select ‘存储过程’,count() from user_procedures;
四、数据迁移
1.打开DM数据迁移工具,选择新建工程
2.点击工程名,右键点击迁移,选择新建迁移,填写迁移名即可。
3.双击迁移名称ora11g-dm7,点击下一步。
- 选择迁移方式OracleDM7,点击下一步。
5.输入ORACLE数据库信息,端口号默认为1521,服务名默认为ORCL。(这里是因为本机已经存在oracle其他版本,oracle11g版本是后来才下载的,因此更改了端口号和服务名),用户名及口令注意大小写,若报错,可以返回sqlplus新建。
6.输入达梦数据库信息,端口号默认为5236。(这里是因为最开始下载了DM8占用了5236端口号,因此将DM7的端口号改为5246。)点击下一步。
7.选择迁移对象。
8.选择迁移对象。可以填写区间再点选择。多出的文件可不选。
9.审阅迁移任务
10.完成迁移向导
11.出现迁移错误,修改代码错误。
12.重新迁移对象
存储过程DELETEBUSINESS报错原因是将变量名称写为专有名词identity,改成identity1则不报错了。
存储过程CREATES的报错原因也是如上,将stat改成stat1即可。
select owner,object_type,count(*) from dba_objects group by object_type,owner having owner='ORADM';
结论:数据迁移的对象统计数据前后不一致,还需要重新再查看两边多出和缺少的对象,再重新进行数据迁移。
总结
本文主要介绍了ora.dmp文件还原到oracle11g,通过达梦数据库的数据迁移工具,将oracle11g里的数据迁移到DM7数据库的流程,结果只能算是成功了一半。但是在这个过程中也学到了许多报错的千奇百怪的问题)。
如果文中有误,欢迎指出,大家共同交流进步!