Oracle11g数据库导入Oracle10g问题

1)问题1: Oracle11g数据库导入Oracle10g数据库操作导入解决方法:

11g备份,导入10g的时候会抛错,直接阻止导入。

但是有时候还必须得把11g的数据库导入到10g,我今天就遇到了这种情况。

一、在11g服务器上,使用expdp命令备份数据

EXPDP USERID='SYS/cuc2009@cuc as sysdba' schemas=sybj directory=DATA_PUMP_DIR dumpfile=aa.dmp logfile=aa.log version=10.2.0.1.0

其中,红色文字部分是根据需要改写的地方。例如我的sys密码是cuc2009,数据库sid是cuc,要到出的用户名是sybj,要导入到10.2.0.1.0版本的Oracle数据库中去。aa.dmp和aa.log将会在11g的dpdump目录中生成,例如我的11g装在了E盘下面,于是aa.dmp将会在E:\app\Administrator\admin\cuc\dpdump目录下被生成。

二、在10g服务器上,使用impdp命令恢复数据

准备工作:1.建库2.建表空间3.建用户并授权4.将aa.dmp拷贝到10g的dpdump目录下

1-3点可以去参考博主的上一篇博客“Oracle数据库移植全步骤”,介绍的很详细,这里不再多说。关于第4点,我的10g装在了e:\tools目录下,于是我将aa.dmp文件拷贝到了E:\tools\admin\cucf\dpdump目录下。

IMPDP USERID='SYS/cuc2009@cucf as sysdba' schemas=sybj directory=DATA_PUMP_DIR dumpfile=aa.dmp logfile=aa.log version=10.2.0.1.0

其中红色部分是根据需要改写的地方。例如我的sys密码是cuc2009,数据库sid是cucf,要导入用户名为sybj,要导入到10.2.0.1.0版本的Oracle数据库中去。aa.log将会在10g的dpdump目录中生成。

http://blog.csdn.net/defonds/archive/2009/06/13/4263137.aspx

2)问题2:Oracle 11g导出来的dmp导入到 10g的数据库(IMP-00010:不是有效的导出文件,头部验证失败)

oracle 11g R2 导出去的dmp文件,导入11g R1或10G的,都显示:

IMP-00010:不是有效的导出文件,头部验证失败

为了这个问题一直苦恼,差点就想卸掉11g然后装10g了,后来想想,头部验证,那么头部到底是什么,用Notepad++查看了dmp文件,发现头部真的显示一些东西:

11g R2:V11.02.00

11g R1:V11.01.00

10g:V10.02.01

把版本改成对方机子数据库版本,执行imp就不再报错了。

考虑到如果文件过大,可能打不开导致死机,做个小程序。(C# WINFORM)

clip_image001

2个按钮的事件:

private void button1_Click(object sender, EventArgs e) 
        { 
            OpenFileDialog file = new OpenFileDialog(); 
            file.InitialDirectory = Application.ExecutablePath; 
            if (file.ShowDialog() == DialogResult.OK) 
            { 
                String path =label11.Text= file.FileName; 
                FileStream fs = File.OpenRead(path); 
                fs.Seek(0, SeekOrigin.Begin); 
                byte[] byData = new byte[100]; 
                fs.Read(byData, 0, 50); 
                string charData = new UTF8Encoding(true).GetString(byData, 0, byData.Length); 
                string[] da = System.Text.RegularExpressions.Regex.Split(charData, @":V", RegexOptions.IgnoreCase); 
                Regex r = new Regex(@":V\d{2}\.\d{2}\.\d{2}"); 
                Match m = r.Match(charData); 
                label9.Text = m.Index.ToString (); 
                label10.Text = m.Length.ToString(); 
                textBox1.Text = System.Text.RegularExpressions.Regex.Split(m.Value, @":V", RegexOptions.IgnoreCase)[1]; 
                fs.Close(); 
            } 
        }

        private void button2_Click(object sender, EventArgs e) 
        { 
            Regex r = new Regex(@"\d{2}\.\d{2}\.\d{2}"); 
            Match m = r.Match(textBox1.Text); 
            if (m.Success) 
            { 
                FileStream fs = File.OpenWrite(label11.Text); 
                fs.Seek(int.Parse(label9.Text.ToString())+2, SeekOrigin.Begin); 
                Byte[] info = new UTF8Encoding(true).GetBytes(textBox1.Text); 
                fs.Write(info, 0, info.Length);

  fs.Close(); 
                MessageBox.Show("版本修改成功。"); 
            } 
            else 
                MessageBox.Show("版本格式错误。"); 
        }

下载:http://files.cnblogs.com/alxc/AlxcTools.rar

http://download.csdn.net/detail/hwt0101/9371830

3)问题3: 11g exp数据时就会遗漏记录数为0的表导入错误解决方法:

原因在于11gR2中的新功能 – Deferred Segment Creation(延迟段创建),默认情况 下这个功能是启用的。

  SQL>show parameter DEFERRED_SEGMENT_CREATION

NAME                                 TYPE                 VALUE

------------------------------------ --------------------

deferred_segment_creation            boolean              TRUE

延迟段创建的含义是当此新创建一个可能会有Segment的对象时(比如表、索引、物化 视图等),如果这个对象中还没有任何记录需要消耗一个Extent,那么将不会在创建对象时自动创建Segment,这样做的好处无疑是在创建对象时大大提高了速度。

对于上例中的T2表,我们在创建结束就立刻检查DBA_SEGMENTS视图,会发现没有任何记

录。

SQL>select segment_name from user_segments where segment_name='T2';

  no rows selected

而对于exp程序而言,当仅仅存在Object的定义而没有相应的Segment时,就会报出

EXP-00011对象不存在的错误。

解决方法就很简单了,以下方法任选其一。

1. 设置DEFERRED_SEGMENT_CREATION为FALSE,这样创建对象时就会自动创建Segment

2. 在创建对象时,明确指定立刻创建Segment

  create table t2 (n number) SEGMENT CREATION IMMEDIATE;

3. 使用expdp替代exp(Datapump本身就是Oracle10g以后的推荐工具)

  D:\Tempexpdp kamus/oracle tables=t2

  Export: Release 11.2.0.1.0 - Production on Fri Apr 16 18:14:41 2010

  Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights

reserved.

  Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 -

64bit Production

  With the Partitioning, Oracle Label Security, Data Mining and Real

Application Testing opt ions

  Starting "KAMUS"."SYS_EXPORT_TABLE_01":  kamus/******** tables=t2

  Estimate in progress using BLOCKS method...

  Processing object type TABLE_EXPORT/TABLE/TABLE_DATA

  Total estimation using BLOCKS method: 0 KB

  Processing object type TABLE_EXPORT/TABLE/TABLE

  . . exported "KAMUS"."T2"                                    0 KB       0

rows

  Master table "KAMUS"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded

  ****************************************************************************

  Dump file set for KAMUS.SYS_EXPORT_TABLE_01 is:

   D:\ORACLE\ADMIN\ORCL\DPDUMP\EXPDAT.DMP

  Job "KAMUS"."SYS_EXPORT_TABLE_01" successfully completed at 18:15:10

4、如果一定要用exp的话可以考虑给空表分配段:

select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0

以上问题均为实际环境11g导入10G中遇到过,部分问题及方案参考各位大侠的经验,一并收录。

文章版权所有Jusin Hao(luckyfriends),支持原创,转载请注明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值