RMAN异机恢复与复制数据库(归档和非归档模式区别,RMAN使用实例)
一、归档与非归档
1、归档与非归档模式的区别
归档模式:可以进行完全、不完全恢复;若发生硬盘故障会导致数据文件丢失,可以利用物理备份和归档日志完全恢复数据库。
非归档模式:在备份过程中数据库不可用,只能部分恢复,不产生归档日志。
(即用户DML还未来得及写进内存突然关机,这部分信息保存在在线日志,如果是归档模式是将在线日志保存下来,之后可以根据它来恢复,如果是非归档模式这部分的数据就会丢失)
2、日志类型
oracle中有两种日志,一是系统日志,即告警日志,二是重做日志,归档模式与重做日志有关
如果存放归档日志的空间不足,就无法进行归档,这时候在线重做日志没有组进行切换,DML语句就不能写入日志,就不能对数据库进行操作。
二、RMAN使用实例
1、RMAN备份语句
connect target / run { allocate channel t1 type DISK; allocate channel t2 type DISK; backup format '/rmanbak/full_%T_%I_%U.bak' database; crosscheck backup; sql 'alter system archive log current'; backup format '/rmanbak/arch_%T_%I_%U.bak' archivelog all delete all input; backup current controlfile format '/rmanbak/con_%T_%I_%U.bak'; backup spfile format '/rmanbak/spf_%T_%I_%U.bak'; delete noprompt obsolete; delete expired backup; release channel t1; release channel t2; }
2、语句拆解
(1)、connect
connect target /;//连接到目标数据库,因为环境变量已经配置好了默认的数据库实例, / 就可以直接连到该数据库
上面是在RMAN里面执行的语句,如果从操作系统连接到RMAN用rman target /;
(2)、run代码块,{}中的语句可以作为一个代码块一起执行,如果不想用rman中的默认配置来备份数据库,就可以使用run代码块。
(3)、allocate channel(磁盘可以分配多个通道,磁带分配的通道数和设备数要一致)
allocate channel t1 type DISK; allocate channel t2 type DISK;//分配两个通道,可以并行进行备份,等价于以下语句
configure device type disk parallelism 2;//第一种是显示分配;第二种是隐式分配,名字是由oracle自动指定的 release channel t1; release channel t2;//释放管道
(4)、backup(备份)
backup format '/rmanbak/full_%T_%I_%U.bak' database;//backup database是备份数据库;format是备份文件的路径;format在database前后都可以 backup format '/rmanbak/arch_%T_%I_%U.bak' archivelog all delete all input;//backup archivelog all备份所有归档日志,delet all input删除所有已备份的旧归档日志 backup current controlfile format '/rmanbak/con_%T_%I_%U.bak';//back current controlfile备份当前控制文件 backup spfile format '/rmanbak/spf_%T_%I_%U.bak';//backup spfile备份参数文件
format说明:
%c 备份片的拷贝数 %d 数据库名称
%I ORACLE数据库的DBID %p 是备份集中的备份片的序号 %s 备份集号 %t 备份集时间戳 %u 是备份集编号和建立时间压缩后组成的8字符名称 %U 是%u_%p_%c的缩写形式 %T 当前时间的年月日,格式为YYYYMMDD %Y 当前时间中的年,格式为YYYY %M 当前时间中的月,格式为MM %D 当前实践中的日,格式为DD
(5)、crosscheck backup 用于检查所有备份文件,包括有效和失效的备份,检查rman目录和物理文件,如果物理文件不存在于介质上,将其标记为Expired,存在就维持Available。为后面delete expire做准备。
(6)、sql(标注执行的是sql语句)
alter system archive log current//对当前日志进行归档 sql 'alter system archive log current'//在rman提示符下执行sql语句,命令用单引号括起来;可以执行查询语句,但是无任何结果输出
(7)、delete
delete noprompt obsolete;//清理过期备份,obsolete是过时的意思 delete expired backup;//删除过期备份
三、定时RMAN备份
需求:0点10分进行数据库全备+归档文件备份;6点、18点进行归档文件备份(归档文件文件共备份三次)。
Oracle官方文档RMAN备份与恢复参考连接:https://docs.oracle.com/en/database/oracle/oracle-database/19/rcmrf/RMAN.html#GUID-E5514ACB-59F6-4DB0-B4DB-64DF4C87CDE7
1、crontab设置定时任务跑定时脚本(crontab详见参考连接)
crontab -e; //在root用户下编辑定时任务 10 0 * * * /home/oracle/scripts/schedule_full.sh //每天0点10分定时任务进行全备+备份归档文件 00 6,18 * * * /home/oracle/scripts/schedule_log.sh //每天6点、18点备份归档文件
2、0点10分定时任务进行数据库全备+归档日志备份(详见/home/oracle/scripts/schedule_full.sh脚本)
vi /home/oracle/scripts/schedule_full.sh CMDFILE=/home/oracle/scripts/full_backup.sh //RMAN执行脚本文件进行数据库全备+归档日志文件备份 LOGFILE=/home/oracle/scripts/baklog/full_baklog_'date +%y%m%d'.log //RMAN日志输出保存位置,date +%y%m%d是yymmdd su - oracle -c "rman cmdfile $CMDFILE msglog $LOGFILE"; //切换到oracle用户执行"rman cmdfile $CMDFILE msglog $LOGFILE"命令再切回root用户。
cmdfile表示脚本文件,要写执行的语句;msglog表示日志文件,指定RMAN备份时输出信息到该日志
full_backup.sh先进行一次全备,再备份归档文件,最后手动备份控制文件和参数文件,方便查找(在备份时要创建好文件夹并授权给oracle用户)。
在root用户下创建文件夹rmanbak,mkdir /rmanbak
修改文件夹所有者为oracle,chown oracle:oinstall /rmanbak
vi /home/oracle/scripts/full_backup.sh //RMAN执行脚本 connect target / run { allocate channel t1 type DISK; allocate channel t2 type DISK; backup format '/rmanbak/full_%T_%I_%U.bak' database; crosscheck backup; sql 'alter system archive log current'; backup format '/rmanbak/arch_%T_%I_%U.bak' archivelog all delete all input; backup current controlfile format '/rmanbak/con_%T_%I_%U.bak'; backup spfile format '/rmanbak/spf_%T_%I_%U.bak'; delete noprompt obsolete; delete expired backup; release channel t1; release channel t2; }
3、每天6点、18点备份归档日志(详见/home/oracle/scripts/schedule_log.sh)
vi /home/oracle/scripts/schedule_log.sh //6点和18点备份归档日志 CMDFILE=/home/oracle/scripts/bak_log.sh LOGFILE=/home/oracle/scripts/baklog/log_baklog_`date +%y%m%d`.log su - oracle -c "rman cmdfile $CMDFILE msglog $LOGFILE"
cmdfile表示脚本文件,要写执行的语句;msglog表示日志文件,指定RMAN备份时输出信息到该日志
back_log.sh备份归档文件
vi /home/oracle/scripts/bak_log.sh
connect target / run { allocate channel t1 type DISK; allocate channel t2 type DISK; sql 'alter system archive log current'; backup format '/rmanbak/arch_%T_%I_%U.bak' archivelog all delete all input; crosscheck backup; delete noprompt obsolete; delete expired backup; release channel t1; release channel t2; }
最后将脚本修改用户所有者,否则oracle执行不了
chown oracle:oinstall schedule_full.sh schedule_log.sh full_backup.sh bak_log.sh
4、查看备份日志
(1)、全备日志
more /home/oracle/scripts/baklog/full_baklog_220921.log
开启通道t1、t2,备份数据文件、在线日志文件及自动备份参数文件和控制文件
检查备份,因为rman的备份保留策略设置保存一份
开始备份归档日志文件
自定义备份控制文件和参数文件
删除多余的备份集
四、RMAN异机恢复
1、查看备份的数据
list backupset; //查看备份集
BS(backupset),数据备份集,piece是一个文件,一个BS包含多个piece;Type是备份类型,Full表示全备
Size是备份集大小;Device Type是备份设备类型;Elapsed Time是备份所用的时间;Completion Time是备份完成时间
List of Datafiles in backup set 9表示列出9号备份集的数据文件
2、在新主机恢复数据库
查看备份文件位置
list backup of database; //数据文件的备份位置 list backup of archivelog all; //归档文件备份位置 list backup of controlfile; //控制文件备份位置 list backup of spfile; //参数文件备份位置 cd /rmanbak; chown oracle:oinstall /rmanbak/full_20220929_3650324070_0418um6k_4_1_1.bak; //修改数据备份文件所有者 chown oracle:oinstall /rmanbak/full_20220929_3650324070_0318um6i_3_1_1.bak; //修改归档备份文件所有者 chown oracle:oinstall /rmanbak/full_20220929_3650324070_0518um81_5_1_1.bak; //修改归档备份文件所有者 chown oracle:oinstall o1_mf_s_1116690690_kmbmn32z_.bkp; //修改参数、控制备份文件所有者
(1)、将数据文件、归档文件、控制文件等备份文件都复制到新主机上
mkdir /rmanbak; //在新主机创建rmanbak文件夹存放备好的文件 chown oracle:oinstall /rmanbak
(2)、配置ORACLE_SID环境变量,与原来的实例名一致
export ORACLE_SID=MDM19c;
(3)、启动RMAN,并从备份中恢复参数文件
rman target /; startup nomount; //启动数据库,会出现找不到参数文件的错误 restore spfile from '/rmanbak/o1_mf_s_1116690690_kmbmn32z_.bkp'; //从备份中恢复参数文件 strings $ORACLE_HOME/dbs/spfileMDM19c.ora |grep /u01; //参数文件中的路径必须存在,如果不存在需要创建
/u01/app/arch文件夹原本就存在不需要创建
mkdir -p /u01/app/oracle/admin/MDM19c/adump; mkdir -p /u01/app/oracle/oradata/MDM19C; mkdir -p /u01/app/oracle/fast_recovery_area/MDM19C; mkdir -p /u01/app/arch; //恢复数据库有用
关闭数据库并重新启动,这时候就重新读取参数文件
(出现错误: system-defined limits for shared memory was misconfigured,查看/u01/app/oracle/diag/rdbms/mdm19c/MDM19c/trace/alert_MDM19c.log文件,发现参数SGA大小是15GB,但是新主机分配不了这么大的内存,修改参数文件,将SGA参数修改小一点)
rman target /; shutdown abort; startup nomount; //出现错误,包括内存过大和参数过时错误 exit; //生成文本参数文件,修改pga_aggregate_target、sga_target大小(修改以*开头的参数)及删除过期参数 more /u01/app/oracle/diag/rdbms/mdm19c/MDM19c/trace/alert_MDM19c.log; sqlplus / as sysdba; create pfile from spfile; exit; vi $ORACLE_HOME/dbs/initMDM19c.ora; *.pga_aggregate_target=1024m //将pga_aggregate_target大小改成1G *.sga_target=2048m //将sga_target大小改成2G *.log_archive_start=FALSE; //将该行数据删除 sqlplus / as sysdba; shutdown abort; create spfile from pfile; startup nomount;
(4)、从备份中恢复控制文件及数据库
(注:recover database noredo相当于源主机在备份归档日志文件之后还有归档日志文件和在线日志文件产生,如果只恢复备份的归档日志文件,新产生的数据就会丢失)
rman target /; restore controlfile from '/rmanbak/o1_mf_s_1116690690_kmbmn32z_.bkp'; alter database mount; list backup; //数据文件的路径必须存在,列出备份信息需要处于mount状态 restore database; //还原数据库,将备份的文件放入相应的路径 recover database; //没有后来归档的文件和新产生在线日志,如果直接recover database会出现错误,而后面加noredo会丢数据,所以将源数据库后面归档的日志文件和新产生的在线日志拷贝到目标主机上相应位置
//进入root环境下,修改这些文件的所属用户 cd /u01/app/arch/; chown oracle:oinstall *.dbf; cd /u01/app/oracle/oradata/MDM19C/; chown oracle:oinstall redo*; recover database; //开始恢复数据库 alter database open RESETLOGS;
五、复制数据库(复制chenmu库为test库)
注意:test库要处于nomount状态;chenmu库处于open或者mount状态;在线复制时test库与chenmu库通过tns相连,拥有相同的用户名和密码;
1、编辑参数文件(涉及的路径要存在)
mkdir /u01/app/oracle/oradata/TEST; vi /tmp/test.ora; //编辑参数文件 db_name=test control_files='/u01/app/oracle/oradata/TEST/control01.ctl' db_file_name_convert='/u01/app/oracle/oradata/CHENMU','/u01/app/oracle/oradata/TEST' log_file_name_convert='/u01/app/oracle/oradata/CHENMU','/u01/app/oracle/oradata/TEST'
2、test库配置静态监听(切换数据库的时候不用等监听起来,如果之前有静态监听,可以直接加SID_DESC)
vi /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora; //编辑监听文件 SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = test) (ORACLE_HOME =/u01/app/oracle/product/19.0.0/dbhome_1) (SID_NAME = test) (ENVS="TNS_ADMIN=/u01/app/oracle/product/19.0.0/dbhome_1/network/admin") ) )
3、配置TNS(chenmu库和test库均配)
vi $ORACLE_HOME/network/admin/tnsnames.ora; //编辑tnsnames.ora文件 test = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = chenmu)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test) ))) chenmu = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = chenmu)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = chennu) )))
4、为test库创建密码文件(文件名不要错误,否则连不上)
orapwd file=$ORACLE_HOME/dbs/orapwtest password=sys format=12
5、手动创建spfile
export ORACLE_SID=test; sqlplus / as sysdba; create spfile from pfile='/tmp/test.ora'; startup nomount;
6、连接chenmu库和test库(chenmu库是open或者mount状态,test库是nomount状态)
rman target sys/sys@chenmu auxiliary sys/sys@test;
7、复制数据库
duplicate target database to "test" from active database nofilenamecheck;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!