Thứ Sáu, 15 tháng 8, 2025

Script RMAN + cron để tự động dọn archived log trên standby mà không ảnh hưởng Apply

0) Nguyên tắc an toàn

  • Chỉ xóa archivelog đã APPLIED trên Standby.

  • Giữ buffer an toàn (ví dụ: 50 sequence mới nhất mỗi thread).

  • Kiểm tra đúng PHYSICAL STANDBYMRP đang chạy trước khi xóa.

  • Ghi log đầy đủ.

1) Chuẩn bị (một lần)

Chạy trên primary (khuyến nghị trên cả primary & standby):

-- Chỉ xóa archivelog đã được áp dụng trên standby RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY;

2) Script Linux: dọn archivelog đã applied (theo SEQUENCE)

Lưu file: /u01/app/oracle/admin/scripts/rman_purge_standby.shchmod +x.

#!/bin/bash # rman_purge_standby.sh -- Purge FRA archivelog (Standby) an toàn theo SEQUENCE đã APPLIED # Yêu cầu: bash, sqlplus, rman; chạy bằng user oracle export ORACLE_SID=${ORACLE_SID:-msalepro} # <-- sửa SID export ORACLE_HOME=${ORACLE_HOME:-/u01/app/oracle/product/19.0.0/dbhome_1} export PATH=$ORACLE_HOME/bin:$PATH LOG_DIR=/u01/app/oracle/admin/logs mkdir -p "$LOG_DIR" NOW=$(date +'%F_%H%M') LOG="$LOG_DIR/rman_purge_${ORACLE_SID}_$NOW.log" # Buffer an toàn: giữ lại N sequence cuối mỗi thread (để phòng apply trễ) RETAIN_SEQ=${RETAIN_SEQ:-50} echo "[$NOW] Start purge for $ORACLE_SID (retain $RETAIN_SEQ seq per thread)" | tee -a "$LOG" sqlplus -s / as sysdba <<'SQL' > /tmp/standby_check.$$ 2>&1 set pages 0 feedback off verify off heading off select 'ROLE='||database_role from v$database; select 'MRP='||count(*) from v$managed_standby where process like 'MRP%'; SQL ROLE=$(grep '^ROLE=' /tmp/standby_check.$$ | cut -d= -f2) MRPCNT=$(grep '^MRP=' /tmp/standby_check.$$ | cut -d= -f2) rm -f /tmp/standby_check.$$ if [ "$ROLE" != "PHYSICAL STANDBY" ]; then echo "ERROR: Database role is '$ROLE' (expect PHYSICAL STANDBY). Abort." | tee -a "$LOG" exit 1 fi if [ "$MRPCNT" -eq 0 ]; then echo "WARNING: MRP not running. Continue with caution (apply may be stopped)." | tee -a "$LOG" fi # Lấy MAX sequence đã APPLIED cho từng thread sqlplus -s / as sysdba <<'SQL' > /tmp/applied_seq.$$ set pages 0 feedback off verify off heading off select thread#, max(sequence#) from v$archived_log where applied='YES' group by thread# order by thread#; SQL if ! [ -s /tmp/applied_seq.$$ ]; then echo "ERROR: Cannot fetch applied sequences." | tee -a "$LOG" exit 2 fi # Tạo script RMAN xóa đến (max_applied - RETAIN_SEQ) cho từng thread RMAN_CMDS=/tmp/rman_cmds_$$.rcv echo "run {" > "$RMAN_CMDS" echo " crosscheck archivelog all;" >> "$RMAN_CMDS" while read -r LINE; do T=$(echo "$LINE" | awk '{print $1}') MAXSEQ=$(echo "$LINE" | awk '{print $2}') if [ -z "$T" ] || [ -z "$MAXSEQ" ]; then continue; fi # Tính SEQ mục tiêu sau khi giữ buffer an toàn TARGET=$(( MAXSEQ - RETAIN_SEQ )) if [ "$TARGET" -ge 1 ]; then echo " # Thread $T: max applied=$MAXSEQ, delete until seq $TARGET" | tee -a "$LOG" echo " delete noprompt archivelog until sequence ${TARGET} thread ${T};" >> "$RMAN_CMDS" else echo " # Thread $T: nothing to delete (max_applied=$MAXSEQ)" | tee -a "$LOG" fi done < /tmp/applied_seq.$$ echo " delete noprompt expired archivelog;" >> "$RMAN_CMDS" echo "}" >> "$RMAN_CMDS" echo "---- RMAN script ----" | tee -a "$LOG" cat "$RMAN_CMDS" | tee -a "$LOG" # Thực thi RMAN rman target / log="$LOG" cmdfile="$RMAN_CMDS" RC=$? rm -f /tmp/applied_seq.$$ "$RMAN_CMDS" echo "[$(date +'%F_%H%M')] Finished with RC=$RC" | tee -a "$LOG" exit $RC

Crontab mẫu (chạy mỗi 30 phút)

*/30 * * * * . /home/oracle/.bash_profile; /u01/app/oracle/admin/scripts/rman_purge_standby.sh >> /u01/app/oracle/admin/logs/rman_purge_cron.log 2>&1

Tùy tốc độ redo, bạn đổi tần suất hoặc RETAIN_SEQ bằng cách export biến trước khi gọi script:

export RETAIN_SEQ=100 /u01/app/oracle/admin/scripts/rman_purge_standby.sh

3) Biến thể: dọn theo “độ tuổi” (ngày/giờ)

Nếu muốn giữ theo thời gian (ví dụ giữ 2 ngày), thay khối run{...} trong RMAN:

run { crosscheck archivelog all; delete noprompt archivelog all completed before 'SYSDATE-2'; delete noprompt expired archivelog; }

Cách này không đảm bảo đã APPLIED nếu apply bị chậm—chỉ dùng khi chắc chắn apply không trễ.


4) Windows (Task Scheduler) – file .bat

Lưu rman_purge_standby.bat:

@echo off set ORACLE_SID=msalepro set ORACLE_HOME=C:\app\oracle\product\19.0.0\dbhome_1 set PATH=%ORACLE_HOME%\bin;%PATH% set LOGDIR=C:\oracle\logs if not exist %LOGDIR% mkdir %LOGDIR% set NOW=%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%%time:~3,2% set LOG=%LOGDIR%\rman_purge_%ORACLE_SID%_%NOW%.log echo run { > %TEMP%\rman_cmds.rcv echo crosscheck archivelog all; >> %TEMP%\rman_cmds.rcv REM Giữ theo ngày (ví dụ 2 ngày) echo delete noprompt archivelog all completed before 'SYSDATE-2'; >> %TEMP%\rman_cmds.rcv echo delete noprompt expired archivelog; >> %TEMP%\rman_cmds.rcv echo } >> %TEMP%\rman_cmds.rcv rman target / log=%LOG% cmdfile=%TEMP%\rman_cmds.rcv

Tạo Task chạy 30 phút/lần bằng Task Scheduler.


5) Giám sát FRA (gợi ý câu lệnh)

SELECT name, round(space_used/1024/1024) MB_used, round(space_limit/1024/1024) MB_limit, round(space_reclaimable/1024/1024) MB_reclaimable FROM v$recovery_file_dest; SELECT file_type, percent_space_used FROM v$flash_recovery_area_usage ORDER BY percent_space_used DESC;

6) Mẹo & bài học

  • Đặt FRA ≥ (redo 24–48h + flashback + backup pieces).

  • Luôn cấu hình CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY.

  • Ưu tiên xóa theo SEQUENCE đã APPLIED (script #2) cho standby có nguy cơ apply trễ.

  • Có dashboard cảnh báo khi space_used/space_limit > 80%.

=============================
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

=============================
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, 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, 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