【1Z0-083】 oracle Gold ResetLogsって結局なんなの！？

# 本記事の目的
Oracle Database Administration (oracle Gold)の学習がメインである。
個人的に理解するのにわかりにくかったところを記事としてまとめた。


大前提として、

*基本的にDBを障害直前に戻す場合は、ResetLogsオプションは不要！！！*

# 目次

1. 用語の整理
1. ResetLogsオプションは、何をしているのか
1. まとめ


# 1.用語の整理

ResetLogsを理解するうえで、事前に理解しておく必要がある4つの用語を以下に列挙した

- インカネーション(incarnation)
- SCN
- ログ順序番号
- 不完全リカバリ(Point-In-Timeリカバリ)


早速、用語をかみ砕いていこう。

### ■インカネーション(incarnation)
インカネーションを、oracle社 公式の[ドキュメント](https://docs.oracle.com/cd/E15817_01/backup.111/e05700/glossary.htm#:~:text=%E3%82%A4%E3%83%B3%E3%82%AB%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88incarnation%EF%BC%89,%E3%81%8B%E3%82%89%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%82%92%E3%83%AA%E3%82%AB%E3%83%90%E3%83%AA%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82)で調べると、以下のように記載されている。
```
データベースの個別のバージョン。
データベースのインカネーションは、RESETLOGSオプションでデータベースをオープンすると変更されるが、必要なREDOを使用できるかぎり、以前のインカネーションからバックアップをリカバリできる。
```

要するに、ResetLogsは、何をしているかわからないが、
- リカバリを行った際、ResetLogsオプションでDBをオープンしない限り、インカネーションは同一のものを再利用する
- ResetLogsオプションで、DBをオープンしたら、インカネーションは更新される

もう少し、わかりやすく書いてみる。
インカネーションは、*ゲームの時系列* に近い。

某 ポケットモ〇スターのゲームをイメージしてほしい。
このゲームは、ゲームを進めていく中で、強い敵に挑む前はセーブをするかと思う。
負けたとしても、直前のセーブ地点からゲームを再開できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/876655ac-d952-e79b-fed8-eb8c42668083.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/eb713d58-c033-cd0e-e3d0-d38740c50541.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/1035e6b1-81d5-fa52-0a52-869bb43171dc.png)



この【ゲームを進めていく上での時系列】が、インカネーションというイメージを持ってほしい。

### ■SCN

SCNを、oracle社 公式の[ドキュメント](https://docs.oracle.com/cd/F19136_01/cncpt/transactions.html#GUID-A2615547-94D2-4346-B156-64C534C5E9E4)で調べると、以下のように記載されている。
```
システム変更番号(SCN)は、Oracle Databaseで使用される論理的な内部タイムスタンプです。

SCNを使用して、トランザクションのACIDプロパティに準拠する必要があるデータベース内で発生するイベントに順序を付けます。
```

要するに
- トランザクションごとに、一意に割り当てられる番号
- 同一トランザクションで、複数更新があった際は、同様の番号が割り当てられる
- データベースのすべての変更をトランザクション単位で識別することができる番号

前述した、ゲームで例えると以下の感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/69dea080-7927-15b8-1564-c3c55316b168.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/61d95586-8df9-6b29-dbd6-2eead8455d75.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/0332507c-77e9-7bfc-b360-a477bfa8b134.png)


### ■ログ順序番号

ログ順序番号を、oracle社 公式の[ドキュメント](https://docs.oracle.com/cd/E16338_01/server.112/b56306/glossary.htm)で調べると、以下のように記載されている。
```
REDOログ・ファイル内のREDOレコードの集合を一意に識別する番号。
データベースで1つのオンラインREDOログ・ファイルがいっぱいになり、別のファイルに切り替えるとき、データベースは新しいファイルにログ順序番号を自動的に割り当てます。
```

以下の図にわかりやすくまとめた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/4154a820-63f2-79cb-8865-644010411d50.png)



オンラインREDOログファイルは、ローテーションする際、
既に書き込みされているファイルへは上書きではなく、追記をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/756c5fdb-5517-38df-5298-7ccddc2fd9c1.png)

アーカイブREDOファイルは、

*過去のREDOログをため込むのが目的*

ローテーションするのではなく、新しいファイルを作り続ける。
また、大事な考えとして以下がある。

*オンラインREDOログ・ファイルに割り当てられているログ順序番号は、アーカイブログファイルにも引き継がれる*

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/63134d29-f0ea-ab50-9cdd-67d5f4cc08a6.png)


### ■不完全リカバリ(Point-In-Timeリカバリ)

ログ順序番号を、oracle社 公式の[ドキュメント](
https://docs.oracle.com/cd/E16338_01/backup.112/b56269/glossary.htm#i432744)で調べると、以下のように記載されている。
```
指定した過去の目標時点、SCNまたはログ順序番号までデータベース全体をリカバリすることです。
```

これは、イメージしやすいと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/d2417f54-8329-47f7-fbd2-50176f747b12.png)

上記状況で、15:05時点で、13時の時点に戻したい
→必要なバックアップは、以下のものだけである。
- 12:00のフルバックアップ
- 13:00のアーカイブログ

要するに、適用できるすべてのログファイルを適用しないことを不完全リカバリと呼んでいる。


# 2. ResetLogsオプションは、何をしているのか

さて、本題である。
冒頭にも記載した通り、基本的にDBを障害直前に戻す場合は、ResetLogsオプションは不要である。

つまり、不完全リカバリを行うときにResetLogsオプションが必要である。

では、
Q.実際にResetLogsオプションは何を行っているのか？
A.ログ順序番号が、1からカウントし直す

ログ順序番号のカウントがリセットされることによって、以下の影響が発生する
- 現行のオンラインREDOログファイルがすべて使えなくなる
- 不完全リカバリで指定した地点と不完全リカバリを実施した地点間で生成されたREDOログは適用できない
- 新たなインカネーションが作成される

影響について文字だけだと、わかりにくいので以下の図を見てほしい。
再度、不完全リカバリを例に挙げる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/0537ca07-ec94-50fe-7f3b-8fa1211224c5.png)

上記状況で、15:05時点で、13時の時点に戻したとする。
Q. 14時と15時に取得したアーカイブログファイルは、使用できるだろうか?
A. Noである

理由としては、シンプルで整合性が取れなくなるからだ。
例えば
14時の地点でのアーカイブログファイルには、empテーブルにEMPNO=7900のJAMESさんのSALを2900→3500にupdateした情報が入っているとする。

▼13時の地点でのempテーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/db3d7f83-7a40-321f-0453-814ac37cb288.png)

▼14時の地点でのempテーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/77067670-fc72-aeaf-2b15-bb2492c55795.png)

さらに、いくつかの修正が入って、15時のアーカイブログも出力したのち、13時の地点に不完全リカバリを行ったとする。
不完全リカバリを行ってから、JAMESさんのSALを2900→ **4500** に修正したとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357323/2800d53e-96da-43c3-124e-0ef28fef31a5.png)

仮に、14時のアーカイブログが使えたとするなら、過去の情報を適用することになってしまい、不整合が生じてしまう。
だから、不完全リカバリで指定した地点と不完全リカバリを実施した地点間で生成されたREDOログは適用できない


# 3. まとめ

- インカネーションとは時系列をイメージ
- SCNとは、トランザクションごとに一意に割り当てられる番号
- ログ順序番号とは、Redoログファイルに割り当てられる番号
- 不完全リカバリとは、とある過去の地点をしてその地点に戻れる番号
- ResetLogsを行うと、指定した地点には戻れるが、特定のアーカイブログが使えなくなるので注意が必要