【问题标题】:How to delete all databases on Postgres?如何删除 Postgres 上的所有数据库?
【发布时间】:2019-11-07 01:21:17
【问题描述】:

我每天使用以下方式回顾我们的 postgres 开发箱: pg_dumpall -h 127.0.0.1 -U 用户 -w | gzip blah.gz

由于 9.0 现在是候选版本,我想每天将此每日备份恢复到 postgres9.0rc1 盒子以进行测试,但我不确定如何重复编写脚本。是否有一些目录可以让我执行此操作?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您可以执行“删除集群”和“创建集群”,这将自动清除所有数据库。擦除 $PGDATA 目录中的所有数据并使用以下命令重新初始化集群:

    initdb -D /usr/local/pgsql/data
    

    【讨论】:

    • 为了清楚起见,您应该将/usr/local/pgsql/data 替换为您的$PGDATA 目录。例如,对于通过 Homebrew 安装的 PostgreSQL,它是 /usr/local/var/postgres。此外,如果您导出$PGDATA,那么您可以不带参数运行initdb。最后,请注意删除您的$PGDATA 目录是一个单独的步骤。 initdb 不是为你做的。哦,如果您的 postgres 服务器仍在运行,则删除将无法正常工作。
    【解决方案2】:

    你可以使用:

    $ pg_dropcluster 9.2 main
    $ pg_createcluster 9.2 main
    $ pg_ctlcluster 9.2 main start
    $ pg_restore -f your_dump_file
    

    其中9.2 = cluster version 和main = cluster name

    【讨论】:

    • 如果我没记错的话,这些不是标准的 Postgres 工具。
    • 这些是 debian 脚本。
    • 我建议使用 -e 'UTF-8' 标志 pg_createcluster 否则如果您想要 UTF-8 数据库并且区域设置未设置为 UTF8,您可能需要稍后进行更改。
    • 警告:这也会破坏你的 postgres 配置——我实际上只是想要一个 CLEAN 数据库,而不是清除之前优化的配置... grumble 至少它是非生产服务器。
    【解决方案3】:

    在这一点上,这个问题已经 9 年了,但它仍然是删除所有数据库的第二个谷歌结果。如果您只是想从 N DBs 转到 0 而不使用您的配置并且还需要翻阅文件系统,这是一个更好的答案:

    https://stackoverflow.com/a/24548640/3499424

    从答案来看,以下脚本将生成 N 个drop database 命令,每个非模板数据库一个:

    select 'drop database "'||datname||'";'
    from pg_database
    where datistemplate=false;
    

    从那里,您可以手动编辑和运行,或者进一步通过管道输入脚本。这是一个有点冗长的单行:

    echo \pset pager off \copy (select 'drop database "'||datname||'";' from pg_database where datistemplate=false) to STDOUT; | psql -U <user> -d postgres | <appropriate grep> | psql -U <user> -d postgres

    解释:

    1. 这是一系列管道
    2. echo \pset pager off \copy (select 'drop database "'||datname||'";' from pg_database where datistemplate=false) to STDOUT; 生成一个字符串供 psql 执行
      1. \pset pager off 确保您获得所有记录,而不是那些(54 行)废话
      2. \copy (select 'drop database "'||datname||'";' from pg_database where datistemplate=false) to STDOUT; 执行上述查询,将结果发送到 STDOUT。我们必须这样做,因为我们以\pset 为首。
    3. | psql -U <user> -d postgres 管道将字符串输入 psql 执行它。将<user> 替换为您要使用的用户
    4. | <appropriate grep> 用于剥离“寻呼机使用已关闭”行
      1. Windows 用户可以使用findstr /v "Pager" 或findstr /b "drop"
      2. *nix 用户可以使用grep 'drop'
    5. | psql -U <user> -d postgres 将生成的 drop database 命令集再次通过管道传输到 psql 中,psql 执行它们,从而删除所有数据库
    6. 警告:如果没有任何额外的过滤,此将也会删除postgres 数据库。如果您不希望发生这种情况,可以在 SELECT 或 grep 中删除它。

    【讨论】:

    • 更新接受的答案以跟上时代的步伐。
    • 这里很酷。像魅力一样工作。
    【解决方案4】:

    将数据库数据移动到其他地方可以达到与删除相同的效果,并且您可以轻松地将其移回以防您改变主意(但请务必小心并在任何情况下备份您的数据)。

    1) 在某处创建一个目录(例如/home/USERNAME/BACKUPDIR)。

    2) 以超级用户身份进入 postgresql 数据目录(Fedora 例如/var/lib/pgsql/)

    3) 将data 移动到您的备份文件夹:mv data /home/USERNAME/BACKUPDIR

    4) 然后使用例如重新初始化一个新数据库。 sudo postgresql-setup --initdb --unit postgresql

    【讨论】:

      猜你喜欢
      • 2014-08-24
      • 2012-05-22
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2017-06-30
      • 2019-02-24
      相关资源
      最近更新 更多