使用手工方法Clone異名資料庫實驗

realkid4發表於2014-03-10

 

搭建資料庫Clone物件是我們經常遇到的日常運維需求。在實際開發測試過程中,經常需要快速複製一份包含業務資料的資料庫環境。之前,我們已經介紹過如果使用RMAN Duplicate功能進行相關操作。本篇一起來討論如何使用傳統的SQL Plus工具進行建立克隆資料庫。

 

1、環境介紹和實驗目標

 

我們選擇Oracle 11gR2進行測試,執行作業系統為Linux 5.3

 

SQL> select * from v$version;

 

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

PL/SQL Release 11.2.0.3.0 - Production

CORE 11.2.0.3.0 Production

TNS for Linux: Version 11.2.0.3.0 - Production

NLSRTL Version 11.2.0.3.0 - Production

 

資料庫例項名為ora11g,相關環境變數如下:

 

[oracle@SimpleLinux ~]$ env | grep ORA

ORACLE_SID=ora11g

ORACLE_BASE=/u01/app

ORACLE_HOME=/u01/app/oracle

 

資料庫引數檔案、控制檔案、資料檔案均遵守OFA規範,檔名稱策略為OMF

實驗目標是建立資料庫ora11cl,內容和ora11g完全相同(clone)。但是資料庫名稱要求不同。由於環境原因,筆者採用相同host進行檔案複製,如果是不同host克隆資料庫,操作完全相同。注意:異地克隆資料庫,最好Oracle軟體版本或者補丁完全相同。這樣做可以防止由於版本原因造成的異常。

 

2、原理分析和準備

 

Oracle資料庫執行三大檔案:資料檔案、控制檔案和日誌檔案(online+archived)。需要進行資料庫複製要將實現:引數檔案啟動一個全新的例項,採用一個新的例項名;控制檔案重建並且識別日誌和資料檔案;如果不完全關閉情況下,還要考慮歸檔日誌的應用補全。

一般情況下,如果是完全關閉資料庫,我們是可以避免歸檔日誌apply過程的。使用pfile可以實現新資料庫例項的建立。在進入nomount之後,可以嘗試重新建立control file,來修改置換檔案頭的各種資訊。

確定當前控制檔案目錄:

 

 

SQL> select name from v$controlfile;

NAME

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

/u01/app/oradata/ORA11G/controlfile/o1_mf_92t72zkf_.ctl

/u01/app/fast_recovery_area/ORA11G/controlfile/o1_mf_92t72zyj_.ctl

 

如果新資料庫依然遵守OFA策略,對應的ORA11CL目錄需要建立,包括資料目錄和日誌目錄。準備cp命令指令碼。

 

 

SQL> select 'cp '||file_name||' '||replace(file_name,'ORA11G','ORA11CL') from dba_data_files;

cp /u01/app/oradata/ORA11G/datafile/o1_mf_users_92t6zl83_.dbf /u01/app/oradata/ORA11CL/datafile/o1_mf_users_92t6zl83_.dbf

cp /u01/app/oradata/ORA11G/datafile/o1_mf_undotbs1_92t6zl6d_.dbf /u01/app/oradata/ORA11CL/datafile/o1_mf_undotbs1_92t6zl6d_.dbf

cp /u01/app/oradata/ORA11G/datafile/o1_mf_sysaux_92t6zl5k_.dbf /u01/app/oradata/ORA11CL/datafile/o1_mf_sysaux_92t6zl5k_.dbf

cp /u01/app/oradata/ORA11G/datafile/o1_mf_system_92t6zl2m_.dbf /u01/app/oradata/ORA11CL/datafile/o1_mf_system_92t6zl2m_.dbf

cp /u01/app/oradata/ORA11G/datafile/o1_mf_example_92t74b1f_.dbf /u01/app/oradata/ORA11CL/datafile/o1_mf_example_92t74b1f_.dbf

cp /u01/app/oradata/ORA11G/datafile/o1_mf_trcatbl_96mlzz0j_.dbf /u01/app/oradata/ORA11CL/datafile/o1_mf_trcatbl_96mlzz0j_.dbf

cp /u01/app/oradata/ORA11G/datafile/o1_mf_testtbl_9j2sxn9r_.dbf /u01/app/oradata/ORA11CL/datafile/o1_mf_testtbl_9j2sxn9r_.dbf

cp /u01/app/oradata/ORA11G/datafile/o1_mf_awp_9khloyod_.dbf /u01/app/oradata/ORA11CLO/datafile/o1_mf_awp_9khloyod_.dbf

 

8 rows selected

 

控制檔案dump備份有很多方法,因為本次試驗希望使用Create control file的策略,所以備份到平面flat text檔案。

 

SQL> set heading on;

SQL> select value from v$diag_info where name='Default Trace File';

VALUE

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

/u01/app/diag/rdbms/ora11g/ora11g/trace/ora11g_ora_3577.trc

 

SQL> alter database backup controlfile to trace;

Database altered

 

開啟trace檔案,定位了指令碼位置,選擇resetlogs模式建立。

 

 

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "ORA11G" RESETLOGS  ARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 1248

LOGFILE

  GROUP 1 (

    '/u01/app/oradata/ORA11G/onlinelog/o1_mf_1_94hvy8pw_.log',

    '/u01/app/fast_recovery_area/ORA11G/onlinelog/o1_mf_1_94hvy9kk_.log'

  ) SIZE 50M BLOCKSIZE 512,

  GROUP 2 (

    '/u01/app/oradata/ORA11G/onlinelog/o1_mf_2_94hvyc26_.log',

    '/u01/app/fast_recovery_area/ORA11G/onlinelog/o1_mf_2_94hvydb6_.log'

  ) SIZE 50M BLOCKSIZE 512,

  GROUP 3 (

    '/u01/app/oradata/ORA11G/onlinelog/o1_mf_3_94hvyfvx_.log',

    '/u01/app/fast_recovery_area/ORA11G/onlinelog/o1_mf_3_94hvyh9v_.log'

  ) SIZE 50M BLOCKSIZE 512

-- STANDBY LOGFILE

DATAFILE

  '/u01/app/oradata/ORA11G/datafile/o1_mf_system_92t6zl2m_.dbf',

  '/u01/app/oradata/ORA11G/datafile/o1_mf_sysaux_92t6zl5k_.dbf',

  '/u01/app/oradata/ORA11G/datafile/o1_mf_undotbs1_92t6zl6d_.dbf',

  '/u01/app/oradata/ORA11G/datafile/o1_mf_users_92t6zl83_.dbf',

  '/u01/app/oradata/ORA11G/datafile/o1_mf_example_92t74b1f_.dbf',

  '/u01/app/oradata/ORA11G/datafile/o1_mf_trcatbl_96mlzz0j_.dbf',

  '/u01/app/oradata/ORA11G/datafile/o1_mf_testtbl_9j2sxn9r_.dbf',

  '/u01/app/oradata/ORA11G/datafile/o1_mf_awp_9khloyod_.dbf'

CHARACTER SET AL32UTF8

;

 

兩個地方需要修改,一個是online group資訊。因為我們是完全關閉資料庫,不會有啟動之後例項恢復步驟。而且OMF策略的一些檔案在一些版本下是不能指定,所以為避免麻煩,刪除掉日誌檔案資訊,讓Oracle執行過程中重新建立日誌。另一個改動是資料檔案的目錄資訊,將其中的ORA11G替換為ORA11CL

 

 

STARTUP NOMOUNT

CREATE CONTROLFILE SET DATABASE "ORA11CL" RESETLOGS  ARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 1248

LOGFILE

  GROUP 1 SIZE 50M BLOCKSIZE 512,

  GROUP 2 SIZE 50M BLOCKSIZE 512,

  GROUP 3 SIZE 50M BLOCKSIZE 512

-- STANDBY LOGFILE

DATAFILE

  '/u01/app/oradata/ORA11CL/datafile/o1_mf_system_92t6zl2m_.dbf',

  '/u01/app/oradata/ORA11CL/datafile/o1_mf_sysaux_92t6zl5k_.dbf',

  '/u01/app/oradata/ORA11CL/datafile/o1_mf_undotbs1_92t6zl6d_.dbf',

  '/u01/app/oradata/ORA11CL/datafile/o1_mf_users_92t6zl83_.dbf',

  '/u01/app/oradata/ORA11CL/datafile/o1_mf_example_92t74b1f_.dbf',

  '/u01/app/oradata/ORA11CL/datafile/o1_mf_trcatbl_96mlzz0j_.dbf',

  '/u01/app/oradata/ORA11CL/datafile/o1_mf_testtbl_9j2sxn9r_.dbf',

  '/u01/app/oradata/ORA11CL/datafile/o1_mf_awp_9khloyod_.dbf'

CHARACTER SET AL32UTF8

;

 

此外,我們注意在指令碼中沒有temp tablespace的資訊。在trace檔案中,我們看到Oracle可以在open reset之後建立表空間。當然,原始Trace檔案中包括臨時檔案的名稱資訊,筆者也將其刪除,促使Oracle自動建立。

 

ALTER DATABASE OPEN RESETLOGS;

 

ALTER TABLESPACE TEMP ADD TEMPFILE SIZE 481296384  AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

ALTER TABLESPACE TEMPTEST ADD TEMPFILE SIZE 1024M AUTOEXTEND OFF;

ALTER TABLESPACE TEMPTEST ADD TEMPFILE SIZE 525328384  AUTOEXTEND OFF;

ALTER TABLESPACE AWP_TEMP ADD TEMPFILE SIZE 1024M AUTOEXTEND ON NEXT 104857600  MAXSIZE 32767M;

 

最後是引數檔案準備,可以使用ora11g作為範本進行改寫。

 

SQL> create pfile from spfile;

File created.

 

[oracle@SimpleLinux dbs]$ ls -l | grep init

-rw-r--r-- 1 oracle oinstall    2851 May 15  2009 init.ora

-rw-r--r-- 1 oracle oinstall    1070 Mar 10 11:17 initora11g.ora

 

修改其中內容,主要是資料庫名稱,控制檔案引數control_files要進行遮蔽。對應所有與ora11g有關目錄需要進行改寫。

 

ora11cl.__db_cache_size=71303168

ora11cl.__java_pool_size=20971520

ora11cl.__large_pool_size=4194304

ora11cl.__oracle_base='/u01/app'#ORACLE_BASE set from environment

ora11cl.__pga_aggregate_target=113246208

ora11cl.__sga_target=264241152

ora11cl.__shared_io_pool_size=0

ora11cl.__shared_pool_size=150994944

ora11cl.__streams_pool_size=8388608

*.audit_file_dest='/u01/app/admin/ora11cl/adump'

*.audit_trail='db'

*.compatible='11.2.0.0.0'

#*.control_files='/u01/app/oradata/ORA11CL/controlfile/o1_mf_92t72zkf_.ctl','/u01/app/fast_recovery_area/ORA11CL/controlfile/o1_mf_92t72zyj_.ctl'

*.db_block_size=8192

*.db_create_file_dest='/u01/app/oradata'

*.db_domain=''

*.db_name='ora11cl'

*.db_recovery_file_dest='/u01/app/fast_recovery_area'

*.db_recovery_file_dest_size=10737418240

*.diagnostic_dest='/u01/app'

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

*.log_checkpoints_to_alert=TRUE

*.memory_max_target=360m

*.memory_target=360m

*.open_cursors=300

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.undo_retention=300

*.undo_tablespace='UNDOTBS1'

*.use_large_pages='true'

 

儲存為initora11clone.ora檔案。

 

[oracle@SimpleLinux dbs]$ ls -l | grep init

-rw-r--r-- 1 oracle oinstall    2851 May 15  2009 init.ora

-rw-r--r-- 1 oracle oinstall    1127 Mar 10 11:49 initora11clone.ora

-rw-r--r-- 1 oracle oinstall    1070 Mar 10 11:17 initora11g.ora

 

目錄建立,依據前面定位的目錄資訊,手工建立檔案系統目錄。

 

[root@SimpleLinux ~]# mkdir -p /u01/app/admin/ora11cl/adump

[root@SimpleLinux ~]# mkdir -p /u01/app/fast_recovery_area/ORA11CL/controlfile/

[root@SimpleLinux ~]# mkdir -p /u01/app/oradata/ORA11CL/datafile

[root@SimpleLinux ~]# mkdir -p /u01/app/oradata/ORA11CL/onlinelog/

[root@SimpleLinux ~]# mkdir -p /u01/app/fast_recovery_area/ORA11CL/onlinelog/

[root@SimpleLinux ~]# cd /u01

[root@SimpleLinux u01]# chown -R oracle:oinstall /u01

 

3、複製過程

 

做好準備之後,就可以開始過程。首先,在cp檔案之前,一定要確保source資料庫是完全關閉,保證控制檔案、資料檔案和日誌檔案時間SCN一致。

 

[oracle@SimpleLinux dbs]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.3.0 Production on Mon Mar 10 11:56:43 2014

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

 

SQL> conn / as sysdba

Connected.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

 

作業系統層面進行cp複製。

 

 

[oracle@SimpleLinux ~]$ cp /u01/app/oradata/ORA11G/datafile/o1_mf_users_92t6zl83_.dbf /u01/app/oradata/ORA11CL/datafile/o1_mf_users_92t6zl83_.dbf

cp /u01/app/oradata/ORA11G/datafile/o1_mf_trcatbl_96mlzz0j_.dbf

(篇幅原因,有省略……

[oracle@SimpleLinux ~]$ cp /u01/app/oradata/ORA11G/datafile/o1_mf_awp_9khloyod_.dbf /u01/app/oradata/ORA11CL/datafile/o1_mf_awp_9khloyod_.dbf

 

為新例項建立密碼檔案:

 

命令:orapwd file=orapwora11cl password=oracle

[oracle@SimpleLinux dbs]$ ls -l | grep orapw

-rw-r----- 1 oracle oinstall    1536 Feb 12 14:03 orapwAUX

-rw-r----- 1 oracle oinstall    1536 Mar 10 13:10 orapwora11cl

-rw-r----- 1 oracle oinstall    1536 Sep  9 09:02 orapwora11g

 

單獨啟動例項資料庫:

 

 

[oracle@SimpleLinux dbs]$ export ORACLE_SID=ora11cl

[oracle@SimpleLinux dbs]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.3.0 Production on Mon Mar 10 12:29:24 2014

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

 

SQL> conn / as sysdba

Connected to an idle instance.

SQL> startup nomount pfile=initora11clone.ora

ORACLE instance started.

 

Total System Global Area  376635392 bytes

Fixed Size                  1345072 bytes

Variable Size             297798096 bytes

Database Buffers           71303168 bytes

Redo Buffers                6189056 bytes

 

例項啟動成功,進入nomount狀態。之後執行create controlfile語句。

 

 

SQL> CREATE CONTROLFILE REUSE DATABASE "ORA11CL" RESETLOGS  ARCHIVELOG

  2      MAXLOGFILES 16

  3      MAXLOGMEMBERS 3

  4      MAXDATAFILES 100

  5      MAXINSTANCES 8

  6      MAXLOGHISTORY 1248

  7  LOGFILE

  8    GROUP 1 SIZE 50M BLOCKSIZE 512,

  9    GROUP 2 SIZE 50M BLOCKSIZE 512,

 10    GROUP 3 SIZE 50M BLOCKSIZE 512

 11  -- STANDBY LOGFILE

 (篇幅原因,有省略……

 20    '/u01/app/oradata/ORA11CL/datafile/o1_mf_awp_9khloyod_.dbf'

 21  CHARACTER SET AL32UTF8

 22  ;

CREATE CONTROLFILE REUSE DATABASE "ORA11CL" RESETLOGS  ARCHIVELOG

*

ERROR at line 1:

ORA-01503: CREATE CONTROLFILE failed

ORA-01161: database name ORA11G in file header does not match given name of

ORA11CL

ORA-01110: data file 1:

'/u01/app/oradata/ORA11CL/datafile/o1_mf_system_92t6zl2m_.dbf'

 

注意:Oracle此時報錯,認為定義名稱和資料檔案頭中記錄的名稱有差異。這也就說明,在資料檔案頭上,記錄著資料庫的名稱資訊。

解決方法就是修改create controlfile語句頭的名稱,從reuse更改為set。這樣可以讓語句強制性將資料檔案的頭資訊加以修改。

 

SQL> CREATE CONTROLFILE SET DATABASE "ORA11CL" RESETLOGS  ARCHIVELOG

  2      MAXLOGFILES 16

  3      MAXLOGMEMBERS 3

  4      MAXDATAFILES 100

  5      MAXINSTANCES 8

  6      MAXLOGHISTORY 1248

  7  LOGFILE

  8    GROUP 1 SIZE 50M BLOCKSIZE 512,

  9    GROUP 2 SIZE 50M BLOCKSIZE 512,

(篇幅原因,有省略……

'/u01/app/oradata/ORA11CL/datafile/o1_mf_awp_9khloyod_.dbf'

 21  CHARACTER SET AL32UTF8

 22  ;

 

Control file created.

 

此時控制檔案引數被設定上,而且是正確的。注意:10g一些版本中,duplicate過程是由一些bug的。

 

 

SQL> show parameter control

NAME                                 TYPE        VALUE

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

control_file_record_keep_time        integer     7

control_files                        string      /u01/app/oradata/ORA11CL/contr

                                                 olfile/o1_mf_9ktloqho_.ctl, /u

                                                 01/app/fast_recovery_area/ORA1

                                                 1CL/controlfile/o1_mf_9ktloqol

                                                 _.ctl

control_management_pack_access       string      DIAGNOSTIC+TUNING

 

啟動open resetlogs資料庫,建立臨時表空間和檔案。

 

 

SQL> alter database open resetlogs;

Database altered.

 

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE SIZE 481296384  AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

ALTER TABLESPACE TEMPTEST ADD TEMPFILE SIZE 1024M AUTOEXTEND OFF;

ALTER TABLESPACE TEMPTEST ADD TEMPFILE SIZE 525328384  AUTOEXTEND OFF;

Tablespace altered.

 

SQL>

Tablespace altered.

 

SQL>

Tablespace altered.

 

Recovery AreaArchive模式檢查。

 

SQL> show parameter recovery

 

NAME                                 TYPE        VALUE

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

db_recovery_file_dest                string      /u01/app/fast_recovery_area

db_recovery_file_dest_size           big integer 10G

recovery_parallelism                 integer     0

SQL> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     1

Next log sequence to archive   1

Current log sequence           1

 

此時並沒有結束,資料庫還是使用pfile進行啟動,要建立出spfile。此處筆者嘗試使用from memory進行建立。

 

SQL> create spfile from memory;

File created.

 

SQL> startup force;

ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance

ORACLE instance started.

 

Total System Global Area  376635392 bytes

Fixed Size                  1345072 bytes

Variable Size             301992400 bytes

Database Buffers           67108864 bytes

Redo Buffers                6189056 bytes

Database mounted.

Database opened.

 

資料庫啟動,但是過程中存在提示告警資訊。

 

4、告警資訊解決

 

啟動過程中告警資訊,不是什麼大的問題。從alert_log中可以定位問題,發現故障片段。

 

Deprecated system parameters with specified values:

  background_dump_dest    

  user_dump_dest           

End of deprecated system parameter listing

 

 

Oracle認為backgroup_dump_destuser_dump_dest兩個引數已經過時了,不需要設定。我們from memory的過程中,過多的引數被加入了spfile

修復方法也很簡單,就是轉換為pfile之後,將其遮蔽掉。

 

[oracle@SimpleLinux dbs]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.3.0 Production on Mon Mar 10 13:30:01 2014

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

 

SQL> conn / as sysdba

Connected to an idle instance.

SQL> create pfile from spfile;

File created.

 

[oracle@SimpleLinux dbs]$ ls -l | grep init

-rw-r--r-- 1 oracle oinstall    2851 May 15  2009 init.ora

-rw-r--r-- 1 oracle oinstall    1233 Mar 10 13:28 initora11clone.ora

-rw-r--r-- 1 oracle oinstall    6558 Mar 10 13:30 initora11cl.ora

-rw-r--r-- 1 oracle oinstall    1070 Mar 10 11:17 initora11g.ora

 

手工將引數檔案中的過期引數用#遮蔽住。

 

*._unnest_subquery=TRUE

*._use_column_stats_for_function=TRUE

*.audit_file_dest='/u01/app/admin/ora11cl/adump'

*.audit_trail='DB'

#*.background_dump_dest='/u01/app/diag/rdbms/ora11cl/ora11cl/trace'#Deprecate parameter

*.compatible='11.2.0.0.0'

*.control_files='/u01/app/oradata/ORA11CL/controlfile/o1_mf_9ktloqho_.ctl','/u01/app/fast_recovery_area/ORA11CL/controlfile/o1_mf_9ktloqol_.ctl'# Oracle managed file

*.core_dump_dest='/u01/app/diag/rdbms/ora11cl/ora11cl/cdump'

(篇幅原因,有省略……

*.undo_tablespace='UNDOTBS1'

*.use_large_pages='true'

#*.user_dump_dest='/u01/app/diag/rdbms/ora11cl/ora11cl/trace'#Deprecate parameter

 

啟動資料庫,重建spfile

 

[oracle@SimpleLinux dbs]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.3.0 Production on Mon Mar 10 13:32:02 2014

 

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

SQL> conn / as sysdba

Connected to an idle instance.

SQL> startup nomount pfile=initora11cl.ora

ORACLE instance started.

 

Total System Global Area  376635392 bytes

Fixed Size                  1345072 bytes

Variable Size             301992400 bytes

Database Buffers           67108864 bytes

Redo Buffers                6189056 bytes

SQL> create spfile from pfile;

File created.

 

重啟測試,成功。

 

SQL> startup force;

ORACLE instance started.

 

Total System Global Area  376635392 bytes

Fixed Size                  1345072 bytes

Variable Size             301992400 bytes

Database Buffers           67108864 bytes

Redo Buffers                6189056 bytes

Database mounted.

Database opened.

 

5、結論

 

如果是使用熱備份方法(begin backup\end backup)的方法,就意味著需要歸檔日誌進行輔助還原。

SQL命令符下,需要使用set logsource進行歸檔路徑指定。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-1104611/,如需轉載,請註明出處,否則將追究法律責任。

相關文章