1、問題mysql
因爲工做須要,須要把業務庫的數據庫從oracle簽到mysql,免費開源linux
2、解決辦法sql
2.1:ETL單個對象進行轉移(最笨的辦法,因此拋棄掉了)數據庫
2.2:使用Navicat Premium工具windows
官網地址:https://www.navicat.com.cn/download,提供14天的試用權限(以下圖所示)服務器
安裝運行以後,咱們開始進行數據遷移吧數據結構
a:建立源和目標的鏈接,好比從oracle到mysql我就首先須要建立一個mysql和oracle的鏈接oracle
建立MySQL鏈接是傻瓜式的,我這裏不過多的去講app
主要說一下navicat建立Oracle鏈接,官方文檔以下函數
Navicat 支持兩種 Oracle 服務器鏈接:在 Basic 模式中,Navicat 經過 Oracle Call Interface (OCI) 鏈接到 Oracle。
OCI 是一個應用程序界面,讓程序開發人員使用第三代語言原有進程或函數呼叫來訪問 Oracle 數據庫及控制所有 SQL
語句運行的階段。OCI 是一個標準數據庫訪問的庫和動態連接庫形式檢索函數。
在 TNS 模式中,Navicat 使用在 tnsnames.ora 文件中的別名項目經過 Oracle Call Interface (OCI) 鏈接到 Oracle
服務器。OCI 是一個應用程序界面,讓程序開發人員使用第三代語言原有進程或函數呼叫來訪問 Oracle 數據庫及控制
所有 SQL 語句運行的階段。OCI 是一個標準數據庫訪問的庫和動態連接庫形式檢索函數。
大概就是須要在navicat的選項中指定oci.dll文件的位置,以下圖
可是我按照操做安裝了oracle client以後指定client中的oci.dll文件的路徑一直不行,仍是報錯,oracle鏈接一直建立不成功,接下來給出終極
解決方法:
把Oracle安裝目錄D:\app\Administrator\product\11.2.0\dbhome_1\BIN(根據你的實際安裝目錄)下的oci.dll文件替換Navicat安裝目錄D:\software\Navicatfor Oracle\instantclient_10_2(根據你的實際安裝目錄)下的oci.dll就能夠了
確實解決了問題
b:開始遷移數據庫
以下圖所示,在native中選擇工具-數據傳輸能夠看到以下界面,咱們定義好源和目標,選擇好遷移的對象
遺憾的地方是:Oracle到mysql只能遷移表,視圖過程什麼的多是由於語法不同而被禁用了,或者是由於我這裏是使用版的問題,這就不知道了
點擊開始遷移,咱們能夠看到遷移日誌,以下圖所示
不幸的是,中途卻報錯了
錯誤1:[Err] [Dtf] 2006 - MySQL server has gone away With statement: INSERT INTO `T_XX_MESSAGE`
這個錯誤是由於要插入的字段中含有BLOB、CLOB的大文本字段,MySQL處理能力有限
解決辦法:
修改MySQL的my.ini文件(windows),linux爲my.cnf,如window解壓版的mysql沒有my.ini只有my-default.ini
那就複製一個my-default.ini重命名爲my.ini在後面加上
max_allowed_packet=16M
結果以下圖所示
修改保存後重啓mysql服務 net stop mysql net start mysql
錯誤2:
[Msg] [Dtf] Create index: `IDX_MEETING_FILENAME`
[Err] [Dtf] 1170 - BLOB/TEXT column 'FILE_NAME' used in key specification without a key length
解決辦法:
原來Mysql數據庫對於BLOB/TEXT這樣類型的數據結構只能索引前N個字符。因此這樣的數據類型不能做爲主鍵,也不能是UNIQUE的。因此要換成VARCH,可是VARCHAR類型的大小也不能大於255,當VARCHAR類型的字段大小若是大於255的時候也會轉換成小的TEXT來處理。因此也一樣有問題。
做爲索引的字符不能太長,修改的短一點吧
繼續處理能夠發現處理OK,以下圖所示