Error: Malformed input or input contains unmappable characters

【 使用环境 】生产环境
【 OB导数工具 】
【 使用版本 】4.3.1
【问题描述】
1、数据库中有中文表名,中文表名会乱码;
2、系统字符集为zh_CN.UTF8
3、备份时会提示Error: Malformed input or input contains unmappable characters

RS_obdumper_20240814_010018.tar.gz.log (83.9 KB)

【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

根据您的描述,您在尝试备份含有中文表名的数据库时遇到了字符编码问题,具体错误信息为 “Error: Malformed input or input contains unmappable characters”。这通常与字符集设置或处理不当有关。

为了进一步诊断这个问题,我们可以使用 obdiag 工具来收集相关的日志信息。

日志采集场景: 数据备份问题
日志采集命令: obdiag gather scene run --scene=observer.backup

这条命令将会收集与备份过程相关的日志和配置信息,帮助我们定位问题的原因。

请您执行上述命令并提供采集回来的日志压缩包。这将有助于我们更准确地判断问题所在。

为了更好地帮助您解决问题,请提供以下信息:

  1. 您是在使用哪个工具或命令来进行备份操作的?
  2. 备份命令的具体参数是什么?
  3. 是否尝试过更改系统的字符集设置,例如通过环境变量或配置文件?
  4. 您能否提供更多关于错误发生的上下文信息,例如完整的错误日志或错误发生前的操作步骤?

附上敏捷诊断工具 obdiag 使用帮助链接

你先查一下 字符集 截个图看看
SHOW VARIABLES LIKE ‘character_set_%’;

image

再向您确认几个问题:

  1. 您提供的截图显示服务器的字符集设置为 ‘character_set_server = zh_CN.utf8’ 这与您之前提到的系统字符集一致 我们需要确认的是客户端的字符集设置 请问客户端的字符集设置是什么
  2. 您在备份过程中是否有遇到特定的步骤或者是在处理某个特定的表时出现了乱码或是错误提示
  3. 您能否提供一下备份工具的具体版本号以及是否使用了默认的备份参数
  4. 除了上传的截图外 您能否提供完整的错误日志 或者是错误发生前后的一些关键日志信息
  1. 您提供的截图显示服务器的字符集设置为 ‘character_set_server = zh_CN.utf8’ 这与您之前提到的系统字符集一致 我们需要确认的是客户端的字符集设置 请问客户端的字符集设置是什么

我就是在observer上进行备份,所以,客户端与服务器端的系统字符集是一样的,都是zh_CN.utf8
目前不确定obdumper用的是什么字符集,但从observer上租户的字符集配置来看,应该是utf8mb4

  1. 您在备份过程中是否有遇到特定的步骤或者是在处理某个特定的表时出现了乱码或是错误提示
  2. 您能否提供一下备份工具的具体版本号以及是否使用了默认的备份参数

2和3的答复如下:
备份命令大致如下:

/usr/local/ob-loader-dumper/bin/obdumper -h ${DB_HOST} -u ${BAK_USER} -P"${DB_PORT}" -p ${BAK_PWD} --sys-user ${BAK_USER} --sys-password ${BAK_PWD} -t ${BAK_TEN} -c ${BAK_CLS} -D ${DB_NAME} --all --ddl --csv -f "${BAK_PATH}"  --thread 2 2>&1 1>>"${BAK_LOG}"

obdumper 设置过jvm的堆内存大小:

# ####################################################################################
#        This shell snippets is used for setting JAVA OPTS: -Xms, -Xmx and GC
#                          Support on Linux/MacOSX
# ####################################################################################
VM_OPTS="-Xms16G -Xmx16G"
GC_OPTS="-XX:+UseG1GC"
  1. 除了上传的截图外 您能否提供完整的错误日志 或者是错误发生前后的一些关键日志信息
    日志已经附加在原文中

根据您提供的信息,您正在使用 OceanBase 4.3.1 版本,并且使用 obdumper 工具进行备份。您提到在备份过程中遇到了字符编码问题,具体表现为中文表名出现乱码,并且有错误提示 “Error: Malformed input or input contains unmappable characters”。

分析

  1. 服务器端字符集:您确认服务器端字符集为 zh_CN.UTF8,这与您之前提到的一致。
  2. 客户端字符集:您提到客户端与服务器端的字符集相同,均为 zh_CN.UTF8
  3. 备份命令:您提供了备份命令,其中包含了 --all --ddl --csv 参数,这些参数分别表示备份所有表、表结构和数据以 CSV 格式输出。
  4. 错误日志:您提供的日志中并没有直接显示具体的错误信息,但是根据您的描述,错误信息为 “Error: Malformed input or input contains unmappable characters”。

解决方案建议

1. 确认字符集一致性

  • 确保客户端和服务器端的字符集设置一致。您已经确认客户端和服务器端的字符集均为 zh_CN.UTF8,这是正确的设置。
  • 确认 obdumper 工具在运行时是否正确识别了字符集。您可以尝试在 obdumper 命令中显式指定字符集,例如通过 --character-set=zh_CN.UTF8 参数。

2. 检查表结构

  • 确认中文表名在数据库中的实际字符集。可以通过查询表结构来确认,例如使用 DESCRIBE table_name; 命令。
  • 如果表名确实使用了 zh_CN.UTF8 字符集,那么问题可能出现在 obdumper 对表名的处理上。

3. 更新 obdumper 版本

  • 您当前使用的 obdumper 版本为 4.3.1,建议检查是否有更新版本可用。较新版本的工具可能已经修复了字符集相关的问题。
  • 如果有更新版本,尝试升级 obdumper 并重新进行备份操作。

4. 使用 set names 设置字符集

  • 在备份之前,尝试使用 set names zh_CN.UTF8; 来设置当前会话的字符集,确保整个备份过程中字符集的一致性。

5. 收集诊断信息

  • 您可以使用 obdiag 工具来收集详细的诊断信息,以便进一步分析问题原因。请参考您提供的链接中的指南来执行该操作。

示例命令

如果您决定尝试在备份命令中显式指定字符集,可以使用以下命令作为参考:

/usr/local/ob-loader-dumper/bin/obdumper -h ${DB_HOST} -u ${BAK_USER} -P"${DB_PORT}" -p ${BAK_PWD} --sys-user ${BAK_USER} --sys-password ${BAK_PWD} -t ${BAK_TEN} -c ${BAK_CLS} -D ${DB_NAME} --all --ddl --csv -f "${BAK_PATH}" --character-set=zh_CN.UTF8 --thread 2 2>&1 1>>"${BAK_LOG}"

请注意,上述命令中的 --character-set=zh_CN.UTF8 参数是新增加的,用于显式指定字符集。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多的错误日志信息以便进一步分析。

具体信息可参考以下文档:

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

  1. 您是在使用哪个工具或命令来进行备份操作的?

obdumper

  1. 备份命令的具体参数是什么?
/usr/local/ob-loader-dumper/bin/obdumper -h ${DB_HOST} -u ${BAK_USER} -P"${DB_PORT}" -p ${BAK_PWD} --sys-user ${BAK_USER} --sys-password ${BAK_PWD} -t ${BAK_TEN} -c ${BAK_CLS} -D ${DB_NAME} --all --ddl --csv -f "${BAK_PATH}"  --thread 2 2>&1 1>>"${BAK_LOG}"
  1. 是否尝试过更改系统的字符集设置,例如通过环境变量或配置文件?

系统字符集需要改成什么zh_CN.utf8不行吗?请具体描述需要执行哪些操作?

  1. 您能否提供更多关于错误发生的上下文信息,例如完整的错误日志或错误发生前的操作步骤?
    日志已经在原文中粘贴

服务器目前有中文的地方 会不会乱码 这个应该和你服务器字符集有关系
locale -a |grep “zh_CN” 截个图
date命令 截个图

1、操作系统中文没有问题
image

2、locale -a | grep "zh_CN" 命令
image

3、date 命名
image

你查一下 你导出的文件的编码 是什么
file --mime-encoding 文件名

由于报错的那个备份任务报错了,没有找到对应的输出文件,我找了一个备份成功输出的文件
image

备份的文件内容乱码不 只有文件名乱码么?

image
只要备份成功就不乱码

这个跟ob server的版本有没有关系

目前没有人反应这个问题 应该和observer的版本没有关系 基本导出乱码 要么是服务器字符集 要么就是数据库的客户端字符集和库字符集的关系 看着都是没有问题的

这么幸运么,第一个反馈这个问题的人。

你的obdumper用的那个版本的 发一下 还有就是服务的版本号 这边反馈一下

Version: 4.3.1-RELEASE
image

好的