第一种情况:
目标数据库中存在与导出用户的缺省表空间同名的表空间,此时,一定要将导入用户的 unlimited tablespace 权限 revoke 掉,否则,数据将全部被导入到那个同名的表空间中,而不是导入用户的缺省表空间中。
1、
从源数据库中导出数据
(1)
授予导出用户DBA权限
SQL> connect system@njgajhpt
Connected to Oracle9i Enterprise Edition Release 9.2.0.4.0
Connected as system
SQL> grant dba to sh;
Grant succeeded
SH的缺省表空间是EXAMPLE
SQL> select username,default_tablespace from dba_users
2 where username = 'SH';
USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
SH EXAMPLE
(2)、导出数据
C:Documents and Settingscuiqing>exp sh/sh@njgajhpt file='d:tempsh.dmp' tables=customers direct=y
Export: Release 9.2.0.1.0 - Production on
星期四
11
月
16 16:36:31 2006
即将导出指定的表通过直接路径
...
. .
正在导出表
CUSTOMERS 50000
行被导出
在没有警告的情况下成功终止导出。
2、
导入目标数据库
(1)
创建表空间
SQL> create tablespace ts_qcui
2 datafile 'D:ORACLEORADATAJWPTZJKts_qcui.ora'
3 size 20M autoextend on next 8M maxsize 1024M;
Tablespace created
(2)
创建用户
SQL> create user qcui identified by qcui
2 default tablespace ts_qcui;
User created
SQL> grant connect,resource to qcui;
Grant succeeded
(3)
导入数据
C:Documents and Settingscuiqing>imp qcui/qcui@jwptzjk fromuser=sh touser=qcui file='d:tempsh.dmp' constraints=n
Import: Release 9.2.0.1.0 - Production on
星期四
11
月
16 16:43:00 2006
经由直接路径导出由
EXPORT:V09.02.00
创建的导出文件
IMP-00013:
只有
DBA
才能导入由其它
DBA
导出的文件
IMP-00000:
未成功终止导入
(4)
授予导入用户DBA权限
SQL> grant dba to qcui;
Grant succeeded
(5)
授权后重新导入
C:Documents and Settingscuiqing>imp qcui/qcui@jwptzjk fromuser=sh touser=qcui file='d:tempsh.dmp' constraints=n
经由直接路径导出由
EXPORT:V09.02.00
创建的导出文件
警告
:
此对象由
SH
导出
,
而不是当前用户
. .
正在导入表
"CUSTOMERS" 50000
行被导入
成功终止导入,但出现警告。
(6)
检查数据存放的表空间。数据没有按预期存放在QCUI的缺省表空间TS_QCUI中
SQL> select table_name,tablespace_name from dba_tables
2 where owner = 'QCUI';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
CUSTOMERS EXAMPLE
(7)
回收QCUI的unlimited tablespace权限
SQL> revoke unlimited tablespace from qcui;
Revoke succeeded
SQL> alter user qcui quota unlimited on ts_qcui;
User altered
(8)
回收权限后重新导入
SQL> drop table qcui.customers;
Table dropped
C:Documents and Settingscuiqing>imp qcui/qcui@jwptzjk fromuser=sh touser=qcui file='d:tempsh.dmp' constraints=n
经由直接路径导出由
EXPORT:V09.02.00
创建的导出文件
警告
:
此对象由
SH
导出
,
而不是当前用户
. .
正在导入表
"CUSTOMERS" 50000
行被导入
成功终止导入,但出现警告。
(9)
检查数据存放的表空间。数据存放在QCUI的缺省表空间TS_QCUI中
SQL> select table_name,tablespace_name from dba_tables
2 where owner = 'QCUI';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
CUSTOMERS TS_QCUI
关于IMP由拥有DBA权限的用户EXP数据时,数据存放表空间的几种情况(IMP-00013) -2
第二种情况:
目标数据库中没有与导出用户的缺省表空间同名的表空间,这种情况下,并不需要将导入用户的 unlimited tablespace 权限 revoke 掉。
1、从源数据库中导出数据
(1)创建表空间
SQL> create tablespace ts_candy
2 datafile 'D:ORACLEORADATANJGAJHPTts_candy.ora'
3 size 20M autoextend on next 8M maxsize 1024M;
Tablespace created
(2)
创建用户,缺省表空间是 ts_candy
SQL> create user candy identified by candy
2 default tablespace ts_candy;
User created
SQL> grant dba to candy;
Grant succeeded
(3)
创建表
SQL> connect candy/candy@njgajhpt
SQL> create table candy_tables
2 as
3 select * from all_tables;
Table created
(4)
导出数据
C:Documents and Settingscuiqing>exp candy/candy@njgajhpt file='d:tempcandy.dmp' direct=y
即将导出指定的表通过直接路径
...
. .
正在导出表
CANDY_TABLES 991
行被导出
在没有警告的情况下成功终止导出。
2、
导入目标数据库
(1)
目标数据库中没有与 ts_candy同名的表空间
SQL> select tablespace_name from dba_tablespaces
2 where tablespace_name = 'TS_CANDY';
TABLESPACE_NAME
------------------------------
(2)
导入数据(导入用户qcui 已授予DBA权限,并且具有 unlimited tablespace权限)
SQL> select grantee,privilege from dba_sys_privs
2 where grantee = 'QCUI';
GRANTEE PRIVILEGE
------------------------------ ----------------------------------------
QCUI UNLIMITED TABLESPACE
C:Documents and Settingscuiqing>imp qcui/qcui@jwptzjk fromuser=candy touser=qcui file='d:tempcandy.dmp' constraints=n
经由直接路径导出由
EXPORT:V09.02.00
创建的导出文件
警告
:
此对象由
CANDY
导出
,
而不是当前用户
已经完成
ZHS16GBK
字符集和
AL16UTF16 NCHAR
字符集中的导入
. .
正在导入表
"CANDY_TABLES" 919
行被导入
成功终止导入,但出现警告。
(3) 检查数据存放的表空间。数据存放在QCUI的缺省表空间TS_QCUI中
SQL> select table_name,tablespace_name from dba_tables
2 where owner = 'QCUI';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
CUSTOMERS TS_QCUI
CANDY_TABLES TS_QCUI
小结:当拿到由拥有
DBA
权限的用户导出的数据时,最好问清楚其缺省表空间,如果目标数据库中存在与导出数据库同名的表空间时,这种情况需要特别注意。
我们往往在一看到“
IMP-00013:
只有
DBA
才能导入由其它
DBA
导出的文件”
这个错误信息后,就立刻给导入用户授予
DBA
权限,但却忽略了
DBA
的角色是拥有对数据库中所有表空间
unlimit
的权限,造成花费很长时间
import
结束后,却发现没有导入到预期的表空间中。
简而言之,如果有同名表空间存在的话,必须将导入用户的
unlimited tablespace
的权限
revoke
掉,否则数据将被直接存放到了那个同名表空间中,而不是导入用户缺省的表空间中;如果没有同名表空间,则无需进行
revoke
,
oracle
会自动将数据存放在导入用户的缺省表空间中。
最后一个需要注意的问题就是
DBA
授权问题,个人建议,一个数据库中除了
system
和
sys
用户以外,最好严格控制
DBA
权限的授予,尤其是不要随便赋予应用系统
schema的owner
以这个权限。目前国内的软件开发以及项目管理的能力还很薄弱,绝大多数项目中,不会设立专门的数据库管理角色,又为了图方便,往往赋予应用系统schema的owner以DBA权限,这样一来,在一个几十人或者上百人的团队中,其中任何一个开发人员或是运维人员一个随意的对
DB的
操作,对DB而言也许将
会是灾难性的。因此,当导入数据后,应及时
revoke
掉
DBA
权限。