RMAN备份脚本

RMAN备份脚本

𝓓𝓸𝓷 Lv6

一、Linux rman备份脚本

1.练气期版
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

run{
CONFIGURE CONTROLFILE AUTOBACKUP OFF;
crosscheck archivelog all;
crosscheck backup;
crosscheck copy;
allocate channel d1 type disk;
allocate channel d2 type disk;
allocate channel d3 type disk;
allocate channel d4 type disk;
allocate channel d5 type disk
crosscheck archivelog all;
backup database include current controlfile format '/rmanbak/rmanbak/calldb/full_%d_%s_%T_%U';
sql 'alter system archive log current';
backup archivelog all format '/rmanbak/rmanbak/calldb/log_%d_%s_%T_%U' delete all input;

crosscheck archivelog all;
crosscheck backup;
crosscheck copy;
release channel d5;
release channel d4;
release channel d3;
release channel d2;
release channel d1;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
}

2.筑基期版
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
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash


DATE=`date +"%Y%m%d"`

export ORACLE_SID=scdb1
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1

backup_file_dir='/rman/zd_backup'

BACKUP_STARTTIME=`date '+%Y-%m-%d %H:%M:%S'`


echo "BACKUP_STARTTIME: $BACKUP_STARTTIME " >$backup_file_dir/fulll_$DATE.log
$ORACLE_HOME/bin/rman target "/">> $backup_file_dir/fulll_$DATE.log 2>&1 <<EOF!
run{
CONFIGURE CONTROLFILE AUTOBACKUP OFF;
crosscheck archivelog all;
crosscheck backup;
crosscheck copy;
allocate channel d1 type disk;
allocate channel d2 type disk;
allocate channel d3 type disk;
allocate channel d4 type disk;
sql 'alter system archive log current';
crosscheck archivelog all;
backup database include current controlfile format '$backup_file_dir/full_%d_%s_%T_%U';
sql 'alter system archive log current';
backup archivelog all format '$backup_file_dir/log_%d_%s_%T_%U';
crosscheck archivelog all;
crosscheck backup;
crosscheck copy;
release channel d4;
release channel d3;
release channel d2;
release channel d1;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
}
EOF!

BACKUP_ENDTIME=`date '+%Y-%m-%d %H:%M:%S'`
echo "BACKUP_ENDTIME: $BACKUP_ENDTIME " >> $backup_file_dir/fulll_$DATE.log

3.金丹期版
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
(1)脚本一

#!/bin/bash
#set env
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=$1


DATE=`date +%w`
DATE_D=`date +%Y%m%d`
BACKUP_PATH=/backup/rman
mkdir -p $BACKUP_PATH/{$DATE_D,log}


if [ $DATE -eq 3 ]; then
LEVEL=0
Type=Full
else
LEVEL=1
Type=Incr
fi



echo "----------------------------- $ORACLE_SID Backup Start: `date "+%Y-%m-%d %H:%M:%S"` -----------------------------";

rman target / nocatalog log=$BACKUP_PATH/log/${Type}_${1}_${DATE_D}.log <<EOF
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
allocate channel c5 type disk;
allocate channel c6 type disk;
allocate channel c7 type disk;
allocate channel c8 type disk;
crosscheck archivelog all;
backup as compressed backupset incremental level $LEVEL format '$BACKUP_PATH/$DATE_D/$Type-LEV${LEVEL}-%d-%U-%T-%I-%s' database;
backup current controlfile format '$BACKUP_PATH/${DATE_D}/Ctl-LEV${LEVEL}-%d-%U-%T-%I';
backup spfile format '$BACKUP_PATH/${DATE_D}/Spfile-LEV${LEVEL}-%d-%U-%T-%I';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '$BACKUP_PATH/${DATE_D}/Arch-LEV${LEVEL}-%d-%U-%T-%I-%e' ;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel c5;
release channel c6;
release channel c7;
release channel c8;
}
allocate channel for maintenance device type disk;
report obsolete;
crosscheck copy;
crosscheck backup of archivelog all ;
crosscheck archivelog all;
delete noprompt obsolete device type disk;
crosscheck backup;
delete noprompt expired backup;
delete noprompt archivelog until time 'sysdate - 7';
list backup summary;
release channel;
exit;
EOF
echo
echo "----------------------------- $ORACLE_SID Backup End: `date "+%Y-%m-%d %H:%M:%S"` -----------------------------";




find $BACKUP_PATH/log -name '*.log' -mtime +31 |xargs rm -rf

find $BACKUP_PATH -maxdepth 1 -type d -empty -exec rm -rf {} \; -print



删除空文件夹脚本:
---判断文件夹为空,则删除:
#!/bin/bash



backup_path="/linuxbak-rman01/rman"

function delete_backup(){
for dir in `ls $backup_path`
do
dir_path=${backup_path}/$dir
if [ "$(ls -A $dir_path | wc -l)" -eq 0 ]; then
rm -rf "$dir_path"
echo $dir_path
fi
done
}

delete_backup


对于nas挂载盘备份经常会出现类似.nfs00000000116a01160000001b这种隐藏文件,判断为空可以去掉-A参数:
#!/bin/bash



backup_path="/linuxbak-rman01/rman"

function delete_backup(){
for dir in `ls $backup_path`
do
dir_path=${backup_path}/$dir
if [ "$(ls -A $dir_path | wc -l)" -eq 0 ]; then
rm -rf "$dir_path"
echo $dir_path
fi
done
}

delete_backup




(2)脚本二

#!/bin/bash
#set env
export ORACLE_BASE=/u01/app/oracle/product/12.1.0/dbhome_1
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=mydb2
export DB_NAME=mydb


DATE=`date +%w`
DATE_D=`date +%Y%m%d`
BACKUP_PATH=/unixbak-rman/rman
mkdir -p $BACKUP_PATH/{$DATE_D,log}


if [ $DATE -eq 6 ]; then
LEVEL=0
Type=Full
else
LEVEL=1
Type=Incr
fi



echo "----------------------------- $DB_NAME Backup Start: `date "+%Y-%m-%d %H:%M:%S"` -----------------------------";

rman target / nocatalog log=$BACKUP_PATH/log/${Type}_${DB_NAME}_${DATE_D}.log <<EOF
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
allocate channel c5 type disk;
allocate channel c6 type disk;
allocate channel c7 type disk;
allocate channel c8 type disk;
backup as compressed backupset incremental level $LEVEL format '$BACKUP_PATH/$DATE_D/$Type-LEV$LEVEL-%d-%U-%T-%I-%s' database;
backup current controlfile format '$BACKUP_PATH/${DATE_D}/Ctl-LEV$LEVEL-%d-%U-%T-%I';
backup spfile format '$BACKUP_PATH/${DATE_D}/Spfile-LEV$LEVEL-%d-%U-%T-%I';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '$BACKUP_PATH/${DATE_D}/Arch-LEV$LEVEL-%d-%U-%T-%I-%e' ;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel c5;
release channel c6;
release channel c7;
release channel c8;
}
allocate channel for maintenance device type disk;
report obsolete;
crosscheck copy;
crosscheck backup of archivelog all ;
crosscheck archivelog all;
delete noprompt obsolete device type disk;
crosscheck backup;
delete noprompt expired backup;
delete noprompt archivelog until time 'sysdate - 7';
list backup summary;
release channel;
exit;
EOF
echo
echo "----------------------------- $DB_NAME Backup End: `date "+%Y-%m-%d %H:%M:%S"` -----------------------------";




find $BACKUP_PATH/log -name '*.log' -mtime +31 |xargs rm -rf

find $BACKUP_PATH -maxdepth 1 -type d -empty -exec rm -rf {} \; -print

4.元婴期版
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

#!/bin/bash
#set env
source /home/oracle/.bash_profile
export ORACLE_SID=emesdb2
DATE=`date +%w`
#DATE=0
DATE_D=`date +%d`
DATE_2=`date +%Y%m%d`
BACKUP_PATH=/ora_backup/emesdb_backup
mkdir -p $BACKUP_PATH/$DATE
if [ $DATE -eq 0 ]; then
echo "usage: rman.sh level 0 "
LEVEL=0
fi
if [ $DATE -eq 3 ]; then
echo "usage: rman.sh level 1 "
LEVEL=1
fi

if [ $DATE -eq 1 -o $DATE -eq 2 -o $DATE -eq 4 -o $DATE -eq 5 -o $DATE -eq 6 ]; then
echo "usage: rman.sh level 2 "
LEVEL=2
fi

echo "-----------------------------start-----------------------------";
#backup spfile & pfile

if [ $LEVEL -eq 0 ]; then
echo "-----------------------------1-----------------------------";
rman target / nocatalog log=$BACKUP_PATH/$DATE-0.log <<EOF
run{
allocate channel c3 type disk;
allocate channel c4 type disk;
crosscheck archivelog all;
backup as compressed backupset incremental level $LEVEL filesperset 3 format '$BACKUP_PATH/$DATE/data-$LEVEL-%d-%U-%t' (database include current controlfile) ;
backup current controlfile format '$BACKUP_PATH/$DATE/ctl-$LEVEL-%d-%U-%t';
backup spfile format '$BACKUP_PATH/$DATE/spfile-$LEVEL-%d-%U-%t';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '$BACKUP_PATH/$DATE/arch-$LEVEL-%d-%U-%t' delete input;
CONFIGURE RETENTION POLICY TO recovery window of 30 days;
crosscheck backup of archivelog all ;
crosscheck archivelog all;
crosscheck backupset;
delete noprompt obsolete device type disk;
delete noprompt expired backup;
release channel c3;
release channel c4;
}
exit;
EOF
echo "-----------------------------1-0-----------------------------";
else
echo "-----------------------------2-----------------------------";
rman target / nocatalog log=$BACKUP_PATH/$DATE-0.log <<EOF
run{
allocate channel c3 type disk;
allocate channel c4 type disk;
backup as compressed backupset incremental level $LEVEL filesperset 3 format '$BACKUP_PATH/$DATE/data-$LEVEL-%d-%U-%t' (database include current controlfile) ;
backup current controlfile format '$BACKUP_PATH/$DATE/ctl-$LEVEL-%d-%U-%t';
backup spfile format '$BACKUP_PATH/$DATE/spfile-$LEVEL-%d-%U-%t';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '$BACKUP_PATH/$DATE/arch-$LEVEL-%d-%U-%t' delete input;
CONFIGURE RETENTION POLICY TO recovery window of 30 days;
crosscheck backup of archivelog all ;
crosscheck archivelog all;
crosscheck backupset;
delete noprompt obsolete device type disk;
delete noprompt expired backup;
release channel c3;
release channel c4;
}
exit;
EOF
echo "-----------------------------2-0-----------------------------";
fi

二、Windows rman备份脚本

1.练气期版
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
(1) Windows bat脚本

@echo off

color 0a

cd /d %~dp0

set ORACLE_SID=hyrisdb

set ORACLE_HOME=E:\app\product\12.2.0\dbhome_1




set "BACKUP_DAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%"

set "SCRIPT_PATH=D:\Backup\Oracle\script"

set "SOURCE_PATH=D:\Backup\Oracle\rman"


set "LOG_PATH=%SOURCE_PATH%\log"


if not exist "%LOG_PATH%" md "%LOG_PATH%"

%ORACLE_HOME%\bin\rman target / nocatalog cmdfile=%SCRIPT_PATH%\backup_script.rman log=%LOG_PATH%\rman_%ORACLE_SID%_full_%BACKUP_DAY%.log


(2) backup_script.rman脚本内容

run{
crosscheck archivelog all;
crosscheck backup;
crosscheck copy;
allocate channel d1 type disk;
allocate channel d2 type disk;
sql 'alter system archive log current';
crosscheck archivelog all;
backup as compressed backupset database format 'D:\Backup\Oracle\rman\Full_%d-%U-%T-%I-%s';
backup current controlfile format 'D:\Backup\Oracle\rman\Ctl-%d-%U-%T-%I';
backup spfile format 'D:\Backup\Oracle\rman\Spfile-%d-%U-%T-%I';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format 'D:\Backup\Oracle\rman\Arc_%d-%U-%T-%I-%e';
crosscheck archivelog all;
crosscheck backup;
crosscheck copy;
release channel d1;
release channel d2;
}
allocate channel for maintenance device type disk;
report obsolete;
crosscheck copy;
crosscheck backup of archivelog all ;
crosscheck archivelog all;
delete noprompt obsolete;
crosscheck backup;
delete noprompt expired backup;
delete noprompt archivelog until time 'sysdate - 7';
list backup summary;
release channel;
exit;
2.筑基期版
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
(1) Windows bat脚本

@echo off

color 0a

cd /d %~dp0

set ORACLE_SID=swlisdb

set ORACLE_HOME=E:\app\Administrator\product\11.2.0\dbhome_1

if "%time:~0,1%"==" " set "time=0%time:~1%"

set "BACKUP_DAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%"

set "SCRIPT_PATH=D:/rman/script"

set "SOURCE_PATH=D:/rman"

set "BACKUP_PATH=%SOURCE_PATH%/%BACKUP_DAY%"

set "LOG_PATH=%SOURCE_PATH%/log"


if not exist "%BACKUP_PATH%" md "%BACKUP_PATH%"
if not exist "%LOG_PATH%" md "%LOG_PATH%"

rman target / nocatalog cmdfile=%SCRIPT_PATH%/backup_script.rman log=%LOG_PATH%/rman_%ORACLE_SID%_full_%BACKUP_DAY%.log using '%BACKUP_PATH%'



(2) backup_script.rman脚本内容

run{
crosscheck archivelog all;
crosscheck backup;
crosscheck copy;
allocate channel d1 type disk;
allocate channel d2 type disk;
sql 'alter system archive log current';
crosscheck archivelog all;
backup as compressed backupset database format '&1/Full_%d-%U-%T-%I-%s';
backup current controlfile format '&1/Ctl-%d-%U-%T-%I';
backup spfile format '&1/Spfile-%d-%U-%T-%I';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '&1/Arc_%d-%U-%T-%I-%e';
crosscheck archivelog all;
crosscheck backup;
crosscheck copy;
release channel d1;
release channel d2;
}
allocate channel for maintenance device type disk;
report obsolete;
crosscheck copy;
crosscheck backup of archivelog all ;
crosscheck archivelog all;
delete noprompt obsolete;
crosscheck backup;
delete noprompt expired backup;
delete noprompt archivelog until time 'sysdate - 7';
list backup summary;
release channel;
exit;
3.筑基期版
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
(1) Windows bat脚本

@echo off

color 0a

cd /d %~dp0

set ORACLE_SID=db

set ORACLE_HOME=D:\App\Oracle\product\11.2.0\dbhome_2

if "%time:~0,1%"==" " set "time=0%time:~1%"

set "BACKUP_DATE=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%time:~0,2%"

set "BACKUP_TIME=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2% %time:~0,8%"

set "BACKUP_DAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%"

set "SCRIPT_PATH=D:/App/Oracle/script"

set "SOURCE_PATH=D:/App/Oracle/rman"

set "BACKUP_PATH=%SOURCE_PATH%/%BACKUP_DAY%"

set "LOG_PATH=%SOURCE_PATH%/log"


if not exist "%BACKUP_PATH%" md "%BACKUP_PATH%"
if not exist "%LOG_PATH%" md "%LOG_PATH%"

rman target / nocatalog cmdfile=%SCRIPT_PATH%/backup_script.rman log=%LOG_PATH%/rman_%ORACLE_SID%_full_%BACKUP_DATE%.log using '%BACKUP_PATH%' '%BACKUP_DATE%'



rem ftp上传备份文件到远程备份服务器

cd /d %SOURCE_PATH%
Echo open 192.168.1.97>ftp.up
Echo risbak>>ftp.up
Echo 0791k5Bka>>ftp.up
Echo cd 192.168.1.51>>ftp.up
Echo binary >>ftp.up
Echo cd rman >>ftp.up
Echo mput *%BACKUP_DAY%*>>ftp.up
Echo bye >>ftp.up

ftp -is:ftp.up
del %SOURCE_PATH%\ftp.up /q




(2) backup_script.rman脚本内容

run{
crosscheck archivelog all;
crosscheck backup;
crosscheck copy;
allocate channel d1 type disk;
allocate channel d2 type disk;
sql 'alter system archive log current';
crosscheck archivelog all;
backup as compressed backupset database format '&1/Full_%d-%U-&2-%I-%s';
backup current controlfile format '&1/Ctl-%d-%U-&2-%I';
backup spfile format '&1/Spfile-%d-%U-&2-%I';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '&1/Arc_%d-%U-&2-%I-%e';
crosscheck archivelog all;
crosscheck backup;
crosscheck copy;
release channel d1;
release channel d2;
}
allocate channel for maintenance device type disk;
report obsolete;
crosscheck copy;
crosscheck backup of archivelog all ;
crosscheck archivelog all;
delete noprompt obsolete;
crosscheck backup;
delete noprompt expired backup;
delete noprompt archivelog until time 'sysdate - 7';
list backup summary;
release channel;
exit;

  • Title: RMAN备份脚本
  • Author: 𝓓𝓸𝓷
  • Created at : 2024-06-15 18:20:27
  • Updated at : 2025-09-12 16:53:23
  • Link: https://www.zhangdong.me/rman-backup.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
评论