database - 还原 Postgres 数据库时出现不重音问题

标签 database postgresql backup restore

我也想将另一个数据库名称下的特定数据库还原到另一台服务器。到目前为止,还不错。

我使用了这个命令:

pg_dump -U postgres -F c -O -b -f maindb.dump maindb

将主数据库转储到生产服务器上。我使用这个命令:

 pg_restore --verbose -O -l -d restoredb maindb.dump

将数据库还原到我们测试服务器上的另一个数据库中。它大部分恢复正常,但有一些错误,例如:

pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 3595; 1259 213452 INDEX idx_clientnomclient maindbuser
pg_restore: [archiver (db)] could not execute query: ERROR:  function unaccent(text) does not exist
LINE 1:  SELECT unaccent(lower($1)); 
                ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
QUERY:   SELECT unaccent(lower($1)); 
CONTEXT:  SQL function "cyunaccent" during inlining
Command was: CREATE INDEX idx_clientnomclient ON client USING btree (public.cyunaccent((lower((nomclient)::text))::character varying));

cyunaccent 是公共(public) shcema 中的一个函数,它确实是在恢复时创建的。

恢复后,我能够使用相同的 sql 完美地重新创建这些索引,没有任何错误。

我也曾尝试使用 pg_restore 的 -i 选项来恢复以执行单个事务,但它没有帮助。

我做错了什么?

最佳答案

我刚刚发现了问题,并且能够将其缩小为一个简单的测试用例。

CREATE SCHEMA intranet;
CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA public;
SET search_path = public, pg_catalog;
CREATE FUNCTION cyunaccent(character varying) RETURNS character varying
    LANGUAGE sql IMMUTABLE
    AS $_$ SELECT unaccent(lower($1)); $_$;
SET search_path = intranet, pg_catalog;
CREATE TABLE intranet.client (
    codeclient character varying(10) NOT NULL,
    noclient character varying(7),
    nomclient character varying(200) COLLATE pg_catalog."fr_CA"
 );
ALTER TABLE ONLY client ADD CONSTRAINT client_pkey PRIMARY KEY (codeclient);
CREATE INDEX idx_clientnomclient ON client USING btree (public.cyunaccent((lower((nomclient)::text))::character varying));

此测试用例来自以纯文本形式完成的 pg_dump。

如您所见,cyunaccent 函数是在公共(public) shcema 中创建的,因为它稍后会被其他模式中的其他表使用。

psql/pg_restore 不会重新创建索引,因为它找不到函数,尽管指定了 shcema 名称来引用它。问题出在

SET search_path = intranet, pg_catalog;

打电话。将其更改为

SET search_path = intranet, public, pg_catalog;

解决问题。我已经向 postgres 提交了关于此的错误报告,但尚未在队列中。

关于database - 还原 Postgres 数据库时出现不重音问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23939584/

相关文章:

database - 安卓数据库备份

batch-file - 有人可以向我解释这个备份脚本吗?

Android聊天——数据库架构

ruby-on-rails - 为什么我的 ActiveRecord updated_at 时间戳列默认为负无穷大?

python - SQLAlchemy 计算所有行,我想要特定行

mysql - 如何创建mysql数据库镜像以备不时之需?

php - 如何使用php一次从mysql数据库中获取一个单词

javascript - 星级评级系统。在数据库中保存率

php - 跳过获取表中不需要的数据

sql - Postgresql根据另一个字段的变化改变值