天天看點

DB2 所有資料庫表、表字段注釋亂碼問題的排查及解決方案

問題背景:自2015年以來,國家項目測試平台 db2 所有表的表名、表字段等中文注釋均開始存在亂碼問題,嚴重影響開發人員對于資料庫表含義的了解(特别是在資料庫設計文檔缺乏的情況下)。

本文記錄了解決該曆史遺留問題的相關步驟,總結遇到的坑,最後提出解決該問題的方案。

測試伺服器:10.1.3.3:60000/necc_gjr

centos release 6.3 (final)

db2 express-c 10.1

線上伺服器:10.30.22.16:60000/necc_db

suse linux enterprise server 11 sp2 (x86_64)

db2 enterprise server edition 10.1

本地伺服器:192.168.56.101:50000/necc_db

oracle vm virtualbox 5.0.16

opensuse leap 42.1

db2 express-c 10.5.7

其他用戶端軟體

toad for db2 freeware 5.6

xshell 5

線上資料庫情況

中文資料顯示,xshell 正常

測試伺服器情況

中文資料顯示,xshell 亂碼

中文資料顯示,toad 正常

DB2 所有資料庫表、表字段注釋亂碼問題的排查及解決方案

中文注釋顯示,xshell 正常

中文注釋顯示,xshell 亂碼

中文注釋顯示,toad 亂碼

DB2 所有資料庫表、表字段注釋亂碼問題的排查及解決方案

線上和本地編碼相同,如下:

測試伺服器編碼

總結

三者的編碼都是 utf-8 ,其中,差異在于 <code>database territory</code> 和 <code>database country/region code</code>

執行如下指令:

三個伺服器的編碼相同

聯機備份

DB2 所有資料庫表、表字段注釋亂碼問題的排查及解決方案

放在要還原的主機的執行個體目錄下

DB2 所有資料庫表、表字段注釋亂碼問題的排查及解決方案

還原時,提示如下錯誤:

填坑:脫機備份

先檢查是否有應用在連接配接資料庫,如果有,先斷開所有的應用

生成 <code>necc_db.0.db2inst.dbpart000.20160419112126.001</code>

再次執行還原:

設定防火牆,允許資料庫的端口号

執行:<code>vi /etc/sysconfig/susefirewall2</code>

修改成如下内容:

本地資料庫情況

xshell 、toad 中文資料和字段注釋均正常。

用 db2move 形式還原資料庫

擷取到備份檔案 db2temp,執行如下指令來還原,先導入生産表結構,再導入表資料:

有可能遇到端口不能啟動的問題:

設定一個變量 <code>db2comm=tcpip</code>:

按照幾種方式對線上資料庫在本地進行了備份還原,均未出現中文注釋亂碼問題;

由于時間原因,未在本地重制上述問題,故推測該問題産生的原因是在資料庫備份成 sql 檔案時,該檔案儲存的編碼格式對中文不友好而亂碼,以至于再将該 sql 檔案導入資料庫時,緻使資料庫中文注釋亂碼;

解決方案:嘗試使用多種還原方式,将線上資料庫在測試伺服器上重新還原一個新的資料庫,再檢視是否有類似問題的産生。

後期我在對線上資料庫進行更新時,重制了該問題,在通過執行腳本檔案形式來對資料庫進行更新操作。當我的腳本檔案編碼格式對中文不友好時,執行後的資料就亂碼了:

而把文檔格式儲存為“utf-8 無 bom”的格式編碼,顯示正常:

DB2 所有資料庫表、表字段注釋亂碼問題的排查及解決方案

<a href="http://www.ibm.com/support/knowledgecenter/ssepgg_9.5.0/com.ibm.db2.luw.messages.sql.doc/doc/msql02547n.html">http://www.ibm.com/support/knowledgecenter/ssepgg_9.5.0/com.ibm.db2.luw.messages.sql.doc/doc/msql02547n.html</a>

<a href="https://github.com/waylau/db2-tutorial">《db2 教程》</a>