pg_restore --clean 不会删除和清除数据库

kai*_*enx 10 postgresql

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

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

我在 rds 上使用 9.5

这是我们使用的完整命令

pg_restore --verbose --clean --no-acl --no-owner -h localhost -U superuser -d mydatabase backup.dump
Run Code Online (Sandbox Code Playgroud)

基本上正在发生的事情是这样的。

我每晚对我的生产数据库进行备份,并将其恢复到分析数据库,以便分析师搅动和运行他们的报告。

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

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

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

Evg*_*lev 10

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

选项 1:删除整个架构 您将需要重新创建架构及其权限。这通常仅适用于开发机器。

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
Run Code Online (Sandbox Code Playgroud)

应用程序通常使用“公共”模式。使用(旧)应用程序的数据库时,您可能会遇到其他模式名称。请注意,对于 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 $$;
Run Code Online (Sandbox Code Playgroud)

原来的:

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