Archived Log Mode là một chế độ của Orace phục vụ việc backup database. Archiver Process chính là process chịu trách nhiệm ghi log file ra file archive để lưu trữ. Ta có thể sử dụng các archive log này để tiến hành restore dữ liệu. Archiver Process chỉ chạy khi database đang được cấu hình chế độ chạy Archived Log Mode.
Hôm vừa hệ thống bên mình gặp tình trạng Database bị stop không rõ nguyên nhân. Qua kiểm tra một hồi thì phát hiện ổ cứng bị đầy do Archived Log sinh ra quá nhiều. Việc Archived Log bị tràn sẽ làm Archiver Process bị lỗi không thể chạy dẫn đến các thao tác mà Database không làm được nên treo cả hệ thống.

Sự cố này khá là nghiêm trọng vì nó gây dừng Database. Các hoạt động thực hiện đến nó không thể thực hiện được. Hiện tượng Archived Log bị tràn thỉnh thoảng mới xảy xa nhưng lần này nó phát sinh tới 100GB Archived Log thì đúng là bất thường.
Nguyên nhân gây nên tình trạng này là do 1 job hàng ngày tiến hành xóa và insert một lượng lớn dữ liệu nên Archived Log phát sinh ngày càng nhiều. Vì Archived Log có nhiệm vụ ghi lại toàn bộ sự thay đổi của table nên hàng ngày nó vẫn lưu trữ các thông tin này lại. Mặc dù thực tế dữ liệu đó chỉ có tác dụng nhất thời ghi ra để tiến hành xuất dữ liệu ra file để lưu trữ.
Job này có nhiệm vụ xóa dữ liệu cũ của bảng, tổng hợp lại dữ liệu ở nhiều nguồn rồi insert dữ liệu vào bảng đó để thực hiện 1 số tác vụ tiếp theo.
Cách xử lý để Archived Log không phát sinh nhiều đó là thay vì việc job tiến hành xóa dữ liệu thì tiến hành truncate table. Vì truncate table coi như drop table và create lại, Archived Log không lưu trữ lịch sử thông tin truncate table nên Archived Log phát sinh rất ít.
Để thao tác truncate table thực hiện được trong procedure (gói gọn trong job) ta phải viết lệnh sau:
EXECUTE IMMEDIATE 'TRUNCATE TABLE tablename';
Từ phần này mình để ý từ lâu mà nay mới phát hiện ra. Mình có một table dữ liệu khá lớn tầm 20Gb, dữ liệu được thêm vào liên tục nên ngày càng phình to. Mình sử dụng Toad để xem dữ liệu và thỉnh thoảng xóa bớt dữ liệu đi nhưng sau đó kiểm tra kích thước cũng không bị giảm đi tẹo nào.
Mình đã thử việc xóa dữ liệu đi nhưng kích thước vẫn thế. Chỉ khi sử dụng lệnh truncate table thì kích thước table mới về 0.
Để ý các job tương tự sếp viết thì mình thấy sếp đều dùng câu lệnh truncate để xóa dữ liệu. Đúng là người có kinh nghiệm vẫn cứ khác.