问题背景:自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 正常

中文注释显示,xshell 正常
中文注释显示,xshell 乱码
中文注释显示,toad 乱码
线上和本地编码相同,如下:
测试服务器编码
总结
三者的编码都是 utf-8 ,其中,差异在于 <code>database territory</code> 和 <code>database country/region code</code>
执行如下指令:
三个服务器的编码相同
联机备份
放在要还原的主机的实例目录下
坑
还原时,提示如下错误:
填坑:脱机备份
先检查是否有应用在连接数据库,如果有,先断开所有的应用
生成 <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”的格式编码,显示正常:
<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>