Các Cú Pháp Oracle Thường Dùng Trong Quản Lý Cơ Sở Dữ Liệu

1. Cập nhật dữ liệu qua liên kết bảng

Oracle không hỗ trợ cú pháp UPDATE ... FROM ... JOIN như SQL Server, mà yêu cầu sử dụng truy vấn con để gán giá trị:

UPDATE pp_order_picking target
SET sale_contract_code = (
  SELECT source.sale_contract_code
  FROM pp_order_task source
  WHERE source.code = target.pp_order_task_code
)
WHERE EXISTS (
  SELECT 1
  FROM pp_order_task source
  WHERE source.code = target.pp_order_task_code
);

Tương phản với SQL Server — nơi có thể viết ngắn gọn hơn nhờ hỗ trợ join trực tiếp trong lệnh UPDATE:

UPDATE t2
SET t2.col_b = t1.col_b
FROM table2 t2
INNER JOIN table1 t1 ON t2.col_a = t1.col_a;

2. Xác định bảng vi phạm ràng buộc và kiểm tra chỉ mục lỗi

Khi gặp lỗi ràng buộc (ví dụ: ORA-02292), tên ràng buộc thường được trả về trong thông báo lỗi. Dùng truy vấn sau để xác định bảng liên quan:

SELECT 
  constraint_name AS "Tên_ràng_buộc",
  constraint_type AS "Loại",
  table_name AS "Tên_bảng"
FROM all_constraints
WHERE constraint_name = 'SYS_C0010351';

Để kiểm tra các chỉ mục bị vô hiệu hóa (UNUSABLE), đặc biệt khi cần khôi phục tính toàn vẹn truy vấn hoặc hiệu năng:

SELECT index_name, status, table_name
FROM user_indexes
WHERE status = 'UNUSABLE'
  AND index_name = 'SYS_C0010490';

3. Giải phóng không gian bảng sau khi xóa dữ liệu hàng loạt

Khi hai bảng trong tablespace MOM_SMT chứa ~20 triệu bản ghi mỗi bảng, việc xóa dữ liệu bằng DELETE không giải phóng không gian vật lý — dẫn đến tình trạng tablespace đạt 100% dù không còn dữ liệu.

Các bước xử lý gồm:

  1. Kiểm tra mức độ sử dụng tablespace:
SELECT 
  df.tablespace_name,
  ROUND(df.total_mb, 2) AS "Tổng_MiB",
  ROUND(df.free_mb, 2) AS "Còn_lại_MiB",
  ROUND((df.total_mb - df.free_mb), 2) AS "Đã_sử_dụng_MiB",
  ROUND((df.total_mb - df.free_mb) / df.total_mb * 100, 2) AS "Tỷ_lệ_%" 
FROM (
  SELECT 
    ddf.tablespace_name,
    SUM(ddf.bytes) / 1024 / 1024 AS total_mb,
    COALESCE(SUM(dfs.bytes), 0) / 1024 / 1024 AS free_mb
  FROM dba_data_files ddf
  LEFT JOIN dba_free_space dfs 
    ON ddf.tablespace_name = dfs.tablespace_name
  WHERE ddf.tablespace_name = 'MOM_SMT'
  GROUP BY ddf.tablespace_name
) df;
  1. Xác định bảng chiếm nhiều dung lượng nhất:
SELECT 
  s.segment_name AS "Tên_bảng",
  s.bytes / 1024 / 1024 / 1024 AS "Dung_lượng_GB",
  t.num_rows AS "Số_dòng"
FROM dba_segments s
LEFT JOIN dba_tables t 
  ON s.segment_name = t.table_name AND s.owner = t.owner
WHERE s.segment_type = 'TABLE' 
  AND s.tablespace_name = 'MOM_SMT'
ORDER BY s.bytes DESC;
  1. Thu hồi không gian vật lý cho bảng cụ thể:
ALTER TABLE mes_check_aoi_collect_bad ENABLE ROW MOVEMENT;
ALTER TABLE mes_check_aoi_collect_bad SHRINK SPACE COMPACT;
ALTER TABLE mes_check_aoi_collect_bad DISABLE ROW MOVEMENT;
  1. Bật tự động mở rộng file dữ liệu nếu chưa cấu hình:
-- Kiểm tra khả năng tự mở rộng:
SELECT file_name, autoextensible, increment_by * 8 / 1024 AS "Increment_MB"
FROM dba_data_files 
WHERE tablespace_name = 'MOM_SMT';

-- Kích hoạt mở rộng tự động (tăng 1024 MB mỗi lần):
ALTER DATABASE DATAFILE '/data/u01/oradata/ORCL/pdb_mes/mom_smt.dbf' 
AUTOEXTEND ON NEXT 1024M MAXSIZE UNLIMITED;

4. Lỗi ORA-01109: Cơ sở dữ liệu chưa được mở

Lỗi này thường xảy ra khi kết nối vào một pluggable database (PDB) đang ở trạng thái MOUNTED thay vì OPEN.

Cách khắc phục:

sqlplus / as sysdba
SHOW CON_NAME
SHOW PDBS
ALTER PLUGGABLE DATABASE orclpdb OPEN;

5. Lỗi ORA-01502: Chỉ mục bị vô hiệu hóa

Khi chỉ mục chính hoặc chỉ mục duy nhất bị đánh dấu UNUSABLE, các truy vấn hoặc thao tác INSERT/UPDATE có thể thất bại.

Để xác minh:

SELECT index_name, status, uniqueness
FROM user_indexes
WHERE status = 'UNUSABLE'
  AND table_name = 'WMS_PRODUCT_OUT_ITEM';

Có hai cách xử lý phổ biến:

  • Phục hồi chỉ mục: ALTER INDEX pk_wms_product_out_item REBUILD;
  • Xóa ràng buộc (nếu không còn cần thiết): ALTER TABLE wms_product_out_item DROP CONSTRAINT pk_wms_product_out_item;

Thẻ: Oracle sql dba tablespace index

Đăng vào ngày 7 tháng 6 lúc 16:27