最近作了不少關於Sakai數據庫遷移的工做,服務器和服務器之間,Oralcle和Mysql之間導來導去。儘管最後發現都是無用功,但把數據庫遷移的過程記下來,也算沒白忙活。 php
Oracle版本:Oracle11g2 java
Mysql版本:Mysql5.5.30 mysql
Sakai版本:CLE2.9.1 sql
1、Oracle到Oracle 數據庫
使用的工具:Navicat For Oracle
下載地址:http://pan.baidu.com/share/link?shareid=457377&uk=2819378455
可能要更新一下oci的版本,須要instantclient-sqlplus-win32-11.2.0.1.0.zip這個包(下載地址:http://pan.baidu.com/share/link?shareid=457381&uk=2819378455)
1.軟件安裝完成之後啓動,選擇Tools—Option,便可更新Oci及sqlplus的位置,以下圖所示。 api
2.新建兩個鏈接,一個是源服務器鏈接,一個是目標服務器鏈接,而後使用Data Transfer的功能,選擇好Schema,須要遷移的表,視圖,序列等,開始便可。以下圖所示。 tomcat
2、Mysql到Mysql 服務器
須要使用的工具:mysql-gui-tools-5.0-r17-win32.msi oracle
下載地址:http://pan.baidu.com/share/link?shareid=457410&uk=2819378455 app
服務器與服務器之間的遷移使用該工具提供的MySQL Migration Toolkit便可完成,遷移過程在下面Oracle到Mysql的遷移中會詳細介紹,這裏相似。
一臺服務器中數據庫的複製,根據要求,要把名爲system數據庫徹底複製到sakai數據庫,因爲一些外鍵的限制,使用phpMysqlAdmin工具提供的複製數據庫的功能沒法順利完成,而使用該工具進行Backup,而後Restore就能夠了。備份system數據庫,而後restore到sakai數據庫,就ok了,以下圖所示。
3、Oracle到Mysql
實現不一樣服務器間不一樣數據庫的遷移,特定此方法僅對Sakai的數據庫遷移工做有效,由於Sakai在啓動的時候能夠自動把Mysql的表創建起來,就不用考慮Oracle到Mysql引發的字段不一樣的問題,只要把數據遷過來就好了。
須要使用的工具1:mysql-gui-tools-5.0-r17-win32.msi
下載地址:http://pan.baidu.com/share/link?shareid=457410&uk=2819378455
須要使用的工具2:phpMysqlAdmin
下載地址:http://pan.baidu.com/share/link?shareid=457429&uk=2819378455
(因爲MySQL Migration Toolki不提供僅僅轉移數據庫結構的功能,因此須要用phpMysqlAdmin來完成)
0、準備工做:將sakai在mysql上的某個空庫(如sakaitmp)的基礎上運行,就會在sakaitmp中生成sakai的表,而後使用phpMysqlAdmin工具的複製數據庫功能將sakaitmp庫(注意要選擇「僅結構」)複製到另一個數據庫(這個數據庫的名字與oracle中須要遷移的schema名字相同),這樣就把mysql中的表結構建好了。
一、打開MySQL Migration Toolkit工具,點擊next,選擇Direct Magration,而後next
二、配置源數據庫(Oracle)與目標數據庫(Mysql)的鏈接(地址,端口,用戶名密碼),選擇須要遷移的Schema
三、點擊details,選擇須要遷移的表,視圖等,以下圖所示
5.一直點next,到下一步,選擇show all objects with messages,把advance展開,把每張表的建表語句都刪掉(建表讓Sakai在Mysql裏本身作,這裏再也不作,須要刪300多張表),apply change便可,如圖所示。
六、後面一直next便可。這樣既可完成Oracle到Mysql的遷移。
4、Sakai中資源的遷移
Sakai提供兩種存放資源的方式,一種是放在數據庫中,一種是放在文件系統中,放在文件系統中須要修改配置項(sakai.properties中):
bodyPath@org.sakaiproject.content.api.ContentHostingService = /app/elearndata
bodyVolumes@org.sakaiproject.content.api.ContentHostingService =vol1,vol2,vol3
若是已經放到數據庫中了,想轉移到文件系統中,就加上下面的配置項:
convertToFile@org.sakaiproject.content.api.ContentHostingService = true
但對於Oracle數據庫好像無論用,參考這裏報告的問題https://jira.sakaiproject.org/browse/KNL-164,
修改
/kernel/kernel-impl/src/main/java/org/sakaiproject/content/impl/DbContentService.java
這個代碼便可(在kernel-impl)。下面是patch文件:
=================================================================== ---src/main/java/org/sakaiproject/content/impl/DbContentService.java (revisão 236) +++src/main/java/org/sakaiproject/content/impl/DbContentService.java (cópia de trabalho) @@ -2724,12 +2724,10 @@ try { - Object clob = result.getObject(3); - if(clob != null && clob instanceof byte[]) - { - edit = new BaseResourceEdit(); - resourceSerializer.parse(edit, (byte[]) clob); - } + Blob clob = result.getBlob(3); + edit = new BaseResourceEdit(); + resourceSerializer.parse(edit, clob.getBytes(1L, (int) clob.length())); + }
從新啓動tomcat,就完成了資源從數據庫到文件系統的轉移,而後再遷移到別的機器上就方便了。只要把資源文件遷移到目標服務器相同的目錄下便可。