фон:pg_restore на столе неудачу из-за hstore
Я использую PostgreSQL 9.3.5 на Ubuntu 14.04.
После неудачного сценария у меня есть таблица, которую мне нужно восстановить из файла дампа, созданного через pg_dump. В этой таблице у меня есть триггер аудита, основанный на . wiki page. Как вы можете видеть, функция триггера использует hstore.
Ошибка:
При попытке восстановления, я получаю:
$ pg_restore -a --dbname=a193 -Fc --host=localhost --port=5434 --username=postgres -W --table=foo ~/tmp/a193.dump
Password:
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 4600; 0 26146 TABLE DATA foo u2su8s81ul0a52
pg_restore: [archiver (db)] COPY failed for table "foo": ERROR: type "hstore" does not exist
LINE 6: h_old hstore;
Расширение определенно существует.
=> \dx
List of installed extensions
+--------------------+---------+------------+--------------------------------------------------------------+
| Name | Version | Schema | Description |
+--------------------+---------+------------+--------------------------------------------------------------+
| dblink | 1.1 | public | connect to other PostgreSQL databases from within a database |
| hstore | 1.2 | public | data type for storing sets of (key, value) pairs |
| isn | 1.0 | public | data types for international product numbering standards |
| pg_stat_statements | 1.1 | public | track execution statistics of all SQL statements executed |
| pgcrypto | 1.0 | public | cryptographic functions |
| plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language |
| plpythonu | 1.0 | pg_catalog | PL/PythonU untrusted procedural language |
| postgres_fdw | 1.0 | public | foreign-data wrapper for remote PostgreSQL servers |
| uuid-ossp | 1.0 | public | generate universally unique identifiers (UUIDs) |
+--------------------+---------+------------+--------------------------------------------------------------+
(9 rows)
И я могу использовать его в запросе (как пользователь Postgres - ту же роль, как я использую выше для восстановления):
=> select current_user;
+--------------+
| current_user |
+--------------+
| postgres |
+--------------+
(1 row)
=> \du
List of roles
+----------------+------------------------------------------------+-----------+
| Role name | Attributes | Member of |
+----------------+------------------------------------------------+-----------+
| postgres | Superuser, Create role, Create DB, Replication | {} |
| u2su8s81ul0a52 | | {} |
+----------------+------------------------------------------------+-----------+
=> select 'a=>1'::hstore;
+----------+
| hstore |
+----------+
| "a"=>"1" |
+----------+
(1 row)
Вопросы:
- Почему я получаю эту ошибку, когда база данных имеет это расширение?
- За исключением того, что вы бросаете курок, как я могу обойти эту проблему? Сбрасывание триггеров не хуже в мире, но похоже, что это должно быть возможно, и в производственной базе данных я бы хотел увидеть контрольный след, что кто-то восстановил данные и т. Д.
Единственное, что я могу думать, это то, что hstore не находится в «search_path» для пользователей postgres, но для тех, кого вы входите в систему, чтобы их проверить. Попробуйте восстановить данные в файл, а не напрямую в БД и взглянуть на SQL, если вы хотите проверить. –
@RichardHuxton Я обновил свой OP, чтобы включить информацию о том, какой пользователь я зарегистрирован, когда я выбираю as (который является postgres). –
Ну, либо вы изменили приглашение по умолчанию, либо убрали права суперпользователя от «postgres», потому что это неверное приглашение для суперпользователя. –