使用 psql 恢复时如何修复 postgresql .sql 转储文件中的语法错误?

问题描述 投票:0回答:4

我有一个由 pg_dump 在另一个 Windows 10 机器上创建的 postgresql .sql 转储文件。我正在尝试在我的 Windows 10 笔记本电脑上恢复它 “psql -U 用户 -d 数据库 -1 -f 文件名.sql”。我创建了数据库,但是当我运行命令进行恢复时,在我给它密码后,我从 psql 收到错误:

psql:filename.sql:1:1: 错误:“ÿ_”处或附近的语法错误 第 1 行:ÿ_;

该文件看起来像直的 ascii(我只在第一行看到两个破折号。我在任何地方都没有看到带有变音符号的“y”)。我用 cygwin bash 在 .sql 文件上创建了一个文件,它显示:

Little-endian UTF-16 Unicode 文本,行很长,带有 CRLF、CR 行>终止符

我真的不想手动重新创建数据库。我正在寻找任何建议。

我尝试了带或不带“-1”选项的 psql;没有运气。我尝试添加一个“;”在 sql 文件的顶部,我在某处发现了建议;再次没有运气。

我在 postgresql 安装上执行了 psql -l,所有数据库(包括我尝试恢复的数据库)上的编码都显示为 UTF8。

确实没有代码。只是我似乎无法恢复这个转储文件,因为它出错了。

我认为这解决了我的问题。我从中获取转储的 Windows 盒子现在无法使用;所以我只是希望有一种方法可以解决这个问题。我宁愿避免手动逐表重新创建数据库。

谢谢--

postgresql restore dump
4个回答
5
投票

就我而言,发生这种情况是因为我使用 Windows Powershell 进行转储,因此转储文件中包含了其他字符。 只需使用命令提示符即可解决我的问题。


1
投票

我只能为您提供如何调试问题的线索,因为原因并不是立即显而易见的。

首先,靠近转储文件开头的位置应该有一行设置

client_encoding
。转储文件应该采用该编码。

我可以看到两种可能性:

  • 文件在传输过程中被损坏。要测试这一点,请计算两个文件的校验和并进行比较。

    始终使用二进制模式传输 PostgreSQL 转储。

  • 某些编辑器或其他东西在文件的开头偷偷添加了 BOM(字节顺序标记)。

    这是我的首要怀疑,因为问题出在第 1 行。

    使用十六进制编辑器或

    od
    (在 Cygwin 中)进行验证。如果是这个问题,只需将 BOM 替换为空格即可。


0
投票

添加到this答案:使用PowerShell 7,pg_dump不存在此类编码问题。


0
投票

尝试导入 SQL 转储文件时,您可能会遇到与字符编码相关的错误。如果转储是使用 Windows PowerShell 生成的,则经常会发生这种情况,它可能使用不同的默认字符编码。

要解决此问题,您可以使用 PowerShell 将 SQL 转储文件转换为 UTF-8 编码:

  1. 在包含
    .sql
    文件的目录中打开 PowerShell,然后运行以下命令。确保将
    FILENAME
    替换为 SQL 转储文件的名称:
Get-Content -Encoding Unicode FILENAME.sql | Set-Content -Encoding UTF8 FILENAME_utf8.sql

此命令会读取 SQL 文件的内容(假设它是 Unicode 格式),然后将其写回到 UTF-8 格式的新文件中。

  1. 将文件转换为 UTF-8 后,您可以将其导入到 PostgreSQL 数据库中。将
    MYDATABASE
    替换为数据库名称,将
    FILENAME_utf8.sql
    替换为新生成的文件的名称:
psql -U postgres -d MYDATABASE -f FILENAME_utf8.sql

进行此转换的原因是 Windows PowerShell 默认情况下可能会生成 UTF-16 格式的文件,而 PostgreSQL 期望生成 UTF-8 格式的文件。上述步骤可确保您在导入之前将文件转换为预期的编码。

© www.soinside.com 2019 - 2024. All rights reserved.