數據庫----將Oracle數據庫轉換成Mysql數據庫

前言

  有時候由於項目的需求,我們需要將Oracle數據庫來轉換成mysql,但是當我們數據庫中的表和數據太多的時候,
手動的轉換會耗費大量的時間而且還容易出錯,接下來我就來說一下我實現的方式。

所需工具

    		navicat
		    PL/SQL
   		    notepad++或UltraEdit
1.首先我們確定oracle數據庫中的數據庫可用,我們打開navicat,依次點擊連接->oracle,連接名可以自己隨便定義

在這裏插入圖片描述

2.連接成功之後,我們的navicat就會出現這個標誌,

連接成功

3.接下來我們就要開始數據庫之間的轉換,首先我們在mysql新建一個數據庫,由於之前我已經轉換過一次,在此就不糾結數據庫名了,字符集選擇utf8mb4.

在這裏插入圖片描述

utf8和utf8mb4的區別:

  MySQL在5.5.3之後增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思, 專門用來兼容四字節的unicode。 好在utf8mb4是utf8的超集,除了將編碼改爲utf8mb4外不需要做其他轉換。當然,爲了節省空間,一般情況下使用utf8也就夠了。

  那上面說了既然utf8能夠存下大部分中文漢字,那爲什麼還要使用utf8mb4呢? 原來mysql支持的 utf8 編碼最大字符長度爲 3 字節,如果遇到 4 字節的寬字符就會插入異常了。三個字節的 UTF-8 最大能編碼的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文種平面(BMP)。也就是說,任何不在基本多文本平面的 Unicode字符,都無法使用 Mysql 的 utf8 字符集存儲。包括 Emoji 表情(Emoji 是一種特殊的 Unicode 編碼,常見於 ios 和 android 手機上),和很多不常用的漢字,以及任何新增的 Unicode 字符等等。

4.創建完數據庫之後,我們需要將Oracle中的錶轉到mysql,依次點擊工具->數據傳輸,源數據就選擇Oracle數據庫中需要轉換的數據庫,目標數據庫就選擇我們新建的數據庫,點擊選項,在遇到錯誤時繼續打勾,點下一步

在這裏插入圖片描述
在這裏插入圖片描述

5.選擇我們需要轉儲的數據,本次轉換隻轉換表結構,視圖的轉換稍微有些麻煩,因爲mysql視圖不支持子查詢。點擊開始

在這裏插入圖片描述

6.接下來我們需要看數據的轉換過程中發現了哪些錯誤,我們要將這些錯誤記錄下來,可能由於某些元素會導致某些錶轉換不成功,這時就需要我們在轉換完成後自己手動去創建這些表。

在這裏插入圖片描述

7.由於數據庫中的大小原因會導致轉換的時間長度,在轉換完成後,可以看到上面報了多少錯誤,然後我們複製日誌文件,打開notepad++,將日誌複製進去,查找 [ERR],通常的提示都是這種,我們需要記錄下該表,

在這裏插入圖片描述

8.由於完整的轉換時間比較長,通常在轉換完成後複製整個日誌文件,查找[ERR]就可以看到轉換中出現的錯誤,可能會出現重複的表名,重複的我們只需要記住一個即可。我們需要記住的是報錯語句的上一條記錄的表名,我們記下來這寫問題表,等下來處理。

在這裏插入圖片描述

9.在數據轉換完成後,會有一些問題,就是在轉換的過程中,oracle中的integer類型會在mysql中轉換成decimal類型,date類型也會出現一些問題,就會出現下面這種情況,這時就需要我們將這些字段更改

在這裏插入圖片描述

10.我們對轉換好的mysql數據庫點擊右鍵->轉儲sql文件->僅結構

在這裏插入圖片描述

11.轉儲完成後打用notepad++打開sql文件,將decimal(x,x)全部替換爲int,如果有datetime類型的,將datetime(0)轉換成datetime

在這裏插入圖片描述

12.保存之後我們再新建一個數據庫,和剛纔一樣,選擇我們剛創建的數據庫,右鍵,運行sql文件,選擇我們改過的sql文件

在這裏插入圖片描述

13.運行成功後,目前,我們jaranmes3中的數據是對的,jranmes4中的表結構是對,所以我們需要將此同步一下,這裏我們選擇將jranmes4中的結構同步到jranmes3,選擇工具->結構同步,選擇好後點擊比對,確定沒什麼問題選擇部署,運行

在這裏插入圖片描述
在這裏插入圖片描述

14.更改完表的結構,我們需要對剛纔轉換中出現錯誤的表進行重新創建,我們根據記錄的表明,在PL/SQL中搜索表名,右鍵點擊查看->查看sql

在這裏插入圖片描述
在這裏插入圖片描述
  在更改時,我們不需要關心表空間,只需要在創建表的時候添加上主鍵,創建索引就可以了。
  比如上面的sql,在mysql中,我們需要寫成

   		-- Create table
   		create table UTILS_OBJ_ASSOCHECK
   		(
   		  masterobj   VARCHAR2(64) not null,
   		  slaveobj    VARCHAR2(64) not null,
   		  keyattrsrel VARCHAR2(256) not null,
   		  primary key (KEYATTRSREL, SLAVEOBJ, MASTEROBJ)
   		)

有的表可能包含的有索引,類似下面這樣的語句.
在這裏插入圖片描述
  在mysql中不能使用這種方法來添加索引,上圖中我們添加的是普通索引,我們需要查找對應的sql語句,我們應該使用下面的方式來添加索引

		ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 

所以,上面的語句我們可以寫成

		ALTER TABLE BIZ_REPORT_BOX_BATCH_ASSO ADD INDEX BIZ_REPORT_BOX_BATCH_ASSO (BATCHNO, BOXNO)

有時候PLSQL中添加的是唯一索引,我們需要使用mysql添加唯一索引方式的語句,以下面的格式

		ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 

  需要注意的是:mysql中沒有varchar2類型,且有時varchar2(255)會導致長度太長無法完成建表,所以我們在PL/SQL複製完建表語句後,還需要我們去更改建表語句,比如將varchar2改成varchar,將number改爲int。

15.根據上面的步驟,將我們轉換中遇到問題的表全部重新更新一下就可以了

至此,oracle轉mysql就完成了,如果有什麼疑問或者不對的地方,歡迎糾正!


  鹹魚IT技術交流羣:89248062,在這裏有一羣和你一樣有愛、有追求、會生活的朋友! 大家在一起互相支持,共同陪伴,讓自己每天都活在豐盛和喜樂中!同時還有龐大的小夥伴團體(sha diao wang you),在你遇到困擾時給予你及時的幫助,讓你從自己的坑洞中快速爬出來,元氣滿滿地重新投入到生活中!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章