Dung lượng đĩa hay dung lượng tablespace là có hạn, và trong trường hợp 1 thao tác ta đang thực hiện cần dung lượng  mà lại không đáp ứng được (hết dung lượng data tablespace, hết temp, hết undo, hết quota…), thao tác đó sẽ bị fail. Oracle có 1 tính năng hữu ích để giải quyết vấn đề này, từ phiên bản 9i, đó là Resumable Space Allocation.

 

Ý tưởng rất đơn giản. 1 câu select, 1 transaction, 1 lệnh tạo index… nếu đang thực thi mà bị thiếu dung lượng, sẽ chuyển sang trạng thái “suspended“, chờ ta khắc phục xong vấn đề về dung lượng, sẽ tự resume trở lại, thay vì fail như thông thường.

 

Ví dụ, ta tạo 1 table. Nếu không đủ dung lượng tablespace lưu trữ sẽ gặp lỗi

 

 

Giả sử nếu đây là 1 table lớn, ta đã tạo được hơn nửa dung lượng, tốn vài tiếng đồng hồ. Xong giờ bị lỗi, chạy lại từ đầu, quả là … nản kèo.

 

Thay vào đó, ta nên bật tính năng Resumable Space Allocation lên, để trường hợp gặp lỗi về dung lượng, ta có thể khắc phục và tiếp tục thao tác.

 

Ta có thể bật ở level hệ thống. Ở mức này, tất cả các user đều được mặc định thừa hưởng tính năng này. Tham số resumable_timeout được tính bằng giây, mặc định là 0 – disable.

 

 

Hoặc có thể cấp quyền cho user để hạn chế ảnh hưởng. Tham số resumable_timeout vẫn để bằng 0.

 

 

Khi đã có quyền, user có thể enable tính năng này trong session, với tên và thời gian tự quy định:

 

 

Sau đó, tạo thử 1 table lớn như vd trên đầu

 

 

Lần này, sẽ không bị báo lỗi nữa mà thao tác sẽ được tạm hoãn (suspended), chờ ta xử lý vấn đề dung lượng. Trong alert log có thông báo:

 

 

Kiểm tra trong dba_resumable

 

 

Sau khi ta khắc phục lỗi dung lượng tablespace, thao tác sẽ được tự động resume

 

 

Trong alert log

 

 

Kiểm tra

 

 

Quả là hữu ích giggle

 

Tính năng này có thể áp dụng cho khá nhiều thao tác:

  • Câu lệnh Select
  • Các câu lệnh DML
  • SQL*Loader
  • Các câu lệnh DDL như CTAS, Create index, Create Materialized View, Alter table … move partition…
Note
1 trường hợp đặc biệt là Data Pump. Mặc định sẽ có thời gian suspend và auto resume là 2 giờ. Sau 2 giờ nếu ta không xử lý lỗi dung lượng, Data Pump job sẽ chuyển sang trạng thái NOT RUNNING. Ta vẫn có thể xử lý lỗi và tự resume lại job đó.