首页 > 数据库 >KingbaseES数据库导入数据invalid byte sequence for encoding

KingbaseES数据库导入数据invalid byte sequence for encoding

时间:2023-09-19 18:44:05浏览次数:52  
标签:文件 en UTF LC encoding sequence 字符集 US KingbaseES

一、适用版本:

KingbaseES数据库所有版本。

二、问题现象:

使用备份的数据进行还原,还原过程中发生异常。

日志信息:

sys_restore: connecting to database for restore
sys_restore: creating TABLE "public.table_name"
sys_restore: creating COMMENT "public.COLUMN table_name.com_ied_id"
sys_restore: processing data for table "public.table_name"
sys_restore: while PROCESSING TOC:
sys_restore: from TOC entry 8461; 0 71471 TABLE DATA table_name public
sys_restore: error: COPY failed for table "fes_dig": ERROR:  invalid byte sequence for encoding "UTF8": 0xe5 0x85 0x7a
CONTEXT:  COPY fes_dig, line 52184
sys_restore: creating CONSTRAINT "public.table_name table_name_pkey"
sys_restore: creating INDEX "public.dig_index_pathname"
sys_restore: creating INDEX "public.table_name_index"

主要错误信息:

sys_restore: error: COPY failed for table "fes_dig": ERROR:  invalid byte sequence for encoding "UTF8": 0xe5 0x85 0x7a

三、问题排查:

确认备份环境字符集与还原目标数据库主机、数据库字符集一致(还原文件在数据库服务器主机):

1.登录数据库服务器执行以下命令检查:

$ env | grep LANG
LANG=en_US.UTF-8
$ localectl 
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

保证备份、还原系统字符集一致。

2.登录数据库检查以下参数:

$ ksql -Usystem -dtest -p5432
ksql (V8.0)
Type "help" for help.

test=# show server_encoding ;                                                        
 SERVER_ENCODING 
-----------------
 UTF8
(1 row)

test=# show client_encoding ;
 CLIENT_ENCODING 
-----------------
 UTF8
(1 row)

确认数据库server_encoding、client_encoding跟备份环境的字符集一致。

3.在系统查询文件编码:

$ file -i 文件名
xx.xx: text/plain; charset=utf-8

确保文件charset跟还原数据库字符集一致。

4.查询文件内容是否有乱码或者无效字符:

linux系统:使用vim、cat、less、more进行文件内容查看:

$ cat fes_dig.sql |grep -i 721279627966801
匹配到二进制文件 (标准输入)
$ cat fes_dig.sql |grep -a 721279627966801
721279627966801 1       0       41      41      1       #A套检修压板投入开入_Z.开▒zzz    1103000000000929161   

如上,尽量使用vim、cat、less、more..等4条命令分别查询文件内容,看看是否存在乱码或者无效的数据。

windows系统:使用Notpad++类似的工具进行文件内容查看:

#A套检修压板投入开入_Z.开▒zzz
XE5X85

如上,确保文件内容里面不包含以上示例无效数据。

四、问题解决:

场景1:备份库系统字符集与数据库字符集不一致:

解决方法:修改备份库系统字符集与数据库字符集一致,重新备份然后再进行还原。

场景2:还原目标库系统字符集与数据库字符集不一致:

解决方法:修改还原目标库系统字符集与数据库字符集一致,重新进行还原。

场景3:备份文件字符集与数据库字符集不一致:

备份文件是普通的文本文件,通过ftp、scp...传输后字符集发生变化

解决方法:备份的时候指定备份文件格式为二进制格式或者选择正确的传输模式。

注意:ftp传输模式有两种:ASCII模式和二进制模式:
1.ASCII模式是将文件以文本的形式传输,每次传输一个字符。这种模式适合传输普通的文本文件,如txt、html、xml等,因为它可以根据不同的操作系统自动调整换行符和回车符。
2.二进制模式是将文件以二进制的形式传输,因为二进制传输可以保持文件的原始格式和内容。

使用错误的传输模式,可能会导致以下问题:

1.如用ASCII模式传输二进制文件,可能会丢失一些重要的字节信息;

2.如果用二进制模式传输文本文件,可能会出现换行符和回车符不匹配的问题。

因此在使用ftp命令进行文件传输时,需要根据文件的类型选择合适的传输模式。

默认情况下,ftp命令使用ASCII模式进行传输。如果要切换到二进制模式,可以在ftp命令后输入binary命令。

场景4:文件内容出现乱码或者无效字符:

1.文件内容出现乱码:

解决方法:尝试使用以下命令进行文件字符集转换。

iconv -f utf-8(源字符集) -t utf-8(目标字符集) 文件 > 新的文件

如果使用以上方法文件内容依旧存在乱码可能的原因如下:

数据库字符集与系统字符集不一致,由于此问题导致在备份过程中数据产生乱码。

解决方法:参考问题解决场景1。

使用了错误的传输模式导致文件在传输过程中出现损坏或者丢失了重要的字节信息。

解决方法:参考问题解决场景3。

2.文件内容出现无效字符:参考问题排查4

解决方法:尝试使用以下命令忽略无效的字符,然后重新导入。

iconv -c -f utf-8(源字符集) -t utf-8(目标字符集) 文件 > 新的文件

场景5:程序在写入数据的时候对数据进行了截断产生无效字符:

解决方法:尝试使用以下命令对程序写入数据进行截断导致产生无效字符的处理。

iconv -f utf-8(源字符集) -t utf-8(目标字符集) 文件 > 新的文件

如果是由于程序写入数据时对数据进行截断产生无效字符,需要程序这边进行处理,保证写入数据的完整性。

标签:文件,en,UTF,LC,encoding,sequence,字符集,US,KingbaseES
From: https://www.cnblogs.com/kingbase/p/17561028.html

相关文章

  • KingbaseES V8R6集群运维案例之---在线扩容节点通讯故障问题
    案例说明:KingbaseESV8R6集群节点之间通过ssh或securecmdd工具通讯,默认节点之间通过公钥和私钥方式认证,可以密码通讯;在执行集群节点扩容时,出现以下故障,节点之间仍需要输入密码进行连接:适用版本:KingbaseESV8R6一、问题分析1、测试节点securecmdd通讯如上所示:通过securec......
  • KingbaseES数据库适配Activiti7 didn't put process definition问题处理过程
    一、Activiti介绍Activiti是一个轻量级的java开源BPMN2工作流引擎.目前以升级至7.x,支持与springboot2.x集成.二、项目环境SpringBoot版本2.2.5Activiti版本7.1.x源数据库:MySQL5.7目标数据库:KinbgaseESV008R006C007B0024JDBC驱动:Postgre形态的JDBC驱动,postgresql-42.......
  • KingbaseES数据库配置Hikari数据源
    Hikari是一个高性能的数据库连接池,它是SpringBoot2.x中的默认数据源。一、下载驱动打开下面网址:选择对应平台的jdbc驱动程序。人大金仓-成为世界卓越的数据库产品与服务提供商(kingbase.com.cn)这里以x86平台为例:下载完成后目录里面包含以下文件:根据项目的JDK版本选择对应......
  • KingbaseES V8R3集群运维案例之---主库数据库服务down后failover切换详解
    案例说明:对KingbaseESV8R3集群,主库数据库服务down后,failover切换进行分析,详解其执行切换的过程,本案例可用于对KingbaseESV8R3集群failover故障的分析参考。适用版本:KingbaseESV8R3集群架构:node_id|hostname|port|status|lb_weight|role|select_cnt......
  • KingbaseES V8R6备份恢复案例之---备份crond计划任务的调整
    案例说明:在KingbaseESV8R6数据库通常备份建立的crond任务,默认由root用户建立,写入到/etc/cron.d/KINGBASECRON文件中,在有的生产环境限制了普通用户使用root的权限,创建计划任务可能失败,新的KingbaseESV8R6版本,将计划任务由数据库用户创建,比如通用机环境,将由kingbase用户创建计划......
  • KingbaseES V8R6集群部署案例之---openEuler系统脚本部署故障
    案例说明:在openEuler系统下通过脚本方式部署KingbaseESV8R6集群,脚本执行过程中,加载vip失败。本次故障问题,主要是因为openEuler系统shell和脚本的不兼容引起。适用版本:KingbaseESV8R6系统环境:openEuler-22.03-LTS一、问题现象通过脚本方式部署KingbaseESV8R6集群,脚本执......
  • KingbaseES V8R6集群运维案例之---sys_monitor.sh start启动动态库错误
    案例说明:在KingbaseESV8R6集群部署了postgis后,执行sys_monitor.shstart启动集群时,出现动态库错误,如下图所示:适用版本:KingbaseESV8R6操作系统:KylinV10Server一、问题分析1、手工执行sys_ctl启动数据库服务,启动正常。2、执行sh-xsys_monitor.shstart查看脚本启动......
  • KingbaseES V8R6集群备份恢复案例之---备份初始化“can not find primary node”故障
    案例说明:KingbaseESV8R6集群,备库作为repo-path节点,建立类型为‘cluster’模式的备份,在执行sys_backup.shinit时,出现“cannotfindprimarynode”故障。故障如下图所示:适用版本:KingbaseESV8R6一、集群及备份配置1、集群节点状态[kingbase@node101bin]$./repmgrclus......
  • KingbaseES V8R3集群运维案例---failover切换故障分析
    案例说明:KingbaseESV8R3集群主库数据库服务重启后,failover切换失败,分析failover失败的具体原因。适用版本:KingbaseESV8R3一、集群架构node13----->主库(primary)node25----->管理备库(standby)node58----->备库(standby)二、故障现象1主2备集群,172.31.*......
  • KingbaseES V8R3集群运维案例之---流复制异步同步及全同步模式配置
    案例说明:通过案例描述KingbaseESV8R3集群异步、同步及全同步强一致性配置,本案例为一主二备的架构。适用版本:KingbaseESV8R3集群架构:集群复制配置参数说明:1)sync_flag[kingbase@node101bin]$cat../etc/HAmodule.conf|grep-isync_#1->synchronouscluster,0->async......