【问题标题】:PostgreSQL restore error: "syntax error at or near "x"PostgreSQL 恢复错误:“x 处或附近的语法错误”
【发布时间】:2021-06-02 15:51:12
【问题描述】:

我使用以下命令获取 PostgreSQL 数据库备份:

pg_dump --encoding utf8 "host=localhost port=5432 
    dbname=employee user=postgres" > C:\backup\employee.sql

注意:我尝试了使用和不使用--encoding 参数。还尝试使用许多不同的文件格式进行备份:dumptar 等。


然后我尝试使用以下命令恢复数据库:

psql -e -h 127.0.0.1 -p 5432 -U postgres -d employee -f C:\backup\employee.sql

恢复过程中控制台有很多行,但是在这个日志的末尾,显示以下错误:

psql:C:\backup\employee.sql:1:错误:“ÿs”处或附近的语法错误 第 1 行:ÿs-ebSG:9loios3"s"des9",e3s{0LrT}0se"me"D13,mispRio""""aild{...

我该如何解决?我可能会通过conv 转换备份文件编码,但是由于我使用的是 Windows,所以我无法使用它。

更新:

  1. 我正在转储的 Postgres 版本:PostgreSQL 12.6 on x86_64-pc-linux-gnu,由 Debian clang 版本 10.0.1 编译,64 位

  2. 我要恢复到的 Postgres 版本:x86_64-pc-linux-gnu 上的 PostgreSQL 11.12 (Debian 11.12-1.pgdg90+1),由 gcc (Debian 6.3.0-18+deb9u1) 6.3.0 编译20170516, 64位

  3. 我正在使用的 pg_dump 版本:我查看了容器以检查 pg_dump 版本,但无法获取 pg_dump 文件夹。

【问题讨论】:

  • 更新您的问题以包括以下内容:1) 在源数据库和目标数据库中,\l 显示的数据库 employee 的编码是什么? 2) 错误前后的线路输出是什么?如果它在我那里,我会在恢复时删除-e。这只会产生掩盖你真正追求的东西的线条,错误。
  • 1) 源数据库:编码:UTF8,排序规则/字符类型:en_US.UTF8。源数据库是在还原过程之前创建的。 2) 一些错误,例如“pg_restore:错误:无法设置 default_table_access_method”
  • 请阅读整个评论。我要求您将此信息与目标数据库的编码一起添加到您的问题中。还要添加到问题 1)您正在转储的 Postgres 版本? 2) 您要恢复到的 Postgres 版本? 3)pg_dump你正在使用的版本?
  • @AdrianKlaver 请查看我的更新。谢谢。
  • 要获取 pg_dump 版本,请执行 pg_dump -V。此外,您的原始命令显示您在 Windows 文件系统中工作,但 Postgres 版本显示它们在 Linux 上。请解释差异。

标签: database windows postgresql restore database-backups


【解决方案1】:

这是一个经典错误,因为 PostgerSQL 无法执行二进制备份,而只能执行作为表行值副本的转储。因此,文字是提取物,而数字或日期则转换为文字。然后添加 SQL 命令以重新创建结构和 INSERT。

结果是一个文本文件,可以解释为 SQL 脚本来重构数据库。

但是这种方法是一个主要缺点...转储文件必须以正确的编码方式进行编码,以避免在读取器进程将这些字节解释为非打印命令,如回车、换行...

在SQL Server等其他数据库中没有转储,只有二进制备份,二进制页面只从备份文件替换到目标数据文件,避免了所有这些麻烦。

所以在进行转储时要小心,即使在提取数据或导入重新创建数据库时也要使用推荐的编码。

【讨论】:

  • 非常感谢,投了赞成票。您会建议一个带有必要标志的正确备份和恢复脚本,例如编码?实际上我也尝试在备份时设置编码,但它似乎无法在恢复过程中解决问题。另外,您是否建议使用dump 进行备份?我真的很困惑,因为有多种方法可以做到这一点,通常我介于pg_restorepsql 之间,尤其是恢复:(
  • 此答案包含错误信息。 Postgres 可以进行二进制备份,请参阅Pg basebackup
  • PG_basebackup 复制文件、注释页。这不是像 Oracle、SQL Server、IBM DB2 或 Sybase ASE 那样的二进制备份...
  • 没有解决方案,因为仍有未解决的问题,即正在使用哪个版本的pg_dump,OP 是在 Windows 或 Linux 中运行还是跨操作系统运行?如果没有这些答案,任何事情充其量只是猜测,请查看您的答案。
猜你喜欢
  • 2013-09-10
  • 1970-01-01
  • 2020-03-15
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
相关资源
最近更新 更多