Lỗi ORA-01555 thường xảy ra khi Oracle không thể duy trì được ảnh chụp nhất quán của dữ liệu (consistent read) trong suốt quá trình thực hiện một truy vấn dài hoặc thao tác như Export. Đặc biệt, với dữ liệu LOB (Large Object), lỗi này có thể phổ biến hơn vì các đối tượng LOB có cách xử lý lưu trữ và phục hồi dữ liệu riêng biệt so với các loại dữ liệu khác trong Oracle.

1. Nguyên nhân của lỗi ORA-01555 với dữ liệu LOB

  • Quá trình Export dữ liệu LOB kéo dài: Export có thể bị kéo dài nếu bảng chứa nhiều dữ liệu LOB, dẫn đến việc Oracle không thể giữ nguyên bản chụp của dữ liệu từ thời điểm bắt đầu quá trình Export.
  • Thời gian lưu trữ thông tin undo không đủ: Oracle sử dụng Undo Tablespace để lưu lại các phiên bản trước của dữ liệu. Nếu undo không đủ lớn hoặc thời gian lưu giữ undo không đủ dài, quá trình đọc dữ liệu trong Export sẽ không thể thực hiện được do dữ liệu cũ đã bị ghi đè hoặc xóa.
  • LOB dữ liệu không được quản lý tốt: Các đối tượng LOB có thể có các tùy chọn lưu trữ và quản lý undo riêng biệt, và điều này đôi khi dẫn đến các vấn đề không tương thích với undo thông thường.

2. Các giải pháp xử lý lỗi ORA-01555 với dữ liệu LOB

2.1. Tăng kích thước và thời gian giữ Undo Tablespace

Khi kích thước Undo Tablespace quá nhỏ hoặc Undo Retention không đủ dài, dữ liệu undo có thể bị ghi đè trước khi Export hoàn tất.

Cách xử lý:

Tăng kích thước Undo Tablespace:

ALTER DATABASE DATAFILE '/path/to/undo_tablespace_file.dbf' RESIZE M;

Tăng Undo Retention: Điều này sẽ giúp Oracle giữ dữ liệu undo trong một thời gian dài hơn, giúp Export có thể hoàn tất mà không gặp lỗi ORA-01555.

ALTER SYSTEM SET UNDO_RETENTION = 3600; -- thời gian giữ undo là 1 giờ

Chuyển sang chế độ Autoextend cho Undo Tablespace:

ALTER DATABASE DATAFILE '/path/to/undo_tablespace_file.dbf' AUTOEXTEND ON;

2.2. Sử dụng tham số DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS khi Export

Khi thực hiện Export, nếu các bảng chứa dữ liệu LOB quá lớn hoặc phức tạp, việc sử dụng tham số DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS trong lệnh expdp (Data Pump Export) có thể giúp bỏ qua các lỗi liên quan đến vấn đề dữ liệu LOB.

Ví dụ lệnh Export sử dụng Data Pump:

expdp username/password DIRECTORY=exp_dir DUMPFILE=table_export.dmp LOGFILE=export.log TABLES=table_name DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS

2.3. Sử dụng tham số LOB_STORAGE=SECUREFILE hoặc BASICFILE

Oracle cung cấp hai loại lưu trữ cho đối tượng LOB: SecureFileBasicFile. SecureFile có hiệu suất cao hơn và quản lý tốt hơn so với BasicFile.

Kiểm tra xem LOB đang sử dụng loại nào:

SELECT TABLE_NAME, COLUMN_NAME, SEGMENT_NAME, SECUREFILE FROM DBA_LOBS WHERE TABLE_NAME = 'table_name';

Nếu LOB đang sử dụng BasicFile, có thể chuyển sang SecureFile để tăng hiệu suất:

ALTER TABLE table_name MODIFY lob_column (STORE AS SECUREFILE);

Lưu ý: SecureFile yêu cầu Oracle Database phải được cấp phép và cấu hình tương ứng.

2.4. Chia nhỏ quá trình Export thành các phần nhỏ hơn

Khi thực hiện Export trên các bảng lớn chứa dữ liệu LOB, việc Export toàn bộ bảng một lần có thể dẫn đến lỗi do quá trình này kéo dài. Thay vì Export toàn bộ dữ liệu một lần, bạn có thể chia nhỏ quá trình này theo phạm vi ROWID hoặc DATE.

Ví dụ:

Chia nhỏ Export theo phạm vi ROWID:

expdp username/password DIRECTORY=exp_dir DUMPFILE=table_export_part1.dmp LOGFILE=export_part1.log TABLES=table_name QUERY="WHERE ROWID BETWEEN 'rowid_start' AND 'rowid_end'"

2.5. Kiểm tra và giảm thời gian giữ các phiên giao dịch lớn

Trong một số trường hợp, việc có các phiên giao dịch lớn không commit hoặc thời gian thực thi quá lâu cũng gây ảnh hưởng đến undo, dẫn đến lỗi ORA-01555.

  • Xác định và tối ưu hóa các truy vấn hoặc giao dịch kéo dài.
  • Đảm bảo các phiên giao dịch không mở quá lâu trước khi thực hiện Export.

3. Các bước phòng ngừa

  • Tối ưu hóa truy vấn và giảm thời gian thực thi các thao tác Export: Đảm bảo rằng các truy vấn hoặc thao tác Export được tối ưu hóa để không chạy quá lâu.
  • Sử dụng chế độ ARCHIVELOG: Nếu cơ sở dữ liệu của bạn đang chạy ở chế độ ARCHIVELOG, đảm bảo rằng các bản ghi redo logs không bị ghi đè quá sớm.
  • Giám sát Undo Tablespace: Thường xuyên giám sát dung lượng và mức sử dụng Undo Tablespace để tránh tình trạng bị đầy hoặc không đủ dung lượng cho các giao dịch lớn.

Kết luận

Lỗi ORA-01555 liên quan đến dữ liệu LOB trong quá trình Export trên Oracle Database thường do undo tablespace không đủ lớn hoặc không giữ đủ lâu để duy trì dữ liệu nhất quán. Bằng cách tăng dung lượng undo, tối ưu hóa việc sử dụng bộ nhớ đệm và chia nhỏ quá trình Export, bạn có thể tránh hoặc giảm thiểu lỗi này.