pg_dump — Схема дампа со специальными символами в имени

Мы пытаемся создать файл резервной копии для каждой схемы базы данных в нашем многопользовательском приложении.

Мы получаем список имен схем, выполняя что-то вроде:

$ 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)$'

Мы уже пробовали с кавычками и без них (одинарные и двойные кавычки), пытаясь экранировать специальный символ как шестнадцатеричный... без какого-либо хорошего результата.

Как я могу вызвать pg_dump с именем схемы, которое включает допустимые символы UTF-8? На данный момент я использую PostgreSQL 9.6.15.

Возможно, мы удалим эти специальные символы в ближайшем будущем, но если пока есть способ сделать эти резервные копии, было бы здорово.

Заранее спасибо!


person odarriba    schedule 14.01.2020    source источник


Ответы (2)


Сообщение об ошибке необъяснимо.

Кодировка UTF-8 для é — это C3 A9, и я не могу представить ничего, что превратило бы ее в E3 A9. Было бы интересно узнать ваш регион.

В любом случае, обходным путем было бы использование подстановочного знака:

pg_dump -d PG_DATABASE --format=plain -n 'tenant_el*ctrico' -f output.sql
person Laurenz Albe    schedule 14.01.2020

Кажется, мы нашли ответ!

Мы запускали это внутри сценария bash или в самой консоли, и кавычки интерпретировались оболочкой, а не передавались напрямую в pg_dump, как это ожидается для специальных символов.

Решением было избежать самих кавычек:

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

or:

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