表的行被错误地从数据库中删除。我们有一个 db 备份,它会生成一个可以像这样恢复的 sql 文件:
psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql
这最终会在本地进行完全还原。但是我们需要将单个表的行恢复到生产环境。关于如何使用 PostgreSQL 9.1 进行这项工作的任何提示?
谢谢
表的行被错误地从数据库中删除。我们有一个 db 备份,它会生成一个可以像这样恢复的 sql 文件:
psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql
这最终会在本地进行完全还原。但是我们需要将单个表的行恢复到生产环境。关于如何使用 PostgreSQL 9.1 进行这项工作的任何提示?
谢谢
我不知道有任何工具可以做到这一点,但是这个单行precious_table
从my_backup.sql
文件中提取:
sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql
如果您需要单表还原等,请不要进行 SQL 备份。使用pg_dump
'-Fc
选项- “自定义”格式。这可以使用pg_restore
. 可以进行选择性恢复,以及各种其他方便的功能。pg_restore
如果需要,可以稍后将自定义格式的转储转换为 SQL 转储。
如果您遇到现有转储,您唯一的选择是:
使用文本编辑器将目标表数据提取到单独的文件中,然后将其恢复;或者
将转储还原到一次性数据库,然后用于pg_dump
选择仅包括该表的转储。由于它是一次性的,因此您可以在一些卸载的快速但不安全的机器上使用单独的 Pg 实例,在该机器上打开所有“让它快速但如果你愿意就吃掉我的数据”选项,例如fsync=off
. 你不应该在生产中设置它。
您可以在 roder 中使用 grep + sed 来获取表数据:
首先,您需要确定边界:
$ fgrep -Ehn '^(COPY |CREATE TABLE )' db.sql
49:CREATE TABLE test (
60:CREATE TABLE test2 (
71:CREATE TABLE test3 (
82:COPY test (i) FROM stdin;
100090:COPY test2 (i) FROM stdin;
200098:COPY test3 (i) FROM stdin;
为了提取表 test2 的数据:
sed -n '100090,200097p' < db.sql | sed -e 's/^COPY test2/COPY new_table_name/' > new_table_name.sql
注意,您需要从第二个数字中减去一个(即排除下一个副本stmt)
现在,您可以加载new_table_name.sql
和恢复您需要的数据。现在,您可以将数据加载到新表中
有一个简单的方法。
'pg_restore' 有一个 '--table/-t' 选项。
pg_restore -a -t your_table /path/to/dump.sql
对远程主机使用“-h”。在此处查看其他选项
我最近写了一个关于如何恢复单个 postgres 表的分步指南。
简而言之,它不适用于 SQL 备份,您需要切换pg_dump
到生成备份文件:
pg_dump.exe --host localhost --port 5432 --username "postgres" --schema "public" --format custom --blobs --verbose --file "my_database.dump" "my_database"
然后,每当您需要恢复特定表以进行数据恢复或错误调查时,您必须:
my_database_restored
my_table
在空数据库中创建需要恢复的表pg_restore
以选择性地导入所需表的数据:pg_restore.exe -U postgres --data-only -d "my_database_restored" -t "my_table" "my_database.dump"
我碰巧有pg_dumpall
垃圾场。而且我想users
从名为的数据库中恢复名为的表edc
,因为您很可能会在不同的数据库甚至模式中拥有同名的表。
就我而言,以下sed
oneliner 有效:
sed -ne '/^\\connect edc/,/^\\connect/{/\susers\(\s\|$\)/,/;\|\\\./p}' pg92.dump
它能做什么:
/^\\connect edc/,/^\\connect/
将搜索限制在我的数据库范围内;{…}
将执行范围内的所有内部命令;/\susers\(\s\|$\)/
单独匹配所有行users
,包括行尾;/;\|\\\./
匹配包含;
或包含的行\.
p
强制输出匹配的行(注意,使用 sed 调用-n
)。根据数据的复杂性,您可能需要对此进行调整。
您所要做的就是使用正确的开关将sed
输出传送到命令。psql
我已经编写了一些命令来仅从纯文本 pg_dumpall 恢复一个表的 DATA。灵感来自 Zouppen,谢谢。这是给法国读者的。
Restaurer les DONNÉES d'une table à partir d'une sauvegarde 'plain text SQL' faite, par exemple, avec pg_dumpall
$ cd /data/bkp/ $ ls -l
$ sed -n '/^COPY public.ma_table /,/^\\\.$/p' pg_full_bak.dmp > ma_table.sql $ ls -l
s'assurer que les données Sont bien celles 出席者
$ less ma_table.sql
se connecter sur la base [db_name] contenant la table [ma_table] vide à restaurer, avec un compte ayant les droits en écriture sur la table [ma_table]
$ psql -d db_name
vérifier que la table à restaurer [ma_table] est bien vide
postgres@db_name# select count(*) nb from ma_table ; +------+ | nb | +------+ | 0 | +------+
=> 进口商 les données effacées <=
postgres@db_name# \i ma_table.sql
vérifier que les données ont bien été importées
postgres@db_name# select count(*) nb from ma_table ; +-------+ | nb | +-------+ | 9876 | +-------+
这在 pg 9.3下对我有用
最简单的方法:步骤 2、4 和 6