成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PostgreSQL恢復(fù)誤刪除數(shù)據(jù)

IT那活兒 / 4305人閱讀
PostgreSQL恢復(fù)誤刪除數(shù)據(jù)

今天早上發(fā)生了一件事,業(yè)務(wù)人員一不小心刪除了某張表的數(shù)據(jù)。說(shuō)實(shí)話大哥我玩兒PG也不久,很多運(yùn)維經(jīng)驗(yàn)也是邊踩坑邊總結(jié),所以在誤刪除恢復(fù)這件事上哥的經(jīng)驗(yàn)還是比較匱乏的。而且還有一件比較可怕的事情是該數(shù)據(jù)庫(kù)的物理備份還沒(méi)有弄好。

于是查了一通,發(fā)現(xiàn)有一個(gè)插件pg_dirtyread,可以幫助我們來(lái)處理。關(guān)于插件的介紹就是“Readdead but unvacuumed tuples from a PostgreSQLrelation”。這里有一個(gè)前提條件就是unvacuumedtuples。于是立馬下載,make編譯,然后安裝。信心滿滿的使用查詢的sql,竟然發(fā)現(xiàn)數(shù)據(jù)恢復(fù)不了。

現(xiàn)實(shí)啪啪打臉,只怪自己學(xué)藝不深。研究一通之后發(fā)現(xiàn)并不是插件問(wèn)題。以下是在測(cè)試庫(kù)上使用插件的過(guò)程。使用了https://github.com/df7cb/pg_dirtyread中的demo。

postgres=#  CREATE TABLE foo (bar bigint, baz text);

CREATE TABLE


postgres=#  INSERT INTO foo VALUES (1, Test), (2, New Test);

INSERT 0 2


postgres=#  DELETE FROM foo WHERE bar = 1;

DELETE 1


postgres=# select * from foo;

bar |   baz    

-----+----------

2 | New Test

(1 row)


postgres=# SELECT * FROM pg_dirtyread(foo)

postgres-# AS t(tableoid oid, ctid tid, xmin xid, xmax xid, cmin cid, cmax cid, dead boolean,

postgres(# bar bigint, baz text);

tableoid | ctid  |   xmin   |   xmax   | cmin | cmax | dead | bar |   baz  

----------+-------+----------+----------+------+------+------+-----+----------

2784670 | (0,1) | 17635311 | 17635312 |    0 |    0 | t    |   1 | Test

2784670 | (0,2) | 17635311 |        0 |    0 |    0 | f    |   2 | New Test


從測(cè)試庫(kù)上可以清楚的看到,dead為true的死元組數(shù)據(jù)可以通過(guò)pg_dirtyread插件查到,但是我們生產(chǎn)為什么查不到呢?

在生產(chǎn)庫(kù)根本就查不到dead為true的元組數(shù)據(jù)。這說(shuō)明系統(tǒng)進(jìn)程autovacuumed已經(jīng)執(zhí)行了清理。


對(duì)于這種情況,在Oracle中就只能基于時(shí)間點(diǎn)的恢復(fù)和挖掘redolog了。而PG挖掘wal日志的方法網(wǎng)上又搜了一通,發(fā)現(xiàn)可以使用瀚高公司的walminer插件。

安裝方法其實(shí)很簡(jiǎn)單。https://gitee.com/movead/XLogMiner。先下載插件。然后進(jìn)入到walminer的路徑。

cd /home/postgres/XLogMiner/walminer


USE_PGXS=1 MAJORVERSION=12 make

#MAJORVERSION支持‘9.5’,‘9.6’,‘10’,‘11’,‘12’,‘13’

USE_PGXS=1 MAJORVERSION=12 make install


postgres=# create extension walminer;

CREATE EXTENSION


安裝完成之后需要先加載wal日志,這里你可以選擇全部加載,也可以選擇出故障時(shí)間點(diǎn)的日志進(jìn)行加載。加載完可以列出加載的日志信息。

postgres=# select walminer_wal_add(pg_wal);

walminer_wal_add  

---------------------

64 file add success

(1 row)


postgres=# select walminer_wal_list();

walminer_wal_list                    

---------------------------------------------------------

(/pg_data1/pg12/pgdata/pg_wal/000000010000024E00000023)

(/pg_data1/pg12/pgdata/pg_wal/000000010000024E00000024)

(/pg_data1/pg12/pgdata/pg_wal/000000010000024E00000025)

(/pg_data1/pg12/pgdata/pg_wal/000000010000024E00000026)

(/pg_data1/pg12/pgdata/pg_wal/000000010000024E00000027)

(/pg_data1/pg12/pgdata/pg_wal/000000010000024E00000028)

(/pg_data1/pg12/pgdata/pg_wal/000000010000024E00000029)


接下來(lái)執(zhí)行walminer_all()就可以解析添加的全部wal日志,然后查看walminer_contents表就可以看到之前執(zhí)行的sql記錄了,包括反向的undosql都已經(jīng)生成好了。


postgres=# select walminer_all();

NOTICE: Switch wal to 000000010000024D000000F6 on time 2020-10-26 16:32:34.782724+08

NOTICE: Con not find relfilenode 2777602 in dictionary, ignored related records

NOTICE: Switch wal to 000000010000024D000000F7 on time 2020-10-26 16:32:34.87947+08

walminer_all    

---------------------

pg_minerwal success

(1 row)


postgres=# select * from walminer_contents;

sqlno |   xid    | topxid | sqlkind | minerd |           timestamp          |                        op_text                         |                      undo_text                       | complete | sch

ema | relation |  start_lsn   |  commit_lsn  

-------+----------+--------+---------+--------+-------------------------------+--------------------------------------------------------+-------------------------------------------------------+----------+----

----+----------+--------------+--------------

1 | 17635311 |      0 |       1 | t      | 2020-10-26 16:31:42.373436+08 | INSERT INTO public.foo(bar ,baz) VALUES(1 ,Test)     | DELETE FROM public.foo WHERE bar=1 AND baz=Test    | t        | pub

lic | foo      | 24D/F7CFCB70 | 24D/F7CFCC30

2 | 17635311 |      0 |       1 | t      | 2020-10-26 16:31:42.373436+08 | INSERT INTO public.foo(bar ,baz) VALUES(2 ,New Test) | DELETE FROM public.foo WHERE bar=2 AND baz=New Test | t        | pub

lic | foo      | 24D/F7CFCBB8 | 24D/F7CFCC30

1 | 17635312 |      0 |       3 | t      | 2020-10-26 16:31:45.936969+08 | DELETE FROM public.foo WHERE bar=1 AND baz=Test      | INSERT INTO public.foo(bar ,baz) VALUES(1 ,Test)    | t        | pub

lic | foo      | 24D/F7CFCC30 | 24D/F7CFCC98

(3 rows)


這里操作方法和Oracle中的logminger類似。具體可以參考redeme。

對(duì)于今天早上出現(xiàn)的這類問(wèn)題,比較鬧心的一點(diǎn)是經(jīng)驗(yàn)不足,很多東西都要現(xiàn)學(xué)現(xiàn)查。如果能夠提前部署好這些插件,并在最短的時(shí)間做出選擇,就能快速的恢復(fù)數(shù)據(jù)。同時(shí)當(dāng)前生產(chǎn)庫(kù)也沒(méi)有部署備份,無(wú)法從備份基于時(shí)間點(diǎn)的恢復(fù)。因此,對(duì)我們來(lái)說(shuō),PG運(yùn)維仍然任重而道遠(yuǎn),這里給大家分享出來(lái),也是為了小伙伴們少走彎路。


參考文獻(xiàn)

pg_dirtyread

Walminer2.0Beta功能改進(jìn)說(shuō)明

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/130098.html

相關(guān)文章

  • PostgreSQL UDB,讓31會(huì)議數(shù)據(jù)管理更高效可靠

    摘要:相比自建,其可靠性更高,方便運(yùn)維維護(hù)。宋體經(jīng)過(guò)審慎考慮,用戶同時(shí)選用三種數(shù)據(jù)庫(kù),針對(duì)性的滿足不同目標(biāo)。宋體宋體其中,相比于在上的快速高效是其優(yōu)勢(shì),也是用戶選型的重要砝碼。PostgreSQL UDB用在大數(shù)據(jù)分析上,查詢效率更高。相比自建,其可靠性更高,方便運(yùn)維維護(hù)。 — 31會(huì)議運(yùn)維經(jīng)理 湯雷 如何用好PostgreSQL? PostgreSQL是業(yè)內(nèi)一款十分流行的開(kāi)源數(shù)...

    vspiders 評(píng)論0 收藏0
  • 到底選擇PostgreSOL還是MySQL?看這里

    摘要:經(jīng)過(guò)對(duì)比選型,用戶同時(shí)選用三種數(shù)據(jù)庫(kù)來(lái)針對(duì)性的滿足不同目標(biāo)?;谀軌驇?lái)的這些特性優(yōu)勢(shì),用戶選擇了。相比自建,其可靠性更高,方便運(yùn)維維護(hù)。整個(gè)過(guò)程中用戶不需要任何人工干預(yù)和配置修改,真正做到自動(dòng)容災(zāi)。 據(jù)DB-Engines 最新發(fā)布的2019年8月份數(shù)據(jù)庫(kù)流行度排行榜(如下圖)顯示,名列前茅的MySQL和PostgreSQL數(shù)據(jù)庫(kù)的流行趨勢(shì)與去年同期相比依然穩(wěn)增不減。 showImg...

    沈儉 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.42 - MySQL:從刪庫(kù)到跑路

    摘要:肖鵬微博數(shù)據(jù)庫(kù)那些事兒肖鵬,微博研發(fā)中心技術(shù)經(jīng)理,主要負(fù)責(zé)微博數(shù)據(jù)庫(kù)相關(guān)的業(yè)務(wù)保障性能優(yōu)化架構(gòu)設(shè)計(jì),以及周邊的自動(dòng)化系統(tǒng)建設(shè)。經(jīng)歷了微博數(shù)據(jù)庫(kù)各個(gè)階段的架構(gòu)改造,包括服務(wù)保障及體系建設(shè)微博多機(jī)房部署微博平臺(tái)化改造等項(xiàng)目。 showImg(https://segmentfault.com/img/bV24Gs?w=900&h=385); 對(duì)于手握數(shù)據(jù)庫(kù)的開(kāi)發(fā)人員來(lái)說(shuō),沒(méi)有誤刪過(guò)庫(kù)的人生是...

    aboutU 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<