搭建数据库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 Area和Archive模式检查。
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_dest和user_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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17203031/viewspace-1104611/