我希望我能得到一个明确的答案,说明如何确保像使用 MS SQL Server 一样进行完整的 Postgres 备份,然后照顾孤立的用户。
从我读过的内容来看,这可能是错误的,找到一个好的 PostgreSQL 博客一直很有挑战性,所以请随时向我推荐一些,我需要弄清楚这个应用程序是如何工作的,这样我才能信任我的备份和 Slony复制。我让一位开发人员在选择s 时通过custom,directory和tarformat恢复了我从 PgadminIII 获取的备份,OID但他说其中两个没有加载,tar但它只是目录,而不是数据。我现在真的很困惑。
pg_dump和pg_dumpall选项。我想回到一切了,我需要测试恢复这个数据库的地方,并确认是的,我们需要的所有数据和我们的备份是好的。最终我想写一个自动恢复脚本,但一天一次。pg_dumpall显然有一个-globals应该备份所有内容的选项,但帮助pg_dumpall显示了一个-g, --globals-only dump only global objects, no databases,而不是一个--globals选项。
我认为pg_dumpall至少会备份外键,但即使这样似乎也是一个“选项”。根据文档,即使pg_dumpall我需要使用一个-o选项来备份外键,我也无法想象什么时候我不想备份外键,而这作为默认选项更有意义。
我有一个 PostgreSQL 服务器,但我仍然无法理解为什么该应用程序OID默认情况下不会备份s!似乎 99.9% 的情况下您都希望如此。
更新1:
Postgres文档提到globals我正在寻找的选项似乎是此版本的默认选项,但它仍然需要该-o选项。如果有人可以验证或给我一个示例命令来恢复其他地方的单个数据库及其所需的一切,我将不胜感激。
编辑:被网站要求通过编辑我的问题来显示这个问题的独特性。这个问题提出了这个问题,并明确了备份中的 OID、全局和非全局之间的区别,以及测试恢复建议以确保备份是好的,而不是仅仅备份。由于这些答案,我能够备份、找出全局变量/oids,并使用 cron 作业在 …
我正在使用 PostgreSQL 9.1 并希望恢复使用pg_dump以下命令生成的备份文件:
sudo pg_dump -h 127.0.0.1 -U postgres --clean --inserts -E UTF8 -f out.sql database_name
Run Code Online (Sandbox Code Playgroud)
该命令生成一个有效的 sql 文件,首先删除任何现有的数据库对象,然后生成所有表、索引、序列等,最后插入数据。
当我尝试使用以下方法恢复生成的备份文件时:(添加换行符仅用于显示目的)
sudo pg_restore
-d database_name -h 127.0.0.1 -U postgres
--format=c --clean --create out.sql
Run Code Online (Sandbox Code Playgroud)
它失败并打印:
pg_restore: [archiver] did not find magic string in file header
Run Code Online (Sandbox Code Playgroud)
这是什么原因?
我已经获得了我的 PostgreSQL 数据库的转储:
pg_dump -U user-name -d db-name -f dumpfile
Run Code Online (Sandbox Code Playgroud)
然后我继续在另一个数据库中恢复:
psql X -U postgres -d db-name-b -f dumpfile
Run Code Online (Sandbox Code Playgroud)
我的问题是数据库包含引用约束、检查和触发器,其中一些(特别是检查)在恢复过程中失败,因为信息没有按照会导致这些检查得到遵守的顺序加载。例如,在表中插入一行可能与CHECK调用一个plpgsql函数相关联,该函数检查某个条件是否在某个其他不相关的表中成立。如果后者没有psql在前者之前加载,则会发生错误。
下面是一个 SSCCE,它产生了这样一个一旦转储pg_dump就无法恢复的数据库:
CREATE OR REPLACE FUNCTION fail_if_b_empty () RETURNS BOOLEAN AS $$
SELECT EXISTS (SELECT 1 FROM b)
$$ LANGUAGE SQL;
CREATE TABLE IF NOT EXISTS a (
i INTEGER NOT NULL
);
INSERT INTO a(i) VALUES (0),(1);
CREATE TABLE IF NOT EXISTS b (
i INTEGER NOT NULL
);
INSERT INTO …Run Code Online (Sandbox Code Playgroud) postgresql database-design postgresql-9.1 pg-dump check-constraints
有没有办法查看pg_dump大数据库(即> 1GB)上的操作进度?添加-v选项只会在屏幕上转储文本,但不会给我太多有意义的跟踪信息。
这是在 9.3 上,但我记得自 7.x 以来发生过类似的事情。所以我创建了数据库并在其中安装了 plpgsql 扩展。后来我创建了一个 pg_dump,在将它恢复到数据库之前,我确保它也有 plpgsql 扩展名。然后在恢复时会发生这种情况:
pg_restore: creating EXTENSION plpgsql
pg_restore: creating COMMENT EXTENSION plpgsql
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2053; 0 0 COMMENT EXTENSION plpgsql
pg_restore: [archiver (db)] could not execute query: ERROR: must be owner of extension plpgsql
Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
Run Code Online (Sandbox Code Playgroud)
我正在创建一堆脚本,pg_restore 返回 0 对我来说非常重要,所以我可以忽略这一点这一事实没有任何好处。让我感到困惑的是 IIRC 我需要以 postgres 主用户的身份创建扩展,所以我不知道为什么所有这些扩展的东西最终都在我的转储中。毕竟,我不是语言/扩展的所有者?
无论如何,对于如何摆脱这种情况的任何建议,我将不胜感激。请注意,我知道 -l/-L 开关是如何工作的。然而,仅仅纠正一个简单的扩展注释似乎需要付出太多努力。
我正在尝试在没有接收数据库上的适当角色的情况下恢复转储。
如前所述这里也是在这里,你需要有--no-owner作为一个选项,无论是在pg_dump或pg_restore或两者兼而有之。
我使用以下命令行来创建我的转储:
"C:\Program Files\PostgreSQL\9.3\bin\pg_dump.exe" --no-owner -Ft --dbname=postgresql://avo******:AV0******?@127.0.0.1:5432/BI_DB > K:\BI\backup\sort\bck_%timestamp%.tar
Run Code Online (Sandbox Code Playgroud)
恢复线如下:
"C:\Program Files\PostgreSQL\9.3\bin\pg_restore.exe" --host localhost --port 5432 --username "postgres" --dbname "BI_TEST2" --no-password --no-owner --role=postgres --exit-on-error --verbose "D:\D\avo\backup\bck_04042017_1410.tar"
Run Code Online (Sandbox Code Playgroud)
如您所见,两者都有--no-owner选择,但最终出现以下错误:
最让我烦恼的是下面的日志:
pg_restore: [programme d'archivage (db)] Erreur pendant le traitement de la TOC (« PROCESSING TOC ») :
pg_restore: [programme d'archivage (db)] Erreur à partir de l'entrée TOC 2633 ; 0 0 ACL adm avo******
pg_restore: [programme d'archivage (db)] could not …Run Code Online (Sandbox Code Playgroud) 我已经从带有--data-only和--column-inserts标志的生产服务器创建了一个新的数据库转储,因此在登台服务器上执行还原时,我只有一堆插入语句来插入数据。
pg_dump -h localhost -U adminuser --data-only --column-inserts maindb > maindb.sql
Run Code Online (Sandbox Code Playgroud)
在从生产转储恢复数据之前,如何首先删除登台服务器数据库中的所有数据?
我只想删除所有数据,这样我就不必删除和创建数据库和所有这些东西。我只想删除数据并插入新数据。
由于多种原因,我无法选择删除和创建数据库。我将不得不删除所有数据并仅插入,因此无论需要找到如何执行此操作,我都愿意去做,但显然需要帮助才能开始。
我还需要自动化这个过程。将自动“从生产数据库转储数据”,然后“删除暂存数据库上的数据”,然后“将数据恢复到暂存数据库”。我只需要“删除暂存数据库上的数据”部分的帮助。
我在 PostgreSQL 9.5.2 上运行
我有一些难以计算的物化视图,我希望能够使用实际存储的数据进行备份和恢复,而不是通过重新计算。
在 PostgreSQL 9.4 中可能吗?
(另一种方法是创建实际表,但它们更难“刷新”)
我正在使用 PostgreSQL 9.3pg_dump工具仅使用以下方法提取公共模式定义:
pg_dump -s -n public -h host -U postgres --dbname=db > ./schema.sql
Run Code Online (Sandbox Code Playgroud)
但是当我检查时schema.sql,我们的一个观点出现在CREATE TABLE声明中而不是CREATE VIEW声明中。
但是,如果我pg_dump使用以下特定视图:
pg_dump -s -t myview -h host -U postgres --dbname=db > ./schema.sql
Run Code Online (Sandbox Code Playgroud)
然后schema.sql包含实际的视图定义。
那么,为什么会发生这种情况?谢谢你们!
在从 恢复数据库时pg_dump,会产生许多错误,随后整个表都会被忽略。一个例子:
ERROR: insert or update on table "channelproducts" violates foreign key constraint "fk_rails_dfaae373a5"
DETAIL: Key (channel_id)=(1) is not present in table "channels".
Run Code Online (Sandbox Code Playgroud)
有趣的是,我注意到所有这些实例都是由于加载顺序而弹出的。channels是channelproducts按字母顺序和在文件中之后,因此我可以理解为什么 postgres 抱怨必须创建一个没有父母的孩子。
警告:外键是由 rails 4.2 自动生成的:我可以从源头上删除问题,但这仍然没有真正解决问题......
版本:PostgreSQL 9.4.4。
psql如果已经创建了数据库表和列,那么如何从外键约束的情况中恢复?