RMAN异机恢复数据库详解

前言

数据库RMAN备份脚本

run {
allocate channel d1 type disk;
allocate channel d2 type disk;
allocate channel d3 type disk;
crosscheck backup;
delete noprompt expired backup;
report obsolete;
delete noprompt obsolete;
crosscheck archivelog all;
delete noprompt expired archivelog all;
backup incremental level 0 database filesperset 10 format 'F:\dbbacks\fullback\incr0_%d_%T_%s.bak' plus archivelog format 'F:\dbbacks\fullback\log0_%d_%T_%s.log';
backup current controlfile format 'F:\dbbacks\fullback\ctl0_%d_%T_%s.ctl';
backup spfile format 'F:\dbbacks\fullback\spf0_%d_%T_%s';
delete noprompt archivelog all completed before 'sysdate-7';
release channel d1;
release channel d2;
release channel d3;
}
exit

数据库备份定时任务脚本

rman target / nocatalog cmdfile='F:\dbbacks\incrback0_shell.txt' log='F:\dbbacks\fullback\incrback0.log'

        通过以上脚本可以看出备份文件保存在“F:\dbbacks\fullback\”路径下,这个比较重要,后续用得到;另外备份脚本中同时有备份controlfile、spfile文件,后续恢复时用得到。

        数据库备份步骤在这里不多说,本文主要是讲述如何恢复数据库。

恢复数据库

本文示例数据库实例名称为:PMS,因此相关文件及配置中可能包含PMS或pms字符,后续不做阐述

1.拷贝备份文件

拷贝数据备份至目标服务器“F:\dbbacks\fullback\”路径下(路径与源服务器保持一致)

2.安装恢复目标数据库

在目标服务器安装Oracle数据库(仅安装数据库,不安装实例,安装路径与源服务器相同,避免不必要麻烦,本次验证路径:D:\Oracle\product\11.2.0\dbhome_1)

3.手动创建数据库实例

# 打开cmd命令窗
# 切换到数据库bin路径下

cd /D D:\Oracle\product\11.2.0\dbhome_1\BIN

# 创建密码文件

# 这里创建临时密码:000000(6个0)方便操作,后续会自动被恢复覆盖
orapwd file=D:\Oracle\product\11.2.0\dbhome_1\database\pwdpms.ora password=000000 entries=5;

# 创建数据库服务

oradim -new -sid PMS -startmode m

# 创建监听

netca
# 注:配置“监听程序配置”和“本地网络服务名配置”

4.恢复前准备

连接数据库,做数据库恢复前期准备
# 切换环境

set ORACLE_SID=PMS

# 连接数据库

sqlplus / as sysdba

# 在D:\Oracle\product\11.2.0\dbhome_1\database目录下创建pfile文件(initpms.ora)

D:\Oracle\product\11.2.0\dbhome_1\database\initpms.ora

# 编辑pfile文件(实际使用时请手动删除下方备注信息,备注信息以##标记

## 数据库缓存大小(1024*1024*1024*16=0.5*服务器内存)
pms.__db_cache_size=17179869184
## Java默认缓存池(1024*1024*128)
pms.__java_pool_size=134217728
## Java最大缓存池(1024*1024*128)
pms.__large_pool_size=134217728
## 数据库基准路径
pms.__oracle_base='D:\oracle'#ORACLE_BASE set from environment
## 数据库PGA大小(1024*1024*1024*12=0.375*服务器内存)
pms.__pga_aggregate_target=12884901888
## 数据库SGA大小(1024*1024*1024*18≈0.56*服务器内存)
pms.__sga_target=19327352832
pms.__shared_io_pool_size=0
## 数据库共享池大小(1024*1024*1024*1.8≈0.056*服务器内存)
pms.__shared_pool_size=1932735283
pms.__streams_pool_size=0
*._system_trig_enabled=FALSE
*.audit_file_dest='D:\oracle\admin\PMS\adump'
*.audit_trail='db'
## 数据库版本号
*.compatible='11.2.0.0.0'
## 数据库控制文件路径
*.control_files='D:\oracle\oradata\PMS\control01.ctl','D:\oracle\flash_recovery_area\PMS\control02.ctl'
*.db_block_size=8192
*.db_domain=''
## 数据库实例名称
*.db_name='PMS'
## 闪回区路径
*.db_recovery_file_dest='D:\oracle\flash_recovery_area'
## 闪回区大小(1024*1024*1024*10)
*.db_recovery_file_dest_size=10737418240
## 数据库全局唯一ID
*.db_unique_name='PMS'
*.deferred_segment_creation=FALSE
*.diagnostic_dest='D:\oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=PMSXDB)'
## 归档日志格式
*.log_archive_format='%t_%s_%r.log'
## 服务器内存大小(1024*1024*1024*32)
*.memory_target=34359738368
## 数据库游标数
*.open_cursors=100
## 数据库最大进程数
*.processes=500
*.remote_login_passwordfile='EXCLUSIVE'
## 数据库服务名
*.service_names='PMS'
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'

# 创建必要文件夹(子目录也需要创建)

D:\Oracle\flash_recovery_area\PMS
D:\Oracle\oradata\PMS

# 通过pfile文件启动数据库至nomount状态

SQL> startup nomount pfile='D:\Oracle\product\11.2.0\dbhome_1\database\initpms.ora';

# 通过pfile创建spfile文件

SQL> create spfile from pfile;

# 正常重启数据库至nomount状态

SQL> shutdown immediate
SQL> startup nomount

5.恢复数据库

# 重新开启一个CMD窗口
# 切换环境

set ORACLE_SID=PMS

# 连接RMAN(若提示rman-00554 rman-04005 ora-12560是因为没有切换环境)

rman target /

# 恢复控制文件

RMAN> restore controlfile from 'F:\DBBACKS\FULLBACK\CTL0_PMS_20230603_25904.CTL';

# 控制文件恢复完成后,即可修改数据库至mount状态

RMAN> alter database mount;

# 查看归档日志备份的状态,查看最大能恢复到哪个sequence(在SQL窗口执行)

SQL> select max(sequence#) from v$archived_log;

# 查看归档备份文件的状态(在RMAN窗口执行,注意备份文件存放路径必须与列表中的路径一致)

RMAN> list backup of archivelog all;

# 恢复数据文件(时间比较长,请耐心等待,RMAN恢复不显示实时进度)

RMAN> restore database;

# 恢复数据库

RMAN> recover database;

注:最后恢复时提示“序列xxxx的归档日志以及起始SCN xxxxxx”,说明恢复高度最高到这里(此时的序列应该与我们在前面查询最大恢复的sequence一致),因此这个错误可以忽略

6.启动数据库

# 先用read only方式打开数据库,测试数据库状态切换是否正常

SQL> alter database open read only;

# 重启数据库至mount状态

SQL> shutdown immediate
SQL> startup mount

# 打开数据库

SQL> alter database open resetlogs;

7.恢复后收尾工作

# 修改系统注册表,注册SID

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1
在这个项右侧增加“ORACLE_SID”字符串值,对应值为“PMS”

# 重启数据库,检查是否能够正常启动数据库

SQL> shutdown immediate
SQL> startup

# 修改listener.ora、tnsnames.ora文件,确认可以远程访问

## listener.ora文件配置:

# listener.ora Network Configuration File: D:\Oracle\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PMS)
      (ORACLE_HOME = D:\Oracle\product\11.2.0\dbhome_1)
      (GLOBAL_DBNAME = PMS)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.202)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

ADR_BASE_LISTENER = D:\Oracle

## tnsnames.ora文件配置:

# tnsnames.ora Network Configuration File: D:\Oracle\product\11.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

PMS =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.202)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PMS)
    )
  )

ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

## 打开一个新的CMD窗口,重启监听

lsnrctl stop
lsnrctl start

## 关闭防火墙(或开启防火墙,但开放1521访问端口)

设置防火墙规则

## 关闭数据库归档(若不需要归档的话,可关闭归档)

# 新开一个cmd窗口
# 连接rman
rman target /
# 检查归档日志
crosscheck archivelog all;
# 清理掉所有归档日志
delete noprompt archivelog all;

# 新开一个cmd窗口
# 连接到数据库
sqlplus / as sysdba
# 关闭数据库
shutdown immediate
# 启动数据库到mount状态
startup mount
# 查看数据库状态
archive log list;
# 修改数据库状态为非归档模式
alter database noarchivelog;
# 若后面要再开启归档,可同样使用上面步骤,使用命令“alter database archivelog;”
# 再次查看数据库归档状态
archive log list;
# 再正常重启数据库即可
shutdown immediate
startup

注:经过以上步骤,即可将备份文件全部恢复(数据库连接密码已恢复为源数据库密码),但是若源数据库还在生成归档,此时会丢失备份之后一段时间的数据,若需要补偿该时段数据,需要继续以下步骤。

8.数据补偿

## 将源库新增的归档日志拷贝到目标服务器进行恢复(在源服务器上操作
## 登陆到源数据库服务器上,切换一下日志(生成新的归档文件,避免数据丢失)

SQL> alter system switch logfile;

## 关闭源数据库(避免新数据写入)

SQL> shutdown immediate

## 将新生成的归档文件拷贝至目标服务器(在目标服务器上操作

F:\archivelog\arch_xxx

## 将归档目录注册成日志目录

RMAN> catalog start with 'F:\archivelog\'

## 再次恢复数据库

RMAN> recover database;

至此,数据库已全部恢复完成,数据库密码也已恢复成源数据库密码。希望本篇内容对您有所帮助!

猜你喜欢

转载自blog.csdn.net/Asgard_Hu/article/details/131111629