环境:CentOS 6.4Final x86_64
数据库版本:Oracle11g release 11.2.0.2.0(R2)
主要工具:Rman
注意事项:本次操作是基于同平台,数据库版本一致的环境下进行迁移操作
豆知识:
从Oracle8版本开始自带的工具,与imp/exp的区别:
Imp/exp:基于数据级别备份,缺点:只能恢复到备份时间,优点:速度较快,导出表,用户,表空间等轻量操作推荐使用mkdir /opt/oraclebackup/{datafile,controlfile,spfile}
chown -R oracle:oinstall /opt/oraclebackup
//创建备份文件存放目录,赋予用户oracle读写权限
su - oracle
export $ORACLE_SID= orcl
rman target /
//orcl为需要操作的实例名,export切换环境变量,进入rman,记下DBID如下DBID=3891629467(重要请牢记),和数据库名wmccusto,后面会用到
RMAN>run {
allocate channel c1 device type disk;
backup incremental level 0
format '/opt/oraclebackup/datafile/db_full_%U.bkp'
tag '2015-11-16-FULL'
database plus archivelog;
release channel c1;
}
// format处定义备份文件输出目录和文件名,可自行定义,下同,tag定义备份文件标签,备份完成图如下:
backup current controlfile format '/opt/oraclebackup/controlfile/control20151116.bak';
//备份控制文件
backup spfile format '/opt/oraclebackup/spfile/spfile20151116.bak';
//备份系统参数文件spfile
cp $ORACLE_HOME/dbs/orapwwmccustomer /opt/oraclebackup/
//备份用户密码文件,文件名模式为orapw+实例名)
cd /opt
tar -zcf oraclebackup.tar.gz /opt/oraclebackup/
//打包备份文件
scp -P77 oraclebackup.tar.gz [email protected]:/opt/89DBstuff
//往迁移目标服务器发送备份文件,77是端口号,oracle是服务器用户名,回车之后会要求输入用户密码
sqlplus /nolog
conn /as sysdba
select member from v$logfile;
//检查确认重做日志文件数量,导入数据库之后需要核查
select file_name from dba_data_files;
//检查确认数据文件数量
select file_name,tablespace_name from dba_temp_files;
//检查确认临时表空间文件数量
exit
cat $ORACLE_HOME/network/admin/tnsnames.ora
//查看监听器所监听实例名模块,记录下来,数据库导入完毕后需要还原到目标服务器上,如下图的WMCCUSTOMER为监听实例代号(可自定义),此处HOST监听地址和PORT监听端口可根据实际需要修改,下同
cat $ORACLE_HOME/network/admin/listener.ora
//查看监听器名称,监听端口等基本配置,同样记录下来,此处配置为动态监听,静态监听可自行了解
以下在导入的目标数据库进行操作:
mkdir -p /opt/oraclebackup/{controlfile,datafile,spfile}
//创建存放备份数据目录,建议跟原始数据导出目录一致
tar -zxf /opt/89DBstuff/oraclebackup.tar.gz -C /opt/
chown -R oracle:oinstall /opt/oraclebackup
//解压数据文件到备份存放目录,确保其跟导出时的目录结构一致,确保其文件丛属权限为oracle,以便读取
su - oracle
//切换oracle用户进行操作
mkdir -p $ORACLE_BASE/admin/实例名wmccustomer/{adump,bdump,cdump,dpdump,udump,pfile}
mkdir -p $ORACLE_BASE/oradata/wmccustomer
mkdir -p $ORACLE_BASE/flash_recovery_area/大写实例名WMCCUSTOMER
mkdir -p $ORACLE_BASE/flash_recovery_area/实例名wmccustomer
//创建相关数据库目录
echo 'db_name=wmccusto'>$ORACLE_HOME/dbs/initwmccustomer.ora
//创建初始配置文件并添加数据库名wmccusto(数据库名db_name需要在原始库中确认并保持一致)
export $ORACLE_SID=wmccustomer
//切换实例ID环境变量
rman target /
//进入rman命令行交互环境
set dbid 3891629467
//设置数据库id,跟原库一致
startup nomount;
//启动数据库到非数据挂载状态,只加载系统参数
restore spfile from '/opt/oraclebackup/spfile/spfile20151116.bak';
//恢复参数文件,注意:恢复spfile可以使用from '文件源' 的句式,以便处理文件来源跟原库不在同一目录下的情况,下面恢复控制文件controlfile同理,只有restore database恢复数据库时不能使用,需使用catalog start with '文件源'指定备份集
startup nomount force;
//强制重启到非挂载状态,载入原库spfile配置
恢复spfile之后若目标库安装路径$ORACLE_BASE,$ORACLE_HOME,尤其是数据存放目录oradata,控制文件目录等与原库不一致的情况下,需要修改spfile文件内容更新里面的路径位置,否则会出现无法恢复数据的错误。由于spfile文件包含许多机器控制字符,无法用文本编辑工具vim,vi,gedit等直接修改,两种方法:1.首先转换成pfile文件再修改;2.在当前spfile已恢复情况下将数据库启动到非挂载状态alter database nomount(或startup nomount force),再用alter system来修改spfile的内容。下面介绍一下:
1.转换成pfile修改:
(以下SQL>表示操作在sqlplus环境下进行)
SQL>shutdown immediate; //先停止数据库实例再进行修改
SQL>create pfile='/xxx/xxx/xxx.ora' from spfile; //创建pfile文件,注意目录和文件读写权限
vi /xxx/xxx/xxx.ora //自行编辑所需参数
之后转换回spfile并恢复到默认启动所读取的spfile位置,即$ORALCE_HOME/dbs/
SQL>create spfile='/xxxx/xxxx/spfilewmccustomer.ora' from pfile='/xxx/xxx/xxx.ora' //读取指定路径下pfile生成spfile
cp $ORACLE_HOME/dbs/spfilewmccustomer.ora $ORACLE_HOME/dbs/spfilewmccustomer.ora.bak //备份原文件
mv /xxxx/xxxx/spfilewmccustomer.ora $ORACLE_HOME/dbs/spfilewmccustomer.ora //覆盖
SQL>startup //启动实例
2.sqlplus环境下修改:
可以先用show parameter或者show parameter xxxx_xxxx(xxxx_xxxx为具体参数项,下同)等列出所有或者具体某一个spfile里的参数及参数值,然后使用alter system set xxx_xxx=xxx scope=both/memory/spfile;来修改,关于scope的三个参数值是Oracle 9i版本新增的,具体的不同作用如下:
MEMORY:只改变当前实例运行,重启实例后失效
SPFILE:只改变SPFILE的设置,重启实例后生效
BOTH:改变实例及SPFILE,默认选项,可不加
可以根据需要选用
(PS:实际情况下可新建一个软连接(ln -s 源文件 目标文件)指向到原数据文件导出目录即可解决恢复时遇到的路径错误问题)
restore controlfile from '/opt/oraclebackup/controlfile/control20151116.bak';
//恢复控制文件
alter database mount;
//切换数据库到挂载状态
(catalog start with '/xxx/xxx/xxx')
//若数据文件不在原导出目录,则导入前可使用上述命令指定备份集目录
//此处报错是由于没有把归档日志archivelog拷贝到归档路径下(一般为$ORACLE_BASE/flash_recovery_area/大写实例名/archivelog/),出于数据同步考虑,建议拷贝一份到目标数据库相应目录为最佳选择,恢复不会出现异常。此处我选择不完全恢复,只恢复基本库
exit
sqlplus /nolog
conn /as sysdba
//退出rman,切换到oracle交互命令行sqlplus继续操作
recover database using backup controlfile until cancel;
//恢复数据库到备份文件能够同步到的最新状态
//此处输入cancle取消归档日志同步,进行不完全恢复。若提示有数据文件xxxx.dbf无法恢复时(如下图),必须使用归档日志恢复,具体可根据上图或者recover database时提示缺少的日志代码或日志文件到原服务器进行相应的拷贝,恢复,此处不再赘述
alter database open resetlogs;
//若cancel时没有提示错误则表示不完全恢复成功,重新生成数据库实体,同步且使控制文件,重做日志文件和数据文件的SCN一致(如下图list incarnation最右列对应的新的SCN 58601473808,前两行为历史记录,这里SCN可以理解为一种数据状态记录)
select member from v$logfile;
select file_name from dba_data_files;
select file_name,tablespace_name from dba_temp_files;
//最后依次在sqlplus交互模式下检查各数据文件,重做日志文件,数据库内容是否跟原库一致
shutdown immediate;
exit;
//拷贝用户密码文件前先关闭实例wmccustomer
cp /opt/oraclebackup/orapwwmccustomer $ORACLE_HOME/dbs/
//拷贝密码文件到实例配置文件存放目录
sqlplus /nolog
conn /as sysdba
startup
conn username/password
//重启实例,测试原用户是否可用
exit
恢复添加监听器配置文件listener.ora和tns别名配置文件tnsname.ora各自的对应配置
lsnrctl reload
lsnrctl status //查看监听状态
//重载监听器配置文件,测试实例监听是否正常,当输出结果中status为READY的时候且应用能正常连接数据库的时候则数据库导入工作完成,如下图
//若没有监听到目标实例,则稍等片刻或者进入sqlplus数据库交互模式手动注册实例,具体步骤如下:
sqlplus /nolog
conn /as sysdba
alter system register; //注册实例
至此数据库导入完毕,若导入过程中出现其他异常可根据oracle错误代码自行搜索解决
参考文章:http://ylw6006.blog.51cto.com/470441/659104/