Vertica数据卸载后装载至梧桐DB出现乱码

67 阅读2分钟

Vertica数据卸载后装载至梧桐DB出现乱码

字符集说明

Vertica数据库字符集:utf8 梧桐DB数据库字符集:utf8

问题

Vertica数据在卸载至梧桐db时出现乱码问题

现象

数据装载出现报错

image-10.png

排查过程

  • 使用supersync进行Vertica数据卸载,梧桐DB装载 yloader.ini 添加only_check_conv_data=c 参数,在入库前做字符集转换检查,检查不对的输出报错日志到log.yloader.
  • sync0/205.xdt data conv(0->871) error, MK.EVT_DD_KD_USER_INST.VILLAGE_CODE_NAME rowid AAAAABAAFAAHSiwCiw,从日志中找到205.xdt中 "rowid AAAAABAAFAAHSiwCiw"字符集转换报错。

./yloader -c_xdt /tmp/205.xdt -filter "rowid AAAAABAAFAAHSiwCiw" -tofile 205_1.xdt ./yloader –f ../config/yloader.ini –simp 205_1.xdt –sdump_bin

image-11.png

VILLAGE_CODE_NAME 列存储的是GBK编码,十六进制值0xc6eebcd2b1a4b4e5,用GBK解码后是:祁家堡村

image-12.png

  • 找到问题原因,部分数据是gbk编码,需要转换成utf8,才能导入到梧桐db

解决方式

yloader.ini 添加参数

  • full_lang_from=utf8 #原始数据字符集utf8
  • conv_err_repair=y #无法转换的尝试修复
  • lang_to=AL32UTF8 #目标字符集

说明

  • 只有full_lang_from 和lang_to 字符集不一样时,yloader才会做字符集转换,只有做字符集转换,conv_err_repair=y参数才会生效,所以设置成 full_lang_from=utf8, lang_to=AL32UTF8。

  • utf8 到 AL32UTF8 正常的数据的可以转换的,由于上面的VILLAGE_CODE_NAME列部分数据字符集是gbk,无法正常转换,所以yloader会尝试修复。从下面的日志也可以看到yloader无法正常转换,修复过程 先是判断出 该列是ZHS32GB18030字符集,将该数据从ZHS32GB18030转换成utf8,完成修复。

  • 205_1.xdt data conv(871->873) error, MK.EVT_DD_KD_USER_INST.VILLAGE_CODE_NAME rowid AAAAABAAFAAHSiwCiw, retry set pos 7 end. check csid ZHS32GB18030(854) for repair.

image-13.png

如果这一列所有的数据都是gbk,也可以使用下面参数,指定该列是gbk,gbk 转换到 utf8 full_lang_from_force_cols=gbk.MK.EVT_DD_KD_USER_INST.VILLAGE_CODE_NAME

验证数据

到此问题解决,能正常导入到偶数db,查看vetica原始数据,和偶数修复后的数据

image-14.png