如何在不同的表空间中导入 Oracle 转储

发布于 2024-07-05 17:03:37 字数 790 浏览 10 评论 0原文

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

我有一个由用户 A 使用的表空间 A。我已撤销该用户的 DBA 权限并授予他连接和资源权限。 然后我用命令转储了所有内容

exp a/*** 所有者=a file=oracledump.DMP log=log.log compress=y

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

imp b/*** file=oracledump.DMP log=import.log fromuser=a touser=b

结果是包含大量错误的日志:

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

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

ORA-00959: 表空间“A_TBLSPACE”不存在

应如何完成此操作?

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

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

I want to import an oracle dump into a different tablespace.

I have a tablespace A used by User A. I've revoked DBA on this user and given him the grants connect and resource. Then I've dumped everything with the command

exp a/*** owner=a file=oracledump.DMP log=log.log compress=y

Now I want to import the dump into the tablespace B used by User B. So I've given him the grants on connect and resource (no DBA). Then I've executed the following import:

imp b/*** file=oracledump.DMP log=import.log fromuser=a touser=b

The result is a log with lots of errors:

IMP-00017: following statement failed with ORACLE error 20001: "BEGIN DBMS_STATS.SET_TABLE_STATS
IMP-00003: ORACLE error 20001 encountered
ORA-20001: Invalid or inconsistent input values

After that, I've tried the same import command but with the option statistics=none. This resulted in the following errors:

ORA-00959: tablespace 'A_TBLSPACE' does not exist

How should this be done?

Note: a lot of columns are of type CLOB. It looks like the problems have something to do with that.

Note2: The oracle versions are a mixture of 9.2, 10.1, and 10.1 XE. But I don't think it has to do with versions.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

时光磨忆 2024-07-12 17:03:37

你这里有几个问题。

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

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

其次,我怀疑您收到ORA-00959:表空间'A_TBLSPACE'不存在,因为您正在尝试从成熟的数据库导入.DMP文件Oracle 数据库集成到 10g Express Edition (XE) 数据库中,默认情况下,该数据库会为您创建一个名为 USERS 的预定义表空间。

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

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

    imp/<密码>@XE file=<文件名.dmp>; indexfile=index.sql full=y

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

    查找:'REM<空格>' 替换:<无>

    查找:'""' 替换:'"USERS"'

    查找:'...' 替换:'REM ...'

    查找:'CONNECT' 替换:'REM CONNECT'

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

    sqlplus/@XE @index.sql

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

    imp/<密码>@XE file=<文件名.dmp>; fromuser=<原始用户名>; touser=; ignore=y

时,您可能会收到 Oracle 错误页面,因为 Oracle 将尝试使用相同的数据库标识符,这很可能会失败,因为您位于不同的数据库上。

You've got a couple of issues here.

Firstly, the different versions of Oracle you're using is the reason for the table statistics error - I had the same issue when some of our Oracle 10g Databases got upgraded to Release 2, and some were still on Release 1 and I was swapping .DMP files between them.

The solution that worked for me was to use the same version of exp and imp tools to do the exporting and importing on the different Database instances. This was easiest to do by using the same PC (or Oracle Server) to issue all of the exporting and importing commands.

Secondly, I suspect you're getting the ORA-00959: tablespace 'A_TBLSPACE' does not exist because you're trying to import a .DMP file from a full-blown Oracle Database into the 10g Express Edition (XE) Database, which, by default, creates a single, predefined tablespace called USERS for you.

If that's the case, then you'll need to do the following..

  1. With your .DMP file, create a SQL file containing the structure (Tables):

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

  2. Open the indexfile (index.sql) in a text editor that can do find and replace over an entire file, and issue the following find and replace statements IN ORDER (ignore the single quotes.. '):

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

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

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

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Save the indexfile, then run it against your Oracle Express Edition account (I find it's best to create a new, blank XE user account - or drop and recreate if I'm refreshing):

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

  4. Finally run the same .DMP file you created the indexfile with against the same account to import the data, stored procedures, views etc:

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

You may get pages of Oracle errors when trying to create certain objects such as Database Jobs as Oracle will try to use the same Database Identifier, which will most likely fail as you're on a different Database.

戴着白色围巾的女孩 2024-07-12 17:03:37

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

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE

If you're using Oracle 10g and datapump, you can use the REMAP_TABLESPACE clause. example:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
温柔戏命师 2024-07-12 17:03:37

对我来说,这个工作正常(Oracle Database 10g Express Edition Release 10.2.0.1.0):

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

但是对于新的恢复,您需要新的表

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

For me this work ok (Oracle Database 10g Express Edition Release 10.2.0.1.0):

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

But for new restore you need new tablespace

P.S. Maybe useful http://www.oracle-base.com/articles/10g/OracleDataPump10g.php

风筝在阴天搁浅。 2024-07-12 17:03:37

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

Data Pump 是 10g 和 exp/imp 的替代品多于。 它的工作原理与 exp/imp 非常相似,除了它(据说,我不使用它,因为我陷入了 9i 的土地)更好。

这里是数据泵文档

What version of Oracle are you using? If its 10g or greater, you should look at using Data Pump instead of import/export anyway. I'm not 100% sure if it can handle this scenario, but I would expect it could.

Data Pump is the replacement for exp/imp for 10g and above. It works very similar to exp/imp, except its (supposedly, I don't use it since I'm stuck in 9i land) better.

Here is the Data Pump docs

追风人 2024-07-12 17:03:37

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

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

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

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

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

imp b/*** file=oracledump.dmp log=import.log fromuser=a touser=b stats=noneignore=y

注意:由于其他错误,我仍然需要statistics=none。

有关数据泵的额外信息

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

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

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

    <块引用>

    创建或替换目录临时转储为“/temp/tempdump/”;
    授予对目录临时转储的读、写权限;

  2. 导出:

    <块引用>

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

    导出

  3. 导入:

    <块引用>

    impdp b/* 目录=tempdump dumpfile=adump.dmp logfile=bdump.log REMAP_SCHEMA=a:b

    导入

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

The problem has to do with the CLOB columns. It seems that the imp tool cannot rewrite the create statement to use another tablespace.

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

The solution is:
Create the schema by hand in the correct tablespace. If you do not have a script to create the schema, you can create it by using the indexfile= of the imp tool.

You do have to disable all constraints your self, the oracle imp tool will not disable them.

After that you can import the data with the following command:

imp b/*** file=oracledump.dmp log=import.log fromuser=a touser=b statistics=none ignore=y

Note: I still needed the statistics=none due to other errors.

extra info about the data pump

As of Oracle 10 the import/export is improved: the data pump tool ([http://www.oracle-base.com/articles/10g/OracleDataPump10g.php][1])

Using this to re-import the data into a new tablespace:

  1. First create a directory for the temporary dump:

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

  2. Export:

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

  3. Import:

    impdp b/* directory=tempdump dumpfile=adump.dmp logfile=bdump.log REMAP_SCHEMA=a:b

Note: the dump files are stored and read from the server disk, not from the local (client) disk

坏尐絯 2024-07-12 17:03:37

我的解决方案是使用 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

my solution is to use GSAR utility to replace tablespace name in the DUMP file. When you do replce, make sure that the size of the dump file unchanged by adding spaces.
E.g.

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
白云不回头 2024-07-12 17:03:37

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

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

I wanna improve for two users both in different tablespaces on different servers (databases)

1.
First create a directories for the temporary dump for both servers (databases):

server #1:

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

server #2:

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

2.
Export (server #1):

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

3.
Import (server #2):

impdp directory=tempdump dumpfile=adump_table.dmp logfile=bdump_table.log
REMAP_TABLESPACE=old_tablespace:new_tablespace REMAP_SCHEMA=old_user:new_user
偷得浮生 2024-07-12 17:03:37

答案很困难,但可行:

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

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

    alter tablespace X 重命名为Y

  3. < p>为expdp命令创建一个目录并授予权限

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

    impdp B/B directory=DIR dumpfile=DUMPFILE.dmp logfile=LOGFILE.log REMAP_SCHEMA=A:B

就是这样...

The answer is difficult, but doable:

Situation is: user A and tablespace X

  1. import your dump file into a different database (this is only necessary if you need to keep a copy of the original one)
  2. rename tablespace

    alter tablespace X rename to Y

  3. create a directory for the expdp command en grant rights

  4. create a dump with expdp
  5. remove the old user and old tablespace (Y)
  6. create the new tablespace (Y)
  7. create the new user (with a new name) - in this case B - and grant rights (also to the directory created with step 3)
  8. import the dump with impdp

    impdp B/B directory=DIR dumpfile=DUMPFILE.dmp logfile=LOGFILE.log REMAP_SCHEMA=A:B

and that's it...

烦人精 2024-07-12 17:03:37

因为我想导入(到 Oracle 12.1|2)一个从本地开发数据库 (18c xe) 导出的转储,并且我知道我的所有目标数据库将有一个名为 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 对我的目标感到满意。

Because I wanted to import (to Oracle 12.1|2) a dump that was exported from a local development database (18c xe), and I knew that all my target databases will have an accessible tablespace called DATABASE_TABLESPACE, I just created my schema/user to use a new tablespace of that name instead of the default USERS (to which I have no access on the target databases):

-- 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;

An exp created from this makes imp happy on my target.

掀纱窥君容 2024-07-12 17:03:37

---创建新表空间:

CREATE TABLESPACE TABLESPACENAME DATAFILE
'D:\ORACL\ORADATA\XE\TABLESPACEFILENAME.DBF' 大小 350M 自动扩展下一个 2500M 最大大小无限
记录
永恒的
范围管理本地自动分配
块大小 8K
段空间管理手册
闪回开启;

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

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

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

---Create new tablespace:

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;

---and then import with below command

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

-- where D:\ORACL is path of oracle installation

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文