Thứ Tư, 9 tháng 9, 2026

Runbook ứng cứu diskgroup DATA đầy 99.5%

MỤC LỤC

1.TỔNG QUAN

2.✅ Pre-check

3.① Resize DatafilE

4.② Truncate Partition

5.③ Move INDX→RECO

6.🔍 Verify & Close

Chi tiết:

1.TỔNG QUAN

📊 Tình trạng & Kế hoạch xử lý

99.9%
DATA Used
5,428 MB free / 4,505,556 MB total
92.2%
RECO Free
943,880 MB free / 1,023,984 MB total
505 GB
Target Free (10%)
~500GB cần giải phóng
⚠️ CRITICAL: Database có thể bị HANG ngay lập tức
Khi DATA diskgroup < 1GB free → Oracle không thể extend datafile, không ghi redo log → toàn bộ transactions bị suspend → database treo. Thực hiện runbook này ngay lập tức, ưu tiên Step 1 trước.
🗺️ Kế hoạch 3 bước — Ước tính không gian giải phóng
#Hành độngƯớc tính giải phóngRủi roThời gianDowntime?
1Resize datafile (shrink HWM)50–150 GBTHẤP30–60 phút❌ Không
2Truncate/Drop partition cũ100–300 GBTRUNG BÌNH30–120 phút❌ Không
3Move INDX tablespace → RECO100–300 GBTRUNG BÌNH1–4 giờ⚡ Online (19c) / Offline (11g)
Tổng ước tính (tối thiểu)250–750 GB✓ Đạt mục tiêu 505 GB
📌 Thứ tự thực hiện
Step 1 NGAY TRƯỚC để có buffer tối thiểu > 10GB free trước khi làm bước 2-3. Nếu sau Step 1 chưa đủ → tiếp Step 2 → Step 3. Không cần làm cả 3 nếu đã đạt mục tiêu sau Step 2.

2.✅ Pre-check

✅ Pre-check — Thực hiện trước khi bắt đầu

🔒 Điều kiện bắt buộc trước khi thực hiện
Xác nhận với người phụ trách trước khi thực hiện bất kỳ step nào. Ghi nhận thời gian bắt đầu, người thực hiện, approver vào ticket.
P1 — Kiểm tra trạng thái diskgroup & database
-- ① Diskgroup status realtime
SELECT name, state, type,
       ROUND(total_mb/1024,1) total_gb,
       ROUND(free_mb/1024,1)  free_gb,
       ROUND((1 - free_mb/total_mb)*100,2) used_pct
FROM v$asm_diskgroup
ORDER BY name;

-- ② Database instance status
SELECT instance_name, status, database_status, active_state
FROM v$instance;

-- ③ Số session active — không thực hiện nếu có batch đang chạy
SELECT status, COUNT(*) cnt
FROM v$session
WHERE type='USER'
GROUP BY status;

-- ④ Có archive log bị tắc không?
SELECT dest_id, status, error, archived_seq#
FROM v$archive_dest_status
WHERE target='PRIMARY' AND status != 'VALID';
P2 — Snapshot trạng thái ban đầu (LƯU LẠI)
-- Lưu thông tin tablespace TRƯỚC khi thực hiện (so sánh sau)
SELECT ts.tablespace_name,
       ROUND(SUM(df.bytes)/1024/1024/1024,2) alloc_gb,
       ROUND(SUM(NVL(fs.bytes,0))/1024/1024/1024,2) free_gb,
       ROUND((1 - SUM(NVL(fs.bytes,0))/SUM(df.bytes))*100,1) used_pct
FROM dba_tablespaces ts
JOIN dba_data_files df ON ts.tablespace_name = df.tablespace_name
LEFT JOIN (
  SELECT tablespace_name, SUM(bytes) bytes
  FROM dba_free_space GROUP BY tablespace_name
) fs ON ts.tablespace_name = fs.tablespace_name
GROUP BY ts.tablespace_name
ORDER BY alloc_gb DESC;

-- Lưu size datafile hiện tại (để rollback nếu cần)
SELECT file_id, file_name, tablespace_name,
       ROUND(bytes/1024/1024/1024,3) size_gb,
       autoextensible, maxbytes/1024/1024/1024 maxsize_gb
FROM dba_data_files
WHERE file_name LIKE '+DATA%'
ORDER BY bytes DESC;

-- ⬇️ COPY KẾT QUẢ VÀO FILE NOTEPAD — dùng để rollback và verify
P3 — Tắt autoextend các datafile lớn (giảm nguy cơ ORA-01653 trong lúc xử lý)
-- Kiểm tra datafile nào đang autoextend > 10GB
SELECT file_id, file_name, ROUND(bytes/1024/1024/1024,2) cur_gb,
       autoextensible, ROUND(maxbytes/1024/1024/1024,1) max_gb
FROM dba_data_files
WHERE autoextensible='YES' AND maxbytes/1024/1024/1024 > 10
  AND file_name LIKE '+DATA%'
ORDER BY maxbytes DESC;

-- Tạm tắt autoextend các file > 90% sử dụng để tránh extend thêm
-- (Thay tên file thực tế)
ALTER DATABASE DATAFILE '+DATA/db/datafile/data01.dbf' AUTOEXTEND OFF;

-- LƯU Ý: Bật lại sau khi hoàn thành toàn bộ runbook!

3.① Resize DatafilE

① Resize Datafile — Shrink to HWM

📐 Nguyên lý
Mỗi datafile được cấp trước (allocated) nhưng dữ liệu thực tế chỉ nằm đến HWM (High Water Mark). Phần từ HWM đến cuối file là "allocated but empty" — có thể resize (shrink) để trả lại space cho diskgroup DATA.
1A — Tìm tất cả datafile có thể shrink (shrinkable > 1GB)
-- Query tìm HWM của từng datafile
SELECT df.file_id,
       df.file_name,
       df.tablespace_name,
       ROUND(df.bytes/1024/1024/1024, 2)            alloc_gb,
       ROUND(NVL(mx.hwm_mb,0)/1024, 2)              hwm_gb,
       ROUND((df.bytes/1024/1024 - NVL(mx.hwm_mb,0)
             ) / 1024, 2)                            shrinkable_gb,
       df.autoextensible
FROM dba_data_files df
LEFT JOIN (
    SELECT file_id,
           (MAX(block_id + blocks - 1) * 8) / 1024  hwm_mb
    FROM   dba_extents
    GROUP BY file_id
) mx ON df.file_id = mx.file_id
WHERE df.file_name LIKE '+DATA%'
  AND (df.bytes/1024/1024 - NVL(mx.hwm_mb,0)) / 1024 > 1
ORDER BY shrinkable_gb DESC;
Kết quả mẫu kỳ vọng: Nếu có datafile 200GB chỉ dùng 150GB HWM → shrinkable = 50GB. Cộng tất cả shrinkable_gb → ước tính tổng giải phóng được.
1B — Generate lệnh ALTER DATABASE DATAFILE ... RESIZE
-- Auto-generate lệnh resize cho từng file (để an toàn thêm 512MB buffer)
SELECT 'ALTER DATABASE DATAFILE ''' || df.file_name || ''' RESIZE ' ||
       CEIL(NVL(mx.hwm_mb, 102400) + 512) || 'M;'   AS resize_cmd,
       ROUND(df.bytes/1024/1024/1024, 2)             cur_gb,
       ROUND(NVL(mx.hwm_mb, 0)/1024, 2)              hwm_gb,
       ROUND((df.bytes/1024/1024 - NVL(mx.hwm_mb,0) - 512
             ) / 1024, 2)                            save_gb
FROM dba_data_files df
LEFT JOIN (
    SELECT file_id,
           (MAX(block_id + blocks - 1) * 8) / 1024  hwm_mb
    FROM   dba_extents GROUP BY file_id
) mx ON df.file_id = mx.file_id
WHERE df.file_name LIKE '+DATA%'
  AND (df.bytes/1024/1024 - NVL(mx.hwm_mb,0)) / 1024 > 1
ORDER BY save_gb DESC;

-- COPY output và chạy từng lệnh một — kiểm tra DATA free sau mỗi 5 lệnh
1C — Thực hiện resize và monitor
-- Ví dụ thực tế (thay tên file theo kết quả query 1B):
ALTER DATABASE DATAFILE '+DATA/gold/datafile/data_01.dbf' RESIZE 180000M;
ALTER DATABASE DATAFILE '+DATA/gold/datafile/data_02.dbf' RESIZE 220000M;
ALTER DATABASE DATAFILE '+DATA/gold/datafile/data_03.dbf' RESIZE 195000M;
-- ... tiếp tục cho từng file

-- Theo dõi DATA free sau mỗi lần resize (chạy trên session khác):
SELECT ROUND(free_mb/1024, 1) free_gb,
       ROUND(free_mb/total_mb*100, 2) free_pct
FROM v$asm_diskgroup
WHERE name = 'DATA';

-- Dừng resize khi đã có > 50GB free — chuyển sang bước 2 nếu cần thêm
1D — Xử lý trường hợp resize bị lỗi ORA-03297
-- ORA-03297: file contains used data beyond requested RESIZE value
-- → Có extent nằm ở cuối file, không shrink về HWM được

-- Tìm extent cuối cùng trong file bị lỗi (FILE_ID = thay số thực tế):
SELECT tablespace_name, segment_name, segment_type,
       block_id, blocks,
       (block_id + blocks - 1) last_block
FROM dba_extents
WHERE file_id = &FILE_ID
ORDER BY last_block DESC
FETCH FIRST 10 ROWS ONLY;

-- Nếu extent cuối là của segment di chuyển được → shrink segment trước:
ALTER TABLE schema.table_name ENABLE ROW MOVEMENT;
ALTER TABLE schema.table_name SHRINK SPACE CASCADE;
ALTER TABLE schema.table_name DISABLE ROW MOVEMENT;

-- Sau đó retry resize file
-- Nếu không shrink được → bỏ qua file này, chuyển file khác
✓ Rollback Step 1
Resize lại về size gốc (dùng snapshot đã lưu ở Pre-check P2):
ALTER DATABASE DATAFILE '<tên file>' RESIZE <original_size_mb>M;

4.② Truncate Partition

② Truncate Partition cũ — Giải phóng space theo range

⛔ QUAN TRỌNG: Xác nhận với Business Owner trước khi truncate
Truncate partition là KHÔNG THỂ ROLLBACK nếu không có backup. Phải xác nhận:
(1) Partition cần truncate chứa data tháng/quý nào?
(2) Data đã được archive/export chưa?
(3) Có policy retention nào áp dụng không?
2A — Khảo sát partitioned tables lớn nhất trong DATA diskgroup
-- Top 30 partitioned tables chiếm nhiều space nhất
SELECT s.owner, s.segment_name, s.partition_name,
       s.tablespace_name,
       ROUND(s.bytes/1024/1024/1024, 2) size_gb,
       tp.high_value,
       tp.last_analyzed,
       tp.num_rows
FROM dba_segments s
JOIN dba_tab_partitions tp
  ON s.owner = tp.table_owner
 AND s.segment_name = tp.table_name
 AND s.partition_name = tp.partition_name
WHERE s.tablespace_name LIKE 'DATA%'   -- adjust theo tên thực
  AND s.segment_type = 'TABLE PARTITION'
  AND s.bytes/1024/1024/1024 > 0.5     -- partition > 500MB
ORDER BY s.bytes DESC
FETCH FIRST 30 ROWS ONLY;
2B — Xác định partition đủ điều kiện truncate (ví dụ: data > 6 tháng)
-- Kiểm tra high_value (điểm cutoff của partition RANGE)
-- high_value là cột VARCHAR2 chứa dạng "TO_DATE(' 2025-01-01 00:00:00', ...)"
SELECT table_owner, table_name, partition_name,
       partition_position,
       ROUND(blocks * 8 / 1024 / 1024, 2) size_gb,
       high_value,
       last_analyzed
FROM dba_tab_partitions
WHERE table_owner NOT IN ('SYS','SYSTEM','DBSNMP')
  AND blocks * 8 / 1024 / 1024 > 0.5        -- > 500MB
ORDER BY table_owner, table_name, partition_position;

-- Filter partition cũ hơn 6 tháng (ví dụ với partition theo tháng):
SELECT table_owner, table_name, partition_name,
       ROUND(blocks * 8/1024/1024, 2) size_gb
FROM dba_tab_partitions
WHERE high_value_date < ADD_MONTHS(TRUNC(SYSDATE,'MM'), -6)
ORDER BY high_value_date;
2C — EXPORT DATA trước khi truncate (bắt buộc nếu chưa có backup)
-- Option 1: Export partition ra file trước khi truncate
-- Chạy từ OS bằng user oracle:
expdp system/<pwd> \
  TABLES=SCHEMA.TABLE_NAME:PARTITION_NAME_OLD \
  DIRECTORY=DATA_PUMP_DIR \
  DUMPFILE=backup_partition_20260908.dmp \
  LOGFILE=backup_partition_20260908.log \
  COMPRESSION=ALL

-- Option 2: Archive data sang tablespace RECO trước
CREATE TABLE schema.table_archive_202501
  TABLESPACE RECO_TS   -- tablespace nằm trên RECO diskgroup
AS
SELECT * FROM schema.table_name PARTITION (PARTITION_202501);

-- Verify count trước và sau:
SELECT COUNT(*) FROM schema.table_name PARTITION (PARTITION_202501);
2D — Thực hiện TRUNCATE / DROP PARTITION
-- ⚠️ Chỉ thực hiện sau khi đã xác nhận và backup xong

-- Option A: TRUNCATE partition (giữ cấu trúc, xóa data)
ALTER TABLE schema.table_name
  TRUNCATE PARTITION partition_old_202501 UPDATE GLOBAL INDEXES;

-- Option B: DROP partition (nếu không cần partition đó nữa)
ALTER TABLE schema.table_name
  DROP PARTITION partition_old_202501 UPDATE GLOBAL INDEXES;

-- UPDATE GLOBAL INDEXES: tránh index bị UNUSABLE sau khi truncate/drop
-- (có thể chậm hơn nhưng an toàn hơn)

-- Nếu cần nhanh hơn (index sẽ rebuild sau):
ALTER TABLE schema.table_name
  TRUNCATE PARTITION partition_old_202501 DROP STORAGE;

-- Theo dõi space giải phóng sau mỗi truncate:
SELECT ROUND(free_mb/1024,1) free_gb FROM v$asm_diskgroup WHERE name='DATA';
2E — Rebuild index sau khi truncate (nếu có index UNUSABLE)
-- Kiểm tra index bị UNUSABLE
SELECT owner, index_name, status
FROM dba_indexes
WHERE status = 'UNUSABLE'
  AND owner NOT IN ('SYS','SYSTEM');

SELECT owner, index_name, partition_name, status
FROM dba_ind_partitions
WHERE status = 'UNUSABLE';

-- Generate lệnh rebuild:
SELECT 'ALTER INDEX ' || owner || '.' || index_name ||
       ' REBUILD ONLINE PARALLEL 4;' rebuild_cmd
FROM dba_indexes
WHERE status = 'UNUSABLE'
  AND owner NOT IN ('SYS','SYSTEM');

-- Rebuild (chạy sau giờ cao điểm nếu table đang active):
ALTER INDEX schema.index_name REBUILD ONLINE PARALLEL 4;

-- Sau rebuild: reset degree
ALTER INDEX schema.index_name NOPARALLEL;

5.③ Move INDX→RECO

③ Move INDX Tablespace → RECO Diskgroup

📐 Nguyên lý
Di chuyển datafile của tablespace INDX (chứa indexes) từ +DATA sang +RECO. Với Oracle 19c: thực hiện ONLINE, không downtime. Với Oracle 11g: tablespace OFFLINE trong thời gian copy.
RECO hiện có ~922GB free — đủ để nhận INDX tablespace.
3A — Khảo sát INDX tablespace: datafile, size, vị trí
-- Tìm tất cả tablespace tên chứa INDX và datafile của chúng
SELECT df.tablespace_name, df.file_id,
       df.file_name,
       ROUND(df.bytes/1024/1024/1024, 2) size_gb,
       df.autoextensible,
       ts.status, ts.contents
FROM dba_data_files df
JOIN dba_tablespaces ts ON df.tablespace_name = ts.tablespace_name
WHERE UPPER(df.tablespace_name) LIKE '%INDX%'
   OR UPPER(df.tablespace_name) LIKE '%INDEX%'
ORDER BY df.tablespace_name, df.bytes DESC;

-- Tổng size cần move sang RECO:
SELECT SUM(ROUND(bytes/1024/1024/1024, 2)) total_indx_gb
FROM dba_data_files
WHERE UPPER(tablespace_name) LIKE '%INDX%'
   OR UPPER(tablespace_name) LIKE '%INDEX%';

-- Verify RECO có đủ chỗ không:
SELECT ROUND(free_mb/1024,1) reco_free_gb FROM v$asm_diskgroup WHERE name='RECO';
-- Phải > total_indx_gb + 100GB buffer
3B — Tạo thư mục trên RECO diskgroup (nếu chưa có)
-- Login ASMCMD để tạo thư mục
su - grid
asmcmd

ASMCMD> ls +RECO/
ASMCMD> mkdir +RECO/gold/datafile   -- thay 'gold' bằng DB_UNIQUE_NAME thực tế
ASMCMD> ls +RECO/gold/
ASMCMD> exit
3C — [Oracle 19c] Online Datafile Move — KHÔNG downtime
-- ✅ Oracle 19c: ALTER DATABASE MOVE DATAFILE (online, không cần offline TS)
-- Thực hiện từng file một, theo dõi tiến trình

-- Bước 1: Move file đầu tiên (thay tên file thực tế)
ALTER DATABASE MOVE DATAFILE
  '+DATA/gold/datafile/indx01.dbf'
  TO '+RECO/gold/datafile/indx01.dbf'
  REUSE
  KEEP;

-- Theo dõi tiến trình (session khác):
SELECT sid, serial#, opname, sofar, totalwork,
       ROUND(sofar/NULLIF(totalwork,0)*100, 1) pct_done,
       time_remaining
FROM v$session_longops
WHERE opname LIKE '%MOVE%' OR opname LIKE '%DATA FILE%'
ORDER BY start_time DESC;

-- Move tất cả INDX datafiles (generate lệnh):
SELECT 'ALTER DATABASE MOVE DATAFILE ''' || file_name || ''' TO ''' ||
       REPLACE(file_name, '+DATA/', '+RECO/') || ''' REUSE;' move_cmd,
       ROUND(bytes/1024/1024/1024,2) size_gb
FROM dba_data_files
WHERE UPPER(tablespace_name) LIKE '%INDX%'
   OR UPPER(tablespace_name) LIKE '%INDEX%'
ORDER BY bytes DESC;

-- COPY lệnh generate ở trên và thực hiện tuần tự
-- Mỗi file: chờ hoàn thành → verify → move file tiếp theo
3D — [Oracle 11g] Offline Method — Có downtime cho TS INDX
-- ⚠️ Oracle 11g: tablespace phải OFFLINE trong thời gian copy
-- Thực hiện ngoài giờ cao điểm!

-- Bước 1: Đưa tablespace OFFLINE
ALTER TABLESPACE INDX OFFLINE NORMAL;

-- Bước 2: Copy file bằng RMAN (nhanh hơn cp trên ASM)
rman TARGET /
RMAN> COPY DATAFILE '+DATA/gold/datafile/indx01.dbf'
           TO '+RECO/gold/datafile/indx01.dbf';

-- Bước 3: Rename trong DB catalog
sqlplus / as sysdba
ALTER DATABASE RENAME FILE
  '+DATA/gold/datafile/indx01.dbf'
  TO '+RECO/gold/datafile/indx01.dbf';

-- Bước 4: Bring tablespace ONLINE
ALTER TABLESPACE INDX ONLINE;

-- Bước 5: Verify
SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name='INDX';
SELECT file_name FROM dba_data_files WHERE tablespace_name='INDX';

-- Bước 6: Xóa file cũ trên DATA (sau khi verify OK)
asmcmd
ASMCMD> rm +DATA/gold/datafile/indx01.dbf
3E — Xử lý Index bị Invalid sau khi move (nếu có)
-- Sau khi move, kiểm tra indexes
SELECT owner, index_name, tablespace_name, status
FROM dba_indexes
WHERE tablespace_name LIKE '%INDX%'
  AND status != 'VALID';

-- Rebuild nếu có index N/A hoặc UNUSABLE:
SELECT 'ALTER INDEX '||owner||'.'||index_name||
       ' REBUILD ONLINE PARALLEL 4 TABLESPACE INDX;'
FROM dba_indexes
WHERE tablespace_name LIKE '%INDX%' AND status != 'VALID';
✓ Rollback Step 3 (Oracle 19c)
Move file ngược lại từ RECO về DATA:
ALTER DATABASE MOVE DATAFILE '+RECO/gold/datafile/indx01.dbf' TO '+DATA/gold/datafile/indx01.dbf';

6.🔍 Verify & Close

🔍 Verify & Close — Kiểm tra kết quả cuối cùng

V1 — Kiểm tra DATA diskgroup đạt mục tiêu 505GB
-- CHECK PASS/FAIL: DATA free phải >= 505GB
SELECT name,
       ROUND(total_mb/1024, 1)    total_gb,
       ROUND(free_mb/1024, 1)     free_gb,
       ROUND(free_mb/total_mb*100, 2) free_pct,
       CASE WHEN free_mb/1024 >= 505
            THEN '✓ PASS — Đạt mục tiêu'
            ELSE '✗ FAIL — Chưa đủ, cần tiếp tục'
       END status
FROM v$asm_diskgroup
WHERE name IN ('DATA','RECO');

-- So sánh TRƯỚC và SAU (dùng kết quả đã lưu ở Pre-check):
SELECT ts.tablespace_name,
       ROUND(SUM(df.bytes)/1024/1024/1024,2)        alloc_gb,
       ROUND(SUM(NVL(fs.bytes,0))/1024/1024/1024,2) free_gb,
       ROUND((1-SUM(NVL(fs.bytes,0))/SUM(df.bytes))*100,1) used_pct
FROM dba_tablespaces ts
JOIN dba_data_files df ON ts.tablespace_name=df.tablespace_name
LEFT JOIN (SELECT tablespace_name,SUM(bytes) bytes
           FROM dba_free_space GROUP BY tablespace_name) fs
       ON ts.tablespace_name=fs.tablespace_name
GROUP BY ts.tablespace_name
ORDER BY alloc_gb DESC;
V2 — Verify Database hoạt động bình thường
-- Không có invalid objects mới
SELECT owner, object_type, COUNT(*) cnt
FROM dba_objects
WHERE status = 'INVALID'
  AND owner NOT IN ('SYS','SYSTEM','DBSNMP','OUTLN')
GROUP BY owner, object_type
ORDER BY cnt DESC;

-- Không có index UNUSABLE
SELECT COUNT(*) FROM dba_indexes WHERE status='UNUSABLE';
SELECT COUNT(*) FROM dba_ind_partitions WHERE status='UNUSABLE';

-- DataGuard vẫn sync (nếu có standby)
SELECT NAME, VALUE FROM v$dataguard_stats
WHERE NAME IN ('transport lag','apply lag');

-- Archive log đang ship bình thường
SELECT dest_id, status, error FROM v$archive_dest_status
WHERE target='PRIMARY';
V3 — Bật lại AutoExtend và cleanup
-- Bật lại autoextend đã tắt ở Pre-check (nếu cần)
-- Chỉ bật cho những file cần thiết, đặt maxsize hợp lý
ALTER DATABASE DATAFILE '+DATA/gold/datafile/data01.dbf'
  AUTOEXTEND ON NEXT 1024M MAXSIZE 200G;

-- Cleanup: Xóa file cũ trên ASM nếu còn sót (Step 3 offline method)
su - grid
asmcmd
ASMCMD> ls -l +DATA/gold/datafile/
ASMCMD> rm +DATA/gold/datafile/indx01.dbf  -- nếu còn file cũ sau khi move

-- Gather stats cho các bảng vừa truncate partition:
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA','TABLE_NAME', cascade=>TRUE);
V4 — Biện pháp phòng ngừa lặp lại
Hành độngTần suấtThực hiện bởi
Monitor DATA diskgroup free < 15%Alert realtime (OEM/Nagios)Monitoring team
Review partition retention policyHàng quýDBA + Business
Chạy script tìm datafile shrinkableHàng tuầnDBA
Capacity planning diskgroupHàng thángDBA
Purge data cũ theo retentionHàng thángApplication team
-- Script monitor định kỳ (thêm vào cron hàng giờ):
SELECT name,
       ROUND(free_mb/1024,1) free_gb,
       ROUND(free_mb/total_mb*100,1) free_pct,
       CASE WHEN free_mb/total_mb < 0.05 THEN '🔴 CRITICAL'
            WHEN free_mb/total_mb < 0.10 THEN '🟡 WARNING'
            ELSE '🟢 OK' END alert_level
FROM v$asm_diskgroup
ORDER BY free_pct;
📋 Checklist hoàn thành
Pre-check hoàn thành, snapshot trạng thái ban đầu đã lưu
Step 1: Resize datafile — đã shrink các file có thể
Step 2: Truncate/drop partition cũ — đã xác nhận với Business, đã backup
Step 3: Move INDX tablespace sang RECO — verify file location mới
DATA diskgroup free ≥ 505GB (≥ 10%)
Không có index UNUSABLE còn sót
DataGuard apply lag bình thường
AutoExtend đã cấu hình lại cho các datafile quan trọng
Monitoring alert ngưỡng 15% đã được set
Ghi nhận kết quả vào ticket, close incident
=============================
TƯ VẤN: Click Here hoặc Hotline/Zalo 090.29.12.888
=============================
Website không chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn không muốn bị AI thay thế và tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp hay làm chủ Database thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ bí kíp thực chiến, thủ tục, quy trình của gần 20 năm kinh nghiệm (mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google) từ đó giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
cơ sở dữ liệu, cơ sở dữ liệu quốc gia, database, AI, trí tuệ nhân tạo, artificial intelligence, machine learning, deep learning, LLM, ChatGPT, DeepSeek, Grok, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c/21c/23c/23ai, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, docker, k8s, micro service, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master