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モードでコールし、これ以上の接続を禁止します。- 必要な
ALTERDATABASEコマンドを使用し、データベースをクローズしてディスマウントします。 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));
...