我有一个奇怪的问题。我们正在尝试为我们的本地环境创建数据库基线,该基线已预先植入了非常具体的数据。我们的希望是确保每个人都使用相同的数据进行操作,从而使协作和检查代码更加简单。
我的想法是,每当我们运行迁移或确定本地开发人员需要一个新帐户时,都运行一个命令以转储数据库。问题是数据库转储约为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));
}
}
这显然不起作用,因为我遇到了很多“关系不存在”错误。我想我只是在寻找一种更好的方法来实现这一目标。
答案 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
。
前后数据会经常更改,但是它们并不大,所以这不是问题。