Wal file là một thành phần rất quan trọng trong PostgreSQL.

Mỗi khi có thay đổi trong database, PostgreSQL sẽ ghi vào WAL file. Nếu có sự cố xảy ra như mất điện đột ngột, thông tin trong WAL file sẽ được sử dụng để khôi phục khi database khởi động trở lại.

WAL file quan trọng là thế, nếu vì một lý do nào đó, ví dụ, như phân vùng lưu WAL file bị đầy 100% thì sao?
Lúc đó PostgreSQL sẽ không thể ghi WAL file xuống đĩa được, và hệ thống sẽ bị rơi vào trạng thái “treo”, không làm việc được nữa.

Trong bài viết này tôi sẽ hướng dẫn các bạn cách xử lý khi gặp tình huống này nhé.


   Triệu chứng việc ghi WAL file có vấn đề

Mặc định PostgreSQL sẽ lưu WAL file ở trong thư mục pg_wal, là 1 thư mục con của data directory. (Ở phiên bản 10 trở về trước, thư mục này có tên là pg_xlog).

Triệu chứng chứng tỏ WAL file đang có vấn đề như sau. Bạn kiểm tra file log của PostgreSQL:

WARNING:  terminating connection because of crash of another server process

DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit because another server process exited abnormally and possibly corrupted shared memory.

HINT:  In a moment you should be able to reconnect to the database and repeat your command. server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Failed.

   Phương án giải quyết

Có 1 số nguyên nhân có thể gây ra lỗi đầy phân vùng WAL file

   Phân vùng bị đầy do 1 file nào đó phát sinh đột biến.

Đây là một nguyên nhân rất hay gặp, nhưng nếu bạn không phải là người đã quá quen với hệ thống rồi, thì bạn sẽ mất khá nhiều thời gian để giải quyết nó đấy.
Phương án giải quyết thì đơn giản chỉ là tìm được file gây phát sinh dung lượng đột biến (thường là các file log), rồi dọn dẹp chúng đi hoặc di chuyển chúng sang chỗ khác.

Tuy nhiên, vấn đề khó là nếu bạn không theo dõi hệ thống thường xuyên thì sẽ rất khó biết “hôm nay cái gì vừa tăng dung lượng đột biến” :D.

Một số tips hỗ trợ bạn trong tình huống này:

Đọc thêm  Bí kip Linux #2: Tìm kiếm file và thư mục theo dung lượng
Đọc thêm  Bí kíp Linux #3: Vừa tìm kiếm vừa xóa file

 

Nếu như bạn không thể xoá hay di chuyển các file đó thì sao?

Vậy thì bạn phải di chuyển thư mục WAL file sang chỗ khác thôi.

Cách làm như sau:

Shutdown PostgreSQL

pg_ctl stop

Copy WAL sang thư mục khác

cp -rf /var/lib/pgsql/13/data/pg_wal/* /postgres/wal

Backup lại thư mục pg_wal và xóa nó đi, hoặc đơn giản là move nó sang chỗ khác.

mv /var/lib/pgsql/13/data/pg_wal /var/lib/pgsql/13/data/pg_wal_bak

Sau đó, bạn tạo link cho pg_wal trỏ đến thư mục chứa WAL file mới

ln -s /postgres/wal /var/lib/pgsql/13/data/pg_wal

Bây giờ bạn có thể start lại PostgreSQL được rồi

pg_ctl start

 

   Do tiến trình archive gặp lỗi

Nếu database của bạn đang cấu hình ở chế độ archive mode, nếu gặp 1 vấn đề gì đó khiến WAL file không được copy sang archive. Ví dụ như: Thư mục lưu archive bị đầy, bị thay đổi quyền khiến process không ghi xuống được,..

Lúc đó WAL file sẽ không tự động dọn dẹp, cho đến khi nó được archive trở lại. Cứ thế WAL file sẽ đầy dần lên.

Triệu chứng khi bạn gặp lỗi này  đó là trong file log liên tục bắn ra lỗi do câu lệnh trong archive_command bị fail

sh: /backup/archive/000000000000001500000009A: No such file or directory
LOG:  archive command failed with exit code 1 (11263)
DETAIL: The failed archive command was: gzip < pg_wal/000000000000001500000009A > /backup/archive/000000000000001500000009A (13453)
PANIC:  could not write to file "pg_wal/waltemp.1432": No space left on device
LOG:  server process (PID 1421) was terminated by signal 6: Aborted (11206)
LOG:  terminating any other active server processes (11553)
LOG:  archiver process (PID 5321) exited with exit code 1 (12421)
LOG:  connection received: host=[local] (14321)

Vậy trong tình huống này, nguyên nhân gốc rễ là ở tiến trình archive gặp lỗi. Chúng ta cần phải giải quyết được lỗi này thì mới xử lý được tận gốc.

Còn nếu trong trường hợp bạn chưa tìm được nguyên nhân gốc rễ, bạn có thể áp dụng cách chuyển thư mục pg_wal sang vị trí khác mà tôi đã nêu ở trên.

Nguồn: https://dangxuanduy.com/

Xin cho tôi được biết, bạn cảm thấy bài viết này như thế nào? Ý kiến của bạn sẽ giúp tôi nâng cao chất lượng bài viết của mình.

    Hãy chia sẻ bài viết này nếu bạn thấy có ích nhé
    0 0 votes
    Article Rating
    Subscribe
    Notify of
    guest
    0 Comments
    Inline Feedbacks
    View all comments