pg_dump - 名称中包含特殊字符的转储模式

pg_dump - Dump schema with special characters in the name

我们正尝试在我们的多租户应用程序上为每个数据库架构创建一个备份文件。

我们得到架构名称列表,执行如下操作:

$ psql -d PG_DATABASE -t -c "select schema_name from information_schema.schemata;" | grep 'tenant_'

然后在执行每个模式的备份时:

$ pg_dump -d PG_DATABASE --format=plain -n SCHEMA_NAME -f output.sql

但是我们遇到了 UTF-8 模式名称的问题,例如 tenant_eléctrico:

$ pg_dump -d PG_DATABASE --format=plain -n "tenant_eléctrico" -f output.sql
pg_dump: last built-in OID is 16383
pg_dump: [archiver (db)] query failed: ERROR:  invalid byte sequence for encoding "UTF8": 0xe3 0xa9 0x63
pg_dump: [archiver (db)] query was: SELECT oid FROM pg_catalog.pg_namespace n
WHERE n.nspname OPERATOR(pg_catalog.~) '^(tenant_el�ctrico)$'

我们已经尝试过使用和不使用引号(单引号和双引号),尝试将特殊字符转义为十六进制...没有任何好的结果。

如何使用包含 UTF-8 有效字符的模式名称调用 pg_dump? 我目前使用的是 PostgreSQL 9.6.15。

我们可能会在不久的将来删除那些特殊字符,但如果有办法同时进行这些备份,那就太好了。

提前致谢!

报错信息莫名其妙

é 的 UTF-8 编码是 C3 A9,我无法想象有什么可以将它变成 E3 A9。知道您的语言环境会很有趣。

无论如何,解决方法是使用通配符:

pg_dump -d PG_DATABASE --format=plain -n 'tenant_el*ctrico' -f output.sql

看来我们找到了答案!

我们 运行 在 bash 脚本或控制台本身中,引号由 shell 解释,而不是直接传递给 pg_dump, 正如它对特殊字符所期望的那样。

解决方案是转义引号本身:

$ pg_dump -d PG_DATABASE --format=plain -n \'tenant_eléctrico\' -f output.sql

或:

$ pg_dump -d PG_DATABASE --format=plain -n '"tenant_eléctrico"' -f output.sql