复制数据库成为复本或克隆数据库,数据库的副本名称与原数据库相同,克隆数据库与原数据库名称不同。我们可以运用前面讲过的还原和恢复技术,可以方便复制数据库。通过复制数据库可以为自己以及开发团队带来好处:
- 开发团队拥有一个用于编程和测试的模拟数据库;
- 可以验证当前数据库备份的质量;
- 可以练习数据库恢复技能
利用Oracle工具,可以用三种方式复制数据库:
- 可以使用操作系统的文件拷贝进行物理数据库的还原和恢复;
- 可以用Oracle Export和Oracle Import工具将原数据库逻辑还原到一个新的数据库;
- 用Oracle的恢复管理其进行数据文件和控制文件的一个物理文件还原。
复制数据库看上去很简单,如MS SQLServer只需要把MDF文件复制到另一个地方即可,Oracle的复制实际上并没有那么简单。复制Oracle数据库包括数据文件、重做日志文件和控制文件三类文件类型的处理。
练习9:克隆打开的PRACTICE数据库
克隆数据库大致的步骤:首先建立CLNE数据库存放的路径、参数文件、口令文件和Windows服务,接着把PRACTICE数据文件复制到CLNE数据库的数据文件目录下,然后将生成为CLNE数据库创建一个新的控制文件所需的命令脚本,最后运行这个命令完成CLNE数据库的创建。
步骤一:准备CLNE数据库
首先,创建CLNE数据库所需的路径:
1
set
ORACLE_SID
=
CLNE
2
set
ORACLE_BASE
=
D:\oracle
3
set
ORACLE_HOME
=
D:\oracle\product\
10.1
.
0
4
set
ORACLE_DATA
=
D:\oracle\
%
ORACLE_SID
%
5
set
ORACLE_ADMIN
=%
ORACLE_HOME
%
\admin\
%
ORACLE_SID
%
6
md
%
ORACLE_ADMIN
%
7
md
%
ORACLE_ADMIN
%
\pfile
8
md
%
ORACLE_ADMIN
%
\bdump
9
md
%
ORACLE_ADMIN
%
\cdump
10
md
%
ORACLE_ADMIN
%
\udump
11
md
%
ORACLE_ADMIN
%
\create
12
md
%
ORACLE_DATA
%
\
13
md
%
ORACLE_DATA
%
\ARCHIVE
可以通过这个命令创建数据库路径接口,如果有差别可以调整相关参数的路径,当然可以通过Window系统建立文件夹建立需要的文件夹。
接着,进入D:\oracle\product\10.1.0\Db_1\database文件夹,复制PRACTICE参数文件SPFILEPRACTICE.ORA并命名为SPFILEPCLNE.ORA,使用写字板打开,将文件中出现”PRACTICE”替换为”CLNE”。
然后,创建一个口令文件,这样就可以在SQL*Plus中以SYSDBA角色SYS连接数据库。
1
WIN
>
orapwd file
=
D:\oracle\product\
10.1
.
0
\Db_1\database\PWDCLNE.ora password
=
CLNE entries
=
4
再次,为CLNE创建一个名为OracleSerciveCLNE的数据库服务,使用CLNE口令:
1
WIN
>
oradim
-
NEW
-
SID CLNE
-
SYSPWD CLNE
最后,配置TNS服务:打开D:\oracle\product\10.1.0\Db_1\NETWORK\ADMIN\ tnsnames.ora添加目标数据库服务;
配置Lisenter服务:打开D:\oracle\product\10.1.0\Db_1\NETWORK\ADMIN\ listener.ora,添加目标数据库服务
步骤二:备份打开的PRACTICE数据库
对第5节练习5创建的脚本进行调整:
- 在PRACITCE数据库打开时,把数据文件拷贝到CLNE数据目录下;
- 删除用于创建控制文件复制命令的行。
删除后如下(具体用户参见练习5):
1
set
feedback off pagesize
0
heading off verify off linesize
200
trimspool on
2
define dir
=
'
D:\oracle\CLNE
'
3
define fil
=
'
D:\oracle\CODE\tmp\copy_database_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
14
FROM dba_tablespaces
15
WHERE status
<>
'
READ ONLY
'
;
16
CURSOR cur_datafile (tn VARCHAR) IS
17
SELECT file_name
18
FROM dba_data_files
19
WHERE tablespace_name
=
tn;
20
BEGIN
21
FOR ct IN cur_tablespace LOOP
22
dbms_output.put_line(
'
alter tablespace
'
||
ct.tablespace_name
||
'
begin backup;
'
);
23
FOR cd IN cur_datafile(ct.tablespace_name) LOOP
24
dbms_output.put_line(
'
host copy
'
||
cd.file_name
||
'
&dir
'
);
25
END LOOP;
26
dbms_output.put_line(
'
alter tablespace
'
||
ct.tablespace_name
||
'
end backup;
'
);
27
END LOOP;
28
END;
29
/
30
prompt alter system
switch
logfile;;
31
prompt archive log list;;
32
prompt spool off;;
33
spool off;
34
@
&
fil
步骤三:配置控制文件脚本
有一个捷径可以让数据库产生创建一个新的控制文件所需要的指令:
1
SQL
>
ALTER DATABASE BACKUP CONTROLFILE TO TRACE RESETLOGS;
使用这个命令Oracle会创建包含创建控制文件所需要的全部命令,文件的位置由user_dump_dest初始化参数确定。
1
SQL
>
SELECT value FROM v$parameter WHERE name
=
‘user_dump_dest’;
2
SQL
>
SHOW PARAMETER user_dump_dest
这个文件可能以ora123.trc之类的名称命名,寻找一个日期/时间与提交跟踪命令时刻相同的文件,打开该文件将看到创建一个控制文件和启动数据库所需要的全部命令。把该文件命名为create_control_open.sql,并剪切到D:\oracle\product\10.1.0\admin\CLNE\create目录下,并做如下改动:
- 删除脚本的注释行;
- 将CREATE CONTROLFILE命令中的REUSE关键字换成SET关键字;
- 将CREATE CONTROLFILE命令中的”PRACTICE”换成”CLNE”;
- 将每个数据文件和重做日志的所在位置从D:\oracle\PRACTICE更为换为D:\oracle\CLNE
完成修改后,文件如下:
1
STARTUP NOMOUNT
2
CREATE CONTROLFILE SET DATABASE
"
CLNE
"
RESETLOGS ARCHIVELOG
3
MAXLOGFILES
16
4
MAXLOGMEMBERS
3
5
MAXDATAFILES
100
6
MAXINSTANCES
8
7
MAXLOGHISTORY
454
8
LOGFILE
9
GROUP
1
'
D:\ORACLE\CLNE\REDO01.LOG
'
SIZE 10M,
10
GROUP
2
'
D:\ORACLE\CLNE\REDO02.LOG
'
SIZE 10M,
11
GROUP
3
'
D:\ORACLE\CLNE\REDO03.LOG
'
SIZE 10M
12
DATAFILE
13
'
D:\ORACLE\CLNE\SYSTEM01.DBF
'
,
14
'
D:\ORACLE\CLNE\UNDOTBS01.DBF
'
,
15
'
D:\ORACLE\CLNE\SYSAUX01.DBF
'
,
16
'
D:\ORACLE\CLNE\USERS01.DBF
'
,
17
'
D:\ORACLE\CLNE\USERS02.DBF
'
,
18
'
D:\ORACLE\CLNE\TOOLS01.DBF
'
,
19
'
D:\ORACLE\CLNE\TS4DROP01.DBF
'
20
CHARACTER SET ZHS16GBK;
- 第1行启动数据库实例,并打开控制文件。可以用PFILE选项制定数据库参数文件,若不指定参数文件,Oracle服务器会根据ORACLE_SID设置以及操作系统打开某一个默认位置下的文件;
- 第2行创建控制文件,当创建控制文件时,将会重新命名数据库。由于不能改变重做日志中的数据库名称,因此这些重做日志必须重新创建。为了改变控制文件中的数据库名称,可以在CREATE CONTROLFILE命令中使用SET和RESETLOGS关键字,控制文件中的RESETLOGS选项将创建新的重做日志;
- 第8-11行用创建日志文件,用RESETLOGS选项表示重新创建;
- 第12-20行定义组成数据库的那些数据文件。
步骤四:运行控制文件脚本
使用SYSDBA登录SQL*Plus数据库,运行D:\oracle\product\10.1.0\admin\CLNE\create路径下的create_control_open.sql脚本,创建一组新的控制文件。
1
WIN
>
SET ORACLE_SID
=
CLNE
2
WIN
>
sqlplus
/
nolog
3
SQL
>
conn sys
/
CLNE
as
sysdba
4
SQL
>
@D:\oracle\product\
10.1
.
0
\admin\CLNE\create\create_control_open.sql
步骤五:恢复克隆数据库
步骤四已经为CLNE数据库创建了一组新的控制文件,由于数据文件是打开数据库备份的,所以必须对这些归档日志进行恢复。无论采用完全或不完全恢复,需使用PRACTICE的归档日志文件:
1
SQL
>
SET LOGSOURCE D:\oracle\PRACTICE\ARCHIVE;
命令通知CLNE实例在PRACTICE数据库的归档目的路径中寻在用于恢复的归档日志,在这里采用取消式恢复:
1
SQL
>
RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
在提示下至少应用过一个归档日志文件,通过应用重做日志,所有的数据文件都将提升到同样的SCN。如果要进行完全恢复,可以采用如下两种选择:
- 在PRACTICE数据库上进行强制数据库切换,将新归档的日志应用于CLNE数据库;
- 关闭PRACTICE数据库,把其数据库的当前重做日志应用于CLNE数据库上。
如果恢复了CLNE数据库,将看到MEDIA RECOVERY COMPLETE。需要注意数据库不断写入到当前联机日志,所以在PRACTICE数据库打开是不要尝试应用PRACITCE当前重做日志到CLNE中。
步骤六:打开克隆数据库
截至恢复被取消或完成的消息之后,使用RESETLOG选项打开数据库:
1
SQL
>
ALTER DATABASE OPEN RESETLOGS;