Mục lục
1. Giới thiệu
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é.
2. 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.
3. 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
1. 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:
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
2. 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/
Hiện tại, tôi có tổ chức đều đặn các khóa học về quản trị Oracle Database, tôi sẽ để thông tin ở đây, để bạn nào quan tâm về lịch học cũng như chương trình học có thể theo dõi nhé.
KHOÁ DÀNH CHO NGƯỜI MỚI
KHÓA HỌC: QUẢN TRỊ ORACLE DATABASE THẬT LÀ ĐƠN GIẢN (ADMIN 1)
CÁC KHOÁ NÂNG CAO:
KHÓA HỌC ORACLE NÂNG CAO: QUẢN TRỊ KIẾN TRÚC MULTITENANT 12c
KHÓA HỌC ORACLE NÂNG CAO: QUẢN TRỊ HỆ THỐNG DATA GUARD
CÁC KHOÁ COMBO:
COMBO 1: ADMIN 1 + MULTITENANT 12c
COMBO 3: ADMIN 1 + MULTITENANT 12c + DATA GUARD
LỊCH HỌC:
Mời bạn xem tại đây: LỊCH HỌC CÁC LỚP ORACLE
ĐĂNG KÝ:
https://forms.gle/MtCAoRQFenP886y79
Hãy tham gia group “Kho tài liệu kiến thức database” để cùng học hỏi và chia sẻ nhé.