目录
假设:某一台oracle12c机器上有30个pdb数据库,采用传统的exp/imp和expdp/impdp需要进行多次导入导出,极为不变。
分析:可以采用oracle自带的RMAN命令导出参数文件、控制文件、数据文件、归档日志
实施步骤如下:
1、对源机的处理
1.1 、开启源机的归档模式
命令行如下:
# 登陆系统
# 开启数据库
#查看当前归档方式以及归档位置
# 当前未开启归档,开启归档(本次测试归档模式下全库备份迁移)
#改变非归档模式为归档模式
# 关闭数据库
SQL>shutdown immediate
# 开启到mount状态
SQL>startup mount
# 改变归档日志状态
SQL>alter database archivelog;
# 打开数据库
SQL>alter database open;
注意:一定要在mount状态改变归档日志状态,否则会报错!
1.2 、切换日志
# 切换到另外一个日志组
SQL>alter system switch logfile;
说明:
Archive Mode --归档模式
Enabled --自动归档
/u01/app/oracle/product/12.1.0/db_1/arch --归档路径
25 --最旧的在线日志序列
27 --下一个待归档序列、当前日志序列
1.3 使用rman清理过期日志
su - oracle
rman target /
#列出过期的归档日志
RMAN> list expired archivelog all;
#删除所有过期的归档日志
RMAN> delete expired archivelog all;
#核验比对物理文件和归档日志记录信息一致性(确保控制文件记录与归档一致,防止导入时报错)
crosscheck archivelog all;
1.3、开始备份
#在源机上的home目录创建backup目录
[oracle@jack /]$ mkdir -p /home/oracle/backup
#打开rman开始备份
注意:先备份数据文件和归档日志,在备份控制文件,在备份参数文件
#备份数据文件和归档日志
RMAN> backup as backupset format '/home/oracle/backup/data_inc0_%d_%I_%T_%t_%s_%p.dbf' database plus archivelog;
#备份控制文件
RMAN> backup current controlfile format '/home/oracle/backup/control_%d_%I_%T_%t_%s_%p.ctl';
#备份参数文件
RMAN> backup spfile format '/home/oracle/backup/spfile_%d_%I_%T_%t_%s_%p.ora';
#打包、上传给备机
[root@jack ~]# tar -czf backup.tar.gz /home/oracle/backup/
[root@jack ~]# scp backup.tar.gz 192.168.3.22:/home/oracle/
注意:
1、源机的备份路径一定要和备机的路径一致(因为在备份的时候,首先备份的时数据文件,控制文件记录了备份路径)
2、备份的顺序不要乱,数据文件&归档日志、控制文件、参数文件
# 可以看到备份的内容:
2、对备机的处理
前提:
1、备机的系统版本、数据库版本要和主机的保持一致(如果不一致,会怎样?没测试过)
2、导库顺序:先导入参数文件、再导入控制文件、最后导入数据文件和归档日志。
2.1、安装Oracle12c软件
安装步骤不做赘述,不懂安装的可以查看作者的oracle12c安装文档。
2.2 、解压备份文件
[root@docker ~]# cd /home/oracle/
[root@docker ~]# tar -zxvf backup.tar.gz
[root@docker ~]# rm -rf backup.tar.gz
备机backup路径:/home/oracle/backup
2.3、创建oracle工作目录
mkdir -p /u01/app/oracle/oradata/cdb/pdb/
mkdir -p /u01/app/oracle/oradata/cdb/pdb01/
mkdir -p /u01/app/oracle/oradata/cdb/archivelog
mkdir -p /u01/app/oracle/oradata/cdb/redolog
mkdir -p /u01/app/oracle/admin/cdb/adump
mkdir -p /u01/app/oracle/fast_recovery_area/cdb/
mkdir -p /u01/app/oracle/audit
mkdir -p /u01/app/oracle/cfgtoollogs
mkdir -p /u01/app/oracle/oradata/cdb/pdbseed/
说明:做rman恢复的时候一定要把目录建好,否则在导数据文件的时候会提示datafile无法找到,备份结束!!!
# 授权(保证读取权限没有问题)
chown -R oracle:oinstall /u01/
chown -R oracle:oinstall /home/oracle/
2.4、恢复数据库
2.4.1、恢复参数文件
# 利用数据库自带的init.ora文件强制开启nomount状态
第一个报错:没找到initcdb.ora文件
处理:将init.ora改成initcdb.ora
第二个报错:找不到ORACLE_BASE
处理:将ORACLE_BASE改为绝对路径/u01/app/oracle
第三个报错:找不到路径
处理:因为我自己设置的全局数据库是cdb不是默认的orcl,所以找不到
小结:嫌麻烦可以直接使用源机的spfilecdb.ora将数据库启动到nomount状态;
# 恢复参数文件
RMAN> restore spfile from '/home/oracle/backup/spfile_CDB_2297573232_20240930_1181037243_22_1.ora';
2.4.2、恢复控制文件
# 恢复参数文件以后,启动报错,原因是我们的参数文件记录local_listener,系统找不到
处理方式:
# 因为spfilecdb.ora是二进制文件不能直接修改,所以需要创建pfile文件进行修改
SQL> create spfile from pfile;
# 重新启动数据库,确保这次database是cdb(表示新的spfilecdb.ora生效)
# 恢复控制文件
RMAN> restore controlfile from '/home/oracle/backup/control_CDB_2297573232_20240930_1181037215_20_1.ctl';
2.4.3、恢复数据文件和归档日志
# 将数据库改位mount,进行数据恢复
# 开始恢复数据库
# 恢复结束的时候,报错:找不到datafile文件(事实上:我们已经将文件全部导出)
#处理方法:
1、通过report schema查看哪些文件没有导入
2、因为每一个pdb都有一个自己的目录,这里缺一个,所以需要新建、授权
[root@docker ~]# mkdir -p /u01/app/oracle/oradata/cdb/jsres
[root@docker ~]# chown -R oracle:oinstall /u01/
3、重新restore
# 通过recover进一步恢复数据库
归档日志写到28,29找不到,这里需要手动指定sequence,告诉数据库恢复到29结束。
2.4.4、重做在线日志
# 以resetlogs方式开启数据库
RMAN> sql alter database open resetlogs;
至此整个数据库恢复过程结束!!!
2.4.5、查看与验证
# 数据库已经可以打开
# 在线重做日志正常
3、总结
1、安装碰见问题在所难免,kill掉就ok!
2、注意操作细节!