一、問題
由於工作需要,需要把業務庫的數據庫從oracle簽到mysql,免費開源
二、解決辦法
2.1:ETL單個對象進行轉移(最笨的辦法,所以拋棄掉了)
2.2:使用Navicat Premium工具
官網地址:https://www.navicat.com.cn/download,提供14天的試用權限(如下圖所示)
安裝運行之后,我們開始進行數據遷移吧
a:創建源和目標的連接,比如從oracle到mysql我就首先需要創建一個mysql和oracle的連接
創建MySQL連接是傻瓜式的,我這里不過多的去講
主要說一下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,如下圖所示