一、問題描述 使用gpfdist往集群中導入大量數據, 一段時間後連接退出,集群無法連接 二、問題定位 使用如下命令查看: 連接到相應機器,查看磁碟狀況: 說明此時磁碟占用滿了。 三、問題解決 處理這種情況有如下幾種方式: 3.1 擴容磁碟 由於本人是將數據目錄直接放在根目錄下,可以通過添加一塊新磁 ...
一、問題描述
使用gpfdist往集群中導入大量數據, 一段時間後連接退出,集群無法連接
二、問題定位
使用如下命令查看:
gpstate -s mdw-1:gpadmin-[INFO]:- Segment Info mdw-1:gpadmin-[INFO]:- Hostname = sdw-1 mdw-1:gpadmin-[INFO]:- Address = sdw-1 mdw-1:gpadmin-[INFO]:- Datadir = /home/mirror/gpseg2 mdw-1:gpadmin-[INFO]:- Port = 50000 mdw-1:gpadmin-[INFO]:- Mirroring Info mdw-1:gpadmin-[INFO]:- Current role = Mirror mdw-1:gpadmin-[INFO]:- Preferred role = Mirror mdw-1:gpadmin-[WARNING]:- Mirror status = Out of Sync <<<<<<<< mdw-1:gpadmin-[INFO]:- Status mdw-1:gpadmin-[INFO]:- PID = 10227 mdw-1:gpadmin-[WARNING]:- Configuration reports status as = Down <<<<<<<< mdw-1:gpadmin-[WARNING]:- Segment status = Down in configuration <<<<<<<<
連接到相應機器,查看磁碟狀況:
說明此時磁碟占用滿了。
三、問題解決
處理這種情況有如下幾種方式:
3.1 擴容磁碟
由於本人是將數據目錄直接放在根目錄下,可以通過添加一塊新磁碟的方式直接擴容空間
3.2 清理文件
往往,線上的環境不會有足夠的時間進行磁碟的擴容,甚至一些其他因素導致根本你就接觸不到伺服器。那麼這時候只能進行文件的清除。
3.2.1 清理日誌文件
系統長時間運行後,一般占用比較大的會是pg_log文件夾下日誌文件,這裡推薦的做法是日誌文件的磁碟和數據目錄掛載在不同的磁碟路徑下,若在同一路徑下,可將日誌文件備份到其他路徑,騰出一部分空間,讓系統正常啟動。操作如下:
1)使用gpstop停止集群
2)處理日誌文件移動到其他位置,或者認為可以不要的直接刪除
3)gpstart啟動集群,啟動後就可以將一些頻繁變化的表執行 vacuum動作,或者刪除一些無用的表
4)若以上動作做完,並不能釋放出空間,則需要考慮下一種方法
3.2.2 清理pg_xlog文件
在segment下,會有pg_xlog文件夾,這個文件夾里存儲的是wal日誌信息,記錄事務信息,類似oracle的redo日誌,數據在進入greenplum資料庫前,都是先進入到該日誌文件中,所以該文件非常重要,千萬不能手工操作該目錄下的文件,如果直接手工刪除了該文件,資料庫就無法啟動。所以刪除該文件要謹慎,可以使用該命令:pg_resetxlog 。只有在xlog占用了大量空間的情況下才考慮清理,否則不建議清理。操作步驟:
1)停止greenplum集群
2)使用pg_controldata命令
pg_controldata $segment_directory ...... Latest checkpoint's NextXID: 0/1874 Latest checkpoint's NextOID: 111252 ......
這裡$segment_directory是安裝集群是的segment目錄,也就是gpstate -s命令看到的路徑,如果找不到可以搜索pg_control,該文件所在的位置即為需要的目錄位置通過上述命令獲取到標紅的兩處關鍵性信息
3)執行如下命令:
pg_resetxlog -o 111252 -x 1874 -f $segment_directory
註意,以上命令需要資料庫管理員賬戶執行,上述命令完成後,能夠有不少的空間釋放出來。
4)啟動greenplum集群
四、實踐建議
1、清理xlog日誌是在不得已的情況下才這麼做,待集群正常啟動後,需要謹慎驗證數據的完整性
2、需要有自己的一套監控機制監控磁碟使用率,儘可能的避免磁碟使用100%的情況發生,一旦由於這種情況導致了集群崩潰,甚至丟失數據,可能是災難性的
3、如果是由於誤刪了pg_logs的文件導致集群無法啟動,也可以使用pg_resetxlog命令使集群恢復啟動,但一定要謹慎驗證數據的完整性