[[toc]]
適用范圍
當(dāng)文件系統(tǒng)異常等原因?qū)е耤log文件丟失或損壞,在沒有備份或者其它更合適的處理辦法時(shí),可嘗試該文檔中的方法應(yīng)急啟動(dòng)數(shù)據(jù)庫。
問題概述
丟失clog數(shù)據(jù)庫啟動(dòng)失敗,日志如下
2022-06-20 17:55:04.761 [unknown] [unknown] localhost 140679013459712 0 0 [REDO] LOG: [REDO_STATS]redo_dump_all_stats WAIT_WRITE_DATA: the event io statistic during redo are as follows : total_duration:0, counter:0
2022-06-20 17:55:04.761 [unknown] [unknown] localhost 140679013459712 0 0 [REDO] LOG: [REDO_STATS]redo_dump_all_stats WAIT_PROCESS_PENDING: the event io statistic during redo are as follows : total_duration:0, counter:0
2022-06-20 17:55:04.761 [unknown] [unknown] localhost 140679013459712 0 0 [REDO] LOG: [REDO_STATS]redo_dump_all_stats WAIT_APPLY: the event io statistic during redo are as follows : total_duration:0, counter:0
2022-06-20 17:55:04.761 [unknown] [unknown] localhost 140679013459712 0 0 [BACKEND] LOG: startup shut down walreceiver.
2022-06-20 17:55:04.761 [unknown] [unknown] localhost 140679013459712 0 0 [BACKEND] LOG: startup shut down datareceiver.
2022-06-20 17:55:04.764 [unknown] [unknown] localhost 140679013459712 0 0 [REDO] LOG: btree_xlog_cleanup is over, it takes time:0 microseconds
2022-06-20 17:55:04.768 [unknown] [unknown] localhost 140679013459712 0 0 [SLRU] FATAL: could not access status of transaction 27372 , nextXid is 27372
2022-06-20 17:55:04.768 [unknown] [unknown] localhost 140679013459712 0 0 [SLRU] DETAIL: Could not open file “pg_clog/000000000000”: No such file or directory <<<<<
問題原因
clog保存了事務(wù)狀態(tài)信息,丟失導(dǎo)致事務(wù)系統(tǒng)無法正常運(yùn)行,數(shù)據(jù)庫啟動(dòng)失敗。

解決方案
手工生成全為COMMITTED狀態(tài)的CLOG日志,認(rèn)為還沒凍結(jié)或設(shè)置t_informask XMIN,XMAX提交狀態(tài)的tuple上的事務(wù)都是已提交的。
提示:正常情況下ABORT事務(wù)較少,多數(shù)為COMMITED的事務(wù)。
=4種事務(wù)狀態(tài)=====
#define TRANSACTION_STATUS_IN_PROGRESS 0x00
#define TRANSACTION_STATUS_COMMITTED 0x01
#define TRANSACTION_STATUS_ABORTED 0x02
#define TRANSACTION_STATUS_SUB_COMMITTED 0x03
#define CLOG_BITS_PER_XACT 2 #使用2bit保存事務(wù)狀態(tài)
#define CLOG_XACTS_PER_BYTE 4 #每字節(jié)可以保存4個(gè)事務(wù)的事務(wù)狀態(tài)
單字節(jié)值0x55為4個(gè)commited事務(wù)狀態(tài)。
In [4]: bin(0x55)
Out[4]: ‘0b1010101’
寫1024個(gè)0x55到文件中
echo -e -n “\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55” > clog.dat
上次是每次寫入1K,可以通過dd方式生成更多clog
$ ls -l clog.dat
-rw-r–r-- 1 postgres dba 1024 6月 20 16:31 clog.dat
$ hexdump clog.dat
0000000 5555 5555 5555 5555 5555 5555 5555 5555
*
0000400
—生成256K一個(gè)的clog文件,單個(gè)文件最大256KB(10242564=1048576個(gè)事務(wù))
for((i=1;i<=255;i++));
do
dd if=clog.dat of=data2/pg_clog/000000000000 bs=1024 count=1 seek=$i conv=notrunc
done
[omm@centos7 ~]$ ls -l data2/pg_clog/000000000000
-rw-r–r--. 1 omm dbgrp 262144 Jun 20 17:59 data2/pg_clog/000000000000
起庫驗(yàn)證,驗(yàn)證數(shù)據(jù)可讀可寫
gs_ctl start -D data2
test=# \dt
List of relations
Schema | Name | Type | Owner | Storage
--------±-----±------±------±---------------------------------
public | t1 | table | omm | {orientation=row,compression=no}
public | t2 | table | omm | {orientation=row,compression=no}
public | t3 | table | omm | {orientation=row,compression=no}
(3 rows)
test=# select * from t1;
id | c
-----±--------
1 | test1
2 | test2
3 | test3
4 | test4
5 | test5
6 | test6
7 | test7
8 | test8
test=# create table t4(id int);
CREATE TABLE




