從 MySQL 遷移數(shù)據(jù)到 Oracle 中的全過程

一型檀、前言

這里記錄一次將MySQL數(shù)據(jù)庫中的表數(shù)據(jù)遷移到Oracle數(shù)據(jù)庫中的全過程 贩汉,使用工具 Navicat,版本 12.0.11

操作環(huán)境及所用工具:
  1. mysql5.7
  2. oracle18c
  3. windows
  4. Navicat12.0.11
  5. idea
在這里插入圖片描述

二、開始移植

點擊 工具 -> 數(shù)據(jù)傳輸

在這里插入圖片描述

左邊 標識mysql數(shù)據(jù)庫 谒所, 右邊 目標 標識要移植到的oracle數(shù)據(jù)庫
在這里插入圖片描述

高級選項中勾選大寫

溫馨小提示:
如果字段名和表名都為小寫洗搂,oracle操作數(shù)據(jù)的時候?qū)霈F(xiàn)找不到表或視圖的錯誤消返,解決方法是必須加上雙引號才能查詢到, 這樣的話我們通過程序操作數(shù)據(jù)的時候必須加上雙引號耘拇,即大大加重了遷移數(shù)據(jù)庫后的工作量撵颊,因此這里需勾選轉(zhuǎn)換對象名為大寫 ,同時在轉(zhuǎn)換過程中如果字段名出現(xiàn)oracle關(guān)鍵字的話惫叛,它會自動給我們加上雙引號解決關(guān)鍵字的困擾3隆!嘉涌!
【 ex: user -> "USER" number -> "NUMBER" desc -> "DESC" level -> "LEVEL"

在這里插入圖片描述

選擇需要移植的表妻熊,這里我一把梭全選了~


在這里插入圖片描述

然后等待數(shù)據(jù)傳輸完成


在這里插入圖片描述

如果最后遇到如下情況,可暫不管仑最,直接關(guān)閉即可~
在這里插入圖片描述

然后查看oracle扔役,如下,數(shù)據(jù)導(dǎo)入成功


在這里插入圖片描述

溫馨小提示:傳輸過程中可能會存在有部分幾張表不成功警医,手動導(dǎo)一下就好了~~

三亿胸、問題

1、解決oracle自增主鍵

oracle設(shè)置自增主鍵的幾種方式:
  1. 序列 + 觸發(fā)器
  2. 序列 + Hibernate配置 (注:此方式僅適用于通過Hibernate連接數(shù)據(jù)庫的方式)
  3. oracle12c版本之后新增 自增列語法 GENERATED BY DEFAULT AS IDENTITY
解決思路:

在ddl 創(chuàng)建表sql中添加自增主鍵的命令预皇,重新創(chuàng)建一次表結(jié)構(gòu)损敷,然后再將oracle中的數(shù)據(jù)單獨導(dǎo)入
這里由于小編oracle版本為18c 因此在創(chuàng)建表的時候加上自增主鍵語法即可完成!

① 備份數(shù)據(jù) -> 數(shù)據(jù)泵方式

數(shù)據(jù)泵 -> 數(shù)據(jù)泵導(dǎo)出

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

② idea中如下查看ddl
在這里插入圖片描述

然后將ddl拷貝到一個txt文本文件中保存


在這里插入圖片描述
③ ddl文件內(nèi)容替換自增主鍵工具類

溫馨小提示:
這里小編數(shù)據(jù)庫中的時間類型為 DATE 類型 需 改為 TIMESTAMP 類型 深啤,這個問題可以直接使用idea的替換功能完成修改~ 拗馒,其余修改可根據(jù)個人實際情況來進行修改

在這里插入圖片描述

public class MySQLToOracleTest {

    public static void main(String[] args) {
        try {
            replaceDDLContent("D:\\Users\\zq\\Desktop\\oracle測試\\oracle_ddl.txt"); // TODO 這里修改為自己的ddl文件存放位置
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 替換文本文件中的 自增主鍵ID
     *
     * @param path
     * @throws IOException
     */
    public static void replaceDDLContent(String path) throws IOException {
        // 原有的內(nèi)容
        String srcStr = "not null";
        // 要替換的內(nèi)容
        String replaceStr = "GENERATED BY DEFAULT AS IDENTITY";
        // 讀
        File file = new File(path);
        FileReader in = new FileReader(file);
        BufferedReader bufIn = new BufferedReader(in);
        // 內(nèi)存流, 作為臨時流
        CharArrayWriter tempStream = new CharArrayWriter();
        // 替換
        String line = null;
        // 需要替換的行
        Map<Integer, Object> lineMap = new HashMap<>(104);
        //定義順序變量
        int count = 0;
        while ((line = bufIn.readLine()) != null) {
            count++;
            if (line.contains("create table")) {
                lineMap.put(count + 2, line);
            }

            //遍歷map中的鍵
            for (Integer key : lineMap.keySet()) {
                if (count == key && !line.contains("NVARCHAR2")) {
                    // TODO 在這里這是自增主鍵哦
                    line = line.replaceAll(srcStr, replaceStr);
                    lineMap.put(count, line);
                }
            }

            // 將該行寫入內(nèi)存
            tempStream.write(line);
            // 添加換行符
            tempStream.append(System.getProperty("line.separator"));
        }
        // 關(guān)閉 輸入流
        bufIn.close();
        // 將內(nèi)存中的流 寫入 文件
        FileWriter out = new FileWriter(file);
        tempStream.writeTo(out);
        out.close();
        System.out.println("文件存放位置:" + path);
        System.out.println(lineMap);
    }

}
④ 將替換過后的ddl拷貝到idea中的一個新控制臺中運行創(chuàng)建表

全選ddl,然后點擊左上角運行創(chuàng)建表 【 注:這里需先清空該庫下所有表溯街,因此步驟①要先備份一下從mysql遷移到oracle后的表數(shù)據(jù)诱桂,不要忘記哦!呈昔!】


在這里插入圖片描述

等待表全部創(chuàng)建成功挥等,如下所示:


在這里插入圖片描述
⑤ 導(dǎo)入備份數(shù)據(jù)

數(shù)據(jù)泵 -> 數(shù)據(jù)泵導(dǎo)入

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

⑥ 最后查看數(shù)據(jù)導(dǎo)入成功!
在這里插入圖片描述

這時候堤尾,數(shù)據(jù)有了肝劲,自增主鍵也有了,但是存在一個問題就是插入數(shù)據(jù)的時候主鍵自增ID都是從1開始自增,如果表中沒有數(shù)據(jù)都還ok辞槐,問題是如果表有數(shù)據(jù)掷漱,就會出現(xiàn)主鍵ID重復(fù)的問題!i省卜范!

2、解決自增主鍵ID無法從表數(shù)據(jù)ID最大值開始增值

思路:拼接出修改表自增ID從幾開始的sql即可鹿榜!
SELECT
    'SELECT ''ALTER TABLE SEWAGE_GY.' || t1.table_name || ' MODIFY(' || t1.Column_Name || ' Generated as Identity (START WITH '' || MAX( ' || t1.Column_Name || '+1 ) || ''));'' FROM ' || t1.table_name || ' UNION ALL' AS FINAL_SQL
FROM cols t1
LEFT JOIN user_col_comments t2 ON t1.Table_name = t2.Table_name AND t1.Column_Name = t2.Column_Name
LEFT JOIN user_tab_comments t3 ON t1.Table_name = t3.Table_name
WHERE
    NOT EXISTS (
        SELECT t4.Object_Name
        FROM User_objects t4
        WHERE
            t4.Object_Type = 'TABLE'
            AND t4.TEMPORARY = 'Y'
            AND t4.Object_Name = t1.Table_Name
    )
    AND t1.IDENTITY_COLUMN = 'YES'
ORDER BY t1.Table_Name, t1.Column_ID

命令解析:

# 設(shè)置表主鍵ID從多少開始自增  ex:下面標識從10000開始自增
ALTER TABLE 數(shù)據(jù)庫名.表名 MODIFY(主鍵ID Generated as Identity (START WITH 10000));

# 查詢該庫下所有表名
SELECT table_name FROM user_tables;

# 查詢出指定表的主鍵ID字段名
SELECT t1.table_name,t1.Column_Name
FROM cols t1
    LEFT JOIN user_col_comments t2 ON t1.Table_name = t2.Table_name AND t1.Column_Name = t2.Column_Name
    LEFT JOIN user_tab_comments t3 ON t1.Table_name = t3.Table_name 
WHERE NOT EXISTS (
        SELECT t4.Object_Name 
        FROM User_objects t4 
        WHERE t4.Object_Type = 'TABLE' 
            AND t4.TEMPORARY = 'Y' 
            AND t4.Object_Name = t1.Table_Name 
    ) 
    AND t1.table_name = '表名' 
    AND t1.IDENTITY_COLUMN = 'YES' 
ORDER BY t1.Table_Name, t1.Column_ID

# 查詢該庫下所有表名+表主鍵字段名
SELECT t1.table_name,t1.Column_Name
FROM cols t1
    LEFT JOIN user_col_comments t2 ON t1.Table_name = t2.Table_name AND t1.Column_Name = t2.Column_Name
    LEFT JOIN user_tab_comments t3 ON t1.Table_name = t3.Table_name 
WHERE NOT EXISTS (
        SELECT t4.Object_Name 
        FROM User_objects t4 
        WHERE t4.Object_Type = 'TABLE' 
            AND t4.TEMPORARY = 'Y' 
            AND t4.Object_Name = t1.Table_Name 
    ) 
    AND t1.IDENTITY_COLUMN = 'YES' 
ORDER BY t1.Table_Name, t1.Column_ID

在這里插入圖片描述

拷貝到新的控制臺后注意刪除最后一個 UNION ALL 再運行哦:Q!舱殿!
在這里插入圖片描述

最終完成自增主鍵ID從表數(shù)據(jù)最大值開始自增奥裸!
在這里插入圖片描述

3、程序中的sql語句轉(zhuǎn)換

這里結(jié)合個人語言實際操作...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沪袭,一起剝皮案震驚了整個濱河市刺彩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枝恋,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗡害,死亡現(xiàn)場離奇詭異焚碌,居然都是意外死亡,警方通過查閱死者的電腦和手機霸妹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門十电,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叹螟,你說我怎么就攤上這事鹃骂。” “怎么了罢绽?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵畏线,是天一觀的道長。 經(jīng)常有香客問我良价,道長寝殴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任明垢,我火速辦了婚禮蚣常,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痊银。我一直安慰自己抵蚊,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贞绳,像睡著了一般谷醉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熔酷,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天孤紧,我揣著相機與錄音,去河邊找鬼拒秘。 笑死号显,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的躺酒。 我是一名探鬼主播押蚤,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羹应!你這毒婦竟也來了揽碘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤园匹,失蹤者是張志新(化名)和其女友劉穎雳刺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裸违,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡掖桦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了供汛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枪汪。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖怔昨,靈堂內(nèi)的尸體忽然破棺而出雀久,到底是詐尸還是另有隱情,我是刑警寧澤趁舀,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布赖捌,位于F島的核電站,受9級特大地震影響矮烹,放射性物質(zhì)發(fā)生泄漏巡蘸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一擂送、第九天 我趴在偏房一處隱蔽的房頂上張望悦荒。 院中可真熱鬧,春花似錦嘹吨、人聲如沸搬味。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碰纬。三九已至萍聊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悦析,已是汗流浹背寿桨。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留强戴,地道東北人亭螟。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像骑歹,于是被迫代替她去往敵國和親预烙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容