oracle还原数据库dmp
最近学习还原oracle数据库,在网上查了很多教程,有的很简单,比如使用一条imp命令imp user/pass@orcl full=y file=e:/xxx.dmp ignore=y log=e:/log.txt,但是我实际还原的时候却并非这么简单;
首先了解一下数据库备份和还原命令
EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用。IMP只适用于EXP导出的文件,不适用于EXPDP导出文件;IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件。
注意:EXP不会导出空表(可能会对存储过程有影响)
原文链接:https://blog.csdn.net/whxlovexue/article/details/82378389
了解了备份和还原命令后,我们应该可以看出可能更多的人更愿意使用expdp命令进行备份,我在最近一次还原数据库的时候就遇到的是使用expdp命令进行备份的文件,当我使用imp命令还原的时候就报错了
(*错误信息:
IMP-00038: Could not convert to environment character set’s handle
IMP-00000: Import terminated unsuccessfully*)
于是我参考这个链接的文章(https://www.cnblogs.com/wangsaiming/p/4947151.html)使用impdp命令(impdp user1/user1@orcl dumpfile=GCL.dmp directory=dpdata1 logfile = gclImpdp20191017.log FULL=y),然而还是有很多错误,因为数据库中包含表空间tablespace、角色role、用户user,在还原数据库的时候impdp会帮创建user,但是表空间和角色需要自己手工创建,但是你未必知道或记得该数据库的表空间名和角色名,可以先执行命令,然后根据报错提示信息再进行对表空间和角色的创建。
实际操作步骤如下:
1.创建目录
sqlplus中执行:create directory dpdata1 as 'D:\Oracle\database';
2.在cmd中执行impdp命令: impdp user1/user1@orcl dumpfile=GCL.dmp directory=dpdata1 logfile = gclImpdp20191017.log FULL=y
其中需要先把dumpfile文件即dmp备份文件放在directory目录下,也就是D:\Oracle\database\目录下,logfile是自动生成的,这里只需要指
定文件名,@orcl中@后面是实例名,安装oracle时默认的是orcl,如果是默认的实例名@orcl可省略不写;
3.创建表空间
在第2步执行后查看logfile文件中报错信息,可以看到错误提示某user创建失败,原因是表空间‘xxx’不存在,这时我们就知道需要创建哪些
名称的表空间了,但是不需要创建user,如果是报错user已存在,需要先将该user删除掉;
删除user的sql语句(在sql plus中执行): drop user user1 cascade;
创建表空间的sql语句(在sql plus中执行):
create tablespace tbspace1 datafile 'D:\Oracle\Database\tbspace1.dbf' size 100M
AUTOEXTEND ON NEXT 100M
MAXSIZE UNLIMITED
LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
如果是创建临时表空间:
create temporary tablespace tempspace1 tempfile 'D:\Oracle\Database\tempspace1.dbf' size 100M
AUTOEXTEND ON NEXT 100M
MAXSIZE UNLIMITED ;
创建表空间的参考链接:https://jingyan.baidu.com/article/e6c8503c4b8881e54f1a188b.html ,在执行impdp缺少临时表空间时报错信息
依然提示的找不到表空间,不会特意提示缺少的是临时表空间,但是可以从出错的sql语句上看出来,sql中会有temporary的语法;
4.创建role
在上一步创建了表空间之后重新执行impdp命令,发现遇到角色不存错的错误,然后我们直接创建该角色就可以了
创建role语句(在sql plus中执行):create role myrole;
5.最后再重新执行impdp命令;
注意:以上操作过程可以需要反复多次,因为在恢复库的时候表空间不存在有时候不是一次性报出来的,所以以上备注在sqlplus中执行的sql语句建议使用navicat或pl/sql工具将语句预先写好,便于多次使用。在每次重新执行impdp的时候可能需要将上一次创建的user、表空间删除掉,所以你可能还会用到以下语句:
--查看用户的连接状态
select username,sid,serial# from v$session;
--kill方法1
--找到要删除用户的sid和serial并杀死;实际上不是真正的杀死会话,它只是将会话标记为终止。等待PMON进程来清除会话。
--可以使用ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE 来快速回滚事物、释放会话的相关锁、立即返回当前会话的控制权
alter system kill session'sid,serial#';
--kill方法2
--ALTER SYSTEM DISCONNECT SESSION 杀掉专用服务器(DEDICATED SERVER)或共享服务器的连接会话,它等价于从操作系统杀掉进程。
--它有两个选项POST_TRANSACTION和IMMEDIATE, 其中POST_TRANSACTION表示等待事务完成后断开会话,IMMEDIATE表示中断会话,立即回滚事务。
ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION;
ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;
--删除用户(当前面impdp有部分执行成功,创建的用户可能已经在使用链接导致无法删除当前用户,则需要执行上面的杀掉用户进程的语句,建议使用kill方法2,因为第一种杀掉进程之后可能还要等很久)
drop user sajet cascade;
--删除表空间
drop tablespace tbspace1 including contents and datafiles;
--创建表空间(一定要设置为自增长autoextend on和最大大小无上限maxsize unlimited,除非你能判断文件不会超过你设定的大小,否则在恢复的时候还是会报错ORA-01659: 无法分配超出 n 的 MINEXTENTS )
create tablespace tbspace1 datafile 'd:\oracle\database\tbspace1.dbf' size 100M autoextend on next 100M maxsize unlimited
logging extent management local segment space management auto;
6.在impdp的过程中可能还会遇到job号重复的问题,报错提示如下:
ORA-39083: Object type JOB failed to create with error:
ORA-00001: unique constraint (SYS.I_JOB_JOB) violated
解决方案参考链接:http://www.oracleplus.net/arch/302.html ,或者自行百度,因为我报错sql提示的似乎不全,似乎不能以此方法解决问题,更奇怪的是我发现自己并未有重复的job号,提示的job号是3,我查看恢复后的job里面未发现有job=3的。


因为这个job可能是用不到所以我也没有去解决该问题,如果有哪位高手有更好的解决方法还请赐教;我还原的数据库包含多个用户,我怀疑job号重复的可能并非我登陆的这个用户,或是谁知道其中原有还请指点一二!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)