我备份了托管在 PostgreSQL 的 RDS 实例上的堆栈交换存档数据库,如下所示:
pg_dump stackexchange -h <host> -U postgres -password -o > stack.dmp
...几个小时后,我有了一个不错的 151GB 转储文件。
接下来,我将这只小狗恢复到另一个实例:
psql --set ON_ERROR_STOP=on -h <otherhost> -U postgres -d stackexchange -f stack.dmp
...大约一个小时后,它完成了,没有错误。幸福。
奇怪的是,pgadmin4 没有显示应该创建的模式,也没有显示任何表、视图等。与 psql 连接并发出 \dn 只返回公共模式。
对于傻笑,我查看了数据库的大小,它看起来正确(ish):
stackexchange=> SELECT pg_size_pretty( pg_database_size('stackexchange') );
pg_size_pretty
----------------
145 GB
(1 row)
我用 head 从转储中抓取前 50 行,一切看起来都很好:
--
-- PostgreSQL database dump
--
-- Dumped from database version 11.10
-- Dumped by pg_dump version 11.11
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
--
-- Name: stackoverflow; Type: SCHEMA; Schema: -; Owner: postgres
--
CREATE SCHEMA stackoverflow;
ALTER SCHEMA stackoverflow OWNER TO postgres;
SET default_tablespace = '';
SET default_with_oids = false;
--
-- Name: posthistory; Type: TABLE; Schema: stackoverflow; Owner: postgres
--
CREATE TABLE stackoverflow.posthistory (
id integer NOT NULL,
posthistorytypeid integer,
postid integer,
revisionguid text,
creationdate timestamp without time zone NOT NULL,
userid integer,
posttext text,
jsonfield jsonb
);
ALTER TABLE stackoverflow.posthistory OWNER TO postgres;
所以我有点难过。所有这些东西都正确执行。数据库大小合适……但没有对象。
接下来,我很好奇并尝试重新创建应该已经创建的模式(“stackoverflow”):
stackexchange=> create schema stackoverflow;
5 分钟后,我在控制台中没有得到任何响应。psql 只是坐在那里。
这听起来对任何人来说都很熟悉吗?我很困惑。关于下一步的想法?
编辑:我在 psql 上做了一个 CTRL-BREAK。结果:
stackexchange=> create schema stackoverflow;
^CCancel request sent
ERROR: canceling statement due to user request
CONTEXT: while inserting index tuple (0,12) in relation "pg_namespace_nspname_index"
您显示的
pg_dump
命令不能是您使用的命令,因为没有-o
选项,并且assword
不是有效的端口号。无论如何,您的问题是另一个问题:有一个打开的事务持有一个锁定
pg_namespace
,阻止您创建模式。调试如下:
在
psql
会话中,运行当第一个会话挂起时,启动第二个会话并运行
现在您知道哪些会话阻止了您。查看
pg_stat_activity
以了解有关这些交易的更多信息。如有必要,使用 终止它们pg_terminate_backend
。如果罪魁祸首是准备好的事务,请在其中查找条目
pg_prepared_xacts
并使用 撤消它们ROLLBACK PREPARED
。