您的位置:首页 > 数据库 > Oracle

Oracle11g数据库导入Oracle10g问题

2015-12-22 11:40 627 查看
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)





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),支持原创,转载请注明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: