Oracleデータベースのバックアップ/リカバリについて検討しているのですが、

サーバ本体のH/W障害等により、
Oracleシステム(或いは、OS自体)が破壊された場合の
リカバリ方法が見当つきません。

Oracleにおける各データ(表領域や制御ファイルなど)に障害が起こった場合は、
・各表領域データファイル
・制御ファイル
・アーカイブRedoログ
のオンラインバックアップにより対処できるということは分かってます。

しかし、Oracle自体が起動できないときは、
例えば、予備のサーバ(DBデータの同期は一切無し、
全く新規のサーバと考えてください)で復旧したいとき、
どのように対処したらよろしいのでしょうか?

上記のオンラインバックアップでは復旧できないのでしょうか?

また、Export/Importによる論理バックアップで対処できるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>代替サーバに適用する「初期化パラメータファイル」の内容や


>データベースファイルのロケーション(PATH)は、
>全く同じでなければならない、
初期化パラメータファイルの内容、ファイルロケーションは必ずしも同じでなくてもかまいません。
ただしそのためには、データベース作成時に、変更した「初期化パラメータファイル」から新たな制御ファイルを作る必要があります。(データベースファイルは再作成の必要はありませんが、おそらく、コールドバックアップでなければならないかも知れませんので、まったくいっしょのほうがよいかもしれません。)

ただ、講習会の中では、制御ファイルを再作成することで、「初期化パラメータファイル」の変更(つまりはデータベースファイルのパスの変更)は大丈夫であるとの説明は、聞きました。
    • good
    • 0
この回答へのお礼

なるほど、よく分かりました。
自分でもいろいろ試してみたいと思います。

ありがとうございました。

お礼日時:2001/09/04 21:28

3つのファイルに加え、初期化パラメータファイルとデータベース作成スクリプトがあれば復旧できます。



代わりのサーバーに、Oracleをインストールし、バックアップの初期化パラメータファイルと、データベース作成スクリプトでデータベースを作成し、残りの3つのファイルをコピーすればできます。

Export/Importでも基本的には手順は同じです。

この回答への補足

早速のご回答ありがとうございます。

なるほど。
代替サーバに適用する「初期化パラメータファイル」の内容や
データベースファイルのロケーション(PATH)は、
全く同じでなければならない、
ということですよね?

補足日時:2001/08/31 12:08
    • good
    • 0
この回答へのお礼

なるほど、よく分かりました。
自分でもいろいろ試してみたいと思います。

ありがとうございました。

お礼日時:2001/09/04 21:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

QOracle9iで必要なインストール領域とメモリ領域について

Oracle9i(Database Enterprise Edition)を導入しようしており、必要なディスク容量
やメモリ量を見積もっています。環境はSolaris9です。
・インストール領域としてどれだけの領域が必要でしょうか?おおそよの数値で
 けっこうです。
・Oracleで使うメモリ容量を算出する方法があればおしえてください。
 「ここに出ていますよ」という情報でもけっこうです。

よろしくお願い致します。

Aベストアンサー

・インストール領域は多分100M前後だったと思います。が、データ領域を考えるとゴミみたいなものですから、意識する必要は殆ど無いかと思われます。

・メモリ必要量はインストール時に512MB必要です。実際にはDB設計及びデータ量、利用形態(プログラムの組み方等)によって大きく異なりますので個別の案件毎に対応が必要かと思われます。少なくともEEが必要な要件であれば最低でも1G以上になると思いますが・・・

QOracle バッファ領域について

Oracleでユーザをエクスポートした際に、ストアドプロシージャのところで、
ORA-01406 取り出された列の値は切り捨てられました
というエラーが出ました。

これはプログラム・バッファ領域が文字列全体を格納するために十分な大きさではない、という意味らしく、対処として、最大列値を保持できるよう列のバッファ領域を増やす必要があるようです。
具体的に何をすればいいのか、上の説明ではよくわかりませんでした。
(結局そのバッファ領域はどこで設定するのか等)
詳しい方がいれば、お教えください。
よろしくお願い致します。

Aベストアンサー

ORACLE7なら、
initorcl.oraというファイルを
いじくればよかったのですが…。

バージョンはいくつですか?
ORACLEのデータを
見るツールは何を使っていますか?

Qテーブル自体のバックアップ

教えてください。
今オラクルのDBにTEST1テーブルが存在するとします。
------TEST1---------------------
id varchar(5) Primary Key
name varchar(20)
old int
--------------------------------

今このテーブルとまったく同じデータを持ち、同じ構成のテーブルTEST2を
作成したいと考えています。

(1)create table TEST2(
id varchar(5) primary key,
name varchar(20),
old int
);
(2)insert into TEST2(
id, name, old)
values
(select id, name, old from TEST1);
としてTEST2テーブルを作成して、TEST1のデータを格納していますが、

他の方法はないでしょうか?

たとえばこんなコマンドはありませんが、
COPY TEST1 TEST2
とか、
オラクルマネージャみたいなもので、
コピペして、名前をTEST2にする
とかなんでもいいです。
TEST1のバックアップをとりたいのですが・・・・
すみません、わかりづらい説明で。
宜しくお願い致しますm(_ _)m

教えてください。
今オラクルのDBにTEST1テーブルが存在するとします。
------TEST1---------------------
id varchar(5) Primary Key
name varchar(20)
old int
--------------------------------

今このテーブルとまったく同じデータを持ち、同じ構成のテーブルTEST2を
作成したいと考えています。

(1)create table TEST2(
id varchar(5) primary key,
name varchar(20),
old int
);
(2)insert into TEST2(
id, name, old)
values
(select id, name, old from ...続きを読む

Aベストアンサー

こんにちわ。

Create table test2 as select * from test1;
でOk です。
上記SQL 文は、Create table 文 (の拡張) ですので
Rollback Segment を使用しない分、Insert 文で
データを投入するより高速に処理できます。

QOracleにて各テーブルの件数を調べる方法

お世話になります。
Oracleにて各テーブルの件数を調べるSQLをご存知の方おられましたら、教えていただけませんでしょうか。

環境ですが、
Oracle: 8.0.6.0.2
SQL*Plus: 8.0.6.0.0
OS: Soralis SunOS 5.6 Generic 05181-33 July 2002

以上、よろしくお願い致します。

Aベストアンサー

こんにちわ。

テーブルの件数ですが、以下の2通りの方法で調べられます。
 1) patak さんのおっしゃられているように、
   Select count(*) from テーブル名 を実行する。
   調べるテーブル数が多いのであれば、テーブル名の部分を
   ALL_TABLES 等から取得するようにして、SQL 文を
   DBMS_SQL プロシージャから実行する方法があります。
 2) テーブルをAnalyze して、ALL_TABLES.NUM_ROWS を取得する。

QOracleの排他制御について教えてください

質問内容は結論から言うと、
INSERT文の時の排他制御について
知りたい。

以下の私の認識を踏まえた上で、
INSERT文の排他制御について
質問させてください。
なお、私の認識に誤りがあれば
指摘してください。

### 私の認識 start ######

1)Oracle
では、select文の時に
for updateを
書かなければ、なんのロックもかからず、
読み取り専用リソースへのアクセスで
ない限り、
ダーティーリードの可能性がある。

2)
select文で for update
を指定した場合は
該当行について
共有ロックがかかる。
行単位の共有ロックがかかる。
その際、
他のトランザクションが
for updateつきで
selectしてきても、
共有ロック同士なので、
互い排他制御しない。

(3)
update 文の場合は
該当行について、
占有ロックがかかる
行単位の占有ロックがかかる。

(4)
INSERT文の時には、
ロックをかけようにも
INSERT前の段階では、
ロック対象行は存在しない。
複数のトランザクションが
INSERTした行のPK
の値が偶然同じであった場合
ロストアップデートの危険があるので
私の創造では、INSERT文の時は
テーブル全体をロックしないと、
うまくいかないように思えます。

(5)
update, insert文については、
Oracleでは、自動的に該当行について
占有ロックを行う。
なお、INSERT文については、
下記の質問事項における疑問点
が解消されていないため、
行単位なのかどうか、私の中では
自身がもてないのが現状です。
### 私の認識 end ######

### 主な質問内容 start ###
私の認識の(4)を踏まえた上で
INSERT文の時のはいた制御
の範囲や挙動について、
教えてください。
### 主な質問内容 end ###

以上です。

質問内容は結論から言うと、
INSERT文の時の排他制御について
知りたい。

以下の私の認識を踏まえた上で、
INSERT文の排他制御について
質問させてください。
なお、私の認識に誤りがあれば
指摘してください。

### 私の認識 start ######

1)Oracle
では、select文の時に
for updateを
書かなければ、なんのロックもかからず、
読み取り専用リソースへのアクセスで
ない限り、
ダーティーリードの可能性がある。

2)
select文で for update
を指定した場合は
該当行について
共有ロッ...続きを読む

Aベストアンサー

#2 補足です。
2)
SELECT FOR UPDATE文は
NO WAIT オプションをつけたときは即時エラーに、
つけないときはロック解除待ちになります。
どちらを使うかはアプリケーションの作り方のポリシーによります。

セッション=クライアントとサーバの間の接続。データベースに接続してから切断するまでの間の接続が確立している状態

トランザクション=データベースの処理をひとまとまりにしたモノ。たとえば、口座Aから口座Bへの振り込み処理の場合、口座Aからの引き出し、口座Bへの振り込みの処理を1トランザクションとして扱います。どちらかが失敗した場合はロールバック(巻き戻し)、成功した場合はコミット(確定)します。

業務用アプリケーションの場合、大抵、1回のセッションの中では複数回のトランザクションが発生します。複数のユーザーがそのアプリケーションを利用していればその数だけセッションが張られます。(Webアプリに関してはその限りではないですが)

デッドロック=
Aと言うセッションがトランザクション内で
1-1 表Xのa行に更新をかけます。
1-2 次に表Yにb行に更新をかけます。
1-3 コミットします(トランザクションの終了)。

同時に
Bと言うセッションがトランザクション内で
2-1 表Yにb行に更新をかけます。
2-2 次に表Xのa行に更新をかけます。
2-3 コミットします(トランザクションの終了)。

これが、1-1 2-1 1-2 2-1 1-3 2-3
と言う順番で実行された場合デッドロックが発生します。つまりAは、X-aにロックをかけたままY-bにロックをかけようとして待ち状態になる。逆にBは、Y-bにロックをかけたまま、X-aにロックをかけようとして待ち状態になる。この状態をデッドロックと呼びます。

なお、Oracleでは、UNDOセグメントではなくロールバックセグメントと呼びます。

a)アーキテクチャに突っ込んだ話になるので、詳しくはOracle データベース概要のドキュメントを読んでください。

基本的に、SELECT中に他のセッション(アプリケーションの方が良いかな?)からの更新が確定した場合、SGA(システムグローバルエリア=Oracleサーバの共有メモリスペース)に前のデータのバックアップを取ります。これによって読み取り一貫性を保証します。ここにデータが入りきらない場合はデータベースのロールバックセグメント(たしか)に吐き出します。

b)
簡単に言えば、Oracleは、行ごとにロックフラグなどを記録する領域を持っています。マニュアルなどに書いてなければおそらく企業秘密です。

#2 補足です。
2)
SELECT FOR UPDATE文は
NO WAIT オプションをつけたときは即時エラーに、
つけないときはロック解除待ちになります。
どちらを使うかはアプリケーションの作り方のポリシーによります。

セッション=クライアントとサーバの間の接続。データベースに接続してから切断するまでの間の接続が確立している状態

トランザクション=データベースの処理をひとまとまりにしたモノ。たとえば、口座Aから口座Bへの振り込み処理の場合、口座Aからの引き出し、口座Bへの振り込みの処理を1トラン...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報