我遇到了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不会丢弃并恢复数据。因为如果我事先放弃架构,我不会得到重复的数据。
答案 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