【Oracle】冷备迁移
需求比较明确,也相对简单,如下:
1:Oracle11.2.0.4 单实例数据库,从A库迁移到B库(B库使用的是SSD盘)
2:目标库(B库)相关路径与源库(A库)不同,(都未遵循OFA)
3:可以停机
4:迁移后,修改DBNAME
看似不复杂,但是如果对Oracle11g不是足够熟悉的话,整个过程还会遇到不少的问题。
整体步骤如下:
第一步:源库确认
1)查看控制文件、数据文件、日志文件的位置(别光看,查询出来的结果,保存下来)
1 2 3 4 5 6 |
## 查看控制文件 SQL> select name from v$controlfile; ## 查看数据文件 SQL> select * from v$dbfile order by 1; ## 查看日志文件 SQL> select group#,member from v$logfile order by 1; |
2)检查源库,Oracle用户的环境变量,确认ORACLE_BASE,ORACLE_HOME,ORACLE_SID等,同时在操作系统确认相关路径及文件相关的属主、属组
步骤略
3)源库shutdown
第二步:设置目标库
1)在 Linux 操作系统,创建Oracle用户
1 2 3 4 5 6 7 |
## 创建组 groupadd -g 1000 oinstall groupadd -g 1001 dba ## 创建Oracle用户 useradd -u 1001 -d /home/oracle -g oinstall -G dba oracle ## 修改密码 passwd oracle |
2)在目标库设置环境变量(路径及名称按照实际要求去做)
1 2 3 4 5 |
[oracle@db ~]$ vi ~/.bash_profile export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SID=ORA11GR2 export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin |
3)将Oracle软件及数据文件从源库拷贝至目标库(可以打tar包,也可以直接拷贝,如果空间允许,最好打好tar包拷贝)
3)拷贝完成后,重新编译Oracle软件,编译前先确认环境变量是否正确(1-环境变量已生效;2-环境变量与实际目录相匹配)
1 |
$ORACLE_HOME/bin/relink all |
第三步:准备启动目标数据库
1)确认ORACLE_SID与源库一致(虽然我们要改DBNAME,当然SID也一并改了,但是,因为涉及到了迁移,所以,还是先能把数据库正常打开,再做后续的改名)
2)创建pfile参数文件
1 2 3 4 5 6 |
## 临时使当前会话的SID的环境变量为源库的SID export ORACLE_SID=原来的SID ## 登录sqlplus,此时数据库未启动,只是登录 sqlplus / as sysdba ## 通过spfile生成pfile create pfile from spfile; |
3)修改参数文件(因为目标库与源库所有数据文件存放的位置是有区别的,所以我们要逐一修改)
1 2 3 4 |
cd $ORACLE_HOME/dbs vi init*****.ora 将审计文件目录、控制文件目录、diagnostic_dest涉及的目录全部修改正确 |
4)数据库启动到mount
1 2 3 4 5 6 7 8 |
## 登录sqlplus sqlplus / as sysdba ## 通过刚刚修改的pfile重新生成spfile create spfile from pfile ## 数据库启动到nomount,确认参数修改没问题 startup nomount; ## 将数据库修改至mount状态 alter database mount; |
5)修改控制文件中所有数据文件的位置
1 2 3 4 5 6 7 8 9 |
## 修改数据文件路径 alter database rename file '/oracle/app/oradata/ORCL/system01.dbf' to '/u01/app/oracle/oradata/ORCL/system01.dbf'; …… 将所有的数据文件全部修改,特别注意,包括临时文件 alter database rename file '/oracle/app/oradata/ORCL/temp01.dbf' to '/u01/app/oracle/oradata/ORCL/temp01.dbf'; …… ## 修改日志文件路径 alter database rename file '/oracle/app/oradata/ORCL/redo01.log' ,'/oracle/app/oradata/ORCL/redo02.log','/oracle/app/oradata/ORCL/redo03.log' to '/u01/app/oracle/oradata/ORCL/redo01.log','/u01/app/oracle/oradata/ORCL/redo02.log','/u01/app/oracle/oradata/ORCL/redo03.log'; |
6)打开数据库
1 |
alter database open; |
第四步:目标库修改DBNAME
1)数据库启动到mount
1 2 3 |
[oracle@host07 ~]$ sqlplus / as sysdba SQL> shutdown immediate; SQL> startup mount; |
2)利用nid修改dbname
1 2 3 4 5 6 7 8 |
[oracle@host07 ~]$ nid target=sys/oracle dbname=ORA11GR2 …… Change database ID and database name ENMO to ORA11GR2? (Y/[N]) => Y …… DBNEWID - Completed succesfully. [oracle@host07 ~]$ |
3)修改pfile参数文件(上一步已经有pfile文件了,无需创建,只要拷贝改名即可)
1 2 3 4 5 6 |
cd $ORACLE_HOME/dbs cp initORCL initORA11GR2 vi initORA11GR2 修改db_name='ORA11GR2' |
4)启动备库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
## 确认当前环境变量为ORA11GR2,重要 [oracle@host07 ~]$ echo $ORACLE_SID ORA11GR2 [oracle@host07 ~]$ ## 登录sqlplus创建spfile [oracle@host07 ~]$ sqlplus / as sysdba SQL> create spfile from pfile; ## 数据库启动到nomount,确认参数文件没问题 SQL> startup nomount; ## 修改数据库至mount状态,确认参数文件没问题 SQL> alter database mount; ## resetlogs打开数据库 SQL> alter database open RESETLOGS; ## 确认dbname修改成功 SQL> show parameter name |
第五步:收尾
启动监听,监听比较容易,但是也容易出现问题,比如我迁移的这个库的监听配置的就是静态监听,由于/etc/hosts配置的主机名不对导致监听无法启动。