表的行被错误地从数据库中删除。我们有一个db备份,它会产生一个可以像这样恢复的sql文件:
psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql
这最终会在本地进行完全恢复。但我们需要的是将单个表的行恢复为生产。有关如何使用PostgreSQL 9.1的任何提示?
由于
答案 0 :(得分:17)
我不知道有任何工具可用,但这个单行提取precious_table
文件中的my_backup.sql
:
sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql
答案 1 :(得分:10)
如果您需要单个表还原等,请不要执行SQL备份。Use pg_dump
's -Fc
option - “自定义”格式。这可以使用pg_restore
恢复。可以选择性恢复,以及各种其他方便的功能。如果需要,pg_restore
可以将自定义格式转储转换为SQL转储。
如果您遇到现有转储,您唯一的选择是:
使用文本编辑器将目标表数据提取到单独的文件中,然后将其恢复;或
将转储恢复到一次性数据库,然后使用pg_dump
进行选择性转储,包括该表。由于它是一次性的,你可以在一些卸载的快速但不安全的机器上使用一个单独的Pg实例,你可以打开所有“快点但是如果你愿意,可以吃我的数据”选项,如fsync=off
。你应该从不在生产中设置它。
答案 2 :(得分:5)
您可以在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
并恢复所需的数据。
现在,您可以将数据加载到新表中
答案 3 :(得分:2)
有一种简单的方法。
&#39; pg_restore在&#39;有一个&#39; - table / -t&#39;选项。
pg_restore -a -t your_table /path/to/dump.sql
使用&#39; -h&#39;用于远程主机。 请参阅其他选项here
答案 4 :(得分:1)
我最近编写了有关如何restore individual postgres tables的逐步指南。
简而言之,它不适用于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"
答案 5 :(得分:0)
我碰巧有pg_dumpall
转储。我想从名为users
的数据库中恢复名为edc
的表,因为您很可能将在不同的数据库甚至模式中同等地命名表。
对于我的情况,以下sed
oneliner有效:
sed -ne '/^\\connect edc/,/^\\connect/{/\susers\(\s\|$\)/,/;\|\\\./p}' pg92.dump
它的作用:
/^\\connect edc/,/^\\connect/
将搜索范围限制为我的数据库范围; {…}
将执行该范围的所有内部命令; /\susers\(\s\|$\)/
会匹配自己拥有users
的所有行,包括行尾; /;\|\\\./
与;
或包含\.
p
强制输出匹配的行(注意,使用-n
调用sed。)根据数据的复杂程度,您可能需要对此进行调整。
您所要做的就是使用正确的开关将sed
输出传递给psql
命令。
答案 6 :(得分:-1)
我写了一些命令,只从明文pg_dumpall恢复一个表的数据。受Zouppen启发,谢谢。那是给法国读者的。
Restaurer lesDONNÉESd'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 lesdonnéessont bien celles参加者
$ less ma_table.sql
表[ma_table]的基础表连接器[db_name],表[ma_table]的编码器可维护餐厅,
$ psql -d db_name
餐厅的餐桌和餐厅[ma_table] est bien vide
postgres@db_name# select count(*) nb from ma_table ; +------+ | nb | +------+ | 0 | +------+
=>进口商lesdonnéeseffacées<=
postgres@db_name# \i ma_table.sql
边疆区的重要国家/地区
postgres@db_name# select count(*) nb from ma_table ; +-------+ | nb | +-------+ | 9876 | +-------+
在pg 9.3
下对我有用简单方法:步骤2、4和6