将pg_restore与多个转储一起使用时管理外键

时间:2019-01-17 15:19:37

标签: postgresql pg-dump cloning pg-restore

我有一个奇怪的问题。我们正在尝试为我们的本地环境创建数据库基线,该基线已预先植入了非常具体的数据。我们的希望是确保每个人都使用相同的数据进行操作,从而使协作和检查代码更加简单。

我的想法是,每当我们运行迁移或确定本地开发人员需要一个新帐户时,都运行一个命令以转储数据库。问题是数据库转储约为17MB。我试图避免每次更新数据库时都必须向GitHub添加一个17MB的文件。

因此,我能想到的最佳解决方案是设置一个脚本以转储数据库中的每个表。这样,如果一个表被更新,我们只会将该备份推送到GitHub上,它的文件大小约为200kb,而不是17mb。

与此相关的主要问题是尝试还原数据库。使用完全转储,处理外键相对简单,因为所有操作都在单个还原命令中完成。但是通过多次还原,它变得更加复杂。

我正在寻找一种将所有表还原到数据库中的方法,忽略触发器和约束,然后在填充数据后再次启用它们。 (或找到一种基于外键定义的顺序导出表的方法)。有很多表要使用,因此手动执行此操作会有些麻烦。

如果禁用/重新启用约束,我还担心数据库的关系完整性。任何帮助或建议,将不胜感激。

现在我在每个表上运行以下命令:

pg_dump postgres://user:password@pg:5432/database -t table_name -Fc -Z9 -f /data/www/database/data/table_name.bak

然后使用此命令将所有备份还原到数据库。

$data_command = "pg_restore --disable-triggers -d $dbUrl -Fc \"%s\"";
$backups = glob("$directory*.bak");
    foreach($backups as $data_file){
        if($data_file != 'data_roles.bak') {
            exec(sprintf($data_command, $data_file));
        }
    }

这显然不起作用,因为我遇到了很多“关系不存在”错误。我想我只是在寻找一种更好的方法来实现这一目标。

1 个答案:

答案 0 :(得分:0)

我将表数据和数据库元数据分开。

使用以下命令创建数据前和数据后摘要

pg_dump --section=pre-data -f pre.sql mydb
pg_dump --section=post-data -f post.sql mydb

然后仅转储每个表的数据:

pg_dump --section=data --table=tab1 -f tab1.sql mydb

要还原数据库,请首先还原pre.sql,然后还原所有表数据,然后还原post.sql

前后数据会经常更改,但是它们并不大,所以这不是问题。