34 データベース管理
この章では、Oracle Database 11gリリース1で導入されたデータベース管理方法について説明します。この章の構成は、次のとおりです。
34.1 データベース管理メソッドの使用
Oracle Database 11gリリース1以降、2つのJDBCメソッド、startup
およびshutdown
がoracle.jdbc.OracleConnection
インタフェースに追加されており、これによりOracle Databaseインスタンスの起動と停止を実行できます。SQL*Plusからデータベース・インスタンスを起動または停止する方法と同様です。
startup
およびshutdown
メソッドを使用するには、次の点に従う必要があります。
-
サーバー専用の接続を行うこと。ディスパッチャを介して共有サーバーには接続できません。
-
SYSDBA
またはSYSOPER
として接続すること。SYSDBA
またはSYSOPER
として、Oracle JDBCドライバ経由で接続するには、INTERNAL_LOGON
接続プロパティに適切な値を設定する必要があります。
SYSDBA
権限を使用し、JDBC Thinドライバ経由でログオンできるようにするには、パスワード・ファイルを使用するようにサーバーを構成しておく必要があります。たとえば、SYSDBA
権限を使用し、JDBC Thinドライバ経由で接続するようにsystem/manager
を構成するには、次の手順を実行します。
JDBC OCIドライバの場合は、JDBC Thinドライバと違い、サーバー上のパスワード・ファイルを指定することなく、SYSDBA
またはSYSOPER
としてローカルに接続できます。
34.2 startupメソッドの使用
startup
メソッドを使用してデータベース・インスタンスを起動するには、SYSDBA
またはSYSOPER
権限を使用して、PRELIM_AUTH
モード(データベースがダウンしているときに許可される唯一の接続モード)でデータベースに接続する必要があります。そのためには、接続プロパティであるPRELIM_AUTH
をtrue
に設定する必要があります。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ドライバは、クライアントのパラメータ・ファイルを使用したデータベースの起動はサポートしていません。
34.2.1 データベース起動オプション
startup
メソッドには、データベース起動オプションを指定するパラメータを指定できます。表34-1は、サポートされているデータベース起動オプションを示しています。これらのオプションは、oracle.jdbc.OracleConnection.DatabaseStartupMode
クラスで定義されています。
表34-1 サポートされているデータベース起動オプション
オプション | 説明 |
---|---|
|
新しいインスタンスを起動する前に、データベースで中断モードになっている現行インスタンスがある場合は停止します。 |
|
アクセス制限なしでデータベースを起動します。 |
|
データベースを起動し、データベース・アクセスを、 |
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");
34.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();
34.3.1 データベース停止オプション
startup
メソッドと同様、shutdown
メソッドにもパラメータを指定できます。このパラメータには、データベースの停止に関するオプションを指定します。表34-2に、サポートされているデータベース停止オプションを示します。それらのオプションは、oracle.jdbc.OracleConnection.DatabaseShutdownMode
クラスで定義されています。
表34-2 サポートされているデータベース停止オプション
オプション | 説明 |
---|---|
|
現在のコールが完了したり、ユーザーがデータベースから切断するまで待機しません。 |
|
新しい接続を拒否し、既存の接続の終了を待ちます。 |
|
データベースを停止します。 |
|
現在のコールが完了したり、ユーザーがデータベースから切断するまで待機しません。 |
|
新しいトランザクションを拒否し、アクティブなトランザクションの終了を待ちます。 |
|
新しいローカル・トランザクションを拒否し、アクティブなローカル・トランザクションの終了を待ちます。 |
ABORT
およびFINAL
以外の停止オプションの場合、データベースを実際に停止するには、FINAL
オプションを指定してshutdown
メソッドを再度コールする必要があります。
ノート:
shutdown(DatabaseShutdownMode.FINAL)
メソッドをコールする場合は、事前に、CONNECT
、TRANSACTIONAL
、 TRANSACTIONAL_LOCAL
またはIMMEDIATE
のいずれかのオプションを指定したshutdown
メソッドをコールする必要があります。そうしないとコールがハングします。
34.3.2 標準的なデータベース停止プロセス
データベースを停止するための標準的な方法は、次のとおりです。
-
停止するための準備として、データベース内における以降の接続とトランザクションを禁止します。指定できる停止オプションは、
CONNECT
、TRANSACTIONAL
、TRANSACTIONAL_LOCAL
またはIMMEDIATE
です。 -
適切な
ALTER DATABASE
コマンドをコールして、データベースをディスマウントおよびクローズします。 -
最後に、
FINAL
オプションを使用して停止を実行します。
データベースを可能なかぎり早く停止する必要があるような特殊な状況においては、ABORT
オプションを使用することもできます。これは、SQL*PlusのSHUTDOWN ABORT
に相当します。
34.4 完全な例
例34-1は、startup
メソッドおよびshutdown
メソッドの使用方法の例を示しています。
例34-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();
}
}