ITPub博客

首页 > 数据库 > Oracle > Oracle11g数据库导入Oracle10g问题

Oracle11g数据库导入Oracle10g问题

Oracle 作者:310248712 时间:2015-08-24 14:38:33 0 删除 编辑

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

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 Haoluckyfriends),支持原创,转载请注明。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12060579/viewspace-1781086/,如需转载,请注明出处,否则将追究法律责任。

下一篇: alert文字换行
请登录后发表评论 登录
全部评论

注册时间:2015-07-17

  • 博文量
    18
  • 访问量
    28732