數據壞塊類問題
更新時間 2025-02-05 09:37:35
最近更新時間: 2025-02-05 09:37:35
分享文章
本頁介紹天翼云TeleDB數據庫數據壞塊類問題。
表文件損壞問題
問題描述
執行SQL報錯,ERROR: could not read block 2 in file "base/xxx/xxx":read only 0 of 8192 bytes。報錯信息和表文件損壞一樣。
可能影響
SQL執行如果使用到壞塊則會報錯。
解決步驟
- 表文件損壞,通常需要從備份文件中恢復;
- 如沒有備份數據,可通過設置設置參數zero_damaged_pages=true來跳過壞塊;
- 通過base/xxx/xxx中的xxx定位到具體的對象, 其中第一個數字為database的oid,第二個數字為表的oid;
查看對應數據庫SQL:
select datname from pg_database where oid=xxx;
查看對應表SQL:
select xxx::regclass;
- 將該表數據導出,truncate或重建表后再導入數據。
索引文件損壞問題
問題描述
SQL報錯,ERROR: could not read block 2 in file "base/xxx/xxx":read only 0 of 8192 bytes。報錯信息和表文件損壞一樣。
可能影響
SQL執行如果使用到該索引則可能會報錯。
解決步驟
- 索引文件損壞,通常可以通過重建索引解決;
- 通過base/xxx/xxx中的xxx定位到具體的對象, 其中第一個數字為database的oid,第二個數字為索引的oid;
查看對應數據庫SQL:
select datname from pg_database where oid=xxx;
查看對應索引SQL:
select xxx::regclass;
- 重建索引reindex index xxx;
- 系統表索引文件損壞,還可以通過設置參數ignore_system_indexes暫時忽略損毀的系統索引,然后再重建系統索引。
toast表文件損壞問題
問題描述
SQL報錯,如: missing chunk number 0 for toast value xxx in pg_toast_xxx。
可能影響
toast表壞塊相關的記錄操作報錯;
解決步驟
- 通過報錯中pg_toast_xxx中的xxx(這里是表的oid)找到對應的表;例如,oid為34458,那么通過 select 34458::regclass; 可以查到34458對應的表;
teledb=# select 34458::regclass;
regclass ???
-----------
test_varchar2
(1 row)
- 對該表執行VACUUM ANALYZE, VACUUM ANALYZE test_varchar2;
- 通常vacuum成功后問題可解決,如果仍有問題,可嘗試重建該表索引、vacuum full表等方法修復;有備份的話可以重建表重新加載數據;也可以嘗試設置zero_damaged_pages參數來跳過錯誤的數據塊。