PostgreSQL误删操作怎么处理
方式一:
PostgreSQL中没有Oracle的闪回机制,只有更加复杂的PITR恢复机制,这要求数据库有全量备份和增量备份,否则无法进行回滚。
方式二:
虽然PostgreSQL有延迟复制的技术,在备库设置recovery_min_apply_delay时间,但是数据库control信息和wal日志都已经接收到备库了,备库到了间隔时间就会进行回放。这样的情景一定情况下可以解决一些问题:我在误删除的时候,立即到备库上,将备库中原来数据备份出来解决问题。
方式三:
那么还有一种方式,使用pg_resetxlog(10之后是pg_resetwal)来重置事务ID来访问被修改的数据。
例如删除数据的xid为100,那么我们回退到99,那么删除到操作还不可见,因此就能看到被删除的数据,但是删除是已经发生的,当我们提升xid到100时,删除就生效,你将无法访问到删除的数据。
被重置的xid之后的操作还是存在,无法抹除。当在xid为99时,我们再插入一条数据,那么这个时候访问表,我们将得到原来删除了表,在插入一条记录的情况。删除和插入将在一个xid下。
因此,使用重置xid的方式,我们也必须在重置之后,将现在的表备份出来,简单方法是create test_old as select * from test;的方式来做。因为随着xid的增长,误操作也会被重现。
下面是方式三的演示,通过pg_xlogdump找到误删的事务号(xid),停止数据库,然后重置xlog,启动数据库,数据就是重置的xid位置可见。
apple=# create table test (id int);
CREATE TABLE
apple=# insert into test select generate_series(1, 10);
INSERT 0 10
apple=# select pg_current_xlog_location();
pg_current_xlog_location
--------------------------
0/9A0171F0
(1 row) apple=# delete from test where id > 5;
DELETE 5
apple=# select pg_current_xlog_location();
pg_current_xlog_location
--------------------------
0/9A017330
(1 row) apple=# \q
end main
appledeMacBook-Pro-2:pg_xlog apple$ pg_xlogdump -s 0/9A0171F0
rmgr: Heap len (rec/tot): 8/ 54, tx: 718255, lsn: 0/9A0171F0, prev 0/9A0171C8, desc: DELETE off 6 KEYS_UPDATED , blkref #0: rel 1663/16384/53529 blk 0
rmgr: Heap len (rec/tot): 8/ 54, tx: 718255, lsn: 0/9A017228, prev 0/9A0171F0, desc: DELETE off 7 KEYS_UPDATED , blkref #0: rel 1663/16384/53529 blk 0
rmgr: Heap len (rec/tot): 8/ 54, tx: 718255, lsn: 0/9A017260, prev 0/9A017228, desc: DELETE off 8 KEYS_UPDATED , blkref #0: rel 1663/16384/53529 blk 0
rmgr: Heap len (rec/tot): 8/ 54, tx: 718255, lsn: 0/9A017298, prev 0/9A017260, desc: DELETE off 9 KEYS_UPDATED , blkref #0: rel 1663/16384/53529 blk 0
rmgr: Heap len (rec/tot): 8/ 54, tx: 718255, lsn: 0/9A0172D0, prev 0/9A017298, desc: DELETE off 10 KEYS_UPDATED , blkref #0: rel 1663/16384/53529 blk 0
rmgr: Transaction len (rec/tot): 8/ 34, tx: 718255, lsn: 0/9A017308, prev 0/9A0172D0, desc: COMMIT 2019-03-28 14:36:02.475298 CST
pg_xlogdump: FATAL: error in WAL record at 0/9A017308: invalid record length at 0/9A017330 appledeMacBook-Pro-2:pg_xlog apple$ pg_ctl stop
waiting for server to shut down.... done
server stopped
appledeMacBook-Pro-2:pg_xlog apple$ pg_resetxlog -x 718255 -D ../
Transaction log reset
appledeMacBook-Pro-2:pg_xlog apple$ pg_ctl start
server starting
appledeMacBook-Pro-2:pg_xlog apple$ LOG: 00000: redirecting log output to logging collector process
HINT: Future log output will appear in directory "pg_log".
LOCATION: SysLogger_Start, syslogger.c:622 appledeMacBook-Pro-2:pg_xlog apple$ psql
argv 0 is: psql
psql will in act_filepsql (9.5.3)
Type "help" for help. apple=# select * from test;
id
----
1
2
3
4
5
6
7
8
9
10
(10 rows)
PostgreSQL误删操作怎么处理的更多相关文章
- postgresql vacuum操作
postgresql vacuum操作 PostgreSQL数据库管理工作中,定期vacuum是一个重要的工作.vacuum的效果: 1.1释放,再利用 更新/删除的行所占据的磁盘空间. 1.2更新P ...
- crontab误删操作的恢复与防范
1.crontab -r 误删操作的恢复 语句解析:crontab -e 编辑 与 crontab -r 删除,由于e, r在键盘上是紧邻的,一旦误操作 crontab -r 将会删除每个用户的定时任 ...
- git stash 的一次惊心动魄的误删操作
git stash 的一次惊心动魄的误删操作 简介:行走在互联网最低端的小熊 问题--源起: 小熊和所有混迹在互联网中的开发一样,公司里面用git来管理项目,由于可能经常有几个问题要开发,要频繁在多分 ...
- postgresql数据操作
windows下操作postgresql 删除数据库:dropdb.exe -U postgres 数据库名称 创建数据库createdb.exe -U postgres lilei_db1--lil ...
- postgreSql 常用操作总结
0. 启动pgsl数据库 pg_ctl -D /xx/pgdata start 1. 查看pgsl版本 pg_ctl --version 1. 命令行登录数据库 psql -U username -d ...
- Postgresql 字符串操作函数
样例测试: update property set memorial_no = btrim(memorial_no, ' ') where memorial_no like ' %' 或:update ...
- mysql sqlite3 postgresql 简明操作
安装 mysql $ sudo apt-get install mysql-server sqlite3 $ sudo apt-get install sqlite3 postgresql $ sud ...
- postgresql 常规操作以及检查备份
一.建表时,复制源表的信息test=# test=# \d test.t1 Table "test.t1" Column | Type | Collation | Nullable ...
- postgresql 一些操作
postgresql 对sql语句敏感的. 所以尽量标准化输入 #############查看版本信息 ############ 1.查看客户端版本 psql --version 1 2.查看服务器端 ...
随机推荐
- 【异常记录(11)】 Web应用程序项目 已配置为使用 IIS。无法访问 元数据库。您没有足够的特权访问计算机上的 IIS 网站
解决办法: 1.项目上右键, 编辑 xxxx.csproj 2.找到 <UseIIS> 标签, 改为 <UseIIS>False</UseIIS> 3.右键,重新 ...
- Java编程语言下 Selenium 驱动各个浏览器代码
这里采用的是Selenium3.7版本,首先介绍的是在Windows环境下运行的: 总结下注意事项: 1,设置各个浏览器的Driver路径 System.setProperty("" ...
- UI自动化测试篇 :webdriver+ant+jenkins自动化测试实践
http://www.cnblogs.com/chengtch/p/6063360.html 前面基本弄清楚了webdriver+ testng 的测试环境部署,现在这里记录一下结合ant及jenki ...
- Struts2文件上传的大小限制问题
问题:上传大文件报错…… 解决:修改struts.xml文件中的参数如下 <constant name="struts.multipart.maxSize" value= ...
- [STL][C++]LIST
参考:http://blog.csdn.net/whz_zb/article/details/6831817 list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素.在STL中,list ...
- Codeforces 821C - Okabe and Boxes
821C - Okabe and Boxes 思路:模拟.因为只需要比较栈顶和当前要删除的值就可以了,所以如果栈顶和当前要删除的值不同时,栈就可以清空了(因为下一次的栈顶不可能出现在前面那些值中). ...
- LeetCode--175--组合两个表
问题描述: 表1: Person +-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | int | ...
- Html显示地图
Html可以通过JS来实现第三方地图的显示,如: 高德: 效果如下:浏览器小区域和全屏展示 代码如下:把key换成自己申请的key值 <script type="text/javasc ...
- Spring Boot 文档
本节对 Spring Boot 的参考文档做了一个简单概述.本章节对全文的参考手册进行内容上的一些索引. 你可以参考本节,从头到尾依次阅读该文档,也可以跳过不感兴趣的内容. Spring Boot 参 ...
- Confluence 6 使用 LDAP 授权连接到 Confluence 内部目录
希望连接一个内部目录但是使用 LDAP 检查登录授权: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接. 单击左侧面板上面的 用户目录(User Dire ...