主に、新規顧客追加時に「CREATE TABLESPACE」が行われた変更をスタンバイ側に
適用する方法を記載。

1)新規顧客追加に伴い、プライマリに対して以下のSQL文を発行(通常)
  新規顧客用の表領域、テーブルを作成、データを挿入されるた場合を想定
     SQL> CREATE TABLESPACE CUST_2
             DATAFILE ’/udb1/USER/cust_2.dbf’ SIZE 10M
             REUSE AUTOEXTEND ON NEXT 1M MAXSIZE 4096M MINIMUM 
             EXTENT 128K DEFAULT STRAGE ( INITIAL 128K NEXT 128K 
                       MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 );
     SQL> CREATE TABLESPACE CUST_IDX_2
             DATAFILE ’/udb2/USER/cust_idx_2.dbf’ SIZE 10M
             REUSE AUTOEXTEND ON NEXT 1M MINIMUM EXTENT 128K DEFAULT STORAGE
             ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 );
     SQL> CREATE TABLE mesg_2 (
             sliceid    number(6)     NOT NULL,
             nameid     number(6)     NOT NULL,
             time_start number(10)    NOT NULL,
             time_end   number(10)    NOT NULL,
             str        varchar2(255) NOT NULL,
             val        number(10)    NOT NULL,
             rid        number(10)    NOT NULL,
             timestamp  date,
             CONSTRAINT pk_mesg_2 PRIMARY KEY(rid)
                    USING INDEX TABLESPACE CUST_IDX_2)
             tablespace CUST_2 ;
     SQL> INSERT INTO mesg_2 SELECT * FROM mesg_1;  -- 本来はありえないがテストのため

2)プライマリのアーカイブREDOログをスタンバイに適用
  プライマリで物理構成が変更された場合でも通常通り、スタンバイにアーカイブを適用する。
    [プライマリにて]
      % sqlplus /nolog
      SQL> connect sys/change_on_install as sysdba
      SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
      SQL> select max(SEQUENCE#)  from v$log_history;
             MAX(SEQUENCE#) = 44
    [スタンバイにて]
      % sqlplus /nolog
      SQL> connect sys/change_on_install as sysdba
      SQL> select max(SEQUENCE#)  from v$log_history;
             MAX(SEQUENCE#) = 43
      スタンバイに必要なアーカイブは、SEQUENCE#=44(/home/SYSTEM/arch/arch1_43.arc)
      これをプライマリからスタンバイに転送
      SQL> RECOVER AUTOMATIC STANDBY DATABASE;
          ORA-00283: recovery session canceled due to errors
          ORA-01670: new datafile 7 needed for standby database recovery
          ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
          ORA-01110: data file 7: ’/udb1/USER/cust_2.dbf’
      と言うように、エラーになってしまう。以後のアーカイブを受け取っても同様。
   SEQUENCE#=44以上のものがあっても、これ以上適用出来なくなる。

3)エラーの検知
    この状態になってしまうと、以下の現象にいたる。
    ・RECOVERはエラー終了する
    ・alert.logに、その旨のエラーが出力される。(日々の監視、連絡体制が必要)
    ・DBWR trace fileに、その旨のエラーが出力される。(日々の監視、連絡体制が必要)
    ・以後のアーカイブを受け取っても適用されない。

 alert.log  /home/SYSTEM/admin/bdump/alert_sptest2.log
    Fri Jun 15 15:50:52 2001
    ALTER DATABASE RECOVER   AUTOMATIC STANDBY DATABASE
    Fri Jun 15 15:50:52 2001
    Media Recovery Start
    Media Recovery Log
    Media Recovery Log /home/SYSTEM/arch/arch1_44.arc
    Fri Jun 15 15:50:52 2001
    Errors in file /home/SYSTEM/admin/bdump/dbw0_769.trc:
    ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
    ORA-01110: data file 7: ’/udb1/USER/cust_2.dbf’
    ORA-27037: unable to obtain file status
    Intel SVR4 UNIX Error: 2: No such file or directory
    Additional information: 3
    Media Recovery failed with error 1670
    ORA-283 signalled during: ALTER DATABASE RECOVER   AUTOMATIC STANDBY DATABAS...
  DBWR trace file /home/SYSTEM/admin/bdump/dbw0_769.trc
    ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
    ORA-01110: data file 7: ’/udb1/USER/cust_2.dbf’
    ORA-27037: unable to obtain file status
    Intel SVR4 UNIX Error: 2: No such file or directory
    Additional information: 3

4)対処方法
   スタンバイ側で、対象のデータファイルを作成して、再度、アーカイブを適用する。
      % sqlplus /nolog
      SQL> connect sys/change_on_install as sysdba
      SQL> ALTER DATABASE CREATE DATAFILE ’/udb1/USER/cust_2.dbf’
                                        AS ’/udb1/USER/cust_2.dbf’;
      SQL> RECOVER AUTOMATIC STANDBY DATABASE;
   これで、最新のアーカイブまで適用出来ればOKだが、INDEX用の表領域もないため、エラーになる。よって
      SQL> ALTER DATABASE CREATE DATAFILE ’/udb2/USER/cust_idx_2.dbf’
                                        AS ’/udb2/USER/cust_idx_2.dbf’;
      SQL> RECOVER AUTOMATIC STANDBY DATABASE;

   これで完了。試しに、新しく作ったmesg_2テーブルの件数をカウントしてみる。
      SQL> ALTER DATABASE OPEN READ ONLY;
      SQL> select count(*) from dbadm.mesg_2;



[[UNIX]] [[Solaris]] [[Oracle]]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS