测试数据库需要通过生产的数据库的数据导过来。但是用一般的导出命令:imp portal/portal file=/home/oracle/3-21.dmp full=y;
用上面的命令总是只能导出部分不为空的表,假如表为空的话,导不出来了,我查了一下,这是ORacle11G的一个bug,需要修改一点配置,才行。
但是修改配置涉及到了生产数据库的修改,这在客户这边是不允许了。后来想了个其他的办法,就是用数据泵的方式也就是用expdp来导出数据,这样就全部导出了。
使用导出泵的方法为:
先明确要把导出的dmp文件放到哪个目录下面比如我们要放到'/home/oracle'底下,那么我们要先建立direction='/home/oracle'
建完之后再执行:
然后再输入
expdp 用户名/密码@IP:端口/实例名 directory=portal_dir tablespaces=portal dumpfile=dp_3-31.dmp logfile=dp_log3-31.log;
即可。
步骤为:
sqlplus /nolog;
conn sys/sys as sysdba;
create or replace directory portal_dir as '/home/oracle';
grant all on directory portal_dir to portal;
exit退出sqlplus
然后执行:
export ORACLE_SID=beeportal;
expdp directory=portal_dir dumpfile=dp_3-31.dmp logfile=dp_log3-31.log;
上面的字符串是我经过了大量的测试之后得到了,第一句的意思是找到beeporal的实例,假如你不知道机器上的实例你可以用:
lsnrctl status 来看一下有没有 要导出的实例名。可能执行完了之后会出现错误:
错误 1、ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
显示字符串的链接出错了,解决方式为:
export ORACLE_SID=beeportal;
expdp directory=portal_dir dumpfile=dp_3-31.dmp logfile=dp_log3-31.log;
把实例名和ip端口全部去掉。就可以了。
错误2、视图和序列倒不出来
开始的时候我在网上查的时候用的命令是:
expdp tablespace=portal
directory=test_dir dumpfile=test_3-31.dmp logfile=test_log3-31.log;
我把tablespace定为:portal,这样只导出了tablespace=portal的数据,视图和序列都没有导出,于是我把tablespace=portal去掉,问题解决。
expdp directory=portal_dir dumpfile=dp_3-31.dmp logfile=dp_log3-31.log;
======================================================================================================
上面写的是用数据泵导出数据,现在再看一下用数据泵导入数据。
为了保证导入数据的完整性。应为:先把表空间和portal用户删掉(假如你知道表空间使用的物理硬盘上的dbf文件,最好也删掉),在建立表空间和poral然后再导入表。
方法为:
sqlplus /nolog;
conn sys/sys as sysdba;
drop tablespace portal including contents cascade constraints;
(
找到物理的表空间的存储地址:dbf文件删掉,到不到也可不删除,不过这要造成浪费磁盘的空间)
drop user portal cascade;
create tablespace portal datafile '/u01/app/oracle/product/oracle/dbs/portal2012-3-31.dbf' size 500m autoextend on maxsize unlimited;
create user portal identified by portal default tablespace portal temporary tablespace temp;
grant connect,resource,exp_full_database,imp_full_database to portal;
然后退出sqplus
执行导入命令:
impdp portal/portal directory=portal_dir dumpfile=dp_3-31..dmp;
我说一下命令:
drop tablespace portal including contents cascade constraints;(表示删除表空间。—)
drop user portal cascade;(删除用户)
create tablespace portal datafile '/u01/app/oracle/product/oracle/dbs/portal2012-3-31.dbf' size 500m autoextend on maxsize unlimited;(创建表空间)
create user portal identified by portal default tablespace portal temporary tablespace temp;(创建用户)
grant connect,resource,exp_full_database,imp_full_database to portal;(给用户赋上导入导出数据的权限)。
当然,在执行这些命令的时候不可能一直顺利的,可能出现的问题:
问题1、应为先执行:drop tablespace portal including contents cascade constraints;再找到物理磁盘dbf文件删除。假如顺序乱了。先删了物理磁盘dbf文件,这时候再执行drop tablespace portal including contents cascade constraints时候会报错。
解决方法为:先查一下要删除的tablespace依赖的dbf文件,然后将文件挂起,然后再删除。
select tablespace_name from sys.dba_tablespaces
alter database datafile '/u01/app/oracle/product/oracle/dbs/portal.dbf' offline drop;
drop tablespace portal including contents cascade constraints;
问题2、删除用户时显示:用户正在连接无法删除。
解决方式为:
进入sqlplus /nolog; conn sys/sys as sysdba;
select name,user# from user$;
找到要删除的portal 的ID=129
UPDATE USER$ SET NAME='portaldelete' WHERE USER#=129;
commit;
改完之后在把数据库停一下在启动:
ALTER SYSTEM FLUSH SHARED_POOL;
shutdown immediate;
startup;
这样就可以建立新的用户portal了。
文章出处:http://hi.baidu.com/yfqsdie/item/f123cfbecdfa86f463388e22