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