本次试验采用用Create controlfile命令来创建控制文件。
应用场合如下
1,丢失了所有的控制文件
2,需要更改重做日志成员或组的最大设置。
3,必须更改数据库文件或实例的最大序号。
4,希望更改数据库文件的名称和位置(也可以在open状态下用其他方法实现)
5,希望更改数据库名。
注意事项
1,数据库实例必须启动,但没有mount。如果执行成功create controlfile语句则加载新创建的控制文件。
2,运行该命令的用户必须被赋予osdba角色
3,当创建一个新的控制文件时,会丢失所保存的历史资料,例如归档日志历史和rman备份。
实验步骤如下
1 准备克隆数据库
2 备份打开的PRACTICE数据库
3 配置控制文件脚本
4 运行控制文件脚本
5 恢复克隆的数据库
6 打开克隆的数据库
step1 准备克隆数据库
export ORACLE_SID=CLNE
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
export ORACLE_DATA=/oradata/$ORACLE_SID
export ORACLE_ADMIN=$ORACLE_BASE/admin/$ORACLE_SID
mkdir -p $ORACLE_ADMIN/{b,c,u}dump
mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/create
mkdir /oradata
mkdir /archive
mkdir /backup
chown oracle:oinstall /oradata
chown oracle:oinstall /archive
chown oracle:oinstall /backup
create pfile from spfile;
scp $ORACLE_HOME/dbs/initPRACTICE.ora192168.1.21:$ORACLE_HOME/dbs/initCLNE.ora
vi $ORACLE_HOME/dbs/initCLNE.ora
db_name=CLNE<==修改克隆数据库名
db_files = 80
db_file_multiblock_read_count = 8
#db_block_buffers = 100
#shared_pool_size = 3500000
log_checkpoint_interval = 10000
processes = 200
parallel_max_servers = 5
log_buffer = 32768
max_dump_file_size = 10240
global_names = FALSE
job_queue_processes=20
control_files = (/oradata/CLNE/control01.ctl,/oradata/CLNE/control02.ctl)
sga_max_size=300M
sga_target=300M
undo_management='AUTO'
CLNE.__db_cache_size=218103808
CLNE.__java_pool_size=4194304
CLNE.__large_pool_size=4194304
CLNE.__shared_pool_size=83886080
CLNE.__streams_pool_size=0
*.control_files='/oradata/CLNE/control01.ctl','/oradata/CLNE/control02.ctl'
*.db_file_multiblock_read_count=8
*.db_files=80
*.db_name='CLNE'
*.global_names=FALSE
*.job_queue_processes=20
*.log_archive_dest_1='location=/oradata/CLNE/archive'
*.log_archive_format='%t_%s_%r.arc'
*.log_buffer=32768
*.log_checkpoint_interval=10000
*.max_dump_file_size='10240'
*.parallel_max_servers=5
*.processes=200
*.sga_max_size=300M
*.sga_target=300M
*.undo_management='AUTO'
创建密码文件
orapwd file=$ORACLE_HOME/dbs/orapwCLNE password=oracle entries=30 force=y
step2 备份打开的PRACTICE数据库
该脚本是在源数据库open状态下执行alter tablespace begin backup方式进行的。
@/backup/scripts/open_backup.sql
脚本如下
vi /backup/scripts/open_backup.sql
set feedback off
set pagesize 0
set heading off
set verify off
set linesize 100
set trimspool on
define dir = '/backup/open_backup'
define fil = '/backup/scripts/open_backup_commands.sql'
define spo = '&dir/open_backup_output.lst'
set serveroutput on
spool &fil
prompt spool &spo
prompt archive log list;;
prompt alter system switch logfile;;
prompt alter system archive log all;;
DECLARE
rem不备份临时表空间
CURSOR cur_tablespace IS
SELECT tablespace_name
FROM dba_tablespaces where tablespace_name<>'TEMP';
CURSOR cur_datafile (tn VARCHAR) IS
SELECT file_name
FROM dba_data_files
WHERE tablespace_name = tn;
BEGIN
FOR ct IN cur_tablespace LOOP
dbms_output.put_line ('alter tablespace '||ct.tablespace_name||' begin backup;');
FOR cd IN cur_datafile (ct.tablespace_name) LOOP
dbms_output.put_line ('host cp '||cd.file_name||' &dir');
END LOOP;
dbms_output.put_line ('alter tablespace '||ct.tablespace_name||' end backup;');
END LOOP;
END;
/
prompt alter system switch log file;;
rem 注意此处只备份了一个控制文件,需要手工复制一份到快速恢复区/u01/app/oracle/fast_recovery_area/PRACTICE
prompt alter database backup controlfile to '&dir./control01.ctl' REUSE;;
prompt archive log list;;
prompt spool off
spool off;
@&fil
执行脚本,复制PRACTICE数据库文件
@/backup/scripts/open_backup.sql
将备份文件复制到实例目录下
scp /backup/open_backup/* 192.168.1.21:/backup/
scp -r /archive/ 192.168.1.21:/
step3 配置控制文件脚本
执行backup 控制文件命令
alter database backup controlfile to trace resetlogs;
查看当前pid
!ps -ef|grep ora
oracle 3689 3688 0 12:35 ? 00:00:00 oraclePRACTICE (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
找到用户dump目录
show parameter user_dump_dest;
user_dump_dest string /u01/app/oracle/admin/PRACTICE/udump
打开trace文件
vi /u01/app/oracle/admin/PRACTICE/udump/practice_ora_3689.trc
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "PRACTICE" RESETLOGS ARCHIVELOG
MAXLOGFILES 30
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/oradata/PRACTICE/redo01.log' SIZE 100M,
GROUP 2 '/oradata/PRACTICE/redo02.log' SIZE 100M,
GROUP 3 '/oradata/PRACTICE/redo03.log' SIZE 100M
-- STANDBY LOGFILE
DATAFILE
'/oradata/PRACTICE/system01.dbf',
'/oradata/PRACTICE/undotbs01.dbf',
'/oradata/PRACTICE/sysaux01.dbf',
'/oradata/PRACTICE/rbs01.dbf',
'/oradata/PRACTICE/users01.dbf',
'/oradata/PRACTICE/tools01.dbf',
'/oradata/PRACTICE/indx01.dbf',
'/oradata/PRACTICE/users02.dbf'
CHARACTER SET US7ASCII
;
创建一个控制文件生成sql
vi /u01/app/oracle/admin/CLNE/create/create_control.sql
STARTUP NOMOUNT
CREATE CONTROLFILE set DATABASE "CLNE" RESETLOGS ARCHIVELOG
MAXLOGFILES 30
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/oradata/CLNE/redo01.log' SIZE 100M,
GROUP 2 '/oradata/CLNE/redo02.log' SIZE 100M,
GROUP 3 '/oradata/CLNE/redo03.log' SIZE 100M
-- STANDBY LOGFILE
DATAFILE
'/oradata/CLNE/system01.dbf',
'/oradata/CLNE/undotbs01.dbf',
'/oradata/CLNE/sysaux01.dbf',
'/oradata/CLNE/rbs01.dbf',
'/oradata/CLNE/users01.dbf',
'/oradata/CLNE/tools01.dbf',
'/oradata/CLNE/indx01.dbf',
'/oradata/CLNE/users02.dbf'
CHARACTER SET US7ASCII
;
step4 运行控制文件脚本
export ORACLE_SID=CLNE
sqlplus / as sysdba
@/u01/app/oracle/admin/CLNE/create/create_control.sql
step5 恢复克隆的数据库
set logsource /archive;
recover database until cancel using backup controlfile;
step6 打开克隆的数据库
alter database open resetlogs;