38

我想将 oracle 转储导入不同的表空间。

我有一个用户 A 使用的表空间 A。我已经撤销了该用户的 DBA 并给了他授权连接和资源。然后我用命令转储了所有东西

exp a/*** 所有者=a 文件=oracledump.DMP 日志=log.log 压缩=y

现在我想将转储导入用户 B 使用的表空间 B。所以我给了他连接和资源的授权(没有 DBA)。然后我执行了以下导入:

imp b/*** 文件=oracledump.DMP 日志=import.log fromuser=a touser=b

结果是一个有很多错误的日志:

IMP-00017:以下语句失败并出现 ORACLE 错误 20001:“BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003:遇到 ORACLE 错误 20001 ORA-20001:输入值无效或不一致

之后,我尝试了相同的导入命令,但使用了选项 statistics=none。这导致了以下错误:

ORA-00959: 表空间 'A_TBLSPACE' 不存在

这应该怎么做?

注意:很多列都是 CLOB 类型的。看起来问题与此有关。

注意 2:oracle 版本是 9.2、10.1 和 10.1 XE 的混合版本。但我认为这与版本无关。

4

10 回答 10

34

你这里有几个问题。

首先,您使用的不同版本的 Oracle 是导致表统计错误的原因 - 当我们的一些 Oracle 10g 数据库升级到第 2 版时,我遇到了同样的问题,有些还在第 1 版上,我正在交换。它们之间的 DMP 文件。

对我有用的解决方案是使用相同版本的expimp工具在不同的数据库实例上进行导出和导入。通过使用同一台 PC(或 Oracle 服务器)发出所有导出和导入命令,这是最容易做到的。

其次,我怀疑您ORA-00959: tablespace 'A_TBLSPACE' does not exist正在尝试将 .DMP 文件从成熟的 Oracle 数据库导入到 10g 快捷版 (XE) 数据库中,该数据库默认情况下会创建一个USERS名为你。

如果是这种情况,那么您需要执行以下操作..

  1. 使用您的 .DMP 文件,创建一个包含结构(表)的 SQL 文件:

    imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y

  2. 在可以查找和替换整个文件的文本编辑器中打开索引文件 (index.sql),然后按顺序发出以下查找和替换语句(忽略单引号..'):

    Find: 'REM<space>' Replace: <nothing>

    Find: '"<source_tablespace>"' Replace: '"USERS"'

    Find: '...' Replace: 'REM ...'

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. 保存索引文件,然后针对您的 Oracle Express Edition 帐户运行它(我发现最好创建一个新的空白 XE 用户帐户 - 如果我正在刷新,则删除并重新创建):

    sqlplus <xe_username>/<password>@XE @index.sql

  4. 最后,针对同一帐户运行您创建索引文件的相同 .DMP 文件,以导入数据、存储过程、视图等:

    imp <xe_username>/<password>@XE file=<filename.dmp> fromuser=<original_username> touser=<xe_username> ignore=y

当您尝试创建某些对象(例如数据库作业)时,您可能会收到几页 Oracle 错误,因为 Oracle 将尝试使用相同的数据库标识符,当您使用不同的数据库时,这很可能会失败。

于 2008-09-16T12:47:33.950 回答
16

如果您使用的是 Oracle 10g 和数据泵,则可以使用 REMAP_TABLESPACE 子句。例子:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
于 2008-09-15T15:15:42.543 回答
6

对我来说,这项工作没问题(Oracle 数据库 10g 快捷版 10.2.0.1.0 版):

impdp B/B full=Y dumpfile=DUMP.dmp REMAP_TABLESPACE=OLD_TABLESPACE:USERS

但是对于新的还原,您需要新的表空间

PS也许有用http://www.oracle-base.com/articles/10g/OracleDataPump10g.php

于 2010-07-20T11:05:33.240 回答
3

您使用的是什么版本的 Oracle?如果它是 10g 或更大,您应该考虑使用数据泵而不是导入/导出。我不是 100% 确定它是否可以处理这种情况,但我希望它可以。

Data Pump是 10g 及以上的 exp/imp 的替代品。它的工作方式与 exp/imp 非常相似,除了它(据说,我不使用它,因为我被困在 9i 土地上)更好。

这是数据泵文档

于 2008-09-15T13:36:29.287 回答
2

问题与 CLOB 列有关。似乎 imp 工具无法重写 create 语句以使用另一个表空间。

来源:http ://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:66890284723848

解决方案是:在正确的表空间中手动创建模式。如果您没有创建架构的脚本,您可以使用 imp 工具的 indexfile= 创建它。

您必须自己禁用所有约束,oracle imp 工具不会禁用它们。

之后,您可以使用以下命令导入数据:

imp b/*** 文件=oracledump.dmp 日志=import.log fromuser=a touser=b 统计=none 忽略=y

注意:由于其他错误,我仍然需要统计信息=无。

有关数据泵的额外信息

从 Oracle 10 开始,导入/导出得到了改进:数据泵工具 ([ http://www.oracle-base.com/articles/10g/OracleDataPump10g.php][1] )

使用它将数据重新导入新表空间:

  1. 首先为临时转储创建一个目录:

    创建或替换目录 tempdump 为 '/temp/tempdump/';
    将目录临时转储授予读取、写入到 a;

  2. 出口:

    expdp a/* schemas=a 目录=tempdump dumpfile=adump.dmp logfile=adump.log

  3. 进口:

    impdp b/* 目录=tempdump 转储文件=adump.dmp 日志文件=bdump.log REMAP_SCHEMA=a:b

注意:转储文件是从服务器磁盘存储和读取的,而不是从本地(客户端)磁盘

于 2008-09-15T09:53:47.840 回答
2

我的解决方案是使用 GSAR 实用程序替换 DUMP 文件中的表空间名称。当您执行 replce 时,请确保通过添加空格来保持转储文件的大小不变。例如

gsar -f -s"TSDAT_OV101" -r"USERS      " rm_schema.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ ENABLE STORAGE IN ROW CHUNK 8192 RETENTION" -r"                                                                   " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ LOGGING" -r"                                  " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ " -r"                             " rm_schema.n.dump rm_schema.n1.dump
于 2012-03-08T14:53:35.277 回答
2

我想为不同服务器(数据库)上不同表空间中的两个用户改进

1.首先为两台服务器(数据库)的临时转储创建一个目录:

服务器#1:

CREATE OR REPLACE DIRECTORY tempdump AS '/temp/old_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO old_user;

服务器#2:

CREATE OR REPLACE DIRECTORY tempdump AS '/temp/new_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO new_user;

2. 导出(服务器 #1):

expdp tables=old_user.table directory=tempdump dumpfile=adump.dmp logfile=adump.log

3. 导入(服务器#2):

impdp directory=tempdump dumpfile=adump_table.dmp logfile=bdump_table.log
REMAP_TABLESPACE=old_tablespace:new_tablespace REMAP_SCHEMA=old_user:new_user
于 2012-11-22T14:28:48.963 回答
1

答案很困难,但可行:

情况是:用户A和表空间X

  1. 将您的转储文件导入不同的数据库(仅当您需要保留原始文件的副本时才需要这样做)
  2. 重命名表空间

    将表空间X重命名为Y

  3. 为 expdp 命令创建目录 en 授予权限

  4. 使用 expdp 创建转储
  5. 删除旧用户和旧表空间 ( Y )
  6. 创建新表空间 ( Y )
  7. 创建新用户(使用新名称) - 在本例中为B - 并授予权限(也授予使用第 3 步创建的目录)
  8. 使用 impdp 导入转储

    impdp B/B 目录=DIR 转储文件=DUMPFILE.dmp 日志文件=LOGFILE.log REMAP_SCHEMA= A : B

就是这样……

于 2009-06-03T13:07:09.353 回答
0

因为我想对imp(到 Oracle 12.1|2)一个exp从本地开发数据库(18c xe)中提取的转储进行 ort,并且我知道我的所有目标数据库都将有一个名为 的可访问表空间DATABASE_TABLESPACE,所以我刚刚创建了我的模式/用户使用该名称的新表空间而不是默认表空间USERS(我无法访问目标数据库):

-- don't care about the details
CREATE TABLESPACE DATABASE_TABLESPACE
  DATAFILE 'DATABASE_TABLESPACE.dat' 
    SIZE 10M
    REUSE
    AUTOEXTEND ON NEXT 10M MAXSIZE 200M;

ALTER DATABASE DEFAULT TABLESPACE DATABASE_TABLESPACE;

CREATE USER username
  IDENTIFIED BY userpassword
  CONTAINER=all;

GRANT create session TO username;
GRANT create table TO username;
GRANT create view TO username;
GRANT create any trigger TO username;
GRANT create any procedure TO username;
GRANT create sequence TO username;
GRANT create synonym TO username;
GRANT create synonym TO username;
GRANT UNLIMITED TABLESPACE TO username;

exp由此创建的一个让imp我的目标感到高兴。

于 2019-02-01T18:07:46.937 回答
-2

---创建新表空间:

CREATE TABLESPACE TABLESPACENAME DATAFILE 'D:\ORACL\ORADATA\XE\TABLESPACEFILENAME.DBF' SIZE 350M AUTOEXTEND ON NEXT 2500M MAXSIZE UNLIMITED LOGGING PERMANENT EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT MANUAL FLASHBACK ON;

---然后使用以下命令导入

CREATE USER BVUSER IDENTIFIED by VALUES 'bvuser' DEFAULT TABLESPACE TABLESPACENAME

-- 其中 D:\ORACL 是 oracle 安装路径

于 2013-11-18T20:36:40.790 回答