Oracle RAC 备份方式

高可用 RAC 数据库中,通过 rman 备份数据库有两个问题:

  1. 如何保证备份在每个实例都能备份成功;
  2. 当一实例发生故障,如何保证其它实例能正常备份。

版本 1.0

通过 RMAN 备份,在单一节点配置脚本,通过系统定时任务去调用,这是方案一。

配置脚本的实例连接实例,总是可以连接到正常的实例执行备份。脚本中指定了备份位置,因而对于集群服务器的要求为:所有节点都挂载同一备份盘

这样,当出现故障的时候是可以依靠其它实例进行备份的。

版本 2.0

上述方案能解决的是数据库级别的故障,如果 OS 层面出现故障,就无法调用脚本执行定时任务。诚然在生产环境中,服务器操作系统层面出现故障应该第一时间进行解决,然而并不能保证无人值守情况下的备份成功。所以,除了备份位置需要一致外,还需要脚本的调用保持一致

保证脚本调用保持一致,每个节点都配置定时任务执行备份,这样带来的问题是如果在多台服务器上进行备份,会出现重复备份等情况。

配置时间间隔去执行备份?这就把简单问题复杂化了。

所以采用的方案是将操作系统层级的任务调度转化为数据库内的任务调度,数据库本身是高可用的意味着该任务调度也是高可用的。即,创建一个 job 去调用备份脚本

同时这也意味着所有节点的服务器都存在同样的脚本,所以条件为:挂载同一个脚本。可以是每台服务器都配置脚本文件,也可以放在备份的共享盘中来共享脚本。

创建一个备份任务:

1
2
3
4
5
6
7
8
9
10
11
12
begin
dbms_scheduler.create_job
(
job_name => 'RAC_BACKUP',
job_type => 'EXECUTABLE',
job_action => '/u01/backup/scripts/backup.sh',
repeat_interval => 'FREQ=DAILY; BYHOUR=0; BYMINUTE=0',
enabled => true,
comments => 'Oracle RAC Backup JOB'
);
end;
/

这里指定每天 0 点调用 /u01/backup/scripts/backup.sh 脚本执行备份。

关于创建任务的 DBMS_SCHEDULER 用法参考:https://docs.oracle.com/database/121/ARPLS/d_sched.htm#ARPLS72260

创建完成,数据库会自动调用该 JOB 定时调用脚本执行备份操作。

查看下次执行时间,随后检测备份执行情况:

1
2
select obj#, object_name, next_run_date from sys.scheduler$_job ssj, dba_objects dob
where ssj.obj# = dob.object_id and object_name = 'RAC_BACKUP';

存在一个疑问是:在多个实例运行正常的情况下,会调用哪个实例执行备份呢?

这个问题在参考部分的第二和第三给出了好的说明。

Shell vs. RMAN

在创建 job 的过程中,参数 job_type 可以指定为 EXECUTABLE 来执行 shell 脚本,其实也可以指定为 BACKUP_SCRIPT 来执行 rman 脚本。此时 job_action 参数可以为保存在数据库内的脚本和 rcv 脚本的路径:

The job_action is either the path to a RMAN script or an inline RMAN script. If the program_action is a path to a script, then the script must reside on every computer that the program runs on.

The job can only have arguments that are strings or that can be cast to strings. These arguments are passed positionally when the script is called.

调用 rman 脚本相对于调用 shell 脚本来讲,少了很多处理逻辑。例如不同的时间执行不同的备份级别,使用 rman 的话需要创建不同的脚本及多个任务来调用,而 shell 可以进行复杂的逻辑处理,也不会影响到任务调度。相比较而言,使用 shell 脚本也是性价比较高的一种选择。

参考

-EOF-