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.查看服务器端 ...
随机推荐
- java中年月日的加减法,年月的加减法使用
本文为博主原创,未经允许不得转载: java计算两个年月日之间相差的天数: public static int daysBetween(String smdate,String bdate) thro ...
- 【TCP/IP详解 卷一:协议】第十章 动态选路协议
更为详细的RIP博客解析: RIP理论 距离向量算法的简介: RIP协议V-D算法的介绍 10.1 引言 静态选路修改路由表的三种方法 (1)主机设置时,默认的路由表项 (2)ICMP重定向报文(默认 ...
- zeptojs库解读2之事件模块
第一,通过obj.addEventListener("click",fn)绑定的事件,你不能通过obj.onclick = null;来移除绑定点击事件的所有回调函数. 所以引入第 ...
- WPF基础学习笔记整理 (八) 命令
基础知识: 命令是应用程序的任务,并跟踪任务是否能够被执行. 命令不包含执行应用程序任务的代码. 命令是比事件更高级的元素.默认的命令目标是当前获得焦点的元素. 良好的Win应用程序,应用程序逻辑不应 ...
- shell 判断字符串是否为空
#!/bin/bash a="" if [ -n "$a" ] then echo "-n $a : 字符串长度不为 0" else ech ...
- shell 逻辑操作符
Shell还提供了与( -a ).或( -o ).非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o&qu ...
- 《剑指offer》第三十六题(二叉搜索树与双向链表)
// 面试题36:二叉搜索树与双向链表 // 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求 // 不能创建任何新的结点,只能调整树中结点指针的指向. #include < ...
- jq expando && $.data()
1.使用隐藏控件或者是js全局变量来临时存储数据,全局变量容易导致命名污染,隐藏控件导致经常读写dom浪费性能 jQuery提供了自己的数据缓存方案,使用jQuery数据缓存方案,我们需要掌握$.da ...
- 解决Resource doesn't have a corresponding Go package.问题
首先上图 这个报错主要是程序要启动没有入口的原因,package main下边的mian方法才是一个程序的入口.这就要 修改目录结构如下图修改并运行就可以了
- 查找并替换字符串 Find And Replace in String
2018-07-29 17:08:15 问题描述: 问题求解: 字符串替换的问题有个技巧就是从右向左进行替换,这样的话,左边的index就不需要考虑变动了. public String findRep ...