删除 Postgres 数据库中的所有数据

ube*_*ebu 17 postgresql pg-dump postgresql-9.5

我已经从带有--data-only--column-inserts标志的生产服务器创建了一个新的数据库转储,因此在登台服务器上执行还原时,我只有一堆插入语句来插入数据。

pg_dump -h localhost -U adminuser --data-only --column-inserts maindb > maindb.sql
Run Code Online (Sandbox Code Playgroud)

在从生产转储恢复数据之前,如何首先删除登台服务器数据库中的所有数据?

我只想删除所有数据,这样我就不必删除和创建数据库和所有这些东西。我只想删除数据并插入新数据。

由于多种原因,我无法选择删除和​​创建数据库。我将不得不删除所有数据并仅插入,因此无论需要找到如何执行此操作,我都愿意去做,但显然需要帮助才能开始。

我还需要自动化这个过程。将自动“从生产数据库转储数据”,然后“删除暂存数据库上的数据”,然后“将数据恢复到暂存数据库”。我只需要“删除暂存数据库上的数据”部分的帮助。

我在 PostgreSQL 9.5.2 上运行

a_h*_*ame 32

您不必删除数据库,这应该足以放下所有对象数据库中。这可以使用

drop owned by adminuser
Run Code Online (Sandbox Code Playgroud)

如果再创建SQL转储,包括create table报表(所以没有--data-only选项)一切都应该罚款。

你也可以去掉--column-inserts的话,这将使进口一个很大更快。


但是,如果您确实想删除所有内容,则可以使用一点动态 SQL 来完成:

do
$$
declare
  l_stmt text;
begin
  select 'truncate ' || string_agg(format('%I.%I', schemaname, tablename), ',')
    into l_stmt
  from pg_tables
  where schemaname in ('public');

  execute l_stmt;
end;
$$
Run Code Online (Sandbox Code Playgroud)

这将public使用单个语句截断模式中的所有表,即使有许多外键约束连接所有表,该语句也将起作用。如果您的表分布在多个架构上,则需要将它们添加到where条件中。


Joi*_*dio 6

pg_restore 有一个 --clean 标志(或者可能是 --create),它会在运行操作之前自动删除数据..

优秀的文档应该对你有很大帮助......

只是为了澄清,以防混淆:

在重新创建数据库对象之前清理(​​删除)它们。(除非使用 --if-exists,否则如果目标数据库中不存在任何对象,则这可能会生成一些无害的错误消息。)

这不会删除实际的数据库......只删除表/视图/等。

如果由于某种原因,删除和重新创建表是不可接受的,那么您将不得不做更多的工作来手动创建一个脚本,该脚本data only从源数据库、问题TRUNCATEDELETE目标数据库中创建转储,然后加载数据转储。据我所知,没有快速/巧妙的方法可以做到这一点。