一个表的行被错误地从数据库中删除。我们有一个数据库备份,它生成一个可以像这样恢复的 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
。你应该NEVER在生产中设置它。有一个简单的方法。
'pg_restore' 有一个 '--table/-t' 选项。
pg_restore -a -t your_table /path/to/dump.sql
对远程主机使用“-h”。 查看其他选项在这里
可以在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
并恢复您需要的数据。
现在,您可以将数据加载到新表
我最近写了一篇关于如何恢复个人 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
的表,因为您很可能 will 在不同的数据库甚至模式中具有相同名称的表。
就我而言,以下
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 中只恢复一个表的数据。灵感来自 Zouppen,谢谢。
从备份纯文本 SQL 恢复表的数据,例如使用 pg_dumpall 完成。
/data/bkp/
(pg_full_bak.dmp
)cd /data/bkp/
ls -l
my_table
中提取表public
的数据到文件中my_table.sql
sed -n '/^COPY public.my__table /,/^\\\.$/p' pg_full_bak.dmp > my_table.sql
ls -l
less my_table.sql
db_name
的数据库my_table
,使用对表具有写权限的帐户psql -d db_name
select count(*) nb from my_table ;
+------+
| nb |
+------+
| 0 |
+------+
\i my_table.sql
select count(*) nb from my_table;
+-------+
| nb |
+-------+
| 9876 |
+-------+
这在 pg 9.3
下对我有用简单的方法:步骤 2、4 和 6