在另一篇Blog里提到怎么用RMAN来复制数据库,本篇Blog在简单谈谈如何手动来实现复制Oracle数据库。
复制数据库可以从一个主数据库创建,无论这个数据库是打开的还是关闭的。为了创建一个复制数据库,来自打开或者关闭的备份文件可以用作数据库文件的副本。关闭备份的数据库文件备份不需要恢复(recover),因为所有的数据文件头的SCN是一致的,而打开备份的数据库文件是需要进行恢复的,因为各个文件相互之间不一致。
当clone数据库的时候,将必须创建一个新的控制文件。数据库控制文件可以用CREATE CONTROLFILE命令来创建。很多情况下,这个命令是有用的或者是必要的,比如说在如下情况下就需要来创建control file.
(1) 丢失了所有的控制文件
(2) 需要更改redo log file member 或 redo log file group的最大设置
(3) 希望更改数据文件或者instance的最大序号
(4) 希望更改数据文件的名称和位置(当然在数据库打开的时候通过其他方法也可以实现)
(5) 希望更改数据库的名称。
在给出CREATE CONTROLFILE 命令语句之后, Oracle根据语句中给定的信息创建一个新的控制文件。 CREATE CONTROLFILE 和 CREATE DATABASE语句有点类似。
下面列出了创建控制文件比较重要的关键字,
- LOGFILE : 指定所有将被数据库使用的重做日志成员和群组。如果计划重新设置重做日志,这些文件就无需存在了,它们将被创建。 如果计划再利用已有的重做日志,必须正确指定每个重做日志文件。
- DATAFILE : 列出数据库中指定的每个数据文件的文件名称。
- REUSE: 当创建一个控制文件,同时又有一个文件与之名称相同时候,会得到一个错误信息。利用reuse参数来覆盖已有的控制文件。控制文件的位置参数由数据库参数文件中的control_files参数来确定。
- SET: 定义出所希望的数据库名称。当重新为数据库命名时需要该选项。
- RESETLOGS: 指出忽略和取代LOGFILE关键字后面跟着的任何日志文件。如果在创建控制文件时使用这一选项,必须使用RESETLOGS选项打开数据库。
- NORESETLOGS : 指定从数据库打开时候起的重做日志文件将被使用. LOGFILE参数指定的重做日志文件必须存在,创建的控制文件将参考当前的数据文件。
创建控制文件时注意事项:
(1) 数据库实例必须启动,但没有加载。(startup nomount) 如果执行成功,CREATE CONTROLFILE语句则加载新创建的控制文件。
(2) 运行改命令的用户必须被赋予DBA角色
(3) 当创建一个新的控制文件时,会丢失所保存的历史资料,例如归档日志历史和RMAN备份。
OK,下面进入正题,来实际操作下clone数据库。
比如说我现在想clone一个跟当前运行的PRACTICE数据库相同的数据库,名字暂且叫做CLNE。
第一步: 创建数据库目录结构,参数文件,口令文件(用于远程sys用户登陆) 和 Windows服务(基于windows平台)
首先建立CLNE的数据库路径(windows 平台下)
SET ORACLE_BASE=D:\oracle
SET ORACLE_HOME=D:\oracle\product\10.2.0
SET ORACLE_DATA=D:\oracle\product\10.2.0\oradata\%ORACLE_SID%
SET ORACLE_ADMIN=D:\oracle\product\10.2.0\admin\%ORACLE_SID%
mkdir %ORACLE_ADMIN%
mkdir %ORACLE_ADMIN%\pfile
mkdir %ORACLE_ADMIN%\bdump
mkdir %ORACLE_ADMIN%\cdump
mkdir %ORACLE_ADMIN%\udump
mkdir %ORACLE_ADMIN%\create
mkdir %ORACLE_DATA%
mkdir %ORACLE_DATA%\archive
接下来为CLNE数据库创建一个参数文件。可以复制目标数据PRACTICE的参数文件,然后把先关的名字改成CLNE。因为PRACTICE用的是SPFILE二进制文件,可以通过如下命令得到对应的pfile,
然后打开文件initclne.ora进行相关的改动(PRACTICE->CLNE). 类似于下面,
clne.__java_pool_size=4194304
clne.__large_pool_size=4194304
clne.__shared_pool_size=184549376
clne.__streams_pool_size=0
*.audit_file_dest='D:\oracle\product\10.2.0/admin/CLNE/adump'
*.background_dump_dest='D:\oracle\product\10.2.0/admin/CLNE/bdump'
*.compatible='10.2.0.1.0'
*.control_files='D:\oracle\product\10.2.0/oradata/CLNE/\control01.ctl','D:\oracle\product\10.2.0/oradata/CLNE/\control02.ctl','D:\oracle\product\10.2.0/oradata/CLNE/\control03.ctl'
*.core_dump_dest='D:\oracle\product\10.2.0/admin/CLNE/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='CLNE'
*.db_recovery_file_dest='D:\oracle\product\10.2.0\flash_recovery_area'
*.db_recovery_file_dest_size=4294967296
*.job_queue_processes=2
*.log_archive_dest_1='location=D:\oracle\product\10.2.0\oradata\CLNE\archive'
*.nls_language='SIMPLIFIED CHINESE'
*.nls_territory='CHINA'
*.open_cursors=300
*.pga_aggregate_target=177209344
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=531628032
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='D:\oracle\product\10.2.0/admin/CLNE/udump'
接下里创建口令文件,借助于ORAPWD命令, 如下
注意host命令,因为orapwd不是SQL命令,不能直接在sqlplus里面执行,另外file的路径名不需要加上引号。
其实在Windows平台上没有必要通过orapwd来单独创建口令文件,因为通过oradim在创建新的实例的时候可以设置参数 -initpwd 来在默认目录下生成口令文件。 如下,
实例已创建。
第二步: 备份打开的PRACTICE数据库
可以通过运行下面的脚步文件来把PRACTICE数据库的数据文件“热”备份到CLNE数据库的数据文件目录下,
2 define dir='D:\oracle\product\10.2.0\oradata\CLNE'
3 define fil='D:\oracle\product\10.2.0\backup_practice\backupcommandfile\open_backup_commands.sql'
4 define spo='&dir\open_backup_output.lst'
5 prompt ***Spooling to &fil
6 set serveroutput on
7 spool &fil
8 prompt spool &spo
9 prompt archive log list;;
10 prompt alter system switch logfile;;
11 DECLARE
12 CURSOR cur_tablespace IS
13 SELECT tablespace_name FROM dba_tablespaces
14 WHERE status <> 'READ ONLY';
15 CURSOR cur_datafile (tn varchar2) IS
16 SELECT file_name
17 FROM dba_data_files
18 WHERE tablespace_name = tn;
19 BEGIN
20 FOR ct IN cur_tablespace LOOP
21 dbms_output.put_line('alter tablespace ' || ct.tablespace_name || ' begin backup;');
22 FOR cd IN cur_datafile (ct.tablespace_name) LOOP
23 dbms_output.put_line('host copy ' || cd.file_name ||' &dir');
24 END LOOP;
25 dbms_output.put_line('alter tablespace ' || ct.tablespace_name|| ' end backup;');
26 END LOOP;
27 END;
28 /
29 prompt alter system switch logfile;;
30 prompt archive log list;;
31 prompt spool off;;
32 spool off;
33 @&fil
34
这样,我们就得到了PRACTICE数据库的不一致的备份文件了,可以用来clone数据库。 (注意,上面的脚步文件可能不会备份temp表空间, 因为TEMP表空间不允许如下操作
alter tablespace TEMP begin backup;
alter tablespace TEMP end backup;
因为临时表空间没有必要尽心备份,我们可以手动创建临时表空间。
第三步: 为CLNE数据库配置控制文件
手动通过写CREATE CONTROLFILE来创建控制文件需要一定的工作量,我们可以像创建参数文件那样来通过改写PRACTICE的控制文件来创建新的控制文件。同样,因为control file不可以直接编辑,我们需要首先把control file转储出来。如下,
SQL> alter database backup controlfile to trace resetlogs;
这样会生成一个包含创建控制文件全部命令的的trace文件,在user_dump_dest指向的目录下。trace file内容大致如下,
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Wed Jan 27 22:06:40 2010
ORACLE V10.2.0.1.0 - Production vsnsta=0
vsnsql=14 vsnxtr=3
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Windows XP Version V5.1 Service Pack 3
CPU : 2 - type 586, 2 Physical Cores
Process Affinity : 0x00000000
Memory (Avail/Total): Ph:592M/1790M, Ph+PgF:2180M/3681M, VA:1363M/2047M
Instance name: practice
Redo thread mounted by this instance: 1
Oracle process number: 15
Windows thread id: 3456, image: ORACLE.EXE (SHAD)
*** SERVICE NAME:(PRACTICE) 2010-01-27 22:06:40.906
*** SESSION ID:(159.7) 2010-01-27 22:06:40.906
*** 2010-01-27 22:06:40.906
-- The following are current System-scope REDO Log Archival related
-- parameters and can be included in the database initialization file.
--
-- LOG_ARCHIVE_DEST=''
-- LOG_ARCHIVE_DUPLEX_DEST=''
--
-- LOG_ARCHIVE_FORMAT=ARC%S_%R.%T
--
-- DB_UNIQUE_NAME="PRACTICE"
--
-- LOG_ARCHIVE_CONFIG='SEND, RECEIVE, NODG_CONFIG'
-- LOG_ARCHIVE_MAX_PROCESSES=2
-- STANDBY_FILE_MANAGEMENT=MANUAL
-- STANDBY_ARCHIVE_DEST=%ORACLE_HOME%\RDBMS
-- FAL_CLIENT=''
-- FAL_SERVER=''
--
-- LOG_ARCHIVE_DEST_1='LOCATION=D:\oracle\product\10.2.0\oradata\PRACTICE\archive'
-- LOG_ARCHIVE_DEST_1='OPTIONAL REOPEN=300 NODELAY'
-- LOG_ARCHIVE_DEST_1='ARCH NOAFFIRM NOEXPEDITE NOVERIFY SYNC'
-- LOG_ARCHIVE_DEST_1='REGISTER NOALTERNATE NODEPENDENCY'
-- LOG_ARCHIVE_DEST_1='NOMAX_FAILURE NOQUOTA_SIZE NOQUOTA_USED NODB_UNIQUE_NAME'
-- LOG_ARCHIVE_DEST_1='VALID_FOR=(PRIMARY_ROLE,ONLINE_LOGFILES)'
-- LOG_ARCHIVE_DEST_STATE_1=ENABLE
--
-- The following commands will create a new control file and use it
-- to open the database.
-- Data used by Recovery Manager will be lost.
-- The contents of online logs will be lost and all backups will
-- be invalidated. Use this only if online logs are damaged.
-- After mounting the created controlfile, the following SQL
-- statement will place the database in the appropriate
-- protection mode:
-- ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "PRACTICE" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\REDO01.LOG' SIZE 50M,
GROUP 2 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\REDO02.LOG' SIZE 50M,
GROUP 3 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\REDO03.LOG' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\SYSTEM01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\UNDOTBS01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\SYSAUX01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\USERS01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\TOOLS01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\RBS01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\INDX01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\USER02.DBF'
CHARACTER SET ZHS16GBK
;
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\ARCHIVE\ARC00001_0567697796.001';
-- ALTER DATABASE REGISTER LOGFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\ARCHIVE\ARC00001_0709060420.001';
-- ALTER DATABASE REGISTER LOGFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\ARCHIVE\ARC00001_0709129065.001';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE USING BACKUP CONTROLFILE
-- Database can now be opened zeroing the online logs.
ALTER DATABASE OPEN RESETLOGS;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\TEMP01.DBF'
SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
-- End of tempfile additions.
--
可以对其做些修改,最后如下,
STARTUP NOMOUNT
CREATE CONTROLFILE SET DATABASE "CLNE" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\REDO01.LOG' SIZE 50M,
GROUP 2 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\REDO02.LOG' SIZE 50M,
GROUP 3 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\REDO03.LOG' SIZE 50M
DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\SYSTEM01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\UNDOTBS01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\SYSAUX01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\USERS01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\TOOLS01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\RBS01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\INDX01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\USER02.DBF'
CHARACTER SET ZHS16GBK
;
第四步: 运行控制文件脚本
把上面的脚本保存在文件D:\oracle\product\10.2.0\admin\CLNE\create\create_control_open.sql
1
3
4 C:\Documents and Settings\Administrator>sqlplus /nolog
5
6 SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 1月 27 22:17:18 2010
7
8 Copyright (c) 1982, 2005, Oracle. All rights reserved.
9
10 SQL> conn sys/CLNE as sysdba
11 已连接到空闲例程。
12 SQL> STARTUP pfile='D:\oracle\product\10.2.0\admin\CLNE\pfile\initclne.ora' NOMOUNT
13 ORACLE 例程已经启动。
14
15 Total System Global Area 532676608 bytes
16 Fixed Size 1249968 bytes
17 Variable Size 192941392 bytes
18 Database Buffers 331350016 bytes
19 Redo Buffers 7135232 bytes
20 SQL> @D:\oracle\product\10.2.0\admin\CLNE\create\create_control_open.sql
21
22 控制文件已创建。
23
24 SQL>
25
(注意在startup的时候指定了所用的参数文件 D:\oracle\product\10.2.0\admin\CLNE\pfile\initclne.ora)
这时候会在目录D:\oracle\product\10.2.0\oradata\CLNE下可以看到生成了三个控制文件。
第五步: 恢复克隆数据库
因为备份文件是在PRACTICE打开的情况下拷贝的,因此是需要进行recover的,因为当表空间被置于备份模式下,数据文件的检查点SCN是不同的,因此每个数据文件都必须用来自PRACTICE数据库的归档日志文件进行恢复。
首先指定归档日志文件路径,
SQL> SET LOGSOURCE 'D:\oracle\product\10.2.0\oradata\PRACTICE\archive'
然后进行恢复,
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
ORA-00279: ?? 698769 (? 01/27/2010 21:56:55 ??) ???? 1 ????
ORA-00289: ??:
D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRACTICE\ARCHIVE\ARC00020_0709129065.001
ORA-00280: ?? 698769 (???? 1) ??? #20 ?
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
介质恢复已取消。
由于系统问题,一些信息看不到,大体上就是说oracle自动检测到需要用到那些日志文件来进行恢复,我这里直接用了cancel了,没有指定filename, 这样完成的是不完全恢复,只是把数据文件同步到过去的某一个时刻,不是最新的状态。
最用用resetlogs方式打开数据库,
SQL> alter database open resetlogs;
数据库已更改。
OK了,数据库恢复完毕,这时候会发现在目录D:\oracle\product\10.2.0\oradata\CLNE 下也生成了redo log file了。
检验一下,
SQL> select file#, name, checkpoint_change# from v$datafile;
FILE# NAME CHECKPOINT_CHANGE#
---------- ---------------------------------------- ------------------
1 D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\SY 698771
STEM01.DBF
2 D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\UN 698771
DOTBS01.DBF
3 D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\SY 698771
SAUX01.DBF
4 D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\US 698771
ERS01.DBF
5 D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\TO 698771
OLS01.DBF
6 D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\RB 698771
S01.DBF
7 D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\IN 698771
DX01.DBF
8 D:\ORACLE\PRODUCT\10.2.0\ORADATA\CLNE\US 698771
ER02.DBF
已选择8行。
可以看到所有的数据文件的checkpoint_scn又一致了。
注意到之前我们没有备份临时表空间的数据文件,很显然CLNE应该还没有临时表空间的数据文件,测试如下,
SQL> select file_name from dba_data_files where tablespace_name = 'TEMP';
未选定行
SQL> select name from v$tablespace;
NAME
----------------------------------------
SYSTEM
UNDOTBS1
SYSAUX
USERS
TOOLS
RBS
INDX
TEMP
已选择8行。
[UPDATE on 2011-2-24: 上面的这个SQL是有问题的,应该从DBA_TEMP_FILES视图中查询,而不是DBA_DATA_FILES]
可以看到临时表空间是存在的,只是没有对应的数据文件,我们可以手动增加一个临时数据文件给临时表空间,如下
SQL> alter tablespace temp add tempfile 'D:\oracle\product\10.2.0\oradata\CLNE\temp01.dbf' size 20m autoextend on;
表空间已更改。
OK,至此整个copy过程就结束了。