天天看點

單執行個體資料庫遷移到rac環境(四)上

 在前面的3個小節中,分别介紹了使用expdp,傳輸表空間以及rman的異機恢複等方式實作單執行個體資料庫向rac環境的遷移,本節中将介紹下使用physical dataguard實作這一過程,核心思想是建構基于單執行個體資料庫的實體備庫(rac環境),而後進行主備庫的切換,盡可能的減少遷移資料的時間消耗和對生産環境的影響!但同前3種方式相比,遷移的難度也增加了不少!由于文章篇幅限制,本節示範将分為上下兩篇文章。本文主要參考下列的文章,感謝作者分享!

<a href="http://space.itpub.net/4227/viewspace-622322">http://space.itpub.net/4227/viewspace-622322</a>

一:環境介紹

primary資料庫(單執行個體環境)

IP:192.168.1.49/24

作業系統版本:rhel5.4 64位

資料庫版本:10.2.0.5

physical standby資料庫(rac環境,2個節點)

節點1 IP:192.168.1.41/24

節點2 IP:192.168.1.42/24

作業系統版本:centos4.8 64位

二:配置primary資料庫的tnsnames.ora檔案以及dataguard相關的設定,由于即将建構的備庫為rac環境,因而需要增加undotbs2表空間和thread 2日志組

[oracle@server49 ~]$ cd $ORACLE_HOME/network/admin

[oracle@server49 ~]$ cat tnsnames.ora 

PRIMARY =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = server49.yang.com)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = primary.yang.com)

    )

  )

STANDBY =

    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1.yang.com)(PORT = 1521))

      (SID = orcl1)

      (SERVICE_NAME = standby.yang.com)

SQL&gt; show parameter name;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_file_name_convert                 string

db_name                              string      orcl

db_unique_name                       string      primary

global_names                         boolean     FALSE

instance_name                        string      orcl

lock_name_space                      string

log_file_name_convert                string

service_names                        string      primary.yang.com

SQL&gt; select name,open_mode,log_mode,force_logging from v$database;

NAME      OPEN_MODE  LOG_MODE     FOR

--------- ---------- ------------ ---

ORCL      READ WRITE ARCHIVELOG   NO

SQL&gt; alter database force logging;

Database altered.

SQL&gt; select bytes/(1024*1024) MB,autoextensible from dba_data_files where tablespace_name='UNDOTBS1';

        MB AUT

---------- ---

        30 YES

SQL&gt; create undo tablespace undotbs2 datafile '/u01/app/oracle/oradata/orcl/undotbs02.dbf' size 30M autoextend on maxsize 10G;

Tablespace created.

SQL&gt; select bytes/(1024*1024) MB,autoextensible from dba_data_files where tablespace_name in ('UNDOTBS1','UNDOTBS2');

QL&gt; select a.group#,a.member,b.bytes/(1024*1024) MB,b.thread# from v$logfile a,v$log b where a.group#=b.group#;

    GROUP# MEMBER                                           MB    THREAD#

---------- ---------------------------------------- ---------- ----------

         3 /u01/app/oracle/oradata/orcl/redo03.log          50          1

         2 /u01/app/oracle/oradata/orcl/redo02.log          50          1

         1 /u01/app/oracle/oradata/orcl/redo01.log          50          1

SQL&gt; alter database add logfile thread 2 group 4 '/u01/app/oracle/oradata/orcl/redo04.log' size 50M;

SQL&gt; alter database add logfile thread 2 group 5 '/u01/app/oracle/oradata/orcl/redo05.log' size 50M;

SQL&gt; alter database add logfile thread 2 group 6 '/u01/app/oracle/oradata/orcl/redo06.log' size 50M;

SQL&gt; select a.group#,a.member,b.bytes/(1024*1024) MB,b.thread# from v$logfile a,v$log b where a.group#=b.group#;

         4 /u01/app/oracle/oradata/orcl/redo04.log          50          2

         5 /u01/app/oracle/oradata/orcl/redo05.log          50          2

         6 /u01/app/oracle/oradata/orcl/redo06.log          50          2

SQL&gt; alter database enable thread 2;

SQL&gt; alter system set log_archive_config='DG_CONFIG=(PRIMARY,STANDBY)';

System altered.

SQL&gt; archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     19

Next log sequence to archive   21

Current log sequence           21

SQL&gt; !mkdir -p /u01/app/oracle/archive_log

SQL&gt; alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/archive_log VALID_FOR=ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORCL';

SQL&gt; alter system set log_archive_dest_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby';

SQL&gt; alter system set fal_server=standby;

SQL&gt; alter system set fal_client=primary;

SQL&gt; alter system set standby_file_management=auto;

System altered.SQL&gt; !mkdir -p /home/oracle/rman_bak

三:在primar庫上生成pfile,并使用rman備份資料庫,将備份的資料複制到rac節點1上

SQL&gt; create pfile='/home/oracle/rman_bak/initorcl.ora' from spfile;

File created.

[oracle@server49 ~]$ rman target /

Recovery Manager: Release 10.2.0.5.0 - Production on Sun Jan 8 14:49:21 2012

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

connected to target database: ORCL (DBID=1299224612)

RMAN&gt; run {

2&gt; allocate channel c1 device type disk;

3&gt; allocate channel c2 device type disk;

4&gt; backup incremental level 0 

5&gt; format '/home/oracle/rman_bak/inr0_%U'

6&gt; tag 'full_bak_for_rac_standby'

7&gt; database plus archivelog delete all input;

8&gt; release channel c1;

9&gt; release channel c2;

10&gt; }

RMAN&gt; backup format '/home/oracle/rman_bak/control01.ctl' current controlfile for standby;

[oracle@server49 ~]$ scp -rp rman_bak/ rac1:$(pwd)

四:standby(節點1)資料庫上,同樣配置tnsnames.ora檔案,建立密碼檔案,修改參數檔案

[oracle@rac1 ~]$ cat $ORACLE_HOME/network/admin/tnsnames.ora

ORCL1 =

    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip.yang.com)(PORT = 1521))

      (INSTANCE_NAME = orcl1)

ORCL2 =

    (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip.yang.com)(PORT = 1521))

      (INSTANCE_NAME = orcl2)

ORCL =

    (LOAD_BALANCE = yes)

      (SERVICE_NAME = orcl.yang.com)

LISTENERS_ORCL =

  (ADDRESS_LIST =

      (INSTANCE_NAME = orcl)

  ) 

[oracle@rac1 ~]$ crs_stat -t -v

Name           Type           R/RA   F/FT   Target    State     Host        

----------------------------------------------------------------------

ora....SM1.asm application    0/5    0/0    ONLINE    ONLINE    rac1        

ora....C1.lsnr application    0/5    0/0    ONLINE    ONLINE    rac1        

ora.rac1.gsd   application    0/5    0/0    ONLINE    ONLINE    rac1        

ora.rac1.ons   application    0/3    0/0    ONLINE    ONLINE    rac1        

ora.rac1.vip   application    0/0    0/0    ONLINE    ONLINE    rac1        

ora....SM2.asm application    0/5    0/0    ONLINE    ONLINE    rac2        

ora....C2.lsnr application    0/5    0/0    ONLINE    ONLINE    rac2        

ora.rac2.gsd   application    0/5    0/0    ONLINE    ONLINE    rac2        

ora.rac2.ons   application    0/3    0/0    ONLINE    ONLINE    rac2        

ora.rac2.vip   application    0/0    0/0    ONLINE    ONLINE    rac2  

[oracle@rac1 ~]$ orapwd file=$ORACLE_HOME/dbs/orapworcl1 password=123456 

[oracle@rac1 ~]$ cat /home/oracle/rman_bak/initorcl.ora 

*.__db_cache_size=79691776

*.__java_pool_size=4194304

*.__large_pool_size=4194304

*.__shared_pool_size=109051904

*.__streams_pool_size=8388608

*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'

*.background_dump_dest='/u01/app/oracle/admin/orcl/bdump'

*.core_dump_dest='/u01/app/oracle/admin/orcl/cdump'

*.user_dump_dest='/u01/app/oracle/admin/orcl/udump'

*.compatible='10.2.0.5.0'

*.control_files='+DATA/ORCL/CONTROLFILE/CONTROL01.CTL','+FRA/ORCL/CONTROLFILE/CONTROL02.CTL'

*.db_block_size=8192

*.db_domain='yang.com'

*.db_file_multiblock_read_count=16

*.db_name='orcl'

*.db_recovery_file_dest='+FRA'

*.db_recovery_file_dest_size=21474836480

*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

*.fal_client='STANDBY'

*.fal_server='PRIMARY'

*.job_queue_processes=10

*.log_archive_config='DG_CONFIG=(PRIMARY,STANDBY)'

*.log_archive_dest_1='LOCATION=+FRA/ORCL/ARCHIVELOG VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=STANDBY'

*.log_archive_dest_2='SERVICE=PRIMARY LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=PRIMARY'

*.log_archive_format='%t_%s_%r.dbf'

*.open_cursors=300

*.pga_aggregate_target=71303168

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.sga_target=213909504

*.standby_file_management='AUTO'

*.undo_management='AUTO'

*.cluster_database=true

*.cluster_database_instances=2

*.db_unique_name='standby'

*.log_file_name_convert=('/u01/app/oracle/flash_recover_area', '+FRA/ORCL/ARCHIVELOG')

*.db_file_name_convert=('/u01/app/oracle/oradata/orcl', '+DATA/ORCL/DATAFILE')

orcl1.undo_tablespace='UNDOTBS1'

orcl2.undo_tablespace='UNDOTBS2'

orcl1.instance_number=1

orcl2.instance_number=2

orcl1.thread=1

orcl2.thread=2

orcl1.local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.41)(PORT=1521))'

orcl2.local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.42)(PORT=1521))'

六:在節點1資料庫上恢複控制檔案

[oracle@rac1 ~]$ rman target /

connected to target database: orcl (not mounted)

RMAN&gt; restore controlfile from '/home/oracle/rman_bak/control01.ctl';   

備注:ASM磁盤内的相應目錄要先建立好

ASMCMD&gt; pwd

+FRA/ORCL/controlfile

ASMCMD&gt; ls

control02.ctl

ASMCMD&gt; cd +DATA/ORCL/controlfile

control01.ctl

七:節點1資料庫連接配接primary進行duplicate操作

connected to auxiliary database: ORCL (not mounted)

RMAN&gt; duplicate target database for standby;

輸出省略

connected to target database: ORCL (DBID=1299224612, not open)

RMAN&gt; report schema;

Starting implicit crosscheck backup at 2012-01-09 15:35:29

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

Crosschecked 9 objects

Finished implicit crosscheck backup at 2012-01-09 15:35:31

Starting implicit crosscheck copy at 2012-01-09 15:35:31

using channel ORA_DISK_1

Finished implicit crosscheck copy at 2012-01-09 15:35:31

searching for all files in the recovery area

cataloging files...

no files cataloged

RMAN-06139: WARNING: control file is not current for REPORT SCHEMA

Report of database schema

List of Permanent Datafiles

===========================

File Size(MB) Tablespace           RB segs Datafile Name

---- -------- -------------------- ------- ------------------------

1    450      SYSTEM               ***     +DATA/orcl/datafile/system01.dbf

2    30       UNDOTBS1             ***     +DATA/orcl/datafile/undotbs01.dbf

3    260      SYSAUX               ***     +DATA/orcl/datafile/sysaux01.dbf

4    5        USERS                ***     +DATA/orcl/datafile/users01.dbf

5    100      EXAMPLE              ***     +DATA/orcl/datafile/example01.dbf

6    410      EXP_RAC              ***     +DATA/orcl/datafile/exp_rac01.dbf

7    300      EXP_RAC_INDEX        ***     +DATA/orcl/datafile/exp_rac_index01.dbf

8    300      EXP_RAC1             ***     +DATA/orcl/datafile/exp_rac1_01.dbf

9    300      EXP_RAC1_INDEX       ***     +DATA/orcl/datafile/exp_rac1_index_01.dbf

10   30       UNDOTBS2             ***     +DATA/orcl/datafile/undotbs02.dbf

List of Temporary Files

=======================

File Size(MB) Tablespace           Maxsize(MB) Tempfile Name

---- -------- -------------------- ----------- --------------------

1    0        TEMP                 32767       +DATA/orcl/datafile/temp01.dbf

+data/ORCL/datafile

example01.dbf

exp_rac01.dbf

exp_rac1_01.dbf

exp_rac1_index_01.dbf

exp_rac_index01.dbf

sysaux01.dbf

system01.dbf

undotbs01.dbf

undotbs02.dbf

users01.dbf

八:啟動節點1資料庫到應用日志模式下,中間若出現歸檔日志的gap,則需要在主庫上restore相應的歸檔日志檔案

[oracle@rac1 ~]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.5.0 - Production on Mon Jan 9 15:43:34 2012

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

SQL&gt; conn /as sysdba

Connected.

Archive destination            +FRA/orcl/archivelog

Oldest online log sequence     26

Next log sequence to archive   0

Current log sequence           28

SQL&gt; alter database recover managed standby database disconnect from session;

SQL&gt; select name,database_role from gv$database;

NAME                        DATABASE_ROLE

--------------------------- ------------------------------------------------

ORCL                        PHYSICAL STANDBY

SQL&gt; select first_time,next_time,sequence#,applied from v$archived_log;

FIRST_TIME          NEXT_TIME            SEQUENCE# APPLIED

------------------- ------------------- ---------- ---------

2012-01-09 14:17:57 2012-01-09 14:52:34         27 NO

[oracle@rac1 ~]$ tail -f /u01/app/oracle/admin/orcl/bdump/alert_orcl1.log 

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

Mon Jan 09 15:44:26 CST 2012

Errors in file /u01/app/oracle/admin/orcl/bdump/orcl1_mrp0_15952.trc:

ORA-00344: unable to re-create online log '/u01/app/oracle/oradata/orcl/redo01.log'

ORA-27040: file create error, unable to create file

Clearing online redo logfile 1 complete

Media Recovery Waiting for thread 1 sequence 26

Fetching gap sequence in thread 1, gap sequence 26-26

Completed: alter database recover managed standby database disconnect from session

Mon Jan 09 15:45:00 CST 2012

FAL[client]: Failed to request gap sequence 

 GAP - thread 1 sequence 26-26

 DBID 1299224612 branch 771443882

FAL[client]: All defined FAL servers have been attempted.

-------------------------------------------------------------

Check that the CONTROL_FILE_RECORD_KEEP_TIME initialization

parameter is defined to a value that is sufficiently large

enough to maintain adequate log switch information to resolve

archivelog gaps.

primary資料庫操作:

RMAN&gt; restore archivelog from sequence 24;

[oracle@server49 ~]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.5.0 - Production on Mon Jan 9 16:15:16 2012

Archive destination            /u01/app/oracle/archive_log

Next log sequence to archive   28

SQL&gt; alter system switch logfile;

RFS[2]: Assigned to RFS process 28510

RFS[2]: Identified database type as 'physical standby'

Primary database is in MAXIMUM PERFORMANCE mode

Mon Jan 09 16:15:46 CST 2012

RFS[1]: Archived Log: '+FRA/orcl/archivelog/1_28_771443882.dbf'

RFS[1]: Archived Log: '+FRA/orcl/archivelog/2_6_771443882.dbf'

Mon Jan 09 16:15:50 CST 2012

Fetching gap sequence in thread 2, gap sequence 5-5

Mon Jan 09 16:16:25 CST 2012

 GAP - thread 2 sequence 5-5

SQL&gt;select first_time,next_time,sequence#,applied from v$archived_log;

2012-01-09 14:13:14 2012-01-09 14:17:57         26 NO

2012-01-09 14:52:34 2012-01-09 16:15:37         28 NO

2012-01-09 14:17:56 2012-01-09 16:15:44          6 NO

RMAN&gt; restore archivelog  from sequence 5 thread 2;

節點1資料庫繼續查詢:

2012-01-09 14:17:57 2012-01-09 14:52:34         27 YES

2012-01-09 14:13:14 2012-01-09 14:17:57         26 YES

2012-01-09 14:52:34 2012-01-09 16:15:37         28 YES

2012-01-09 14:17:56 2012-01-09 16:15:44          6 YES

2012-01-09 14:13:12 2012-01-09 14:17:56          5 YES

2012-01-09 16:15:37 2012-01-09 16:30:00         29 NO

6 rows selected.

上述過程沒有問題後,就可以啟動節點2的資料庫執行個體到mount狀态!

SQL&gt; select name,db_unique_name,open_mode,database_role from gv$database;

NAME                 DB_UNIQUE_ OPEN_MODE            DATABASE_ROLE

-------------------- ---------- -------------------- --------------------

ORCL                 standby    MOUNTED              PHYSICAL STANDBY

最後确定下主庫和備庫的日志傳輸和應用狀況是否正常!

Oldest online log sequence     34

Next log sequence to archive   36

Current log sequence           36

SQL&gt; select first_time,next_time,sequence#,applied,thread# from v$archived_log order by 5,3 ;

FIRST_TIME          NEXT_TIME            SEQUENCE# APPLIED      THREAD#

------------------- ------------------- ---------- --------- ----------

2012-01-09 14:13:14 2012-01-09 14:17:57         26 YES                1

2012-01-09 14:17:57 2012-01-09 14:52:34         27 YES                1

2012-01-09 14:52:34 2012-01-09 16:15:37         28 YES                1

2012-01-09 16:15:37 2012-01-09 16:30:00         29 YES                1

2012-01-09 16:30:00 2012-01-09 18:04:06         30 YES                1

2012-01-09 18:04:06 2012-01-09 18:04:18         31 YES                1

2012-01-09 18:04:18 2012-01-09 18:06:40         32 YES                1

2012-01-09 18:06:40 2012-01-09 19:55:25         33 YES                1

2012-01-09 19:55:25 2012-01-09 19:55:38         34 YES                1

2012-01-09 19:55:38 2012-01-09 19:56:30         35 NO                 1

2012-01-09 14:13:12 2012-01-09 14:17:56          5 YES                2

2012-01-09 14:17:56 2012-01-09 16:15:44          6 YES                2

2012-01-09 16:15:44 2012-01-09 18:04:05          7 YES                2

2012-01-09 18:04:05 2012-01-09 18:04:17          8 YES                2

2012-01-09 18:04:17 2012-01-09 18:06:36          9 YES                2

2012-01-09 18:06:36 2012-01-09 19:55:23         10 YES                2

2012-01-09 19:55:23 2012-01-09 19:55:37         11 YES                2

2012-01-09 19:55:37 2012-01-09 19:56:26         12 YES                2

18 rows selected.

SQL&gt; select name,db_unique_name,database_role,switchover_status from v$database;

NAME      DB_UNIQUE_NAME                 DATABASE_ROLE    SWITCHOVER_STATUS

--------- ------------------------------ ---------------- --------------------

ORCL      primary                        PRIMARY          SESSIONS ACTIVE

 至此,單執行個體主庫和rac實體備庫的環境以及基本完成,下一節中将介紹下switchover過程!

本文轉自斬月部落格51CTO部落格,原文連結http://blog.51cto.com/ylw6006/760860如需轉載請自行聯系原作者

ylw6006