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óng | Rủi ro | Thời gian | Downtime? |
|---|---|---|---|---|---|
| 1 | Resize datafile (shrink HWM) | 50–150 GB | THẤP | 30–60 phút | ❌ Không |
| 2 | Truncate/Drop partition cũ | 100–300 GB | TRUNG BÌNH | 30–120 phút | ❌ Không |
| 3 | Move INDX tablespace → RECO | 100–300 GB | TRUNG BÌNH | 1–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 động | Tần suất | Thực hiện bởi |
|---|---|---|
| Monitor DATA diskgroup free < 15% | Alert realtime (OEM/Nagios) | Monitoring team |
| Review partition retention policy | Hàng quý | DBA + Business |
| Chạy script tìm datafile shrinkable | Hàng tuần | DBA |
| Capacity planning diskgroup | Hàng tháng | DBA |
| Purge data cũ theo retention | Hàng tháng | Application 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