将 pg_restore 用于多个转储时管理外键
Managing foreign keys when using pg_restore with multiple dumps
我有一个奇怪的问题。我们试图为我们的本地环境创建一个数据库基线,其中预先植入了非常具体的数据。我们希望确保每个人都在使用相同的数据进行操作,从而使协作和审查代码变得更加简单。
我的想法是 运行 每当我们 运行 迁移或决定本地开发需要一个新帐户时转储数据库的命令。这个问题是数据库转储大约 17MB。我试图避免我们每次更新数据库时都必须向 GitHub 添加一个 17MB 的文件。
所以我能想到的最好的解决方案是设置一个脚本来将每个人 table 转储到数据库中。这样,如果更新单个 table,我们只会将该备份推送到 GitHub,并且它会更多地沿着 ~200kb 文件而不是 17mb。
我运行遇到的主要问题是尝试恢复数据库。使用完整转储,处理外键相对简单,因为它全部在单个恢复命令中完成。但是随着多次恢复,它变得有点复杂。
我正在寻找一种方法将所有 table 恢复到数据库,忽略触发器和约束,然后在填充数据后再次启用它们。 (或者根据外键定义的顺序找到一种导出 table 的方法)。有很多 table 可以使用,因此手动执行此操作会有点困难。
如果我 disabled/re-enable 约束,我还担心数据库的关系完整性。任何帮助或建议将不胜感激。
现在我运行在每个 table:
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));
}
}
这显然行不通,因为我遇到了很多 "Relationship doesn't exist" 错误。我想我只是在寻找一种更好的方法来实现这一目标。
我会将 table 数据和数据库元数据分开。
使用
创建一个预和post数据脚本
pg_dump --section=pre-data -f pre.sql mydb
pg_dump --section=post-data -f post.sql mydb
然后仅转储每个 table:
的数据
pg_dump --section=data --table=tab1 -f tab1.sql mydb
要恢复数据库,先恢复pre.sql
,然后恢复所有table数据,然后post.sql
。
pre- 和 post- 数据会经常变化,但它们并不大,所以这应该不是问题。
我有一个奇怪的问题。我们试图为我们的本地环境创建一个数据库基线,其中预先植入了非常具体的数据。我们希望确保每个人都在使用相同的数据进行操作,从而使协作和审查代码变得更加简单。
我的想法是 运行 每当我们 运行 迁移或决定本地开发需要一个新帐户时转储数据库的命令。这个问题是数据库转储大约 17MB。我试图避免我们每次更新数据库时都必须向 GitHub 添加一个 17MB 的文件。
所以我能想到的最好的解决方案是设置一个脚本来将每个人 table 转储到数据库中。这样,如果更新单个 table,我们只会将该备份推送到 GitHub,并且它会更多地沿着 ~200kb 文件而不是 17mb。
我运行遇到的主要问题是尝试恢复数据库。使用完整转储,处理外键相对简单,因为它全部在单个恢复命令中完成。但是随着多次恢复,它变得有点复杂。
我正在寻找一种方法将所有 table 恢复到数据库,忽略触发器和约束,然后在填充数据后再次启用它们。 (或者根据外键定义的顺序找到一种导出 table 的方法)。有很多 table 可以使用,因此手动执行此操作会有点困难。
如果我 disabled/re-enable 约束,我还担心数据库的关系完整性。任何帮助或建议将不胜感激。
现在我运行在每个 table:
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));
}
}
这显然行不通,因为我遇到了很多 "Relationship doesn't exist" 错误。我想我只是在寻找一种更好的方法来实现这一目标。
我会将 table 数据和数据库元数据分开。
使用
创建一个预和post数据脚本pg_dump --section=pre-data -f pre.sql mydb
pg_dump --section=post-data -f post.sql mydb
然后仅转储每个 table:
的数据pg_dump --section=data --table=tab1 -f tab1.sql mydb
要恢复数据库,先恢复pre.sql
,然后恢复所有table数据,然后post.sql
。
pre- 和 post- 数据会经常变化,但它们并不大,所以这应该不是问题。