gpt4 book ai didi

postgresql - pg_restore --clean 没有删除和清除数据库

转载 作者:行者123 更新时间:2023-12-03 16:28:23 27 4
gpt4 key购买 nike

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

还是我误解了 --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:删除整个架构
您将需要重新创建架构及其权限。这通常仅适用于开发机器。

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
应用程序通常使用“公共(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

关于postgresql - pg_restore --clean 没有删除和清除数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42481346/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com