最近发现一个生产库的日志频繁地抛出以下错误:
1 |
ERROR,22021,invalid byte sequence for encoding ""UTF8"" , |
数据库日志
1 |
2011-03-01 00:28:59.149 CST,"skytf","skytf",27867,"127.0.0.1:41149",4d6bcd09.6cdb,1,"idle in transaction", |
根据这个信息,猜测可能是字符集没有转换成 “utf8”,由于csv日志没有打出报错时相关的SQL语句,不好分析,于是联系开发人员,希望他们能够找出出错时间的SQL语句。开发人员非常配合,很快找到了相关SQL。
应用程序的日志
1 |
2011-02-28 14:54:26,059 /home/liweijing/skytf/gevent2/src/db.py(56): ERROR fail to batch write db. error 'ERROR: |
上面这段是开发人员贴出来的应用程序LOG,很容易发现,在向表 table_log 的字段插入数据时,host 字段的内容为乱码,即为 “????????” ,正是因为数据为乱码,才导致 PostgreSQL 频繁抛出以下错误:
1 |
ERROR,22021,invalid byte sequence for encoding ""UTF8"" |
解决方法
既然问题找出来了,解决起来就相对容易了,后来开发人员将字段 host 内容强制转换为 utf8 ,并且对服务端接收的数据进行检查,如果有非法字符,则丢弃。有了这些措施之后,数据库不再抛出类似ERROR。
原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/236374.html