データベースを元の状態に戻す④

オラクルデータベースの基本

データベースを元の状態に戻す方法

実機操作を行う前に、データベースを元の状態に戻す方法を把握しておくことは非常に重要です。
設定変更や誤操作によってデータベースに問題が発生することがあるため、復旧手順を事前に知っておくことで、迅速かつ確実に対処できます。

  • スナップショット機能で元に戻す(使用できる場合)
  • バックアップを行った時点に戻す
  • データベースを再作成する
  • 手動で元に戻す


今回は手動で元に戻す方法を紹介していきます。
簡単な操作を行っただけであれば手動で元に戻す方が短時間で行える場合が多いです。
その他の方法で元の状態に戻す方法は以下をご確認ください。


手動で元に戻す方法

手動で元に戻す方法について紹介していきますが、方法といっても行った手順と反対の手順を行っていくというだけです。
行った操作の手順が多い場合は、データベースを元の状態に戻す①~③で紹介している方法を使用する方が良いかと思います。
以下で主な元に戻す手順について紹介していきます。

例1:表を作成した場合

表を作成した場合は当然表を削除します。
例えば以下のようなコマンドで表を削除することができます。

drop table <表名> [purge] ;

“purge” はオプションのコマンドです。
“purge” を指定せずに drop table コマンドで表を削除しても完全に削除されず、いわゆる「ゴミ箱」に移動されます。
「ゴミ箱」にある表は flashback table コマンドで元に戻すことが可能です。
もう元に戻すことが無く、完全に削除したい場合は “purge” を指定しましょう。

以下は “table1” という表を “purge” を指定して削除する手順です。
“purge” を指定して削除しているため、ゴミ箱から戻すこともできません。

SQL> select * from table1;

NO
——–
1

SQL> drop table table1 purge; ★削除

表が削除されました。

SQL> select * from table1;
select * from table1
*
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。 ★表が削除されている

SQL> flashback table table1 to before drop;
flashback table table1 to before drop
*
行1でエラーが発生しました。:
ORA-38305: RECYCLE BINにオブジェクトがありません ★元に戻せない


ちなみに、 “purge” を指定しない場合は以下のように表を元に戻すことが可能です。

SQL> select * from table1;

NO
——–
1

SQL> drop table table1; ★表を削除

表が削除されました。

SQL> select * from table1;
select * from table1
*
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。 ★表が削除されている

SQL> flashback table table1 to before drop; ★flashback table

フラッシュバックが完了しました。

SQL> select * from table1; ★元に戻っている

NO
——–
1


ただし flashback table コマンドで表を元に戻す場合は、 “RECYCLEBIN” が有効になっている必要があります。(デフォルトでは有効)
“RECYCLEBIN” が有効になっているかどうかは、 SHOW PARAMETER RECYCLEBIN のコマンドを実行した結果、 VALUE 列が「ON」 になっているかどうかで確認できます。
ただし SYSユーザー(管理者ユーザー) で作成し、削除した表は RECYCLEBIN が有効になっているかどうかに関わらずゴミ箱に移動されず完全に削除されるため、 flashback table で元に戻すことはできません

SQL> SHOW PARAMETER RECYCLEBIN

NAME TYPE VALUE
————- ———— ————
recyclebin string on ★


詳細はマニュアルをご参考ください。

SQL言語リファレンス – DROP TABLE
SQL言語リファレンス – FLASHBACK TABLE

例2:ユーザーを作成した場合

ユーザーを作成した場合はユーザーを削除します。
ユーザーの削除は以下の drop user 文で削除が可能です。
また、現在接続しているユーザーを削除することはできません。

drop user <ユーザー名> ;

SQL> show user
ユーザーは”USER1″です。 ★USER1で接続中

SQL> drop user user1;
drop user user1
*
行1でエラーが発生しました。:
ORA-01940: 現在接続中のユーザーを削除することはできません。 ★USER1の削除でエラー

SQL> connect / as sysdba ★SYSユーザーに接続
接続されました。
SQL> drop user user1; ★ユーザーの削除が完了

ユーザーが削除されました。


ただし、以下のように削除するユーザーが表を所持している場合は、ユーザーが所有している表を先に削除するか、 “cascade” オプションを指定して削除します
ただし、 “cascade” オプションを指定した場合は、削除するユーザーが所有している表はすべて削除されます。

SQL> show user
ユーザーは”SYS”です。
SQL> drop user user1;
drop user user1
*
行1でエラーが発生しました。:
ORA-01922: USER1’を削除するにはCASCADEを指定する必要があります ★削除でエラー

SQL> select owner,table_name from dba_tables where owner=’USER1′;

OWNER TABLE_NAME
———– —————
USER1 TABLE1 ★USER1がTABLE1とTABLE2を所有している
USER1 TABLE2 ★

SQL> drop user user1 cascade; ★cascadeを指定すると削除できる

ユーザーが削除されました。

SQL> select owner,table_name from dba_tables where owner=’USER1′;

レコードが選択されませんでした。 ★TBALE1、TABLE2も一緒に削除される


詳細はマニュアルをご参考ください。

SQL言語リファレンス – DROP USER

例3:初期化パラメータを変更した場合

初期化パラメータを変更した場合は、元の値に戻すことになります。

まず、現在設定されている初期化パラメータは以下のコマンドで確認することが可能です。

show parameter <初期化パラメータ名>

また、 <パラメータ名> を指定せずに show parameter のみ実行することが出来ますが、すべてのパラメータが出力されてしまいます。
初期化パラメータは例えば Oracle Database 19c では 350 種類以上のパラメータが存在するため、かなり多くのパラメータが出力されてしまいます。
そのためできれば <パラメータ名> を指定して確認しましょう。

以下は初期化パラメータ “open_cursors” の値を確認している例です。

SQL> show parameter open_cursors

NAME TYPE VALUE
——————– —————– ————–
open_cursors integer 300


次に、初期化パラメータの変更は以下のコマンドで実行することが可能です。
※spfileを使用している場合

alter system set <初期化パラメータ名>=<設定する値> scope= [ memory | spfile | both ];

scope に指定する値の意味は以下のようになります。

・memory
 現在のインスタンス(メモリ上)にのみ適用される。
 このオプションを指定した場合、データベースが次回再起動されるまでその変更が有効で、
 再起動後には元の値や SPFILE に設定されている値に戻ります。

・spfile
 初期化パラメータの変更がSPFILE(サーバーパラメータファイルにのみ保存される。
 このオプションを指定した場合、データベースの次回再起動時にその変更が反映されるが、
 現在のセッションには影響を与えず、データベースを再起動しない限り、変更は反映されません。

・both
 初期化パラメータの変更を 現在のメモリ(インスタンス)と SPFILE の両方に適用する。
 これにより、パラメータの変更は即座に反映され、データベースの次回の再起動後も変更が
 維持される。

もし scope を指定せずに alter system set コマンドを実行した場合は、 scope=both として実行されます

例えば open_cursors を変更する場合は以下のようなコマンドを実行します。
例えば400に変更し、元に戻す場合は、デフォルトの300へ変更すれば元に戻します。

SQL> show parameter open_cursors

NAME TYPE VALUE
——————– —————– —————-
open_cursors integer 300

SQL> alter system set open_cursors=400 scope=both; ★400に変更

システムが変更されました。

SQL> show parameter open_cursors

NAME TYPE VALUE
——————– —————– —————-
open_cursors integer 400 ★400に変わった

SQL> alter system set open_cursors=300 scope=both; ★300に戻す

システムが変更されました。

SQL> show parameter open_cursors

NAME TYPE VALUE
——————– —————– —————-
open_cursors integer 300 ★300に戻った


補足:alter session set コマンド

alter session set コマンドは、現在のセッション(ユーザー接続)に対して初期化パラメータや環境設定を一時的に変更するために使用されますこのコマンドによる変更は、そのセッション内でのみ有効であり、他のセッションやデータベース全体には影響を与えません。また、セッションが終了するとその設定はリセットされ、デフォルトの設定に戻ります。
そのため、実機で実際にパラメータを変更した際にどのような影響を与えるかを確認するだけであれば、 alter session set コマンドを使用するのが良いでしょう。

alter session set <初期化パラメータ名>=<設定する値> ;

例えば NLS_DATE_FORMAT は日時の表示形式を指定するパラメータです。
デフォルトだと時間まで表示されませんが、以下のように指定することで時刻まで表示されるようになります。
また、セッションが切断されると元の設定に戻ります。

SQL> show parameter nls_date_format

NAME TYPE VALUE
——————– —————– —————-
nls_date_format string RR-MM-DD
SQL> select sysdate from dual;

SYSDATE
————————-
24-09-20 ★時間が表示されていない

SQL> ALTER SESSION SET NLS_DATE_FORMAT = ‘YYYY-MM-DD HH24:MI:SS’; ★変更

セッションが変更されました。

SQL> show parameter nls_date_format

NAME TYPE VALUE
——————– —————– ——————————-
nls_date_format string YYYY-MM-DD HH24:MI:SS

SQL> select sysdate from dual;

SYSDATE
————————-
2024-09-20 15:23:32 ★時間が表示された

SQL> exit ★セッション切断
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.21.0.0.0との接続が切断されました。
[oracle@v19single ~]$ sqlplus / as sysdba ★再接続

SQL*Plus: Release 19.0.0.0.0 – Production on 金 9月 20 15:29:07 2024
Version 19.21.0.0.0

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

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.21.0.0.0
に接続されました。
SQL> show parameter nls_date_format

NAME TYPE VALUE
——————– —————– —————-
nls_date_format string RR-MM-DD ★元に戻っている
SQL> select sysdate from dual;

SYSDATE
————————-
24-09-20 ★元に戻っている

コメント

タイトルとURLをコピーしました