henbeibi

Wednesday, January 21, 2009

Oracle Clusterwareスタック

■ocssd
[root@oracle01 ~]#
[root@oracle01 ~]# ps -ef | grep ocssd | grep -v grep
oracle 8454 7926 0 Jan20 ? 00:12:10 /u01/app/crs/product/10.2.0/crs/bin/ocssd.bin

■crsd
[root@oracle01 ~]# ps -ef | grep crsd | grep -v grep
root 6370 1 0 Jan20 ? 00:00:00 /bin/sh /etc/init.d/init.crsd run
root 7886 6370 1 Jan20 ? 00:31:11 /u01/app/crs/product/10.2.0/crs/bin/crsd.bin reboot

■evmd
[root@oracle01 ~]# ps -ef | grep evmd | grep -v grep
root 6366 1 0 Jan20 ? 00:00:00 /bin/sh /etc/init.d/init.evmd run
root 7777 6366 0 Jan20 ? 00:00:00 /bin/su -l oracle -c sh -c 'ulimit -c unlimited; cd /u01/app/crs/product/10.2.0/crs/log/oracle01/evmd; exec /u01/app/crs/product/10.2.0/crs/bin/evmd '
oracle 7780 7777 0 Jan20 ? 00:00:47 /u01/app/crs/product/10.2.0/crs/bin/evmd.bin

■oprocd(プロセスモニターデーモン)
[root@oracle01 ~]# ps -ef | grep oprocd | grep -v grep
root 7892 6367 0 Jan20 ? 00:00:00 /bin/sh /etc/init.d/init.cssd oprocd
root 8283 7892 0 Jan20 ? 00:00:00 /u01/app/crs/product/10.2.0/crs/bin/oprocd.bin run -t 1000 -m 500 -f
[root@oracle01 ~]#

RAC環境VIP変更

■現在のアドレスを確認
[root@oracle01 ~]# ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:0C:29:D7:50:76
inet addr:192.168.153.111 Bcast:192.168.153.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fed7:5076/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:527065 errors:0 dropped:0 overruns:0 frame:0
TX packets:422424 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:291691975 (278.1 MiB) TX bytes:151341317 (144.3 MiB)
Interrupt:185 Base address:0x2024
(これがVIP)
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:D7:50:76
inet addr:192.168.153.201 Bcast:192.168.153.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:185 Base address:0x2024
(以下省略)
[root@oracle01 ~]#

■インスタンスと関連リソースを停止
[root@oracle01 ~]# srvctl stop instance -d RACDB -i RACDB1
[root@oracle01 ~]# srvctl stop nodeapps -n oracle01
[root@oracle01 ~]#

■停止後の状態を確認
[root@oracle01 ~]# cstat
HA Resource Target State
----------- ------ -----
ora.oracle01.LISTENER_ORACLE01.lsnr OFFLINE OFFLINE
ora.oracle01.gsd OFFLINE OFFLINE
ora.oracle01.ons OFFLINE OFFLINE
ora.oracle01.vip OFFLINE OFFLINE
ora.oracle02.LISTENER_ORACLE02.lsnr ONLINE ONLINE on oracle02
ora.oracle02.gsd ONLINE ONLINE on oracle02
ora.oracle02.ons ONLINE ONLINE on oracle02
ora.oracle02.vip ONLINE ONLINE on oracle02
ora.RACDB.db ONLINE ONLINE on oracle01
ora.RACDB.RACDB1.inst OFFLINE OFFLINE
ora.RACDB.RACDB2.inst ONLINE ONLINE on oracle02
[root@oracle01 ~]#

■/etc/hostsファイルを編集
[root@oracle01 ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
192.168.153.111 oracle01 oracle01
192.168.153.112 oracle02 oracle02
192.168.11.101 oracle01-priv oracle01-priv
192.168.153.201 oracle01-vip oracle01-vip
192.168.11.102 oracle02-priv oracle02-priv
192.168.153.202 oracle02-vip oracle02-vip
[root@oracle01 ~]#
[root@oracle01 ~]# cp -p /etc/hosts /etc/hosts.bak.090122
[root@oracle01 ~]# vi /etc/hosts
[root@oracle01 ~]#
[root@oracle01 ~]# diff /etc/hosts /etc/hosts.bak.090122
7c7
<> 192.168.153.201 oracle01-vip oracle01-vip
[root@oracle01 ~]#

■srvctlを利用してVIPアドレスを変更する
[root@oracle01 ~]# srvctl modify nodeapps -n oracle01 -A 192.168.153.211/25 5.255.255.0/eth0
[root@oracle01 ~]#

■インスタンスと関連リソースの起動
[root@oracle01 ~]# srvctl start nodeapps -n oracle01
[root@oracle01 ~]# srvctl start instance -d RACDB -i RACDB1
[root@oracle01 ~]#

■起動後の状態を確認
[root@oracle01 ~]# cstat
HA Resource Target State
----------- ------ -----
ora.oracle01.LISTENER_ORACLE01.lsnr ONLINE ONLINE on oracle01
ora.oracle01.gsd ONLINE ONLINE on oracle01
ora.oracle01.ons ONLINE ONLINE on oracle01
ora.oracle01.vip ONLINE ONLINE on oracle01
ora.oracle02.LISTENER_ORACLE02.lsnr ONLINE ONLINE on oracle02
ora.oracle02.gsd ONLINE ONLINE on oracle02
ora.oracle02.ons ONLINE ONLINE on oracle02
ora.oracle02.vip ONLINE ONLINE on oracle02
ora.RACDB.db ONLINE ONLINE on oracle01
ora.RACDB.RACDB1.inst ONLINE ONLINE on oracle01
ora.RACDB.RACDB2.inst ONLINE ONLINE on oracle02
[root@oracle01 ~]#
[root@oracle01 ~]# cat
[root@oracle01 ~]#
[root@oracle01 ~]# ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:0C:29:D7:50:76
inet addr:192.168.153.111 Bcast:192.168.153.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fed7:5076/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:528391 errors:0 dropped:0 overruns:0 frame:0
TX packets:423350 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:291812061 (278.2 MiB) TX bytes:151446944 (144.4 MiB)
Interrupt:185 Base address:0x2024

eth0:1 Link encap:Ethernet HWaddr 00:0C:29:D7:50:76
inet addr:192.168.153.211 Bcast:192.168.153.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:185 Base address:0x2024
(以下省略)
[root@oracle01 ~]#

■/etc/hostsを2号機にもコピーする
[root@oracle01 ~]# scp -p /etc/hosts oracle02:/etc/
root@oracle02's password:
hosts 0% 0 0.0KB/s --:-- ETAhosts 100% 384 0.4KB/s 00:00
[root@oracle01 ~]#
[root@oracle01 ~]#

コンプライアンス

compliance(法令遵守)
企業が経営・活動を行ううえで、法令や各種規則などのルール、さらには社会的規範などを守ること。一般市民が法律を遵守することと区別するために、企業活動をいう場合は「ビジネスコンプライアンス」ともいう。

Sunday, January 18, 2009

ODV有効化無効化_RAC環境

■無効化手順
Enterprise Managerの停止

$ORACLE_HOME/bin/emtcl status dbconsole
$ORACLE_HOME/bin/emtcl stop dbconsole
$ORACLE_HOME/bin/emtcl status dbconsole

Databaseの停止
srvctl stop database -n global_sid
srvctl stop nodeapps -n oracle01
srvctl stop nodeapps -n oracle02
cstat

Relink
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk dv_off
cd $ORACLE_HOME/bin
relink oracle

ssh oracle02
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk dv_off
cd $ORACLE_HOME/bin
relink oracle

Databaseの起動
srvctl start nodeapps -n oracle01
srvctl start nodeapps -n oracle02
srvctl start database -d global_sid
cstat

ODV無効化
$ORACLE_HOME/bin/dvca -debug -action disable \
-service sminveuc \
-sys_passwd password \
-owner_account smbcrlm -owner_passwd oracle10g_ \
-racnode oracle01 \
-silent \
-nodecrypt

Enterprise Managerの起動
emctl start dbconsole
emctl status dbconsole

トリガーの無効化とODV状態の確認
sqlplus / as sysdba
alter trigger dvsys.dv_before_ddl_trg disable;
alter trigger dvsys.dv_after_ddl_trg disable;
SET LINE 999
COLUMN INST_ID FORMAT 9
COLUMN PARAMETER FORMAT A30
COLUMN VALUE FORMAT A20
select * from gv$option where parameter like '%Vault%';

有効化手順
トリガーの有効化
sqlplus / as sysdba
alter trigger dvsys.dv_before_ddl_trg enable;
alter trigger dvsys.dv_after_ddl_trg enable;
exit

ODVの有効化
$ORACLE_HOME/bin/dvca -debug -action enable \
-service sminveuc \
-sys_passwd password \
-owner_account smbcrlm -owner_passwd oracle10g_ \
-silent \
-racnode oracle01 \
-nodecrypt

Enterprise Managerの停止
emctl stop dbconsole
emctl status dbconsole

Databaseの停止
srvctl stop database -d sminveuc
srvctl stop nodeapps -n oracle01
srvctl stop nodeapps -n oracle02
cstat

Relink
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk dv_on
cd $ORACLE_HOME/bin
relink oracle

ssh oracle02
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk dv_on
cd $ORACLE_HOME/bin
relink oracle
exit

Databaseの起動
srvctl start nodeapps -n oracle01
srvctl start nodeapps -n oracle02
srvctl start database -d sminveuc
cstat

Enterprise Managerの起動
emctl start dbconsole
emctl status dbconsole

ODV状態の確認
sqlplus / as sysdba
SET LINE 999
COLUMN INST_ID FORMAT 9
COLUMN PARAMETER FORMAT A30
COLUMN VALUE FORMAT A20
select * from gv$option where parameter like '%Vault%';
exit


RAID

複数台のディスク・ドライブを組み合わせることで、高速・大容量かつ信頼性に優れたディスク・サブシステムを構築する技術。

■RAID0
ストライピングによって、複数ディスクをあたかも1台のディスクであるかのように扱えるようにするもの。最低2台以上のディスクを組み合わせて、ディスク への書き込み処理や、ディスクからの読み出し処理を複数ディスクに分割し、同時並行的に実行することで、アクセス速度を高速化する。ディスクの大容量化や 高速化の目的で使用されるのが一般的。ただし、後述するRAID 1やRAID 5のような冗長性は備えておらず、耐障害性は高くないどころか、複数のディスクのうち、どれか1台が読み出し不能になると、ディスク全体が読み出し不能になるという欠点がある。

■RAID1
ミラーリングを使って同一のデータを複数のディスクに書き込み、一方のディスクが故障しても、他方で処理を続行できるようにし、耐障害性を高めるもの。通 常はディスク2台を使って実現する。ただしRAID1では、同一のデータを2台のディスクに書き込むため、ディスクの使用効率は50%になってしまうとい う欠点がある(例えば1Gbytesのデータを記録するには、1Gbytes×2=2Gbytes分のディスクが必要になる)。

■RAID2■RAID3■RAID4
分類上これらは存在するが、次のRAID5が一般的に使われるため、現実のシステムではほとんど用いられない。

■RAID5
複数のディスクにデータとパリティ情報を記録することで耐障害性を高めたもの。データをディスクに記録する際、そのデータのパリティ情報を生成し、 残りのデータとともにストライピングによって複数のディスクに分散して書き込む。こうしておけば、万一ディスクの1台が故障しても、残ったデータとパリ ティ情報から破損したデータを割り出すことができる。パリティに必要な容量はディスク1台分で済むため、ミラーリングよりも効率よくディスク領域を使用で きる。

 RAID5では、ディスクからの読み出し時には、複数ディスクからの同時並行読み出しが可能なので高速化がなされるが、データの書き込み時にはパリティを算出しなければならず、その分のオーバーヘッドがかかる。

RAID5で使用できるHDDのデータ量は「物理HDDの数-1」です。

■データを"d"、パリティ情報を"*"とした場合
HDD1:d,d,*,d,d,*~
HDD2:d,*,d,d,*,d~
HDD3:*,d,d,*,d,d~

RAID5は実データとパリティ情報を分散記憶することで、
転送速度と信頼性を向上させる方法です。

パリティビットについてですが、パリティビットというのは、
誤り検出符号ですが、その検出方法は単純です。
RAID5の場合はデータ1~データnまでの排他的論理和をパリティ情報としています。

※排他的論理和
双方の数字が同じであれば偽(0)を返し、同じでなければ 真(1)を返し

■8bitの実データ(00 10 10 11)、記録データ長を1bit、HDD3台とした場合
HDD1:0(d),1(d),1(*),1(d)
HDD2:0(d),1(*),1(d),1(d)
HDD3:0(*),0(d),0(d),0(*)

となります。実際は記録データ長が数十byte(セクタ長?)になりますので、
仮に先ほどの8bitのデータを4bit長で記録し、XORでパリティ情報を付加すると
HDD1:0010(d)
HDD2:1011(d)
HDD3:1001(*)

ストライピング【striping】

ストライピングとは

 1つのデータを2つ以上のハードディスクに分けて同時に書き込むこと。

 ストライピング先のディスクで最も遅いものの転送速度に台数を掛けたものが全体の転送速度になり、飛躍的にデータ転送が高速化される。

 ストライピングするハードディスクの容量は、ストライピングを行なうディスク全体でもっとも容量の小さいものの容量に台数を掛けたものになるため、各ディスクの速度と容量を活かすためには、同種のハードディスクでストライピングを行なうのが望ましい。

 ストライピングはRAID-0として規定されており、名目上はRAIDの一種とされているが、データの冗長化は行われない。このため、ストライピング構成は耐障害性が低く、ストライピングに使用しているハードディスクが1台でも故障するとデータが復旧できなくなってしまうという欠点を持っている。

 この欠点を克服するために、ストライピング構成をまるごとミラーし、片方のストライピング構成が破損してもデータが失われないようにする(その代わりディスクの台数は2倍以上になる)などの方法が考案されている。

Wednesday, January 07, 2009

不完全リカバリ

##とりあえず、フルバックアップ取る。

SYS @ TESTDB >
SYS @ TESTDB >alter system switch logfile;

System altered.

SYS @ TESTDB >
SYS @ TESTDB >ALTER DATABASE BEGIN BACKUP;

Database altered.

SYS @ TESTDB >
SYS @ TESTDB >host
[oracle@node01 ctrl01]$ export BKID=3000
[oracle@node01 ctrl01]$ mkdir -p /home/testdb/orabackups/${BKID}/oradata03
[oracle@node01 ctrl01]$ mkdir -p /home/testdb/orabackups/${BKID}/oradata04
[oracle@node01 ctrl01]$ mkdir -p /home/testdb/orabackups/${BKID}/arch
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ ll /home/testdb/orabacupkups
合計 36
drwxr-xr-x 5 oracle oinstall 4096 11月 27 23:18 3000
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ cp -p /home/testdb/oradata03/TESTDB/*.dbf /home/testdb/orabackups/${BKID}/oradat a03
[oracle@node01 ctrl01]$ cp -p /home/testdb/oradata04/TESTDB/*.dbf /home/testdb/orabackups/${BKID}/oradat a04
[oracle@node01 ctrl01]$ cp -p /home/testdb/oradata01/TESTDB/arch/*.* /home/testdb/orabackups/${BKID}/arc h
[oracle@node01 ctrl01]$ rm -f /home/testdb/oradata01/TESTDB/arch/*.*
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ ll /home/testdb/orabackups/${BKID}/oradata03
合計 995120
-rw-r----- 1 oracle oinstall 524296192 11月 27 23:17 sysaux01.dbf
-rw-r----- 1 oracle oinstall 314580992 11月 27 23:17 system01.dbf
-rw-r----- 1 oracle oinstall 52436992 11月 27 22:01 temp01.dbf
-rw-r----- 1 oracle oinstall 178266112 11月 27 23:17 undotbs01.dbf
[oracle@node01 ctrl01]$ ll /home/testdb/orabackups/${BKID}/oradata04
合計 82048
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:17 index01_01.dbf
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:17 index02_01.dbf
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:17 users01_01.dbf
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:17 users02_01.dbf
[oracle@node01 ctrl01]$ ll /home/testdb/orabackups/${BKID}/arch
合計 19304
-rw-r----- 1 oracle oinstall 44032 11月 27 23:16 arch_1_0000000001_0671930144.arc
-rw-r----- 1 oracle oinstall 19449856 11月 27 22:52 arch_1_0000000002_0671910876.arc
-rw-r----- 1 oracle oinstall 1024 11月 27 23:17 arch_1_0000000002_0671930144.arc
-rw-r----- 1 oracle oinstall 235008 11月 27 23:05 arch_1_0000000003_0671910876.arc
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ exit
exit

SYS @ TESTDB >
SYS @ TESTDB >alter database end backup;

Database altered.

SYS @ TESTDB >
SYS @ TESTDB >
SYS @ TESTDB >alter database backup controlfile to trace as '/home/testdb/orabackups/3000/trace.trc';

Database altered.

SYS @ TESTDB >

##これで最初のバックアップが終了しました。

##続いて、データベースに変更を加えます。
##まずは、testdb_user.testtableをdrop。時間を記録する。

SYS @ TESTDB >SELECT TO_CHAR(SYSDATE, 'YYYYMMDD HH24:MI:SS') NOW FROM DUAL;

NOW
-----------------
20081127 23:22:01

SYS @ TESTDB >
SYS @ TESTDB >drop table testdb_user.ta esttable;

Table dropped.

SYS @ TESTDB >
SYS @ TESTDB >
##新しいテーブルを作成します。
SYS @ TESTDB >CREATE TABLE SYSTEM.TESTTABLE (COLA VARCHAR2(5), COLB VARCHAR2(10), COLC TIMESTAMP);

Table created.

SYS @ TESTDB >
SYS @ TESTDB >BEGIN
FOR I IN 1..50 LOOP
INSERT INTO SYSTEM.TESTTABLE(COLA, COLB, COLC)
VALUES(I,'SYSTEM',SYSDATE);
END LOOP;
END;
/

PL/SQL procedure successfully completed.

SYS @ TESTDB >COMMIT;

Commit complete.

SYS @ TESTDB >SELECT COUNT(*) FROM SYSTEM.TESTTABLE;
COUNT(*)
----------
50

SYS @ TESTDB >

##変更が完了。再びフルバックアップを取得します。

SYS @ TESTDB >alter system switch logfile;

System altered.

SYS @ TESTDB >
SYS @ TESTDB >alter database begin backup;

Database altered.

SYS @ TESTDB >
SYS @ TESTDB >host
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ export BKID=3001
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ mkdir -p /home/testdb/orabackups/${BKID}/oradata03
[oracle@node01 ctrl01]$ mkdir -p /home/testdb/orabackups/${BKID}/oradata04
[oracle@node01 ctrl01]$ mkdir -p /home/testdb/orabackups/${BKID}/arch
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ cp -p /home/testdb/oradata03/TESTDB/*.dbf /home/testdb/orabackups/${BKID}/oradat a03
[oracle@node01 ctrl01]$ cp -p /home/testdb/oradata04/TESTDB/*.dbf /home/testdb/orabackups/${BKID}/oradat a04
[oracle@node01 ctrl01]$ cp -p /home/testdb/oradata01/TESTDB/arch/*.* /home/testdb/orabackups/${BKID}/arc h
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ ll /home/testdb/orabackups/${BKID}/oradata03
合計 995120
-rw-r----- 1 oracle oinstall 524296192 11月 27 23:24 sysaux01.dbf
-rw-r----- 1 oracle oinstall 314580992 11月 27 23:24 system01.dbf
-rw-r----- 1 oracle oinstall 52436992 11月 27 22:01 temp01.dbf
-rw-r----- 1 oracle oinstall 178266112 11月 27 23:24 undotbs01.dbf
[oracle@node01 ctrl01]$ ll /home/testdb/orabackups/${BKID}/oradata04
合計 82048
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:24 index01_01.dbf
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:24 index02_01.dbf
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:24 users01_01.dbf
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:24 users02_01.dbf
[oracle@node01 ctrl01]$ ll /home/testdb/orabackups/${BKID}/arch
合計 60
-rw-r----- 1 oracle oinstall 56320 11月 27 23:23 arch_1_0000000003_0671930144.arc
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ exit
exit

SYS @ TESTDB >
SYS @ TESTDB >alter database end backup;

Database altered.

SYS @ TESTDB >
SYS @ TESTDB >alter database backup controlfile to trace as '/home/testdb/orabackups/3001/trace.trc';

Database altered.

SYS @ TESTDB >
SYS @ TESTDB >

##仮にここで、テーブルがドロップされたことが発覚!
shutdownして、3000に戻る
SYS @ TESTDB >shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS @ TESTDB >
SYS @ TESTDB >host

[oracle@node01 ctrl01]$
##3000のファイルをリストア
export BKID=3000
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ cp -p /home/testdb/orabackups/${BKID}/oradata03/*.dbf /home/testdb/oradata03/TES TDB
[oracle@node01 ctrl01]$ cp -p /home/testdb/orabackups/${BKID}/oradata04/*.dbf /home/testdb/oradata04/TES TDB
[oracle@node01 ctrl01]$ cp -p /home/testdb/orabackups/${BKID}/arch/*.* /home/testdb/oradata01/TESTDB/arc h/
[oracle@node01 ctrl01]$ ll -ltr /home/testdb/oradata01/TESTDB/arch/
合計 19364
-rw-r----- 1 oracle oinstall 19449856 11月 27 22:52 arch_1_0000000002_0671910876.arc
-rw-r----- 1 oracle oinstall 235008 11月 27 23:05 arch_1_0000000003_0671910876.arc
-rw-r----- 1 oracle oinstall 44032 11月 27 23:16 arch_1_0000000001_0671930144.arc
-rw-r----- 1 oracle oinstall 1024 11月 27 23:17 arch_1_0000000002_0671930144.arc
-rw-r----- 1 oracle oinstall 56320 11月 27 23:23 arch_1_0000000003_0671930144.arc
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ exit
exit

SYS @ TESTDB >
SYS @ TESTDB >startup mount;
ORACLE instance started.

Total System Global Area 2147483648 bytes
Fixed Size 1268536 bytes
Variable Size 1543505096 bytes
Database Buffers 587202560 bytes
Redo Buffers 15507456 bytes
Database mounted.
SYS @ TESTDB >

##テーブルドロップ直前に戻す

SYS @ TESTDB >recover database until time '2008/11/27 23:22:00';
Media recovery complete.
SYS @ TESTDB >
SYS @ TESTDB >alter database open resetlogs;

Database altered.

SYS @ TESTDB >
SYS @ TESTDB >SELECT * FROM TESTDB_USER.TESTTABLE;

COLA COLB COLC
----- ---------- ----------------------------------------
1 TESTDB 27-NOV-08 10.50.26.000000 PM
2 TESTDB 27-NOV-08 10.50.26.000000 PM
3 TESTDB 27-NOV-08 10.50.26.000000 PM
4 TESTDB 27-NOV-08 10.50.26.000000 PM
5 TESTDB 27-NOV-08 10.50.26.000000 PM
6 TESTDB 27-NOV-08 10.50.26.000000 PM
7 TESTDB 27-NOV-08 10.50.26.000000 PM
8 TESTDB 27-NOV-08 10.50.26.000000 PM
9 TESTDB 27-NOV-08 10.50.26.000000 PM
10 TESTDB 27-NOV-08 10.50.26.000000 PM
11 TESTDB 27-NOV-08 10.50.26.000000 PM
12 TESTDB 27-NOV-08 10.50.26.000000 PM
13 TESTDB 27-NOV-08 10.50.26.000000 PM
14 TESTDB 27-NOV-08 10.50.26.000000 PM
15 TESTDB 27-NOV-08 10.50.26.000000 PM
16 TESTDB 27-NOV-08 10.50.26.000000 PM
17 TESTDB 27-NOV-08 10.50.26.000000 PM
18 TESTDB 27-NOV-08 10.50.26.000000 PM
19 TESTDB 27-NOV-08 10.50.26.000000 PM
20 TESTDB 27-NOV-08 10.50.26.000000 PM
21 TESTDB 27-NOV-08 10.50.26.000000 PM
22 TESTDB 27-NOV-08 10.50.26.000000 PM
23 TESTDB 27-NOV-08 10.50.26.000000 PM
24 TESTDB 27-NOV-08 10.50.26.000000 PM
25 TESTDB 27-NOV-08 10.50.26.000000 PM
26 TESTDB 27-NOV-08 10.50.26.000000 PM
27 TESTDB 27-NOV-08 10.50.26.000000 PM
28 TESTDB 27-NOV-08 10.50.26.000000 PM
29 TESTDB 27-NOV-08 10.50.26.000000 PM
30 TESTDB 27-NOV-08 10.50.26.000000 PM
31 TESTDB 27-NOV-08 10.50.26.000000 PM
32 TESTDB 27-NOV-08 10.50.26.000000 PM
33 TESTDB 27-NOV-08 10.50.26.000000 PM
34 TESTDB 27-NOV-08 10.50.26.000000 PM
35 TESTDB 27-NOV-08 10.50.26.000000 PM
36 TESTDB 27-NOV-08 10.50.26.000000 PM
37 TESTDB 27-NOV-08 10.50.26.000000 PM
38 TESTDB 27-NOV-08 10.50.26.000000 PM
39 TESTDB 27-NOV-08 10.50.26.000000 PM
40 TESTDB 27-NOV-08 10.50.26.000000 PM
41 TESTDB 27-NOV-08 10.50.26.000000 PM
42 TESTDB 27-NOV-08 10.50.26.000000 PM
43 TESTDB 27-NOV-08 10.50.26.000000 PM
44 TESTDB 27-NOV-08 10.50.26.000000 PM
45 TESTDB 27-NOV-08 10.50.26.000000 PM
46 TESTDB 27-NOV-08 10.50.26.000000 PM
47 TESTDB 27-NOV-08 10.50.26.000000 PM
48 TESTDB 27-NOV-08 10.50.26.000000 PM
49 TESTDB 27-NOV-08 10.50.26.000000 PM
50 TESTDB 27-NOV-08 10.50.26.000000 PM

50 rows selected.

SYS @ TESTDB >
##おお、回復しました。

##しかし!
SYS @ TESTDB >SELECT * FROM SYSTEM.TESTTABLE;
SELECT * FROM SYSTEM.TESTTABLE
*
ERROR at line 1:
ORA-00942: table or view does not exist

SYS @ TESTDB >
##後に作成されたテーブルはない!!
##それはしょうがないですね。
##とにかく、せっかく戻したテーブルのデータをエクスポートしておく!!
SYS @ TESTDB >host
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ exp testdb_user/testdb_user file='/home/testdb/orabackups/3000/testdbuser_testtable.dmp' tables=testdb_user.testtable;

Export: Release 10.2.0.4.0 - Production on Thu Nov 27 23:36:07 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, Data Mining and Real Application Testing options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)

About to export specified tables via Conventional Path ...
. . exporting table TESTTABLE 50 rows exported
Export terminated successfully without warnings.
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ exit
exit

SYS @ TESTDB >
##後に作ったテーブルも戻さないとだめなので、
##最新の状態に戻そう...
SYS @ TESTDB >shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS @ TESTDB >
SYS @ TESTDB >
SYS @ TESTDB >host
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ export BKID=3001
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ cp -p /home/testdb/orabackups/${BKID}/oradata03/*.dbf /home/testdb/oradata03/TES TDB
[oracle@node01 ctrl01]$ cp -p /home/testdb/orabackups/${BKID}/oradata04/*.dbf /home/testdb/oradata04/TES TDB
[oracle@node01 ctrl01]$ cp -p /home/testdb/orabackups/${BKID}/arch/*.* /home/testdb/oradata01/TESTDB/arc h/
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ ll /home/testdb/oradata01/TESTDB/arch/*.*
-rw-r----- 1 oracle oinstall 44032 11月 27 23:16 /home/testdb/oradata01/TESTDB/arch/arch_1_0000000001_0671930144.arc
-rw-r----- 1 oracle oinstall 19449856 11月 27 22:52 /home/testdb/oradata01/TESTDB/arch/arch_1_0000000002_0671910876.arc
-rw-r----- 1 oracle oinstall 1024 11月 27 23:17 /home/testdb/oradata01/TESTDB/arch/arch_1_0000000002_0671930144.arc
-rw-r----- 1 oracle oinstall 235008 11月 27 23:05 /home/testdb/oradata01/TESTDB/arch/arch_1_0000000003_0671910876.arc
-rw-r----- 1 oracle oinstall 56320 11月 27 23:23 /home/testdb/oradata01/TESTDB/arch/arch_1_0000000003_0671930144.arc
-rw-r----- 1 oracle oinstall 2848768 11月 27 23:33 /home/testdb/oradata01/TESTDB/arch/arch_1_0000000004_0671930144.arc
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ exit
exit

SYS @ TESTDB >
SYS @ TESTDB >startup mount;
ORACLE instance started.

Total System Global Area 2147483648 bytes
Fixed Size 1268536 bytes
Variable Size 1543505096 bytes
Database Buffers 587202560 bytes
Redo Buffers 15507456 bytes
Database mounted.
SYS @ TESTDB >
SYS @ TESTDB >recover dta atabase;
ORA-00283: recovery session canceled due to errors
ORA-19909: datafile 1 belongs to an orphan incarnation
ORA-01110: data file 1: '/home/testdb/oradata03/TESTDB/system01.dbf'


SYS @ TESTDB >
SYS @ TESTDB >shutdown imem mediate;
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SYS @ TESTDB >
SYS @ TESTDB >
SYS @ TESTDB >alter da startup nomount;
ORACLE instance started.

Total System Global Area 2147483648 bytes
Fixed Size 1268536 bytes
Variable Size 1543505096 bytes
Database Buffers 587202560 bytes
Redo Buffers 15507456 bytes
SYS @ TESTDB >
SYS @ TESTDB >
SYS @ TESTDB >CREATE CONTROLFILE REUSE DATABASE "TESTDB" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 200
MAXINSTANCES 2
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
'/home/testdb/oradata01/TESTDB/redo/redo01a.log',
'/home/testdb/oradata02/TESTDB/redo/redo01b.log'
) SIZE 20M,
GROUP 2 (
'/home/testdb/oradata01/TESTDB/redo/redo02a.log',
'/home/testdb/oradata02/TESTDB/redo/redo02b.log'
) SIZE 20M,
GROUP 3 (
'/home/testdb/oradata01/TESTDB/redo/redo03a.log',
'/home/testdb/oradata02/TESTDB/redo/redo03b.log'
) SIZE 20M
DATAFILE
'/home/testdb/oradata03/TESTDB/system01.dbf',
'/home/testdb/oradata03/TESTDB/undotbs01.dbf',
'/home/testdb/oradata03/TESTDB/sysaux01.dbf',
'/home/testdb/oradata04/TESTDB/index01_01.dbf',
'/home/testdb/oradata04/TESTDB/index02_01.dbf',
'/home/testdb/oradata04/TESTDB/users01_01.dbf',
'/home/testdb/oradata04/TESTDB/users02_01.dbf'
CHARACTER SET AL32UTF8
;
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Control file created.

SYS @ TESTDB >SYS @ TESTDB >
SYS @ TESTDB >
SYS @ TESTDB >
SYS @ TESTDB >s alter database mount;
alter database mount
*
ERROR at line 1:
ORA-01100: database already mounted


SYS @ TESTDB >
SYS @ TESTDB >recover database until cancel using backup controlfile;
ORA-00279: change 272945 generated at 11/27/2008 23:24:17 needed for thread 1
ORA-00289: suggestion : /home/testdb/oradata01/TESTDB/arch/arch_1_0000000004_0671930144.arc
ORA-00280: change 272945 for thread 1 is in sequence #4


Specify log: {=suggested | filename | AUTO | CANCEL}

ORA-00279: change 273406 generated at 11/27/2008 23:33:06 needed for thread 1
ORA-00289: suggestion : /home/testdb/oradata01/TESTDB/arch/arch_1_0000000005_0671930144.arc
ORA-00280: change 273406 for thread 1 is in sequence #5
ORA-00278: log file '/home/testdb/oradata01/TESTDB/arch/arch_1_0000000004_0671930144.arc' no longer
needed for this recovery


Specify log: {=suggested | filename | AUTO | CANCEL}

ORA-00308: cannot open archived log
'/home/testdb/oradata01/TESTDB/arch/arch_1_0000000005_0671930144.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3


SYS @ TESTDB >
SYS @ TESTDB >alter database open resetlogs;

Database altered.

SYS @ TESTDB >SELECT * FROM TESTDB_USER.TESTTABLE;
SELECT * FROM TESTDB_USER.TESTTABLE
*
ERROR at line 1:
ORA-00942: table or view does not exist


SYS @ TESTDB >
SYS @ TESTDB >SELECT * FROM SYSTEM.TESTTABLE;

COLA COLB COLC
----- ---------- ----------------------------------------
1 SYSTEM 27-NOV-08 11.22.51.000000 PM
2 SYSTEM 27-NOV-08 11.22.51.000000 PM
3 SYSTEM 27-NOV-08 11.22.51.000000 PM
4 SYSTEM 27-NOV-08 11.22.51.000000 PM
5 SYSTEM 27-NOV-08 11.22.51.000000 PM
6 SYSTEM 27-NOV-08 11.22.51.000000 PM
7 SYSTEM 27-NOV-08 11.22.51.000000 PM
8 SYSTEM 27-NOV-08 11.22.51.000000 PM
9 SYSTEM 27-NOV-08 11.22.51.000000 PM
10 SYSTEM 27-NOV-08 11.22.51.000000 PM
11 SYSTEM 27-NOV-08 11.22.51.000000 PM
12 SYSTEM 27-NOV-08 11.22.51.000000 PM
13 SYSTEM 27-NOV-08 11.22.51.000000 PM
14 SYSTEM 27-NOV-08 11.22.51.000000 PM
15 SYSTEM 27-NOV-08 11.22.51.000000 PM
16 SYSTEM 27-NOV-08 11.22.51.000000 PM
17 SYSTEM 27-NOV-08 11.22.51.000000 PM
18 SYSTEM 27-NOV-08 11.22.51.000000 PM
19 SYSTEM 27-NOV-08 11.22.51.000000 PM
20 SYSTEM 27-NOV-08 11.22.51.000000 PM
21 SYSTEM 27-NOV-08 11.22.51.000000 PM
22 SYSTEM 27-NOV-08 11.22.51.000000 PM
23 SYSTEM 27-NOV-08 11.22.51.000000 PM
24 SYSTEM 27-NOV-08 11.22.51.000000 PM
25 SYSTEM 27-NOV-08 11.22.51.000000 PM
26 SYSTEM 27-NOV-08 11.22.51.000000 PM
27 SYSTEM 27-NOV-08 11.22.51.000000 PM
28 SYSTEM 27-NOV-08 11.22.51.000000 PM
29 SYSTEM 27-NOV-08 11.22.51.000000 PM
30 SYSTEM 27-NOV-08 11.22.51.000000 PM
31 SYSTEM 27-NOV-08 11.22.51.000000 PM
32 SYSTEM 27-NOV-08 11.22.51.000000 PM
33 SYSTEM 27-NOV-08 11.22.51.000000 PM
34 SYSTEM 27-NOV-08 11.22.51.000000 PM
35 SYSTEM 27-NOV-08 11.22.51.000000 PM
36 SYSTEM 27-NOV-08 11.22.51.000000 PM
37 SYSTEM 27-NOV-08 11.22.51.000000 PM
38 SYSTEM 27-NOV-08 11.22.51.000000 PM
39 SYSTEM 27-NOV-08 11.22.51.000000 PM
40 SYSTEM 27-NOV-08 11.22.51.000000 PM
41 SYSTEM 27-NOV-08 11.22.51.000000 PM
42 SYSTEM 27-NOV-08 11.22.51.000000 PM
43 SYSTEM 27-NOV-08 11.22.51.000000 PM
44 SYSTEM 27-NOV-08 11.22.51.000000 PM
45 SYSTEM 27-NOV-08 11.22.51.000000 PM
46 SYSTEM 27-NOV-08 11.22.51.000000 PM
47 SYSTEM 27-NOV-08 11.22.51.000000 PM
48 SYSTEM 27-NOV-08 11.22.51.000000 PM
49 SYSTEM 27-NOV-08 11.22.51.000000 PM
50 SYSTEM 27-NOV-08 11.22.51.000000 PM

50 rows selected.

SYS @ TESTDB >
SYS @ TESTDB >ドロップされたテーブルはない、2番目のはある。いいですね。

SYS @ TESTDB >host

[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ imp HELP=Y

Import: Release 10.2.0.4.0 - Production on Thu Nov 27 23:42:46 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.



You can let Import prompt you for parameters by entering the IMP
command followed by your username/password:

Example: IMP SCOTT/TIGER

Or, you can control how Import runs by entering the IMP command followed
by various arguments. To specify parameters, you use keywords:

Format: IMP KEYWORD=value or KEYWORD=(value1,value2,...,valueN)
Example: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
or TABLES=(T1:P1,T1:P2), if T1 is partitioned table

USERID must be the first parameter on the command line.

Keyword Description (Default) Keyword Description (Default)
--------------------------------------------------------------------------
USERID username/password FULL import entire file (N)
BUFFER size of data buffer FROMUSER list of owner usernames
FILE input files (EXPDAT.DMP) TOUSER list of usernames
SHOW just list file contents (N) TABLES list of table names
IGNORE ignore create errors (N) RECORDLENGTH length of IO record
GRANTS import grants (Y) INCTYPE incremental import type
INDEXES import indexes (Y) COMMIT commit array insert (N)
ROWS import data rows (Y) PARFILE parameter filename
LOG log file of screen output CONSTRAINTS import constraints (Y)
DESTROY overwrite tablespace data file (N)
INDEXFILE write table/index info to specified file
SKIP_UNUSABLE_INDEXES skip maintenance of unusable indexes (N)
FEEDBACK display progress every x rows(0)
TOID_NOVALIDATE skip validation of specified type ids
FILESIZE maximum size of each dump file
STATISTICS import precomputed statistics (always)
RESUMABLE suspend when a space related error is encountered(N)
RESUMABLE_NAME text string used to identify resumable statement
RESUMABLE_TIMEOUT wait time for RESUMABLE
COMPILE compile procedures, packages, and functions (Y)
STREAMS_CONFIGURATION import streams general metadata (Y)
STREAMS_INSTANTIATION import streams instantiation metadata (N)
VOLSIZE number of bytes in file on each volume of a file on tape

The following keywords only apply to transportable tablespaces
TRANSPORT_TABLESPACE import transportable tablespace metadata (N)
TABLESPACES tablespaces to be transported into database
DATAFILES datafiles to be transported into database
TTS_OWNERS users that own data in the transportable tablespace set

Import terminated successfully without warnings.
[oracle@node01 ctrl01]$ imp userid=testdb_user/testdb_user file=/home/testdb/orabackups/3000/
arch/ oradata04/ testtable.dmp
oradata03/ testdbuser_testtable.dmp trace.trc
[oracle@node01 ctrl01]$ imp userid=testdb_user/testdb_user file=/home/testdb/orabackups/3000/testdbuser_ttesttable.dmp

Import: Release 10.2.0.4.0 - Production on Thu Nov 27 23:43:09 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, Data Mining and Real Application Testing options

Export file created by EXPORT:V10.02.01 via conventional path
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing TESTDB_USER's objects into TESTDB_USER
. importing TESTDB_USER's objects into TESTDB_USER
. . importing table "TESTTABLE" 50 rows imported
Import terminated successfully without warnings.
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ exit
exit

SYS @ TESTDB >
SYS @ TESTDB >
SYS @ TESTDB >SELECT * FROM TESTDB_USER.TESTTABLE;

COLA COLB COLC
----- ---------- ----------------------------------------
1 TESTDB 27-NOV-08 10.50.26.000000 PM
2 TESTDB 27-NOV-08 10.50.26.000000 PM
3 TESTDB 27-NOV-08 10.50.26.000000 PM
4 TESTDB 27-NOV-08 10.50.26.000000 PM
5 TESTDB 27-NOV-08 10.50.26.000000 PM
6 TESTDB 27-NOV-08 10.50.26.000000 PM
7 TESTDB 27-NOV-08 10.50.26.000000 PM
8 TESTDB 27-NOV-08 10.50.26.000000 PM
9 TESTDB 27-NOV-08 10.50.26.000000 PM
10 TESTDB 27-NOV-08 10.50.26.000000 PM
11 TESTDB 27-NOV-08 10.50.26.000000 PM
12 TESTDB 27-NOV-08 10.50.26.000000 PM
13 TESTDB 27-NOV-08 10.50.26.000000 PM
14 TESTDB 27-NOV-08 10.50.26.000000 PM
15 TESTDB 27-NOV-08 10.50.26.000000 PM
16 TESTDB 27-NOV-08 10.50.26.000000 PM
17 TESTDB 27-NOV-08 10.50.26.000000 PM
18 TESTDB 27-NOV-08 10.50.26.000000 PM
19 TESTDB 27-NOV-08 10.50.26.000000 PM
20 TESTDB 27-NOV-08 10.50.26.000000 PM
21 TESTDB 27-NOV-08 10.50.26.000000 PM
22 TESTDB 27-NOV-08 10.50.26.000000 PM
23 TESTDB 27-NOV-08 10.50.26.000000 PM
24 TESTDB 27-NOV-08 10.50.26.000000 PM
25 TESTDB 27-NOV-08 10.50.26.000000 PM
26 TESTDB 27-NOV-08 10.50.26.000000 PM
27 TESTDB 27-NOV-08 10.50.26.000000 PM
28 TESTDB 27-NOV-08 10.50.26.000000 PM
29 TESTDB 27-NOV-08 10.50.26.000000 PM
30 TESTDB 27-NOV-08 10.50.26.000000 PM
31 TESTDB 27-NOV-08 10.50.26.000000 PM
32 TESTDB 27-NOV-08 10.50.26.000000 PM
33 TESTDB 27-NOV-08 10.50.26.000000 PM
34 TESTDB 27-NOV-08 10.50.26.000000 PM
35 TESTDB 27-NOV-08 10.50.26.000000 PM
36 TESTDB 27-NOV-08 10.50.26.000000 PM
37 TESTDB 27-NOV-08 10.50.26.000000 PM
38 TESTDB 27-NOV-08 10.50.26.000000 PM
39 TESTDB 27-NOV-08 10.50.26.000000 PM
40 TESTDB 27-NOV-08 10.50.26.000000 PM
41 TESTDB 27-NOV-08 10.50.26.000000 PM
42 TESTDB 27-NOV-08 10.50.26.000000 PM
43 TESTDB 27-NOV-08 10.50.26.000000 PM
44 TESTDB 27-NOV-08 10.50.26.000000 PM
45 TESTDB 27-NOV-08 10.50.26.000000 PM
46 TESTDB 27-NOV-08 10.50.26.000000 PM
47 TESTDB 27-NOV-08 10.50.26.000000 PM
48 TESTDB 27-NOV-08 10.50.26.000000 PM
49 TESTDB 27-NOV-08 10.50.26.000000 PM
50 TESTDB 27-NOV-08 10.50.26.000000 PM

50 rows selected.

SYS @ TESTDB >
SYS @ TESTDB >SELECT * FROM SYSTEM.TESTTABLE;

COLA COLB COLC
----- ---------- ----------------------------------------
1 SYSTEM 27-NOV-08 11.22.51.000000 PM
2 SYSTEM 27-NOV-08 11.22.51.000000 PM
3 SYSTEM 27-NOV-08 11.22.51.000000 PM
4 SYSTEM 27-NOV-08 11.22.51.000000 PM
5 SYSTEM 27-NOV-08 11.22.51.000000 PM
6 SYSTEM 27-NOV-08 11.22.51.000000 PM
7 SYSTEM 27-NOV-08 11.22.51.000000 PM
8 SYSTEM 27-NOV-08 11.22.51.000000 PM
9 SYSTEM 27-NOV-08 11.22.51.000000 PM
10 SYSTEM 27-NOV-08 11.22.51.000000 PM
11 SYSTEM 27-NOV-08 11.22.51.000000 PM
12 SYSTEM 27-NOV-08 11.22.51.000000 PM
13 SYSTEM 27-NOV-08 11.22.51.000000 PM
14 SYSTEM 27-NOV-08 11.22.51.000000 PM
15 SYSTEM 27-NOV-08 11.22.51.000000 PM
16 SYSTEM 27-NOV-08 11.22.51.000000 PM
17 SYSTEM 27-NOV-08 11.22.51.000000 PM
18 SYSTEM 27-NOV-08 11.22.51.000000 PM
19 SYSTEM 27-NOV-08 11.22.51.000000 PM
20 SYSTEM 27-NOV-08 11.22.51.000000 PM
21 SYSTEM 27-NOV-08 11.22.51.000000 PM
22 SYSTEM 27-NOV-08 11.22.51.000000 PM
23 SYSTEM 27-NOV-08 11.22.51.000000 PM
24 SYSTEM 27-NOV-08 11.22.51.000000 PM
25 SYSTEM 27-NOV-08 11.22.51.000000 PM
26 SYSTEM 27-NOV-08 11.22.51.000000 PM
27 SYSTEM 27-NOV-08 11.22.51.000000 PM
28 SYSTEM 27-NOV-08 11.22.51.000000 PM
29 SYSTEM 27-NOV-08 11.22.51.000000 PM
30 SYSTEM 27-NOV-08 11.22.51.000000 PM
31 SYSTEM 27-NOV-08 11.22.51.000000 PM
32 SYSTEM 27-NOV-08 11.22.51.000000 PM
33 SYSTEM 27-NOV-08 11.22.51.000000 PM
34 SYSTEM 27-NOV-08 11.22.51.000000 PM
35 SYSTEM 27-NOV-08 11.22.51.000000 PM
36 SYSTEM 27-NOV-08 11.22.51.000000 PM
37 SYSTEM 27-NOV-08 11.22.51.000000 PM
38 SYSTEM 27-NOV-08 11.22.51.000000 PM
39 SYSTEM 27-NOV-08 11.22.51.000000 PM
40 SYSTEM 27-NOV-08 11.22.51.000000 PM
41 SYSTEM 27-NOV-08 11.22.51.000000 PM
42 SYSTEM 27-NOV-08 11.22.51.000000 PM
43 SYSTEM 27-NOV-08 11.22.51.000000 PM
44 SYSTEM 27-NOV-08 11.22.51.000000 PM
45 SYSTEM 27-NOV-08 11.22.51.000000 PM
46 SYSTEM 27-NOV-08 11.22.51.000000 PM
47 SYSTEM 27-NOV-08 11.22.51.000000 PM
48 SYSTEM 27-NOV-08 11.22.51.000000 PM
49 SYSTEM 27-NOV-08 11.22.51.000000 PM
50 SYSTEM 27-NOV-08 11.22.51.000000 PM

50 rows selected.

SYS @ TESTDB >
SYS @ TESTDB >全部戻しました。完璧です。

SYS @ TESTDB >念のため、もう一度フルバックアップを取るぞ。
alter system si witch lgofi ogfile;

System altered.

SYS @ TESTDB >
SYS @ TESTDB >alter database begin backup;

Database altered.

SYS @ TESTDB >e host
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ export BKID=3002
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ mkdir -p /home/testdb/orabackups/${BKID}/oradata03
[oracle@node01 ctrl01]$ mkdir -p /home/testdb/orabackups/${BKID}/oradata04
[oracle@node01 ctrl01]$ mkdir -p /home/testdb/orabackups/${BKID}/arch
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ cp -p /home/testdb/oradata03/TESTDB/*.dbf /home/testdb/orabackups/${BKID}/oradat a03
[oracle@node01 ctrl01]$ cp -p /home/testdb/oradata04/TESTDB/*.dbf /home/testdb/orabackups/${BKID}/oradat a04
[oracle@node01 ctrl01]$ cp -p /home/testdb/oradata01/TESTDB/arch/*.* /home/testdb/orabackups/${BKID}/arc h
[oracle@node01 ctrl01]$ rm -f /home/testdb/oradata01/TESTDB/arch/*.*
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ ll /home/testdb/orabackups/${BKID}/oradata03
合計 995120
-rw-r----- 1 oracle oinstall 524296192 11月 27 23:44 sysaux01.dbf
-rw-r----- 1 oracle oinstall 314580992 11月 27 23:44 system01.dbf
-rw-r----- 1 oracle oinstall 52436992 11月 27 22:01 temp01.dbf
-rw-r----- 1 oracle oinstall 178266112 11月 27 23:44 undotbs01.dbf
[oracle@node01 ctrl01]$ ll /home/testdb/orabackups/${BKID}/oradata04
合計 82048
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:44 index01_01.dbf
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:44 index02_01.dbf
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:44 users01_01.dbf
-rw-r----- 1 oracle oinstall 20979712 11月 27 23:44 users02_01.dbf
[oracle@node01 ctrl01]$ ll /home/testdb/orabackups/${BKID}/arch
合計 22236
-rw-r----- 1 oracle oinstall 44032 11月 27 23:16 arch_1_0000000001_0671930144.arc
-rw-r----- 1 oracle oinstall 79360 11月 27 23:44 arch_1_0000000001_0671931715.arc
-rw-r----- 1 oracle oinstall 19449856 11月 27 22:52 arch_1_0000000002_0671910876.arc
-rw-r----- 1 oracle oinstall 1024 11月 27 23:17 arch_1_0000000002_0671930144.arc
-rw-r----- 1 oracle oinstall 235008 11月 27 23:05 arch_1_0000000003_0671910876.arc
-rw-r----- 1 oracle oinstall 56320 11月 27 23:23 arch_1_0000000003_0671930144.arc
-rw-r----- 1 oracle oinstall 2848768 11月 27 23:33 arch_1_0000000004_0671930144.arc
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ exit
exit

SYS @ TESTDB >
SYS @ TESTDB >alter database end backup;

Database altered.

SYS @ TESTDB >
SYS @ TESTDB >alter database backup controlfile to trace as '/home/testdb/orabackups/3002/trace.trc';

Database altered.

SYS @ TESTDB >
SYS @ TESTDB >
SYS @ TESTDB >exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, Data Mining and Real Application Testing options
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$
[oracle@node01 ctrl01]$ これで完了です。

[oracle@node01 ctrl01]$ exit

統計情報の履歴やロックなど

●統計情報履歴

まずは、統計情報の履歴です。これは便利です。
10g 以降において、SQLの実行計画が悪化した場合、まずは過去の統計情報を戻すことを考えてみてください。Oracleが自動的に過去の統計情報を約1ヶ月 保持しているはずです。今日の朝からSQLの性能が悪化したのであれば、昨日の統計に戻してみると改善するかもしれません。

例:
SELECT * FROM DBA_TAB_STATS_HISTORY WHERE TABLE_NAME='TEST_FOR_STATS';

SYSTEM TEST_FOR_STATS

08-10-09 22:55:38.859000 +09:00

SYSTEM TEST_FOR_STATS

08-10-09 22:57:48.906000 +09:00

このように統計情報がバージョン管理されています。
注:analyzeでは過去統計情報が残らないため注意してください。

統計を過去に戻す方法ですが、次のように行います。

例:
exec DBMS_STATS.RESTORE_TABLE_STATS(ownname=>'SYSTEM',tabname=>'TEST_FOR_STATS',as_of_timestamp=>'08-10-09 22:56:38.859000');

なお、DBMS_STATS.RESTORE_DATABASE_STATS で、データベース全体が、
DBMS_STATS.RESTORE_SCHEMA_STATS で、スキーマ全体が戻ります。

ここら辺のプロシージャの詳細は、PL/SQL パッケージ・プロシージャマニュアルをご覧ください。日本オラクルのOTNからマニュアルは無料でダウンロードできます。

なお、9i以前のOracleの場合、DBMS_STATSで手動でバックアップをとることができます。

●統計情報のロック

次は、統計情報のロックです。性能を変えたくない場合、ロックすることで統計が変わらないようにできます。これにより実行計画はほぼ固定となります。

DBMS_STATSのLOCK_SCHEMA_STATS や LOCK_TABLE_STATS、
UNLOCK_SCHEMA_STATS や UNLOCK_TABLE_STATSを用います。

例:
EXECUTE DBMS_STATS.LOCK_TABLE_STATS ('SYSTEM', 'TEST_FOR_STATS');

注意点は、データが少ないときに固定してしまうと、Oracleはフルスキャンを選びやすいという点があげられます。つまり、データが多くなってもフルスキャンのままになって性能がどんどん劣化する場合もありえます。

●ヒストグラム(分布に関する情報)

10g以降において、統計情報の収集では、ヒストグラムも収集されえるようになりました(デフォルト値)。ヒストグラムも、実行計画が変わる要素です。9iまでと同様に取らないというのも手です。

DBMS_STATSの METHOD_OPT というパラメータがあり、これがデフォルトで'FOR ALL COLUMNS SIZE AUTO'となっています。この場合、ヒストグラムをとってしまうことがあります。

ただし、DWHなどでは、ヒストグラムがあるからこそ速くなるケースもあるため、きちんと検討した上で止めてください。OLTP系ではヒストグラムはあまり必要ないかもしれません。

● バインドピークの停止

実 は、Oracleは9i以降、バインド変数の中をピーク(peek:のぞく)して、実行計画を立てる参考にしています。これが実行計画を変動させることが あります。この機能は目的があって導入されているので、いちがいに止める必要はありませんが、実行計画を変動させたくない場合には、これの停止も検討して よいでしょう。

個人的に止め方を書くことはできないので、Oracleのサポートやインターネットで検索して止め方を調べてみてください。「バインドピーク 無効」といったキーワードで出てくるはずです。

●そのほか

なお、実行計画はキャッシュされることもあるため、alter system flush shared_pool などでメモリ上のキャッシュをクリアすることも、必要に応じて実行してください。
また、統計を取得していない場合、Oracleはメモリ上に一時的な統計情報を置く(ダイナミックサンプリング)ことがあります。これも実行計画を変動させます。alter system flush shared_pool でこれも消すことができます。

今回紹介したノウハウを使いこなせば、実行計画はだいたい安定するのではないでしょうか? まだまだ統計情報のノウハウは続きます。