1. 程式人生 > >SQLServer2PostgreSQL遷移過程中的幾個問題

SQLServer2PostgreSQL遷移過程中的幾個問題

post content enter 文件 中一 postgres 能夠 lac ftw

1、PostgreSQL 跨平臺遷移工具Migration Toolkit的使用指南:http://www.enterprisedb.com/docs/en/8.4/mtkguide/Table%20of%20Contents.htm#TopOfPage

2、可能是程序的問題,遷移工具會把jtds驅動連接字符串認為是Oracle去連接,Google以後:http://my.oschina.net/congqian/blog/106518,找到這個指令指定數據源類型的方式來做操作:

Java -Dprop=toolkit.properties -jar lib/edb-migrationtoolkit.jar -sourcedbtype sqlserver -targetdbtype postgresql -allTables -targetSchema public dbo

3、用上面的工具遷移的過程中,我所發現的能夠阻礙整個表遷移的問題是類型匹配問題,MSSQL的bit類型在Postgresql建表的過程中被建為boolean字段,但是數據加載的過程中卻報錯:完全無法把bit數據轉化為boolean數據.我剛開始準備寫Python腳本遷移這幾個表,後來發現問題比較單一,直接把源表裏的bit類型轉化為smartint類型,然後遷移過來,準備再Postgresql裏面再回去。(後加)比較詭異的是其中一個表的bit類型轉移過去了,但是數據庫的bit和Java代碼中Byte類型無法兼容,還是得把字段類型改成smallini

4、接著上面問題說,3所做的數據遷移完成以後,修改了Web應用數據源配置文件,啟動Web應用,做了幾個前面改了類型的表的讀寫測試,發現正常可用,原來之前SQLServer中bit類型自動生成的hibernate ORM配置文件中bit對應的類型是java.lang.Byte,Byte是8位字節,smallint恰好也是8位,正好可以兼容可用。算是一個偶然運氣事件吧。

5、再說一個問題,之前工具數據遷移的時候,系統經常提醒說UTF-8編碼問題,我以為遷移過程中所有字符串數據自動會轉換成UTF-8的數據,而Web應用之前是GBK編碼,所以猜想是不是遷移完還得做編碼集全體轉換成UTF-8,但實際發現並不是這樣,連之前用python在SQLServer裏面查詢出來帶U字頭的字符串,在Postgresql裏面查出來好像已經不帶U字頭了。

6、RHEL6.0的PostgresSQL二進制版本的安裝目錄是/var/lib/pgsql ,與其它平臺不同的是,數據文件和配置文件都在這個目錄內的子目錄內。

7、數據遷移後的處理,PostgreSQL中主鍵ID生成機制和SQLServer中的實現機制略有不同,從SQLServer的Identity到PostgreSQL中的Sequence,工具遷移的過程中,只復制數據,主鍵需要自己手動(或腳本)來設置,主鍵字段設置好以後,還要對每個sequence的當前值根據當前表的ID最大值做一次設置。我的Web應用項目是基於Hibernate的,因為Hibernate的配置文件也要修改:1、是修改主配置文件中的SQL方言類型;2、就是把每個表的主鍵生成機制由identity改為sequence([email protected]

/* */)

SQL Server是這樣:

<id name="id" column="id" type="java.lang.Integer">  
     <generator class="identity"/>  
</id>  

改為PostgreSQL以後是這樣:

<id name="id" column="id" type="java.lang.Integer">  
    <generator class="sequence">     
        <param name="sequence">此處是表ID對應的序列名稱,你可以在AdminIII的序列目錄中找到表對應序列名,一般序列的名字是Tablename_id_seq</param>     
    </generator>   

SQLServer2PostgreSQL遷移過程中的幾個問題