PostgreSQL 不同版本的保留字不同引发的逻辑备份异常处理 - pg_dump ERROR: syntax error at or near old

less than 1 minute read

背景

使用pg_dump 9.0.1版本导出PostgreSQL 8.4.2,当备份到某个表时报了一个错误.

pg_dump: SQL command failed  
pg_dump: Error message from server: ERROR:  syntax error at or near "old"  
LINE 1: ...erid, create_time, update_time, showvote, isshow, old, showi...  
                                                             ^  
pg_dump: The command was: COPY wapmarket.topics (id, title, content, orderid, create_time, update_time, showvote, isshow, old, showindex) TO stdout;  
pg_dump: *** aborted because of error  

排查过程如下:

1. 在8.4.2数据库服务端登录到psql命令行下面,

postgres=# create table tbl_test (old boolean);  
ERROR:  syntax error at or near "old"  
LINE 1: create table tbl_test (old boolean);  
                               ^  
postgres=# create table tbl_test ("old" boolean);  
CREATE TABLE  
postgres=# select old from tbl_test;  
ERROR:  OLD used in query that is not in a rule  
LINE 1: select old from tbl_test;  
               ^  
postgres=# select "old" from tbl_test;  
 old   
-----  
(0 rows)  

在PostgreSQL8.4 版本中old作为关键字使用,查询时必须使用双引号。

COPY也是一样,

postgres=# copy tbl_test (old) to stdout;  
ERROR:  syntax error at or near "old"  
LINE 1: copy tbl_test (old) to stdout;  
                       ^  
postgres=# copy tbl_test ("old") to stdout;  
postgres=#   

2. 在PostgreSQL9.0.1数据库服务端中登录到psql环境再测试一遍,

rmt_rescue=> create table tbl_test (old boolean);  
CREATE TABLE  
rmt_rescue=> select old from tbl_test;  
 old   
-----  
(0 rows)  

不需要加双引号,

因此使用9.0.1的pg_dump导出8.4的数据库遇到old字段会报错.

解决办法是使用8.4的pg_dump导出8.4的数据库

Flag Counter

digoal’s 大量PostgreSQL文章入口