ITPub博客

首页 > 数据库 > Oracle > 使用手工方法Clone异名数据库实验

使用手工方法Clone异名数据库实验

原创 Oracle 作者:realkid4 时间:2014-03-10 15:04:31 0 删除 编辑

 

搭建数据库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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7677846