Oracle11g資料庫匯入Oracle10g問題

luckyfriends發表於2014-02-17

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/14710393/viewspace-1082697/,如需轉載,請註明出處,否則將追究法律責任。

相關文章