記一次使用db2資料庫遇到的坑
IBM DB2 是美國IBM公司開發的一套關係型資料庫管理系統,它主要的運行環境為UNIX(包括IBM自家的AIX)、Linux、IBM i(舊稱OS/400)、z/OS,以及Windows伺服器版本。 DB2主要應用於大型應用系統,具有較好的可伸縮性,可支持從大型機到單用戶環境,應用於所有常見的伺服器操作系統平台下。
我需要實現的技術方案如下:
需要從db2資料庫中取數,然後把數據寫入到MySQL數據中。
理論知識
DB2資料庫幾個概念
instance, 同一台機器上可以安裝多個DB2 instance。
database, 同一個instance下面可以創建有多個database。
schema, 同一個database下面可以配置多個schema。 所有的資料庫對象包括table、view、sequence,etc都必須屬於某一個schema。
另外,database是一個connection的目標對象,也就是說用戶發起一個DB2連接時,指的是連接到到一個database,而不是連接到一個instance,也不是連接到一個schema。
但是DB2的啟動和關停是以instance為單位的。可以啟動一個instance,或者關停一個instance。但不可以啟動或者關停一個資料庫或者一個schema。
使用的模塊
使用了ibm_db,該模塊在安裝時會根據當前平台自動下載對應的客戶端驅動程序。
第一坑
遇到的第一坑是(代碼頁),可以簡單的理解為這是資料庫的編碼,在db2資料庫資料庫中,如果客戶端和服務端的不一致,連接時會報錯:
而使用的中沒有提到如何設置的方式,在各種google攻略後,得到的解決方案有兩個:
修改客戶端的操作系統語言。
添加系統環境變數。
我的後端架構為:
最外層是ubuntu系統,然後起一個容器,容器是基於ubuntu16.04的,然後在容器中有一個模塊,這是一個node模塊,node通過調用這個模塊去連接db2資料庫。
不論我怎麼修改最外層的系統還是容器中的unbuntu系統的語言和環境變數,都不起作用。
最終解決方案:
在模塊中,在連接db2代碼之前設置環境變數:
第二坑
成功連接到db2資料庫後,發現取到的數據的中文是亂碼。於是又開始在網上找攻略,大多數答案都是說問題。可是上一個坑已經解決了呀。優於無法直接訪問到db2所在的伺服器,所以無法很準確的確認db2資料庫使用的值,但是經過各種調試及執行如下SQL語句:
得出的結論都是:db2資料庫的是,可以理解成db2資料庫的編碼是GBK。所以我把客戶端的設置成應該是沒有問題的呀?但是實際情況就是中文無法正確展示。
最終解決方案:
將客戶端的設置成即可。一臉懵逼啊!此方案是我拍腦袋嘗試後得出的。對應的編碼是。
其他坑
環境問題,項目自身的打包發布流程存在各種坑。
ibm_db問題,2.1.0之前的版本在連接上是存在一些問題的,我開始折騰的時候是2.3.0版本,其實這個版本也有一些問題,然後我提了個issue,過了兩天後更新到了2.3.1,使用這個版本後神奇的解決了連接問題。
使用ibm_db去連接db2資料庫,不是真正的命令行客戶端連接,而是使用了一個驅動程序去連接,所以網上的在客戶端執行的方法都行不通。
使用連接db2資料庫的相關資料較少,使用的人也少,搜到很多都是java的資料。
總結
為了實現開頭提到的技術方案,我加班加點花了差不多一個禮拜的時間,除了項目本身的打包、運行環境的坑以及對db2不熟悉外,其他問題大概花了兩天左右。經過一個禮拜的折騰,對解決問題有了一些心得:
環境很重要,因為我在本地開發環境是執行代碼是比較順利的,但是現場環境比較複雜,所以在解決問題之前要充分了解現場的軟體環境,包括操作系統、版本等。
如果是沒遇到的東西,最後先去了解基本的概念、必要的基礎知識。
從最終代碼執行處入手,如果我一開始就在使用代碼連接db2的地方通過列印出來的話,可能會省很多時間。
參考資料
https://www.jianshu.com/p/e1f38505f789
※宜豐人 孤島情緣
※Think Different 致瘋狂的人
TAG:全球大搜羅 |