Oracle備份與恢復系列(四)複製資料庫 續 建立新的控制檔案

snowdba發表於2014-08-02
本次試驗採用用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;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29047826/viewspace-1244346/,如需轉載,請註明出處,否則將追究法律責任。

相關文章