pg_dump/pg_restore lc_collat​​e English_United States.1252 Windows Linux 迁移

Wil*_*lem 2 postgresql

我想用

pg_dump -j 8 -Fd -f /tmp/newout.dir fsdcm_external
Run Code Online (Sandbox Code Playgroud)

不转储 LC_COLLATE ('English_United States.1252'),因为它与我的 Linux 机器不兼容。

我最初通过以下过程成功迁移了 LC_COLLATE = 'English_United States.1252' 的数据库:

@Windows机器:

pg_dump postgres > "/drive/folder/options.bak"
Run Code Online (Sandbox Code Playgroud)

@Linux机器:

psql postgres < "/drive/folder/backup.bak"
Run Code Online (Sandbox Code Playgroud)

但是,我更喜欢使用“作业”进行并行转储和恢复(如复制 postgresql 数据库的更快方法(或最佳方法)),因此我尝试:

@Windows机器:

pg_dump -j 8 -Fd -f /tmp/newout.dir fsdcm_external
Run Code Online (Sandbox Code Playgroud)

@Linux机器:

pg_restore -j 8 --format=d -C -d postgres /tmp/newout.dir/
Run Code Online (Sandbox Code Playgroud)

我期望有相同的 LC_COLLATE 中性转储,但我收到了此错误:

pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 3498; 1262        
12401 DATABASE postgres postgres
pg_restore: [archiver (db)] could not execute query: ERROR:                  
invalid locale name: "English_United States.1252"
Command was: CREATE DATABASE postgres WITH TEMPLATE = template0 
ENCODING = 'UTF8' LC_COLLATE = 'English_United States.1252' 
LC_CTYPE = 'E...
Run Code Online (Sandbox Code Playgroud)

如何在 pg_dump 或 pg_restore 中指定避免复制 LC_COLLATE 设置?例如,我可以只转储表、数据和索引吗?

Lau*_*lbe 6

你的问题是-C的选项pg_restore

相反,首先创建数据库,然后在pg_restore没有以下命令的情况下运行-C

createdb fsdcm_external
pg_restore -j 8 --format=d -d fsdcm_external /tmp/newout.dir/
Run Code Online (Sandbox Code Playgroud)