Như ta đã biết, trong Oracle database có 1 Undo tablespace dùng để lưu trữ undo data – dữ liệu lịch sử nhằm hỗ trợ cho các hoạt động của database (rollback transaction, read consistency, recover, …). Với việc lưu trữ dữ liệu lịch sử, Undo tablespace còn hỗ trợ thêm khả năng Flashback query – query dữ liệu tại 1 thời điểm trong quá khứ.

 

Ta tìm hiểu sơ qua về Undo tablespace.

 

Cấu hình phổ biến của Undo tablespace

 

 

Ý nghĩa các tham số

  • Từ version 9i, Oracle chuyển sang dùng undo segment thay cho rollback segment, do đó tham số undo_management ta nên để mặc định AUTO
  • Tham số undo_tablespace dùng chỉ định tablespace làm Undo tablespace. Ta có thể tạo nhiều Undo tablespace, tuy nhiên tại 1 thời điểm chỉ dùng được 1 Undo tablespace
  • Tham số undo_retention xác định thời gian tối thiểu Undo tablespace cố gắng lưu giữ dữ liệu lịch sử, nếu Undo tablespace có Auto extend. Mặc định là 900 giây = 15 phút. Trường hợp Undo tablespace có kích thước cố định, Oracle bỏ qua tham số này và tự động cấu hình lưu giữ lượng dữ liệu lịch sử phù hợp với kích thước tablespace
 

Ngoài ra, Undo tablespace còn 1 đặc tính nữa là Guarantee

 

 

Nếu guarantee được bật, thời gian undo_retention luôn được đảm bảo. Do đó nếu kích thước Undo tablespace không đủ thì các câu lệnh DML rất dễ fail do không còn chỗ lưu trữ undo data. Cấu hình này nếu muốn bật cũng cần cân nhắc kỹ.

 

 

Flashback query

Nhờ dữ liệu lưu trữ trong Undo tablespace, ta có thể thực hiện các câu query kiểm tra lại dữ liệu cũ nếu nghi ngờ có thay đổi, bằng mệnh đề AS OF

 

Ví dụ ta xóa 2 employee, sau đó kiểm tra lại trước đó 5 phút:

 

 

 

Tất nhiên là nếu dữ liệu không còn trong Undo tablespace, ta sẽ gặp 1 lỗi quen thuộc: “snapshot too old”

 

 

Ngoài timestamp, ta cũng có thể dùng System Change Number để kiểm tra sự thay đổi dữ liệu nếu có.

Ta thử update first_name của 1 employee, sau đó kiểm tra lại first_name tại thời điểm SCN, và thời điểm hiện tại:

 

 

Flashback version query

 

Flashback version query là 1 tính năng khác, cũng dựa trên Undo data, tuy nhiên sẽ cung cấp thông tin chi tiết hơn Flashback query. 

 

Giả sử ta thực hiện các thao tác update, delete trên table employees như sau

 

 

Ta có thể kiểm tra lại lịch sử thao tác cũng như dữ liệu cũ bằng cách sử dụng mệnh đề versions between trong câu query:

 

 

Ta có thể thấy được employee_id 198 đã bị xóa (Oper = D), employee_id 197 đã được thay đổi (Oper = U) về lương, người quản lý, cũng như bộ phận làm việc.

 

Tuy vậy, tính năng Flashback version query có 1 số hạn chế như:

  • Không dùng được trên external table
  • Không dùng được trên các table của Oracle
  • Không dùng được trên temporary table, view
  • Không query được về trước thời điểm 1 lệnh DDL thay đổi cấu trúc table

Các tính năng Flashback query này khá hữu ích trong trường hợp thời gian cần kiểm tra thay đổi dữ liệu ngắn, undo data vẫn còn trong Undo tablespace. Với thời gian xa hơn 1 chút, ta phải sử dụng các tính năng Flashback khác.