33 データベース管理

この章では、Oracle Database 11gリリース1で導入されたデータベース管理方法について説明します。この章の構成は、次のとおりです。

33.1 データベース管理メソッドの使用

Oracle Database 11gリリース1以降、2つのJDBCメソッド、startupおよびshutdownoracle.jdbc.OracleConnectionインタフェースに追加されており、これによりOracle Databaseインスタンスの起動と停止を実行できます。SQL*Plusからデータベース・インスタンスを起動または停止する方法と同様です。

startupおよびshutdownメソッドを使用するには、次の点に従う必要があります。

  • サーバー専用の接続を行うこと。ディスパッチャを介して共有サーバーには接続できません。

  • SYSDBAまたはSYSOPERとして接続すること。SYSDBAまたはSYSOPERとして、Oracle JDBCドライバ経由で接続するには、INTERNAL_LOGON接続プロパティに適切な値を設定する必要があります。

SYSDBA権限を使用し、JDBC Thinドライバ経由でログオンできるようにするには、パスワード・ファイルを使用するようにサーバーを構成しておく必要があります。たとえば、SYSDBA権限を使用し、JDBC Thinドライバ経由で接続するようにsystem/managerを構成するには、次の手順を実行します。

  1. コマンドラインから次のように入力します。
    orapwd file=$ORACLE_HOME/dbs/orapw entries=5
    Enter password: password
    
  2. SQL*Plusから、SYSDBAとしてデータベースに接続し、次のコマンドを実行します。
    GRANT SYSDBA TO system;
    PASSWORD system
           Changing password for system
           New password: password
           Retype new password: password
    
  3. init.oraを編集し、次の行を追加します。
    REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
    
  4. データベース・インスタンスを再起動します。

JDBC OCIドライバの場合は、JDBC Thinドライバと違い、サーバー上のパスワード・ファイルを指定することなく、SYSDBAまたはSYSOPERとしてローカルに接続できます。

33.2 startupメソッドの使用

startupメソッドを使用してデータベース・インスタンスを起動するには、SYSDBAまたはSYSOPER権限を使用して、PRELIM_AUTHモード(データベースがダウンしているときに許可される唯一の接続モード)でデータベースに接続する必要があります。そのためには、接続プロパティであるPRELIM_AUTHtrueに設定する必要があります。PRELIM_AUTHモードでは、ダウンしているデータベース・インスタンスの起動のみ実行できます。このモードでは、SQL文の実行はできません

次のコードは、ダウンしているデータベース・インスタンスを起動する方法を示しています。

 OracleDataSource ds = new OracleDataSource();
    Properties prop = new Properties();
    prop.setProperty("user","sys");
    prop.setProperty("password","manager");
    prop.setProperty("internal_logon","sysdba");
    prop.setProperty("prelim_auth","true");
    ds.setConnectionProperties(prop);
    ds.setURL("jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=XYZ.com)(PORT=5221))"
+ "(CONNECT_DATA=(SERVICE_NAME=rdbms.devplmt.XYZ.com)))");
    OracleConnection conn = (OracleConnection)ds.getConnection();
    conn.startup(OracleConnection.DatabaseStartupMode.NO_RESTRICTION);
    conn.close();

ノート:

startupメソッドは、サーバーのパラメータ・ファイルを使用してデータベースを起動します。Oracle JDBCドライバは、クライアントのパラメータ・ファイルを使用したデータベースの起動はサポートしていません

33.2.1 データベース起動オプション

startupメソッドには、データベース起動オプションを指定するパラメータを指定できます。表33-1は、サポートされているデータベース起動オプションを示しています。これらのオプションは、oracle.jdbc.OracleConnection.DatabaseStartupModeクラスで定義されています。

表33-1 サポートされているデータベース起動オプション

オプション 説明

FORCE

新しいインスタンスを起動する前に、データベースで中断モードになっている現行インスタンスがある場合は停止します。

NO_RESTRICTION

アクセス制限なしでデータベースを起動します。

RESTRICT

データベースを起動し、データベース・アクセスを、CREATE SESSIONRESTRICTED SESSIONの両方の権限を持つユーザー(通常はDBA)のみに許可します。

startupメソッドは、データベース・インスタンスを起動するのみです。データベース・インスタンスのマウントもオープンも実行しません。データベース・インスタンスをマウントおよびオープンするには、SYSDBAまたはSYSOPERとして、PRELIM_AUTH以外のモードで再接続する必要があります。

次のコードは、データベース・インスタンスをマウントおよびオープンする方法を示しています。

    OracleDataSource ds1 = new OracleDataSource();
    Properties prop1 = new Properties();
    prop1.setProperty("user","sys");
    prop1.setProperty("password","manager");
    prop1.setProperty("internal_logon","sysdba");
    ds1.setConnectionProperties(prop1);
    ds1.setURL(DB_URL);
    OracleConnection conn1 = (OracleConnection)ds1.getConnection();
    Statement stmt = conn1.createStatement();
    stmt.executeUpdate("ALTER DATABASE MOUNT");
    stmt.executeUpdate("ALTER DATABASE OPEN");

33.3 shutdownメソッドの使用

shutdownメソッドを使用すると、Oracle Databaseインスタンスを停止できます。このメソッドを使用するには、SYSDBAまたはSYSOPERとしてデータベースに接続する必要があります。

次のコードは、データベース・インスタンスをシャットダウンする方法を示しています。

    OracleDataSource ds2 = new OracleDataSource();
...
    OracleConnection conn2 = (OracleConnection)ds2.getConnection();
    conn2.shutdown(OracleConnection.DatabaseShutdownMode.IMMEDIATE);
    Statement stmt1 = conn2.createStatement();
    stmt1.executeUpdate("ALTER DATABASE CLOSE NORMAL");
    stmt1.executeUpdate("ALTER DATABASE DISMOUNT");
    stmt1.close();
    conn2.shutdown(OracleConnection.DatabaseShutdownMode.FINAL);
    conn2.close();

33.3.1 データベース停止オプション

startupメソッドと同様、shutdownメソッドにもパラメータを指定できます。このパラメータには、データベースの停止に関するオプションを指定します。表33-2に、サポートされているデータベース停止オプションを示します。それらのオプションは、oracle.jdbc.OracleConnection.DatabaseShutdownModeクラスで定義されています。

表33-2 サポートされているデータベース停止オプション

オプション 説明

ABORT

現在のコールが完了したり、ユーザーがデータベースから切断するまで待機しません。

CONNECT

新しい接続を拒否し、既存の接続の終了を待ちます。

FINAL

データベースを停止します。

IMMEDIATE

現在のコールが完了したり、ユーザーがデータベースから切断するまで待機しません。

TRANSACTIONAL

新しいトランザクションを拒否し、アクティブなトランザクションの終了を待ちます。

TRANSACTIONAL_LOCAL

新しいローカル・トランザクションを拒否し、アクティブなローカル・トランザクションの終了を待ちます。

ABORTおよびFINAL以外の停止オプションの場合、データベースを実際に停止するには、FINALオプションを指定してshutdownメソッドを再度コールする必要があります。

ノート:

shutdown(DatabaseShutdownMode.FINAL)メソッドをコールする場合は、事前に、CONNECTTRANSACTIONAL TRANSACTIONAL_LOCALまたはIMMEDIATEのいずれかのオプションを指定したshutdownメソッドをコールする必要があります。そうしないとコールがハングします。

33.3.2 標準的なデータベース停止プロセス

データベースを停止するための標準的な方法は、次のとおりです。

  1. 停止するための準備として、データベース内における以降の接続とトランザクションを禁止します。指定できる停止オプションは、CONNECTTRANSACTIONALTRANSACTIONAL_LOCALまたはIMMEDIATEです。

  2. 適切なALTER DATABASEコマンドをコールして、データベースをディスマウントおよびクローズします。

  3. 最後に、FINALオプションを使用して停止を実行します。

データベースを可能なかぎり早く停止する必要があるような特殊な状況においては、ABORTオプションを使用することもできます。これは、SQL*PlusのSHUTDOWN ABORTに相当します。

33.4 完全な例

例33-1は、startupメソッドおよびshutdownメソッドの使用方法の例を示しています。

例33-1 データベースの起動と停止

import java.sql.Statement;
import java.util.Properties;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.pool.OracleDataSource;
/**
 * To logon as sysdba, you need to create a password file for user "sys":
 *   orapwd file=/path/orapw password=password entries=300
 * and add the following setting in init.ora:
 *   REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
 * then restart the database.
 */
public class DBStartup
{
  static final String DB_URL = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=5221))"
+ "(CONNECT_DATA=(SERVICE_NAME=rdbms.devplmt.XYZ.com)))";

  public static void main(String[] argv) throws Exception
  {
// Starting up the database:
    OracleDataSource ds = new OracleDataSource();
    Properties prop = new Properties();
    prop.setProperty("user","sys");
    prop.setProperty("password","manager");
    prop.setProperty("internal_logon","sysdba");
    prop.setProperty("prelim_auth","true");
    ds.setConnectionProperties(prop);
    ds.setURL(DB_URL);
    OracleConnection conn = (OracleConnection)ds.getConnection();
    conn.startup(OracleConnection.DatabaseStartupMode.NO_RESTRICTION);
    conn.close();

// Mounting and opening the database
    OracleDataSource ds1 = new OracleDataSource();
    Properties prop1 = new Properties();
    prop1.setProperty("user","sys");
    prop1.setProperty("password","manager");
    prop1.setProperty("internal_logon","sysdba");
    ds1.setConnectionProperties(prop1);
    ds1.setURL(DB_URL);
    OracleConnection conn1 = (OracleConnection)ds1.getConnection();
    Statement stmt = conn1.createStatement();
    stmt.executeUpdate("ALTER DATABASE MOUNT");
    stmt.executeUpdate("ALTER DATABASE OPEN");
    stmt.close();
    conn1.close();

// Shutting down the database
    OracleDataSource ds2 = new OracleDataSource();
    Properties prop = new Properties();
    prop.setProperty("user","sys");
    prop.setProperty("password","manager");
    prop.setProperty("internal_logon","sysdba");
    ds2.setConnectionProperties(prop);
    ds2.setURL(DB_URL);
    OracleConnection conn2 = (OracleConnection)ds2.getConnection();
    conn2.shutdown(OracleConnection.DatabaseShutdownMode.IMMEDIATE);
    Statement stmt1 = conn2.createStatement();
    stmt1.executeUpdate("ALTER DATABASE CLOSE NORMAL");
    stmt1.executeUpdate("ALTER DATABASE DISMOUNT");
    stmt1.close();
    conn2.shutdown(OracleConnection.DatabaseShutdownMode.FINAL);
    conn2.close();
  }
}