Xây dựng hệ thống tự động hóa quản lý Partition và dọn dẹp Log cũ trên Oracle Database 19c
Trong thực tế vận hành các hệ thống công nghệ thông tin lớn, đặc biệt là dưới góc độ An toàn thông tin, các bảng dữ liệu lưu trữ nhật ký kiểm toán hoặc nhật ký lưu lượng mạng sinh ra một lượng dữ liệu khổng lồ mỗi ngày. Việc giữ lại toàn bộ log từ năm này qua năm khác sẽ dẫn đến hai vấn đề lớn:
- Tràn dung lượng lưu trữ: Gây treo hệ thống nếu ổ cứng đầy.
- Suy giảm hiệu năng: Các câu lệnh SELECT truy vấn log để điều tra sự cố sẽ trở nên chậm chạp khi quét qua hàng tỷ dòng dữ liệu cũ không cần thiết.
Để giải quyết bài toán này, thay vì phải chạy các lệnh DELETE thủ công (vốn rất chậm và tốn tài nguyên Undo/Redo) hay thao tác bằng tay mỗi tháng, tôi đã xây dựng một bài Lab Tự động hóa hoàn toàn vòng đời của dữ liệu sử dụng tính năng Partitioning kết hợp PL/SQL trên Oracle 19c. Hệ thống sẽ tự động tạo phân vùng cho dữ liệu tháng mới và tự động xóa bỏ các phân vùng chứa dữ liệu đã quá hạn lưu trữ (ví dụ: cũ hơn 3 tháng).
Môi trường triển khai
Để triển khai và kiểm chứng giải pháp, bài viết được thực hành trong môi trường lab. Môi trường thực hiện trong bài viết:
- Máy ảo: Oracle VM VirtualBox
- Hệ điều hành: Oracle Linux 7.9
- Phiên bản cơ sở dữ liệu: Oracle Database 19c
- Công cụ kết nối terminal: MobaXterm.
- Công cụ Database IDE: Toad for Oracle (dùng để viết script SQL, PL/SQL và quản lý trực quan).
Quá trình triển khai
Để xây dựng hệ thống tự động hóa quản lý Partition và dọn dẹp Log cũ, chúng ta sẽ đi lần lượt từ:
Chuẩn bị cấu trúc dữ liệu → Tối ưu phân vùng → Xây dựng thủ tục PL/SQL → Tự động hóa toàn bộ quy trình.
Bước 1: Thiết lập cấu trúc lưu trữ và phân vùng
Trước khi thực hiện tự động hóa dọn dẹp, hệ thống bắt buộc phải khởi tạo bảng dữ liệu hỗ trợ cơ chế tự động mở rộng phân vùng (Interval Partitioning).
Khởi tạo bảng log và cơ chế tự động tạo Partition:
CREATE TABLE network_audit_logs (
log_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
event_date DATE NOT NULL,
source_ip VARCHAR2(15),
event_action VARCHAR2(100),
status VARCHAR2(20)
)
PARTITION BY RANGE (event_date)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION p_baseline VALUES LESS THAN (TO_DATE('2026-01-01', 'YYYY-MM-DD'))
);
Bước 2: Xây dựng thủ tục dọn dẹp tự động (PL/SQL Procedure)
Để giải phóng dung lượng đĩa cứng mà không gây ảnh hưởng tới hiệu năng hệ thống, chúng ta sử dụng lệnh DROP PARTITION thông qua Dynamic SQL trong PL/SQL.
Khởi tạo Stored Procedure dọn dẹp phân vùng quá hạn:
CREATE OR REPLACE PROCEDURE prc_drop_old_partitions IS
v_sql VARCHAR2(500);
CURSOR c_old_partitions IS
SELECT partition_name
FROM user_tab_partitions
WHERE table_name = 'NETWORK_AUDIT_LOGS'
AND partition_name <> 'P_BASELINE';
BEGIN
FOR rec IN c_old_partitions LOOP
BEGIN
v_sql := 'ALTER TABLE network_audit_logs DROP PARTITION ' || rec.partition_name;
EXECUTE IMMEDIATE v_sql;
DBMS_OUTPUT.PUT_LINE('Da xoa phan vung: ' || rec.partition_name);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Loi khi xoa: ' || rec.partition_name || ' - ' || SQLERRM);
END;
END LOOP;
END prc_drop_old_partitions;
/
Bước 3: Lập lịch thực thi tự động (DBMS_SCHEDULER)
Cuối cùng, chúng ta đóng gói toàn bộ quy trình vào trình lập lịch của Oracle Database để hệ thống tự động vận hành định kỳ hàng tháng.
Tạo Job chạy ngầm vào 1h sáng ngày mùng 1 mỗi tháng:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'JOB_CLEANUP_AUDIT_LOGS',
job_type => 'STORED_PROCEDURE',
job_action => 'prc_drop_old_partitions',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MONTHLY; BYMONTHDAY=1; BYHOUR=1; BYMINUTE=0; BYSECOND=0',
enabled => TRUE,
comments => 'Job tu dong xoa partition log cu'
);
END;
/
Kết quả kiểm thử
Để kiểm chứng hệ thống hoạt động đúng thiết kế, tôi đã tiến hành ép chạy Job thủ công và giám sát chéo trên cả 2 công cụ:
Kiểm tra trên Toad for Oracle:
Tôi thực thi lệnh EXEC DBMS_SCHEDULER.RUN_JOB để ép Job dọn dẹp chạy ngay lập tức. Sau đó, truy vấn vào view user_scheduler_job_run_details, hệ thống ghi nhận Job đã chạy thành công (STATUS = SUCCEEDED) với thời gian thực thi cực nhanh.

Giám sát dưới góc độ OS trên MobaXterm:
Để có cái nhìn sâu hơn về những gì Database thực sự làm dưới nền (Background), tôi đã dùng lệnh tail -f trên MobaXterm để bám sát file alert_orcl.log. Kết quả thật tuyệt vời, Alert Log đã ghi nhận rõ ràng các sự kiện Oracle tự động tạo ra các phân vùng mới (ADDED INTERVAL PARTITION SYS_P401...) khi tôi chèn thử các dòng log giả lập của các tháng trong tương lai (tháng 6, tháng 7/2026).

Kết luận
Giải pháp Automated Partition Management đã giải quyết được bài toán quản lý dung lượng và tối ưu hiệu năng cho các bảng chứa dữ liệu nhật ký dung lượng lớn.
Các kết quả đạt được:
Tự động hóa: Loại bỏ các thao tác quản trị thủ công hàng tháng, giảm thiểu rủi ro sai sót do con người.
Tối ưu hiệu năng: Lệnh DROP PARTITION giải phóng không gian lưu trữ ngay lập tức trên đĩa cứng mà không gây tải hệ thống (I/O, Redo Log) như phương pháp DELETE truyền thống.
Đảm bảo tính sẵn sàng: Dữ liệu log luôn được duy trì đúng thời gian lưu trữ quy định, giúp các truy vấn điều tra sự cố an toàn thông tin luôn đạt tốc độ tối ưu
All rights reserved