<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • mysql數據遷移到oracle(oracle數據庫常用命令)


    一、前言

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

    操作環境及所用工具:

    1. mysql5.7
    2. oracle18c
    3. windows
    4. Navicat12.0.11
    5. idea
    從 MySQL 遷移數據到 Oracle 中的全過程

    二、開始移植

    點擊 工具 -> 數據傳輸

    從 MySQL 遷移數據到 Oracle 中的全過程

    左邊 源 標識mysql數據庫 , 右邊 目標 標識要移植到的oracle數據庫

    從 MySQL 遷移數據到 Oracle 中的全過程

    高級選項中勾選大寫

    溫馨小提示:
    如果字段名和表名都為小寫,oracle操作數據的時候將會出現找不到表或視圖的錯誤,解決方法是必須加上雙引號才能查詢到, 這樣的話我們通過程序操作數據的時候必須加上雙引號,即大大加重了遷移數據庫后的工作量,因此這里需勾選轉換對象名為大寫 ,同時在轉換過程中如果字段名出現oracle關鍵字的話,它會自動給我們加上雙引號解決關鍵字的困擾!??!
    【 ex: user -> “USER” number -> “NUMBER” desc -> “DESC” level -> “LEVEL” 】

    從 MySQL 遷移數據到 Oracle 中的全過程

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

    從 MySQL 遷移數據到 Oracle 中的全過程

    然后等待數據傳輸完成

    從 MySQL 遷移數據到 Oracle 中的全過程

    如果最后遇到如下情況,可暫不管,直接關閉即可~

    從 MySQL 遷移數據到 Oracle 中的全過程

    然后查看oracle,如下,數據導入成功

    從 MySQL 遷移數據到 Oracle 中的全過程

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

    三、問題

    1、解決oracle自增主鍵

    oracle設置自增主鍵的幾種方式:

    1. 序列 + 觸發器
    2. 序列 + Hibernate配置 (注:此方式僅適用于通過Hibernate連接數據庫的方式)
    3. oracle12c版本之后新增 自增列語法 GENERATED BY DEFAULT AS IDENTITY

    解決思路:

    在ddl 創建表sql中添加自增主鍵的命令,重新創建一次表結構,然后再將oracle中的數據單獨導入這里由于小編oracle版本為18c 因此在創建表的時候加上自增主鍵語法即可完成!

    ① 備份數據 -> 數據泵方式

    數據泵 -> 數據泵導出

    從 MySQL 遷移數據到 Oracle 中的全過程
    從 MySQL 遷移數據到 Oracle 中的全過程
    從 MySQL 遷移數據到 Oracle 中的全過程

    ② idea中如下查看ddl

    從 MySQL 遷移數據到 Oracle 中的全過程

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

    從 MySQL 遷移數據到 Oracle 中的全過程

    ③ ddl文件內容替換自增主鍵工具類

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

    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 {
            // 原有的內容
            String srcStr = "not null";
            // 要替換的內容
            String replaceStr = "GENERATED BY DEFAULT AS IDENTITY";
            // 讀
            File file = new File(path);
            FileReader in = new FileReader(file);
            BufferedReader bufIn = new BufferedReader(in);
            // 內存流, 作為臨時流
            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);
                    }
                }
    
                // 將該行寫入內存
                tempStream.write(line);
                // 添加換行符
                tempStream.append(System.getProperty("line.separator"));
            }
            // 關閉 輸入流
            bufIn.close();
            // 將內存中的流 寫入 文件
            FileWriter out = new FileWriter(file);
            tempStream.writeTo(out);
            out.close();
            System.out.println("文件存放位置:" + path);
            System.out.println(lineMap);
        }
    
    }

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

    全選ddl,然后點擊左上角運行創建表 【 注:這里需先清空該庫下所有表,因此步驟①要先備份一下從mysql遷移到oracle后的表數據,不要忘記哦?。 ?/p>

    從 MySQL 遷移數據到 Oracle 中的全過程

    等待表全部創建成功,如下所示:

    從 MySQL 遷移數據到 Oracle 中的全過程

    ⑤ 導入備份數據

    數據泵 -> 數據泵導入

    從 MySQL 遷移數據到 Oracle 中的全過程
    從 MySQL 遷移數據到 Oracle 中的全過程
    從 MySQL 遷移數據到 Oracle 中的全過程

    ⑥ 最后查看數據導入成功!

    從 MySQL 遷移數據到 Oracle 中的全過程

    這時候,數據有了,自增主鍵也有了,但是存在一個問題就是插入數據的時候主鍵自增ID都是從1開始自增,如果表中沒有數據都還ok,問題是如果表有數據,就會出現主鍵ID重復的問題!??!

    2、解決自增主鍵ID無法從表數據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

    命令解析:

    # 設置表主鍵ID從多少開始自增  ex:下面標識從10000開始自增
    ALTER TABLE 數據庫名.表名 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
    從 MySQL 遷移數據到 Oracle 中的全過程

    拷貝到新的控制臺后注意刪除最后一個 UNION ALL 再運行哦?。?!

    從 MySQL 遷移數據到 Oracle 中的全過程

    最終完成自增主鍵ID從表數據最大值開始自增!

    從 MySQL 遷移數據到 Oracle 中的全過程

    3、程序中的sql語句轉換

    這里結合個人語言實際操作…

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费