--data-only
我已经使用and标志从生产服务器创建了一个新的数据库转储--column-inserts
,因此在登台服务器上执行还原时,我只有一堆插入语句来插入数据。
pg_dump -h localhost -U adminuser --data-only --column-inserts maindb > maindb.sql
在从生产转储中恢复数据之前,如何先删除登台服务器数据库中的所有数据?
我只想删除所有数据,这样我就不必删除和创建数据库以及所有这些东西。我只想删除数据并插入新数据。
由于多种原因,我无法选择删除和创建数据库。我将不得不删除所有数据并仅插入,因此无论如何找到如何做到这一点,我都愿意这样做,但显然需要帮助。
我还需要自动化这个过程。将自动“从生产数据库转储数据”,然后“删除暂存数据库上的数据”,然后“将数据恢复到暂存数据库”。我只需要“删除暂存数据库上的数据”部分的帮助。
我在 PostgreSQL 9.5.2 上运行
您不必删除数据库,删除数据库中的所有对象就足够了。这可以使用
如果您随后创建包含
create table
语句的 SQL 转储(因此没有选项--data-only
),一切都应该没问题。您也可以删除
--column-inserts
then,这将使导入更快。但是,如果您确实想删除所有内容,可以使用一点动态 SQL 来完成:
这将使用单个语句截断模式中的所有表,
public
即使有许多连接所有表的外键约束也将起作用。如果您的表分布在多个模式中,则需要在where
条件中添加它们。pg_restore 有一个 --clean 标志(或者可能是 --create),它将在运行操作之前自动删除数据。
优秀的文档应该对您有很大帮助...
只是为了澄清,以防它令人困惑:
这不会删除实际的数据库..只有表/视图/等。
如果由于某种原因,删除和重新创建表是不可接受的,那么您将不得不投入更多的工作来手动创建一个脚本,该脚本
data only
从源数据库、问题TRUNCATE
或DELETE
目标数据库中创建转储,然后加载数据转储。据我所知,没有快速/巧妙的方法可以做到这一点。上述查询将为数据库中的所有表生成截断查询。
很简单。
您可以使用 pgAdmin 来执行此操作。
注意:我的回答是关于真正删除表和其他数据库对象;对于删除表中的所有数据,即截断所有表,Endre Both 在一个月后提供了一个同样执行良好(直接执行)的语句。
对于你不能的情况
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
或者别的什么,这是我写的一个独立的 SQL 脚本,它是事务安全的(即你可以把它放在两者之间BEGIN;
,要么ROLLBACK;
只是测试它,要么COMMIT;
实际做事)和清理“所有”数据库对象......好吧,我们的应用程序使用的数据库中使用的所有对象,或者我可以明智地添加,即:CHECK
、、、UNIQUE
)VIEW
s(正常或物化)public
或 DB 内部)模式:该脚本在以“非数据库超级用户”身份运行时很有用;超级用户可以删除所有模式(但真正重要的仍然被明确排除)没有删除的是(有些是故意的;有些只是因为我在我们的数据库中没有示例):
public
用于扩展提供的东西)这对于您要恢复的转储与您要恢复到的数据库不同的数据库模式版本(例如,使用 Debian 、Flyway 或 Liquibase/DB-Manul)的情况非常有用。
dbconfig-common
我还有一个版本,它删除“除了两个表和属于它们的所有内容”(一个序列,手动测试,对不起,我知道,无聊)以防有人感兴趣;差异很小。如果有兴趣,请联系我或查看此 repo 。
SQL
在 PostgreSQL 9.6 ( ) 上经过测试,除了后来的添加(
extensions
由Clément Prévostjessie-backports
提供)。在 9.6 和 12.2 上测试了骨料去除,也在 12.2 上测试了过程去除。欢迎进行错误修复和进一步改进!另一种方法是使用 shell 脚本:
schema_migrations
如果有一个表,它不会截断表。它希望您的表名不包含双引号。第一个命令生成如下脚本:第二个执行它。