16 データベースの起動と停止
この章では、OCIデータベースの起動および停止に関するトピックについて説明します。
16.1 OCIデータベースの起動と停止について
OCI関数OCIDBStartup()
およびOCIDBShutdown()
には、Oracle Databaseを起動および停止するために最小限必要なインタフェースが用意されています。
Cのプログラムから、OCIDBStartup()
をコールする前に、サーバーに接続し、事前認証モードでSYSDBA
またはSYSOPER
セッションを開始する必要があります。インスタンスが起動していない場合はこのモードのみを使用でき、インスタンスを起動するためにのみ使用されます。OCIDBStartup()
をコールすると、データベースをマウントまたはオープンせずに1つのサーバー・インスタンスが起動します。データベースをマウントまたはオープンするには、事前認証セッションを終了し、通常のSYSDBA
またはSYSOPER
セッションを開始し、適切なALTER
DATABASE
文を実行します。
データベースを停止するには、アクティブなSYSDBA
またはSYSOPER
セッションが必要です。OCI_DBSHUTDOWN_ABORT
以外のすべてのモードにおいて、OCIDBShutdown()
に2つのコールを実行します。1つめのコールは、データベースへのこれ以上の接続を禁止することにより停止を開始し、次に適切なALTER
DATABASE
コマンドによりデータベースをディスマウントして閉じるためのもので、もう1つのコールは、インスタンスを停止することにより停止を終了させるためのものです。特別な環境においては、データベースをできるかぎり迅速に停止させるために、OCIDBShutdown()
をOCI_DBSHUTDOWN_ABORT
モードでコールしますが、これはSQL*PlusでのSHUTDOWN
ABORT
に相当します。
これらの関数は両方とも、サーバーに対する専用接続を必要とします。ディスパッチャを介して共有サーバーに接続されている場合、データベースを起動または停止しようとすると、ORA-106
が発生します。
OCIAdmin
管理ハンドルCデータ型を使用して、インタフェースを拡張可能にします。OCIAdmin
は、ハンドル・タイプOCI_HTYPE_ADMIN
に関連付けられています。OCIAdmin
パラメータadmhp
に値を渡すかどうかは、OCIDBStartup()
ではオプションで選択できますが、OCIDBShutdown()
では不要です。
16.2 OCIでの起動と停止の例
起動するには、SYSOPER
またはSYSDBA
としてOCI_PRELIM_AUTH
モードでデータベースに接続する必要があります。ディスパッチャを介して共有サーバーには接続できません。
クライアント側のパラメータ・ファイル(pfile
)を使用するには、OCIAttrSet()
を使用して管理ハンドルで属性OCI_ATTR_ADMIN_PFILE
を設定する必要があります。設定しない場合、サーバー側のパラメータ・ファイル(spfile
)が使用されます。後者の場合は、(OCIAdmin *)0
を渡します。OCIDBStartup()
のコールにより、サーバー上で1つのインスタンスが起動します。
例16-1では、管理ハンドルで設定され、データベース起動操作を実行する、クライアント側のパラメータ・ファイル(pfile
)を使用するサンプル・コードを示しています。
停止するには、SYSOPER
またはSYSDBA
としてデータベースに接続する必要があります。ディスパッチャを介して共有サーバーには接続できません。OCI_DBSHUTDOWN_ABORT
以外のモードで停止する場合、次の手順を使用します。
OCIDBShutdown()
をOCI_DEFAULT
、OCI_DBSHUTDOWN_TRANSACTIONAL
、OCI_DBSHUTDOWN_TRANSACTIONAL_LOCAL
またはOCI_DBSHUTDOWN_IMMEDIATE
モードでコールし、これ以上の接続を禁止します。- 必要な
ALTER
DATABASE
コマンドを使用し、データベースをクローズしてディスマウントします。 OCIDBShutdown()
をOCI_DBSHUTDOWN_FINAL
モードでコールし、インスタンスを停止します。
例16-1 データベースの起動操作を実行するOCIDBStartup()のコール
... /* Example 0 - Startup: */ OCIAdmin *admhp; text *mount_stmt = (text *)"ALTER DATABASE MOUNT"; text *open_stmt = (text *)"ALTER DATABASE OPEN"; text *pfile = (text *)"/ade/viewname/oracle/work/t_init1.ora"; /* Start the authentication session */ checkerr(errhp, OCISessionBegin (svchp, errhp, usrhp, OCI_CRED_RDBMS, OCI_SYSDBA|OCI_PRELIM_AUTH)); /* Allocate admin handle for OCIDBStartup */ checkerr(errhp, OCIHandleAlloc((void *) envhp, (void **) &admhp, (ub4) OCI_HTYPE_ADMIN, (size_t) 0, (void **) 0)); /* Set attribute pfile in the admin handle (do not do this if you want to use the spfile) */ checkerr (errhp, OCIAttrSet( (void *) admhp, (ub4) OCI_HTYPE_ADMIN, (void *) pfile, (ub4) strlen(pfile), (ub4) OCI_ATTR_ADMIN_PFILE, (OCIError *) errhp)); /* Start up in NOMOUNT mode */ checkerr(errhp, OCIDBStartup(svchp, errhp, admhp, OCI_DEFAULT, 0)); checkerr(errhp, OCIHandleFree((void *) admhp, (ub4) OCI_HTYPE_ADMIN)); /* End the authentication session */ OCISessionEnd(svchp, errhp, usrhp, (ub4)OCI_DEFAULT); /* Start the sysdba session */ checkerr(errhp, OCISessionBegin (svchp, errhp, usrhp, OCI_CRED_RDBMS, OCI_SYSDBA)); /* Mount the database */ checkerr(errhp, OCIStmtPrepare2(svchp, &stmthp, errhp, mount_stmt, (ub4) strlen((char*) mount_stmt), (CONST OraText *) 0, (ub4) 0, (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)); checkerr(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4)0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT)); checkerr(errhp, OCIStmtRelease(stmthp, errhp, (OraText *)0, 0, OCI_DEFAULT)); /* Open the database */ checkerr(errhp, OCIStmtPrepare2(svchp, &stmthp, errhp, open_stmt, (ub4) strlen((char*) open_stmt), (CONST OraText *)0, (ub4)0, (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)); checkerr(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4)0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT)); checkerr(errhp, OCIStmtRelease(stmthp, errhp, (OraText *)0, 0, OCI_DEFAULT)); /* End the sysdba session */ OCISessionEnd(svchp, errhp, usrhp, (ub4)OCI_DEFAULT); ...
例16-2 OCI_DBSHUTDOWN_FINALモードでのOCIDBShutdown()のコール
/* Example 1 - Orderly shutdown: */ ... text *close_stmt = (text *)"ALTER DATABASE CLOSE NORMAL"; text *dismount_stmt = (text *)"ALTER DATABASE DISMOUNT"; /* Start the sysdba session */ checkerr(errhp, OCISessionBegin (svchp, errhp, usrhp, OCI_CRED_RDBMS, OCI_SYSDBA)); /* Shutdown in the default mode (transactional, transactional-local, immediate would be fine too) */ checkerr(errhp, OCIDBShutdown(svchp, errhp, (OCIAdmin *)0, OCI_DEFAULT)); /* Close the database */ checkerr(errhp, OCIStmtPrepare2(svchp, &stmthp, errhp, close_stmt, (ub4) strlen((char*) close_stmt), (CONST OraText *)0, (ub4)0, (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)); checkerr(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4)0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT)); checkerr(errhp, OCIStmtRelease(stmthp, errhp, (OraText *)0, 0, OCI_DEFAULT)); /* Dismount the database */ checkerr(errhp, OCIStmtPrepare2(svchp, &stmthp, errhp, dismount_stmt, (ub4) strlen((char*) dismount_stmt), (CONST OraText *)0, (ub4)0, (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)); checkerr(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4)0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT)); checkerr(errhp, OCIStmtRelease(stmthp, errhp, (OraText *)0, 0, OCI_DEFAULT)); /* Final shutdown */ checkerr(errhp, OCIDBShutdown(svchp, errhp, (OCIAdmin *)0, OCI_DBSHUTDOWN_FINAL)); /* End the sysdba session */ checkerr(errhp, OCISessionEnd(svchp, errhp, usrhp, (ub4)OCI_DEFAULT)); ...
例16-3 OCI_DBSHUTDOWN_ABORTモードでのOCIDBShutdown()のコール
/* Example 2 - Shutdown using abort: */ ... /* Start the sysdba session */ ... checkerr(errhp, OCISessionBegin (svchp, errhp, usrhp, OCI_CRED_RDBMS, OCI_SYSDBA)); /* Shutdown in the abort mode */ checkerr(errhp, OCIDBShutdown(svchp, errhp, (OCIAdmin *)0, OCI_DBSHUTDOWN_ABORT)); /* End the sysdba session */ checkerr(errhp, OCISessionEnd(svchp, errhp, usrhp, (ub4)OCI_DEFAULT)); ...