快轉到主要內容

Oracle 備份方式: RMAN

·956 字·2 分鐘·
PolloChang
作者
PolloChang
我是一隻雞

NFS 設定方法
#

一般資料庫備份建議是使用本機,但是我的 LAB 環境中硬碟有限,所以使用 NAS 方案

1
2
3
4
# 11g
rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600
# 19c
rw,bg,hard,rsize=65536,wsize=65536,nfsvers=3,forcedirectio,tcp,timeo=600
  • /etc/auto.nas
1
db-bk -fstype=nfs,vers=3,rw,hard,nointr,rsize=32768,wsize=32768,tcp,timeo=600,actimeo=0 nas.home.pollochang.work:/volume1/vm-backup/test/vm123-db-bk

設定說明

  • vers=3:雖然 19c 支援 4.1,但在許多 NAS 環境下,NFS v3 配合 Oracle 的相容性最穩定,且能避開許多 ORA-27054 的錯誤。
  • hard:非常重要。必須從 soft 改為 hard。使用 soft 時,若 NFS 超時會回傳錯誤給 Oracle,這可能導致資料庫以為寫入成功但實際失敗;hard 則會持續重試直到成功,確保資料一致性。
  • nointr:禁止訊號中斷掛載操作,確保 I/O 完整。
  • timeo=600:將超時時間拉長,避免在備份大型檔案時因為 NAS 壓力大而被斷開。
  • actimeo=0(或 noac):停用目錄與檔案屬性的快取,確保 Oracle 讀取到的是 NAS 上最新的狀態。

設定備份腳本
#

切換到 Oracle 帳戶

1
su - oracle
1
2
mkdir -p /u01/backup/oracle/rman/log
rman target /
1
2
3
4
5
CONFIGURE BACKUP OPTIMIZATION ON;            # 啟用備份優化
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;  # 保留 2 次的備份 或 TO RECOVERY WINDOW OF 7 DAYS
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/mnt/nas-share/db-bk/rman/%F';
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK;
  • /home/oracle/scripts/01_rman_fullbackup.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
. /home/oracle/scripts/setEnv.sh

# 建議明確設定環境變數,避免依賴 .bash_profile
# export ORACLE_SID=your_sid
# export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
# export PATH=$ORACLE_HOME/bin:$PATH

export SCRIPT_HOME="/home/oracle/scripts"
export RMAN_BACKUP_LOG="/u01/backup/oracle/rman/log"
export BACKUP_DEST="/mnt/nas-share/db-bk/rman"

# 檢查備份目錄是否存在
if [ ! -d "$BACKUP_DEST" ]; then
    echo "錯誤: 備份目錄 $BACKUP_DEST 不存在!"
    exit 1
fi

rman TARGET / CMDFILE=${SCRIPT_HOME}/02_rman_fullbackup.rcv LOG=${RMAN_BACKUP_LOG}/log_$(date +%Y%m%d%H%M%S)_rman.log

find ${RMAN_BACKUP_LOG} -name "*.log" -mtime +30 -exec rm -f {} \;
  • /home/oracle/scripts/02_rman_fullbackup.rcv
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SHOW ALL;

RUN {
  # 1. 增加並行度 (Parallelism)
  # 如果你的 CPU 與磁碟 I/O 許可,開啟多個頻道可以大幅縮短備份時間
  ALLOCATE CHANNEL d1 TYPE DISK;
  ALLOCATE CHANNEL d2 TYPE DISK;
  
  # 2. 建議使用壓縮備份 (AS COMPRESSED BACKUPSET)
  # 這能節省 70% 以上的磁碟空間,並減少 I/O 負載
  BACKUP AS COMPRESSED BACKUPSET
         DATABASE 
         FORMAT '/mnt/nas-share/db-bk/rman/%T_%d_%s_alldb_%p.bak'
         PLUS ARCHIVELOG 
         FORMAT '/mnt/nas-share/db-bk/rman/%T_%d_%s_alldb_%p.arc' 
         DELETE INPUT;
  
  # 3. 備份控制檔案與 SPFILE (雖然你有設定 AUTOBACKUP,但手動備份更保險)
  BACKUP CURRENT CONTROLFILE FORMAT '/mnt/nas-share/db-bk/rman/%T_%d_%s_ctl.bak';
  BACKUP SPFILE FORMAT '/mnt/nas-share/db-bk/rman/%T_%d_%s_spfile.bak';
  
  RELEASE CHANNEL d1;
  RELEASE CHANNEL d2;

  # 4. 清理過期備份
  CROSSCHECK BACKUP;
  CROSSCHECK ARCHIVELOG ALL;
  DELETE NOPROMPT EXPIRED BACKUP;
  DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
  DELETE NOPROMPT OBSOLETE;
}

設定排程
#

雖然 crontab 很經典,但 systemd.timer 它能提供更強大的日誌管理(透過 journalctl)以及更精細的資源控制。

  • /etc/systemd/system/oracle-rman-backup.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[Unit]
Description=Oracle RMAN Daily Full Backup Service
After=network.target oracle-database.service

[Service]
Type=oneshot
User=oracle
Group=oinstall
# 呼叫你之前準備好的啟動腳本
ExecStart=/home/oracle/scripts/01_rman_fullbackup.sh

# 設定環境變數(如果腳本內部沒載入,這裡可以當作雙重保險)
Environment=ORACLE_HOME=/u01/app/oracle/product/19.0.0/db
Environment=ORACLE_SID=db151

[Install]
WantedBy=multi-user.target
  • /etc/systemd/system/oracle-rman-backup.timer
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Unit]
Description=Run Oracle RMAN Backup Daily at Midnight

[Timer]
# 設定每天凌晨 00:00 執行一次
OnCalendar=*-*-* 00:00:00

# 如果系統在該執行時關機了,開機後是否補執行 (推薦設為 true)
Persistent=true

# 指定對應的 Service
Unit=oracle-rman-backup.service

[Install]
WantedBy=timers.target
1
systemctl enable --now oracle-rman-backup.timer
1
systemctl list-timers --all | grep rman
1
2
# 查看最近一次的備份日誌
journalctl -u oracle-rman-backup.service -f