はじめに

こんにちは!ゆうきです🤗
これまで「ひとりでできるもん」シリーズなどを執筆しています。
関連記事が充実していますのであわせてご覧くださいね。
特にDB停止起動ひとりでできるもん(制御ファイル破壊編)は今回の記事と内容が近しいので是非ご覧ください。

今回は制御ファイルの作成方法をご紹介したいと思います🍀

 

本記事では、実機操作を通して情報処理技術の理解を深めることを目的としており、
皆様の環境での動作を保証するものではありません。👀

制御ファイル作成スクリプトを作成する

制御ファイルを作成するSQL文を、
現在の制御ファイルから作成できるので最初に作成しましょう!

方法については、マニュアルを読んで操作していきます。

Oracle Database
Release 19
SQL言語リファレンス
13 SQL文: CREATE COMMITからCREATE JAVA
CREATE CONTROLFILE

マニュアルが苦手でも、読んでいるうちに見方がわかってくると思います。
ぜひチャレンジしてみてください。

 

 

 

 

データベースが正常に動作している状態で次のALTER文を実行して制御ファイル作成スクリプトを出力しましょう。

SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@localhost ~]# date
2020年 12月 8日 火曜日 15:25:57 JST
[root@localhost ~]# uname -a
Linux localhost.localdomain 4.14.35-1818.3.3.el7uek.x86_64 #2 SMP Mon Sep 24 14:45:01 PDT 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# su - oracle
最終ログイン: 2020/10/01 (木) 17:04:28 JST日時 pts/0
[oracle@localhost ~]$ id
uid=1001(oracle) gid=1002(oinstall) groups=1002(oinstall),1001(dba) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[oracle@localhost ~]$ ls -l
合計 10364
drwxr-x---. 2 oracle oinstall 4096 8月 6 16:12 ORCL
-rw-r-----. 1 oracle oinstall 10600448 8月 6 14:00 control01.ctl
-rw-r-----. 1 oracle oinstall 3584 7月 15 15:27 spfileorcl.ora
-rw-r--r--. 1 oracle oinstall 10 10月 1 17:07 test.txt
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 ダウンロード
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 テンプレート
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 デスクトップ
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 ドキュメント
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 ビデオ
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 音楽
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 画像
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 公開
[oracle@localhost ~]$ pwd
/home/oracle
[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Dec 8 15:26:10 2020
Version 19.3.0.0.0

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

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 838858176 bytes
Fixed Size 8902080 bytes
Variable Size 595591168 bytes
Database Buffers 230686720 bytes
Redo Buffers 3678208 bytes
Database mounted.
Database opened.
SQL> select host_name, instance_name, status from v$instance;

HOST_NAME
--------------------------------------------------------------------------------
INSTANCE_NAME
------------------------------------------------
STATUS
------------------------------------
localhost.localdomain
orcl
OPEN


SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/home/oracle/control01.sql';

Database altered.

SQL> quit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@localhost ~]$ ls -l
合計 10372
drwxr-x---. 2 oracle oinstall 4096 8月 6 16:12 ORCL
-rw-r-----
. 1 oracle oinstall 10600448 8月 6 14:00 control01.ctl
-rw-r--r--. 1 oracle oinstall 5495 12月 8 15:44 control01.sql
-rw-r-----. 1 oracle oinstall 3584 7月 15 15:27 spfileorcl.ora
-rw-r--r--. 1 oracle oinstall 10 10月 1 17:07 test.txt
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 ダウンロード
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 テンプレート
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 デスクトップ
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 ドキュメント
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 ビデオ
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 音楽
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 画像
drwxr-xr-x. 2 oracle oinstall 6 6月 29 17:01 公開
[oracle@localhost ~]$

現在のデータベースの制御ファイルを元にSQL文が生成されました。

今回の作業では、「TO TRACE」 の後に 「AS ‘/home/oracle/control01.sql’」を指定して出力先を明示しているところがポイントですね🤗

 

 

制御ファイルを破壊する

データベースが起動している状態では、
次のコマンドで、制御ファイルの配置先を確認できます。
削除コマンドを作りやすくするために配置先を控えておきましょう。

SQL> select name from v$controlfile;

[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Dec 28 15:02:55 2020
Version 19.3.0.0.0

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


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/opt/oracle/base/oradata/ORCL/control01.ctl
/opt/oracle/base/oradata/ORCL/control02.ctl

SQL> quit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@localhost ~]$

確認ができたらデータベースを停止しておきます。

[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Dec 8 16:02:39 2020
Version 19.3.0.0.0

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


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> select host_name, instance_name, status from v$instance;

HOST_NAME
--------------------------------------------------------------------------------
INSTANCE_NAME
------------------------------------------------
STATUS
------------------------------------
localhost.localdomain
orcl
OPEN


SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> quit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@localhost ~]$

データベースの制御ファイルを削除します。

[oracle@localhost ~]$ ls -l /opt/oracle/base/oradata/ORCL
合計 2140240
-rw-r-----. 1 oracle oinstall 10600448 12月 8 16:03 control01.ctl
-rw-r-----. 1 oracle oinstall 10600448 12月 8 16:03 control02.ctl
-rw-r-----. 1 oracle oinstall 209715712 12月 8 15:34 redo01.log
-rw-r-----. 1 oracle oinstall 209715712 12月 8 15:34 redo02.log
-rw-r-----. 1 oracle oinstall 209715712 12月 8 16:03 redo03.log
-rw-r-----. 1 oracle oinstall 576724992 12月 8 16:03 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 734011392 12月 8 16:03 system01.dbf
-rw-r-----. 1 oracle oinstall 20979712 8月 25 14:24 temp01.dbf
-rw-r-----. 1 oracle oinstall 220209152 12月 8 16:03 undotbs01.dbf
-rw-r-----. 1 oracle oinstall 5251072 12月 8 16:03 users01.dbf
[oracle@localhost ~]$ rm -f /opt/oracle/base/oradata/ORCL/control01.ctl
[oracle@localhost ~]$ rm -f /opt/oracle/base/oradata/ORCL/control02.ctl
[oracle@localhost ~]$ ls -l /opt/oracle/base/oradata/ORCL
合計 2119536
-rw-r-----. 1 oracle oinstall 209715712 12月 8 15:34 redo01.log
-rw-r-----. 1 oracle oinstall 209715712 12月 8 15:34 redo02.log
-rw-r-----. 1 oracle oinstall 209715712 12月 8 16:03 redo03.log
-rw-r-----. 1 oracle oinstall 576724992 12月 8 16:03 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 734011392 12月 8 16:03 system01.dbf
-rw-r-----. 1 oracle oinstall 20979712 8月 25 14:24 temp01.dbf
-rw-r-----. 1 oracle oinstall 220209152 12月 8 16:03 undotbs01.dbf
-rw-r-----. 1 oracle oinstall 5251072 12月 8 16:03 users01.dbf
[oracle@localhost ~]$

制御ファイルが削除された状態になりました。

制御ファイルを作成する

生成されたSQL文を利用して、制御ファイルを作成します。

行頭が「–」になっている行はコメント行なので、使用しません。

CREATE CONTROLFILE文以外のコマンドも書いてあるので、流れがつかみやすいですね

 

 

 

 

 

[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Dec 9 16:50:12 2020
Version 19.3.0.0.0

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

Connected to an idle instance.

SQL> STARTUP NOMOUNT
ORACLE instance started.

Total System Global Area 838858176 bytes
Fixed Size 8902080 bytes
Variable Size 595591168 bytes
Database Buffers 230686720 bytes
Redo Buffers 3678208 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 '/opt/oracle/base/oradata/ORCL/redo01.log' SIZE 200M BLOCKSIZE 512,
9 GROUP 2 '/opt/oracle/base/oradata/ORCL/redo02.log' SIZE 200M BLOCKSIZE 512,
10 GROUP 3 '/opt/oracle/base/oradata/ORCL/redo03.log' SIZE 200M BLOCKSIZE 512
11 DATAFILE
12 '/opt/oracle/base/oradata/ORCL/system01.dbf',
13 '/opt/oracle/base/oradata/ORCL/sysaux01.dbf',
14 '/opt/oracle/base/oradata/ORCL/undotbs01.dbf',
15 '/opt/oracle/base/oradata/ORCL/users01.dbf'
16 CHARACTER SET JA16SJISTILDE
17 ;

Control file created.

SQL> RECOVER DATABASE
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required


SQL> ALTER DATABASE OPEN;

Database altered.

SQL> select host_name, instance_name, status from v$instance;

HOST_NAME
--------------------------------------------------------------------------------
INSTANCE_NAME
------------------------------------------------
STATUS
------------------------------------
localhost.localdomain
orcl
OPEN


SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/opt/oracle/base/oradata/ORCL/temp01.dbf'
  2  SIZE 20971520  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

Tablespace altered.

SQL> quit

Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@localhost ~]$

正常に制御ファイルが作成できました!

おわりに

生成されたスクリプトを元に制御ファイルを作成できましたでしょうか👀

SQL文を実行するときに、内容を書き換えて制御ファイルの設定値を変更したり
何らかの理由で制御ファイルのバックアップから復旧できない際にSQL文で作成できるなど
応用できる場面がいろいろあります。

CREATE CONTROLFILE文を読むことで、どんな情報が制御ファイルに記録されているのかを知る機会にもなりますね

 

 

 

 

 

投稿者プロフィール

技術チーム
技術チーム
DBひとりでできるもんを盛り上げるべく、技術チームが立ち上がり早6年。ひとりでできるもんと言いつつ、技術者が読んでプッとなるような、極めてピンポイントでマニアックな技術ネタを執筆しています!