DBの運用・管理

#バックアップ
Oracleのバックアップ優れた点:障害発生直前の状態にまで復旧できる。

####秘訣2点

・REDOログファイル:データベースの更新履歴を逐一記録するファイル
・リカバリ:REDOログファイルに記録された更新履歴を元に、更新処理を再実行する処理。

####障害発生時の流れ
1.正常な時にバックアップを取得
↓
2.障害発生
↓
3.リストア
障害発生前に取得していたバックアップを元の場所に戻す。
↓
4.リカバリ
REDOログファイルを使用し、発生直前に戻す。

####アーカイブログモード
REDOログを保管しておくために必要なモード

REDOログファイルは複数存在し、それがローテーションしながら、次々にログが記載されていく。
通常のモードでは既にあるログが上書きされてしまうので、アーカイブログモードにすることで、上書きされる前に、ファイルを別の場所にコピーすることができる。

####アーカイブログモードと非アーカイブログモードのその他の違い
バックアップ時にデータベースを停止せずに行うことができる。
→本番環境でのメリット大

####アーカイブログモードへの変更
ALTER DATABASE ARCHIVELOG;

変更の流れ
sqlplus /as sysdba   ←sysユーザーでログイン

archive log list    ←アーカイブログモードか非アーカイブログモードか確認

shutdown immediate　　　←データベースの停止

startup mount         ←マウントモードDB起動

ALTER DATABASE ARCHIVELOG;　　←DBをアーカイブログモードに変更

ALTER DATABASE OPEN;　←DBをOPEN。通常のモードに変更。

####オンラインバックアップ　RMAN
非アーカイブの場合、オフラインバックアップしかできないので手順異なる。

rman TARGET /  ←RMANコマンドを起動し、バックアップ対象のデータベースに接続。

BACKUP DATABASE;　←RMANのBACKUP DATABASEコマンドでバックアップ。

####バックアップ取得　4ポイント
・データベース全体のバックアップを取得する
　表領域だけ×　データベースを構成する全てのファイルが整合性を持っている。

・バックアップファイル、アーカイブREDOログファイル　データベースとは別のディスクに置く

・定期的にバックアップを取得

・適切な時間帯にバックアップを実行する
　稼働が少ない時間帯など

####バックアップ出力先の設定
バックアップファイルとアーカイブログファイルをデータベースとは別の場所に分ける必要あり

高速リカバリ領域でデータベースとは別のパスを設定

|初期化パラメータ|説明|
|---|---|
|DB_RECOVERY_FILE_DEST|高速リカバリ領域のディレクトリパスを指定。データベースの構成ファイルを配置するディレクトリパスとは別のパスを指定するのが望ましい。|
|DB_RECOVERY_FILE_DEST_SIZE|高速リカバリ領域の上限サイズを指定。|

####アーカイブREDOログファイルのバックアップ
上記RMAN時にREDOログファイルもバックアップする。

BACKUP DATABASE PLUS ARCHIVELOG; ←BackupにプラスしてArchivelogが付け加わっている。

BACKUP DATABASE PLUS ARCHIVELOG DELETE ALL INPUT; ←delete all input バックアップ済みのREDOログファイルを削除。

####定期的なバックアップ
基本はジョブスケジューラーにスクリプトを登録する。

スクリプト
①RMANバックアップ用のスクリプト

```backup_database.rman
BACKUP DATABASE PLUS ARCHIVELOG DELETE ALL INPUT;
```
②RMAN自体を起動するシェルスクリプト

```backup_database.sh
rman TARGET / @backup_database.rman log=backup_database.log
```
|パラメーター|説明|
|---|---|
|TARGET /|バックアップ対象のデータベースに接続する|
|@backup_database.rman|backup_database.rmanに記載されたコマンドを実行。|
|log=backup_database.log|コマンドの実行結果をbackup_database.logにログ出力|

####古いバックアップの削除
```
RMAN>CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
```
これで2世代より前のバックアップファイルが自動で削除される。
デフォルトは1

手動は
DELETE OBSOLETE;

####データベースの復旧
リストア
RESTORE DATABASE;

リカバリ
RECOVER DATABASE;

```
>rman TARGET /     ←rman を開始。
RMAN>startup mount ←全てのデータファイルに障害が発生している場合、DBは異常停止している。
　　　　　　　　　　　　普及作業を開始するために、一旦MOUNTモードで起動。

RMAN>RESTORE DATABASE;
RMAN>RECOVER DATABASE;
RMAN>ALTER DATABASE OPEN;　←データベースをOPEN
```

#データベースのメンテナンス
sql遅くなる要素

・実行計画
・テーブル断片化

####実行計画とオプティマイザ統計情報

SQL実行されるまでの流れ
Oracleのオプティマイザ統計情報→実行計画(SQLの実行手順)

テーブルの情報からオプティマイザ統計情報を作成するが、古い状態のままだとクエリ処理速度遅くなる。

定期に統計情報を取集する必要がある。

####自動収集の実行時間帯の設定
OME(Oracle Enterprise Manager)で設定。

データを大量に投入した場合は自動収集を待たずに、手動実行するべき。
DBMS_STARS のプロシージャ

####テーブルの断片化

断片化の流れ
大量のデータをINSERT,UPDATE,DELETEするとブロックで構成されているデータの中に、隙間が生まれ、フルスキャン検索やインデックス検索などで処理が遅くなることがある。

####解消法
|テーブル再編成方法|再編成中のデータ更新可否|使用条件、注意点|
|---|---|---|
|ALTER TABLE MOVE|不可|一時的に2倍の記憶領域が必要|
|ALTER TABLE SHRINK|可|Oracle10g以降、かつ自動セグメント管理方式の場合限定|
|オンライン再定義|可|一時的に2倍の記憶領域が必要|

```
SQL>ALTER TABLE table01 MOVE;

SQL>ALTER INDEX index01 REBUILD; ←indexが使えなくなるのでリビルド
```

#初期化パラメーター
頻繁に変更することはないが環境に応じて変更することあり

設定ファイルはサーバーパラメータファイル(spfile)だが、直接変更することはない。
→ALTER SYSTEM SET

####oracleのメモリ変更
MEMORY_TARGET,SGA_TARGET,PGA_AGGREGATE_TARGET

より多くもメモリを割り与えるとすれば物理メモリの70%程度

####プロセス
Oracleは1接続1プロセス使用する。

大規模な接続が多い環境であると、デフォルト値(100)ではエラーが発生するため、変更する必要がある。

#監視
####アラートログの確認
ファイル名　alert＜ORACLE_SID>.log

####アプリケーションのログ
Tomcatなど

####OSのログ

####ストレージの空き容量
1.表領域の空き領域を監視
sqlで確認
データファイルの自動拡張をONにする

2.ファイルシステムの空き領域を監視
$df -m

####OSの監視
4175
top/vmstat/sar コマンドが有名
特にsarコマンドは過去の使用状況なども確認できるのでおすすめ。

####Oracleの監視
4231
Statspack(Oracleの機能)
Sysユーザーで実行

#本番環境のOracle接続

####リモート接続
本番環境ではWeb3層構造などからクライアント端末からDBにリモートで接続される。
(WebブラウザなどはDBサーバー的にはクライアントと呼ばない。APサーバなどのことを呼ぶ)

リモート接続のためにはDBサーバーとクライアントマシンの両方の設定が必要。

・リスナーの構成
・サービス登録設定(DBサーバー)
・クライアント設定

####リスナーの構成
4349
NetCAというツールを使用。
listener.oraを編集し、構築することもできるが、↑がおすすめ。


####サービスの登録
リスナーはクライアントからの接続要求をDBに中継する。
このためには、中継するDBの情報をリスナーに登録する必要がある。

####クライアントマシンの構成
4445
OracleClientのインストール

ネットサービス名の設定
4457
接続先となるリスナー及データベースの情報をクライアントに与える必要あり。
↓
＜ORACLE_HOME>¥network¥admin¥tnsnames.ora
サービス名はlsnrctl servicesコマンドの出力内容を参考にするのがおすすめ


アプリケーションとドライバ
4509
Java →Oracle JDBC(JDBCThin ドライバ,JDBC OCIドライバ)

C#,VB.NET →　Oracle Data Provider for.NET