PostgreSQL - 错误:"类型为bytea"的输入语法无效;

时间:2015-02-20 14:52:32

标签: postgresql

我对PostgreSQL很新,所以如果问题是基本的,我会道歉。

在PostgreSQL数据库恢复期间,从sql文件中,我收到错误“类型为bytea的输入语法无效”,我相信数据不会复制到表中,即表是空的。

这是错误消息:

    2015-02-20 08:56:14 EST ERROR:  invalid input syntax for type bytea
    2015-02-20 08:56:14 EST CONTEXT:  COPY ir_ui_menu, line 166, column web_icon_data: "\x6956424f5277304b47676f414141414e5355684555674141414751414141426b43414d41414142485047566d4141414143..."
2015-02-20 08:56:14 EST STATEMENT:  COPY ir_ui_menu (id, parent_id, name, icon, create_uid, create_date, write_date, write_uid, web_icon_data, web_icon, sequence, web_icon_hover, web_icon_hover_data) FROM stdin;

数据库备份转储的创建方式如下:

pg_dump -U user_name database_name -f backup_file.sql

数据库恢复完成如下:

psql -U user_name -d destination_db -f backup_file.sql

源数据库(从中获取备份)是一台服务器上的PostgreSQL版本9.1.15,另一台服务器上的目标(恢复到)数据库是PostgreSQL 8.3.4。

有什么办法可以解决这个问题吗?在此先感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

将较新版本的Postgres中的转储恢复到较旧版本通常会出现问题,并且没有我所知道的自动化方式。完成这项工作很可能需要手动编辑转储文件。

具体来说,Postgres 9.0更改了与bytea一起使用的转义字符串的处理:在\等常规字符串文字中处理'\'的先前版本作为转义字符,而较新的版本使用{ {3}} E'\'

答案 1 :(得分:4)

如果您可以访问9.X服务器配置,则可以在postgresql.conf上将bytea_output变量更改为'escape':

bytea_output = 'escape'                 # hex, escape

然后重新启动Postgres 9.X服务器并正常转储数据库。最后,在8.X服务器上恢复它。

您也可以仅针对数据库转储操作更改客户端连接变量,但它可能超出范围。

希望它有所帮助。

答案 2 :(得分:2)

不幸的是,PostgreSQL 9备份向后兼容,并且没有选项可以实现此兼容性。几个小时以来我一直坚持这个问题。

你需要弄清楚哪些语句不兼容,并在PostgreSQL 8中找到它们的等价物(如果有的话)。

另一种选择,更好的选择是将v8升级到最新的v9。