windows单实例迁移至Linux RAC 平台
一、环境描述
背景:
当前DB环境: windows server 2016 + oracle11.2.0.4 企业版 (单机)
客户需求: 将windows 系统更换为linux系统,将单机环境更换为RAC 环境。
迁移思路: 利用rman备份将数据库从windows恢复至linux环境,在执行转换单实例转RAC脚本。
备注:
-
windows 到 linux rman备份需要冷备,也可以考虑DG,这里数据量不大,我们采用冷备方式。
-
RAC数据库通过dbca 建库,然后手动将datafile、redo log、tempfile删除,保留集群信息和参数文件。也可以恢复完成后,修改集群相关参数和通过srvctl add命令添加数据库信息到集群中。
二、迁移步骤
第一部分: Windows备份恢复至Linux
1.主库冷备
– 1) 记录当前无效对象
SQL> select 'alter '||object_type||' '||owner||'.'||object_name||' compile;'
from dba_objects t
where t.status = 'INVALID';

– 2) 重启数据库至mount状态
SQL> alter system switch logfile;
SQL> alter system checkpoint;
SQL> Shutdown immediate ;
SQL> Startup mount ;
SQL> select name,open_mode from v$database;

–3) 检查一下alert日志,确认数据库为一致性关闭。

– 4) rman备份
RMAN> run{
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
allocate channel c4 device type disk;
allocate channel c5 device type disk;
backup as compressed backupset database filesperset 3 format 'E:\backup\db_%d_%T_%U';
backup current controlfile format 'E:\backup\cntrl_%s_%p_%s';
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel c5;
}


2. 拷贝备份到RAC 环境
3. 启动数据库至nomount状态
-- 因为参数文件已经存在了,直接启动
SQL> startup nomount

4. 修改参数文件
SQL> alter system set cluster_database=FALSE scope=spfile sid='*';
SQL> alter system set job_queue_processes= 0; -- 将job参数改为0,避免数据库恢复后job自动运行,导致数据更改
-- 重启数据库至nomount状态,生效参数
SQL> shutdown immediate
SQL> startup nomount

5. 恢复控制文件
RMAN> restore controlfile from '/soft/backup/CNTRL_51_1_51';
RMAN> alter database mount;

6. 重新注册备份集
RMAN> crosscheck backup;
RMAN> delete EXPIRED backup;
RMAN> catalog start with '/soft/backup/';

7. restore 数据库
RMAN> run{
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
allocate channel c4 device type disk;
allocate channel c5 device type disk;
set newname for datafile 1 to '+DATA/xxx/datafile/system01.dbf';
set newname for datafile 2 to '+DATA/xxx/datafile/sysaux01.dbf';
set newname for datafile 3 to '+DATA/xxx/datafile/undotbs01.dbf';
set newname for datafile 4 to '+DATA/xxx/datafile/users01.dbf';
set newname for datafile 5 to '+DATA/xxx/datafile/xxx_data01_a.dbf';
set newname for datafile 6 to '+DATA/xxx/datafile/xxx_data01_b.dbf';
set newname for datafile 7 to '+DATA/xxx/datafile/xxx_data01_c.dbf';
set newname for datafile 8 to '+DATA/xxx/datafile/xxx_data01_d.dbf';
set newname for datafile 9 to '+DATA/xxx/datafile/xxx_index01_a.dbf';
set newname for datafile 10 to '+DATA/xxx/datafile/xxx_data01_e.dbf';
set newname for datafile 11 to '+DATA/xxx/datafile/xxx_index01_b.dbf';
set newname for datafile 12 to '+DATA/xxx/datafile/xxx_data01_f.dbf';
set newname for datafile 13 to '+DATA/xxx/datafile/xxx_data01_g.dbf';
set newname for datafile 14 to '+DATA/xxx/datafile/xxx_data01_h.dbf';
restore database;
switch datafile all;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel c5;
}


8. open 数据库
SQL> alter database open resetlogs;
SQL> select open_mode from v$database;

9. 重建temp
SQL> select name from v$tempfile;
SQL> create temporary tablespace temp1 tempfile '+DATA' size 10M autoextend on;
SQL> alter database default temporary tablespace temp1;
SQL> drop tablespace temp including contents and datafiles;
SQL> create temporary tablespace temp tempfile '+DATA' size 30g autoextend on;
SQL> alter database default temporary tablespace temp;
SQL> drop tablespace temp1 including contents and datafiles;

10. 重建redo
-- 先建新的redo,切换日志,让旧的日志组状态都变为inactive,再删旧的redo
SQL> select group#,member from v$logfile;
SQL> select group#,status from v$log;
SQL> alter system switch logfile;
SQL> alter system checkpoint;
SQL> alter database drop logfile group 4;
SQL> alter database drop logfile group 5;
SQL> alter database drop logfile group 6;
SQL> alter database add logfile group 1 '+DATA' size 500M;
SQL> alter database add logfile group 2 '+DATA' size 500M;
SQL> alter database add logfile group 3 '+DATA' size 500M;
SQL> alter database add logfile group 4 '+DATA' size 500M;
SQL> alter database add logfile group 5 '+DATA' size 500M;
11. 重启数据库
SQL> shutdown immediate
SQL> startup
SQL> @?/rdbms/admin/utlrp.sql
-- 对比无效对象,检查有没有新增的无效对象
SQL> select 'alter '||object_type||' '||owner||'.'||object_name||' compile;'
from dba_objects t
where t.status = 'INVALID';

– 清除控制文件中关于v$archived_log的残留的windows信息 (可选)
SQL> select sequence#,name,blocks from v$archived_log;
SQL> execute sys.dbms_backup_restore.resetCfileSection(11);
此时,数据库已经从windows恢复到linux rac环境,但是数据库依然是一个单实例的数据库,因此还需要将数据库转换为RAC库。
第二部分: 单实例转RAC
1. 执行将单机转换成rac的脚本
SQL> @?/rdbms/admin/catclust.sql

2. 添加日志组
SQL> alter database add logfile thread 2 group 6 ('+DATA') size 500M;
SQL> alter database add logfile thread 2 group 7 ('+DATA') size 500M;
SQL> alter database add logfile thread 2 group 8 ('+DATA') size 500M;
SQL> alter database add logfile thread 2 group 9 ('+DATA') size 500M;
SQL> alter database add logfile thread 2 group 10('+DATA') size 500M;

3. 修改rac参数
SQL> alter system set cluster_database=true scope=spfile;

4. 添加其他节点undo
SQL> create undo tablespace undotbs2 datafile '+DATA/xxx/datafile/undotbs02.dbf' SIZE 10G autoextend on;

5. 启用其他节点
SQL> select thread#,status,enabled from v$thread;
SQL> alter database enable public thread 2;

6. 重建数据字典
SQL> @?/rdbms/admin/catalog.sql SQL> @?/rdbms/admin/catproc.sql SQL> @?/rdbms/admin/utlrp.sql
7. 使用集群命令管理数据库
-- 先将恢复的库关闭
SQL> shutdown immediate
-- 通过集群命令,可以正常管理数据库
srvctl stop database -d xxx
srvctl start database -d xxx
srvctl status database -d xxx

8. 启用job
– 应用测试无问题后,恢复job参数
SQL> alter system set job_queue_processes= 1000;

此时,数据库已经从单实例库转换为RAC库。系统也从windows 更换为linux,迁移完成。
最后修改时间:2022-10-19 16:13:47
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




