天天看点

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>