zoukankan      html  css  js  c++  java
  • IMP不到指定的表空间

    ==============================================================================
    只导dmp文件中的几个表数据,解决导入时tablespace
    doesnot exist
    imp SYSTEM/SYSTEM@TESTA file=D:TEST.dmp
    fromuser=TEST
    touser=NEWTEST
    TABLES=(TABLE1,TABLE2,TABLE3)
    buffer=100000000
    ignore=y;

    ==============================================================================
    关于IMP由有DBA权限的用户EXP数据时,数据存放表空间的几种情况(IMP-00013)

    ORACLE公司培训BIEE,带了一个DEMO的DMP文件,其导出用户DBO具有DBA权限,缺省表空间是USERS。
    做导入时,另外创建了一个用户BIEE,其缺省表空间是TS_BIEE
    ,授予DBA权限。
    结果数据没有按预期导入到表空间TS_BIEE中,而是导入到了表空间USERS中。
    因为忘了revoke unlimited
    tablespace 的权限造成的。


    由拥有DBA权限的用户EXP的数据时,IMP数据存放表空间有两种情况:以下测试数据库均为
    ORACLE 9.2.0.4
    ?
    第一种情况:
    目标数据库中存在与导出用户的缺省表空间同名的表空间。此时,一定要将导入用户的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

    第二种情况:
    目标数据库中没有与导出用户的缺省表空间同名的表空间,这种情况下,并不需要将导入用户的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 权限。

  • 相关阅读:
    VBA基础四:数据库链接(WPS2019)
    VBA基础三:循环(DO...LOOP,)
    随机多人红包
    概率抽奖
    七步轻松实现大数据库表的数据转储
    SQL Server中的行列倒置技巧
    把对应表的字段跨表赋值
    sql内日期格式化输出
    事务的用法
    女孩,你为什么不沉住气奋斗
  • 原文地址:https://www.cnblogs.com/Struts-pring/p/4039936.html
Copyright © 2011-2022 走看看