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.
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;
DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS
khi ExportKhi 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
LOB_STORAGE=SECUREFILE
hoặc BASICFILE
Oracle cung cấp hai loại lưu trữ cho đối tượng LOB: SecureFile và BasicFile. 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.
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'"
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.
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.