目录

一、备份策略制定
| 数据量&需求 | 备份策略 | 恢复所需文件 |
| 数据量 100G以下 | 一天做一次level 0的备份(全备) | 恢复的时候,会使用最新的那一份备份和归档进行恢复 |
| 数据量 100G-500G | 周日做一次level 0的备份,其它工作日做level 1的增量备份 | 恢复的时候,会使用周日的那一次level 0的做恢复,再加上工作日的 level 1的增量以及归档恢复到最新状态 |
| 数据量 500G -1T 对恢复时间要求高 | 周日做一次level 0的备份,其它工作日做level 1的增量备份 | 恢复的时候,会使用周日的那一次 level 0的做恢复,再加上工作日的 level 1的增量以及归档恢复到最新状态 |
| 数据量500G以上 对恢复时间无要求 | 每月初的周日做一次 level 0的备份,其它周日做level 1的增量备份,其它工作日做level 2 的增量备份。 例:2024- 05-01 做 level 0 的备份,7、14、21、28 号做 level 2的 incremental level 1 的备份,其它日做 incremental level 2的备份 | 假如 05 月 29 号发生数据库损 坏,可以使用月初周末的 1 号那 天的 level0 的做恢复,然后依次 使用 7、14、21、28 号做 level2 的 incremental level 1 的备份恢 复,再使用 29 号的 incremental level 2 备份恢复,最 后使用归档恢复到最新状态 |
目前我们数据库数据量为300G量级,选择第二种备份策略,既周日做一次level 0的全量备份,其它工作日做level 1的增量备份。
二、创建备份目录
在 C 盘中新建 orcl 文件夹以及子文件夹 archive(归档日志)、control(控制)、log(过程日志)、rmanbackup(备份文件),如下:
C:
-orcl
--archive
--rmanbackup
--control
--log
三、查看归档并启用
要用到RMAN备份,必须先开启存档模式
cmd 下输入此命令
sqlplus / as sysdba
SQL> archive log list; (查看是否开启存档模式)
如果未开启,执行下面语句开启
SQL> shutdown immediate; (立即关闭数据库)
SQL> startup mount; (启动实例并加载数据库,但不打开)
SQL> alter database archivelog; (更改数据库为归档模式)
SQL> alter database open; (打开数据库)
SQL> alter system archive log start; (启用自动归档)
SQL> alter system set log_archive_dest_1='location=C:\orcl\archive'; (修改归档路径)
注:修改归档模式后,需要做一次完全备份,等配置完计划任务后,立即执行完全备份
四、设置RMAN参数
(cmd 下输入此命令)
rman target /
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'C:\orcl\control\%F';
RMAN> show all;

五、创建备份脚本
1、全备脚本(level 0级别)
全量备份指令rmanbackup_full.txt
connect target /
run{
backup incremental level 0 database format 'C:\orcl\rmanbackup\Fullbackup_%Y%M%D_%s';
backup archivelog all format 'C:\orcl\rmanbackup\arch_%Y%M%D_%s' delete input;
crosscheck backup;
delete noprompt expired backup;
delete noprompt obsolete device type disk;
}
代码解释:
第一行是连接数据库 RMAN。
第二行开始是 RMAN 的 run 块,里面写相关的命令,注意 delete 命令都需要添加 noprompt 来实现无提示的自动运行效果。
run 块中的第一行就是 0 级备份的语句。
run 块中的第二行就是备份归档日志并删除的语句。
run 块中的第三行是删除被标记为过期的备份文件,就是删除 7 天之前最后一个全备和那次全备之前的所有1级2级备份和归档日志。这里一定要注意,是7天之前的最后一个全备,可能是 7天前的某个全备。
run 块中的第四行是重做归档日志文件,让备份完毕后新的归档日志以当前的全备为起始,防止产生归档日志断续的问题,也可以在恢复的时候自动寻找最近的一次全备然后开始逐条 sql 恢复。
run 块中第五行是检查备份文件物理上有没有缺失的状况,可以不执行这条语句。这条语句的主要作用是如果你从磁盘上物理删除了之前的某次备份,可以通过这个检查出来
run 块中第六行是删除上面那一条发现的,物理磁盘已经丢失但控制文件还记录的备份文件,删除物理已经丢失的文件可以在回滚数据库的时候减少无意义的报错。
全量备份批处理文件:rmanbackup_full.bat
@echo off
set oracle_sid=orcl
set nls_lang=simplified chinese_china.zhs16gbk
set BACKUPDATE=%date:~0,4%%date:~5,2%%date:~8,2%
set logfile=C:\orcl\log\rmanFullbackup_%BACKUPDATE%.log
rman cmdfile= C:\orcl\rmanbackup_full.txt >> %logfile%
2、增量脚本(level 1级别)
增量备份指令rmanbackup_incremental.txt
connect target /
run{
backup incremental level 1 database format 'C:\orcl\rmanbackup\Daybackup_%Y%M%D_%s';
}
增量备份批处理文件:rmanbackup_incremental.bat
@echo off
set oracle_sid=orcl
set nls_lang=simplified chinese_china.zhs16gbk
set BACKUPDATE=%date:~0,4%%date:~5,2%%date:~8,2%
set logfile=C:\orcl\log\rmanDaybackup_%BACKUPDATE%.log
rman cmdfile= C:\orcl\rmanbackup_incremental.txt >> %logfile%
3、累计脚本(level 1级别)
累计备份指令rmanbackup_cumulative.txt
connect target /
run{
backup incremental level 1 cumulative database format 'C:\orcl\rmanbackup\Day3backup_%Y%M%D_%s';
}
批处理文件:rmanbackup_cumulative.bat
@echo off
set oracle_sid=orcl
set nls_lang=simplified chinese_china.zhs16gbk
set BACKUPDATE=%date:~0,4%%date:~5,2%%date:~8,2%
set logfile=C:\orcl\log\rmanDay3backup_%BACKUPDATE%.log
rman cmdfile= C:\orcl\rmanbackup_cumulative.txt >> %logfile%
六、创建备份任务
创建 3 个计划任务,分别对应以下时间点,任务执行时间是每天晚上 23:00
星期日:完全备份
星期一:增量备份
星期二:增量备份
星期三:累计备份
星期四:增量备份
星期五:增量备份
星期六:增量备份
1、创建计划任务
控制面板>管理工具>任务计划程序

创建任务

选择每周

选择周日

启动程序

添加全备脚本

完成

打开属性对话框

选择“不管用户是否登陆都要运行”,勾选“不存储密码”,确定

七、删除备份文件
RMAN脚本示例,该脚本删除所有备份片和归档日志的备份:
RMAN> connect target /;
RMAN> connect catalog cat_user/cat_password@cat_db;
RMAN> delete backup;
RMAN> delete archivelog all;
RMAN> crosscheck backup;
RMAN> crosscheck archivelog all;
RMAN> delete expired backup;
RMAN> delete expired archivelog all;
八、问题记录
1、备份表空间目录大小限制
一、故障现象:
RMAN> backup incremental level =0 database;

二、故障分析
在使用rman进行数据库全备份时出现ORA-19809: 超出了恢复文件数的限制错误,查报错说明例如以下:
ORA-19809: limit exceeded for recovery files
Cause: The limit for recovery files specified by the DB_RECOVERY_FILE_DEST_
SIZE was exceeded.
Action: The error is accompanied by 19804. See message 19804 for further details.
在这里能够看到。文档明白指出了ORA-19809错误是伴随着ORA-19804出现,接着看下ORA-19804的出现原因及解决方式:
ORA-19804: cannot reclaim string bytes disk space from string limit
Cause: Oracle cannot reclaim disk space of specified bytes from the DB_RECOVERY_FILE_DEST_SIZE limit.
Action: There are five possible solutions: 1) Take frequent backup of recovery area
using RMAN. 2) Consider changing RMAN retention policy. 3) Consider changing
RMAN archivelog deletion policy. 4) Add disk space and increase DB_
RECOVERY_FILE_DEST_SIZE. 5) Delete files from recovery area using RMAN.
以上已经明白给出导致这个错误的原因及五点解决方式
最简单也是最经常使用的办法就是扩大DB_RECOVERY_FILE_DEST_SIZE的设置
首先查看数据库的当前设置:
SYS @ ORCL(159)> archive log list;

能够看到使用了数据库默认的闪回区用来存储归档,接下来看下闪回区的位置,大小及使用情况
SYS @ ORCL(159)> show parameter db_recovery_file_dest;

对于db_recovery_file_dest_size,系统默认设置为4G大小,当该空间不够容纳备份集则会导致上面见到的错误。
三、解决方式:
1、扩大db_recovery_file_dest_size參数设置,依据实际占用表空间大小测算,比如实际表空间占用了210G,则设置此参数时需超过此大小。
sql>alter system set db_recovery_file_dest_size=400G;
2、查看当前设置情况
sql>show parameter db_recovery_file_dest;
3、又一次运行rman备份
RMAN> backup incremental level =0 database;

RMAN> list backupset;

2、数据库连接数受限
--查询数据库当前进程的连接数:
select count(*) from v$process;
--查看数据库当前会话的连接数:
select count(*) from v$session;
--查看数据库的并发连接数:
select count(*) from v$session where status='ACTIVE';
--查看当前数据库建立的会话情况:
select sid,serial#,username,program,machine,status from v$session where username='SYSMAN';
--查询所有数据库的连接数
select schemaname,count(*) from v$session group by schemaname;
--查询终端用户使用数据库的连接情况。
select osuser,schemaname,count(*) from v$session where schemaname='SYSMAN' group by schemaname,osuser;
--查看当前有哪些用户正在使用数据:
select osuser,a.username,cpu_time/executions/1000000||'s',sql_fulltext,machine from v$session a,v$sqlarea b where a.sql_address = b.address order by cpu_time/executions desc;
--使用SQL语句查询出已被占用的连接:
SELECT s.sid, s.user#, s.serial#, s.status FROM v$session s, v$process p WHERE s.status = 'INACTIVE';
SELECT p.* FROM v$session s, v$process p WHERE s.status = 'INACTIVE' and s.username='SYSMAN';
--查看连接数状态统计
select inst_id,status,count(*) from gv$session where type <> 'BACKGROUNND' group by inst_id,status order by 3;
--查看rman 系统进程号SPID
select sid,spid,client_info from v$process p,v$session s where p.addr=s.paddr and client_info like '%rman%';
--查看rman备份进度
SELECT inst_id,sid,serial#,opname,ROUND(SOFAR / TOTALWORK * 100, 2) "%_COMPLETE" FROM gV$SESSION_LONGOPS WHERE OPNAME LIKE 'RMAN%' AND TOTALWORK != 0 AND SOFAR <> TOTALWORK;

1万+

被折叠的 条评论
为什么被折叠?



