pg_restore --clean不会丢弃并清除数据库

时间:2017-02-27 08:52:26

标签: postgresql

我遇到了pg_restore的问题 - 清理没有清除数据库。

或者我是否误解了--clean的作用,我希望它能截断数据库表并重新初始化索引/主键。

我在rds上使用9.5

这是我们使用的完整命令

pg_restore --verbose --clean --no-acl --no-owner -h localhost -U superuser -d mydatabase backup.dump

基本上发生的事情就是这个。

我对我的生产数据库进行夜间备份,并将其恢复到分析数据库,以便分析师流失并运行他们的报告。

我最近发现用于查看报告的rails应用程序抱怨已恢复的分析数据库中缺少主键。

所以我开始调查生产数据库,分析数据库等。当我意识到分析数据库中存在多个具有相同主键的行时。

我进行了一些简短的实验,并意识到每次运行pg_restore脚本时都会将重复数据插入表中,这使我认为--clean不会丢弃并恢复数据。因为如果我事先放弃架构,我不会得到重复的数据。

1 个答案:

答案 0 :(得分:0)

要从数据库中删除所有表(但保留数据库本身),您有两个选择。

选项1:删除整个架构 您将需要重新创建架构及其权限。通常这仅对开发机器就足够了。

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;

应用程序通常使用“公共”模式。使用(旧式)应用程序的数据库时,您可能会遇到其他架构名称。

请注意,对于Rails应用程序,在开发中通常可以删除和重新创建数据库本身。您可以为此使用bin / rake db:drop db:create。

选项2:分别放下每个表格 对于生产或登台服务器,首选此设置。权限可能由您的运营团队管理,并且您不想成为搞乱共享数据库群集上的权限的人。

以下SQL代码将找到所有表名,并对每个表名执行一个DROP TABLE语句。

DO $$ DECLARE
  r RECORD;
BEGIN
  FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
    EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE'; -- DROP TABLE IF EXISTS instead DROP TABLE - thanks for the clarification Yaroslav Schekin
  END LOOP;
END $$;

原文:

https://makandracards.com/makandra/62111-how-to-drop-all-tables-in-postgresql