SQLServerはWindowsサーバー上でしか使えませんが、OracleはLinux上でも使えるため、多くのインターネット上の巨大サービスのデータ管理で採用されてきた歴史があります。検索やSQL処理スピードは体感としてOracleのほうが快適に感じますが、管理ツールはSQLServerのほうが豊富で使いやすいです。 インドネシアのITサービス インターネット技術の急速な発展と普及により、優秀なIT人材を輩出することで知られるジャカルタのビヌス大学(BINUS)やバンドゥンのバンドゥン工科大学、インドネシアコンピューター大学(UNIKOM)の学生の多くがインターネット・WEB業界やソフトウェア業界を志望するようです。 続きを見る
OracleとSQLServer
この2つのDBは武蔵と小次郎みたいなもんで、バージョンが上がるたびに機能比較がされてきましたが、最近では「検索のOracle、更新のSQLServer」と言われているらしいです。
ただDBにそれほど詳しくない僕くらいのレベルの人間にしてみれば「データ量の多い大規模なシステムにはOracle、中堅どころの規模にはSQLServer」くらいの認識が一般的だと思います。
これはSQLServerはWindowsでしか使用できないがOracleはUnix系サーバでも利用できるという汎用性の濃淡が多少影響していると思います。
Oracleのライセンス形態はProcessorライセンス(サーバーのCPUの枚数)かNamed User Plus(NUP)ライセンス(何人で使うか)の2通りあり、インストール時にシリアルキー入力の必要もないので、11g R2のライセンスがあれば12cをインストールすることも可能です。
2016年に価格改定があり、実質的な大幅値上げになりました(泪)。
一方でSQLServer2012も同じようにComputing Power ライセンスモデル(CPUの中のコアの数)とCALモデル(何人で使うか)という似たようなライセンス体系になっていますが、Oracleのように物理プロセッサをカウントする方式ではなく1プロセッサごとに搭載されるコア数の合計をカウントするところがミソです。
SQL ServerもOracleと同じように3つのエディションがありますが、会計システムを少数のユーザーで使用する場合、サーバーライセンス(15万円)+CAL(ユーザー分)買っておけば問題ないわけです。
DB操作のためのコマンドラインツールとしてSQL plus、GUIツールとしてSQLServerのManagement Studioに相当するOracle SQL Developerがありますが、スクリプト(拡張子sqlのSQLが記述されたDB全般で扱われるテキストファイル)の実行結果を確認したいときはGUIツールのほうが便利です。
Oracle clientとserverの関係
リスナーはサーバーで実行する個別のプロセスであり、クライアントからの接続要求を受け取りサーバーへの要求を管理します。
Oracleネットマネージャー
起動しているOracle関連のサービス
Oracleホーム
Oracleリスナー
サーバー側とクライアント側で設定する項目
サーバー側
- Database Configuration Assisantでインスタンス作成
- Net Configuration Assistantでリスナー作成
クライアント側
- Net managerでサービスネームを作成
Database Configuration AssistantはOracleデータベースの作成と構成に使用します。
Oracle Net Configuration Assistantは、リスナー名やプロトコル・アドレスなどの基本的なOracle Netネットワーク・コンポーネントの構成、およびディレクトリ・サーバーを使用するためのOracleホームの構成に使用します。
Oracle Net Managerは、ローカル・クライアントやサーバー・ホスト上のOracleホームに対してOracle Net Servicesを構成します。
Oracle DB ソフトウェアインストールとインスタンスとスキーマ作成の流れ
Oracle DBの導入は以下の3ステップに分かれます。
- インストーラからDBソフトウェアのインストール
- DBCA(Database Configuration Assistant)からインスタンスの作成
- スキーマの作成
DBソフトウェアのインストールはsetup.exeを実行しインストーラを起動させ、以下の4つの主要設定パラメータを設定します。
- Oracleベース(C:\app\Hp):インストールの場所ですべてのOracle関連ファイルの場所
- Oracleホーム(C:\app\Hp\product\11.2.0):Oracleベース内のDB構成ファイル以外の場所
- 初期データベースのGlobal DB Name(Orcl)
- ユーザIDとパスワード
以上によりOracleベースの中にdbhome_1というホーム(ソフトウェアディレクトリ)が生成されます。
- C:\app\Hp\product\11.2.0\dbhome_1
以上でDBソフトウェアがインストールされたので、次はOracle Databese Configuration Assistance(DBCA)でインスタンスを作成します。
Oracle で「DBを作成する」というのは「インスタンスを作成する」のとほぼ同義で、そして1つのインスタンスの中に複数の「スキーマを作成」しますが、これは「ユーザを作成する」のとほぼ同義です。
DB構成ファイル自体はDB(インスタンス)ごとに以下に配置されます。
- C:\app\Hp\oradata\orcl
ここまでの手順に間違いがなければ、サーバー側で以下の2つのサービスが起動しています。
- OracleServiceORCL(OracleServiceの後ろにSID名をくっつけたもの)
- OracleOraDB11g_Home1TNSListener
一方、クライアント側で起動するサービスは以下の1つで、Oracle clientはOracle DBがインストールされているサーバで稼動しているリスナーというサービスを経由してOracle DBに接続します。
- OracleOraDB11g_Home1ClrAgent
インスタンスが作成できたら次にスキーマを作成します。
- [C:sqlplus /nolog]でログを保存しない状態でログイン
- [SQL> conn sys/admin@orcl as sysdba]で管理者権限でインスタンスに接続すると[Connected.]を返す。
- [SQL> @D:/createuser.sql スキーマ名 パスワード]で[User created.]を返す。
上記のcreateuser.sqlの中身は以下のとおり。
set verify off
spool &2
create user &1 identified by &1
default tablespace users
temporary tablespace temp;
grant dba to &1;
grant connect to &1;
grant create any trigger to &1;
grant create any sequence to &1;
grant create procedure to &1;
grant unlimited tablespace to &1;
grant alter rollback segment to &1;
grant select on v_$session to &1;
grant select on v_$mystat to &1;
grant execute on dbms_lock to &1;
grant select on v_$instance to &1;
spool off
quit
ここまででインスタンスとスキーマが準備できたので、あとはシステム環境(テーブルとか)を作成するだけです。
Oracleのアンインストール手順
インストール手順は画像が多いのでアンインストール手順から先に説明します。
11g R2になってOUI(Oracle Universal Installer)でアンインストールしようとすると、「C:\app\HP\product\11.2.0\dbhome_1\deinstallで削除してください」と拒否されます。
- deinstallから来る質問に丁寧に回答する(ほとんどがYesかNo)。
- regeditを実行して以下のレジストリキーを削除する。
HKEY_LOCAL_MACHINE/SOFTWARE/Oracle key
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Oracle key
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Ora* key - 再起動する。
- Oracle関連ディレクトリを全部削除する。
C:\app\HP
C:\Program Files (x86)\Oracle
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\ - テンポラリーファイル「C:\temp」をクリアする。
- ごみ箱を空にする。
regeditからOracle関連のレジストリキーを削除する際は、バックアップを取った上で、細心の注意を払いながら作業しましょう。
Oracle 11g Release2 32bit版のインストール手順(12画面)
11gといっても11.2.0.1はバグありなので、最新版11.2.0.4をインストールします。
まずはメルアドやProxy情報はあまり気にせず先に進みましょう。
ここでCreate and configure Databaseを選ぶとOracle DB Softwareのインストール後にDataBase Configuration Assistantが自動で起動し、初期DB(インスタンス)をorclの名前で生成します。
ただ通常はInstall database onlyを選択して後からDBCAでインスタンスを作成すると思います。
Grobal database nameのデフォルトはorclなので必要に応じて変更します。
ここからDBCAがGrobal database name:orcl, SID:orclでインスタンスを生成し始めます。
Oracle client 11g 32bit版のインストール手順(11画面)
Administrator版をインストールするとSQL PlusやSQL Developer、Net Managerなどのツールが自動的にインストールされます。
ここでいくつかFailedになったとしても必ずしも致命的なエラーとは限らないので、勇気を出してIgnore Allで抜けましょう。
ここまででOracle Clientのインストールは完了しているので、次はNet Managerで接続先のリスナー情報を設定します。
DBCAによるDB(インスタンス)作成手順(18画面)
このとき通常はGlobal DB name=SIDでOK。SIDとは複数インスタンス構築時に区別するための識別子である。
管理者アカウント(スキーマ)であるSYS、SYSTEM、SYSMANおよびDBSNMPが生成される。
Character setの指定はインスタンス単位で行う(スキーマ単位では行えない)のでインスタンス生成時に指定する必要がある。
Oracle Developer起動時にJava2 SE SDKのjava.exeのPathを聞かれる場合は以下を指定。
- C:\app\Toshiba\product\11.2.0\dbhome_1\jdk\bin
Oracle DeveloperでSYSMANという管理者アカウント(スキーマ)への接続を作成すると・・・
Oracleスキーマオブジェクトの構成
Oracleのスキーマオブジェクトは主に以下のオブジェクトで構成されています。パッケージやプロシージャーやファンクションは他のOracleオブジェクト(SQL Plusなど)やユーザーアプリケーション(VBなど)からCallできます。
- テーブル:
- インデックス:
- ビュー:
- パッケージ:プロシージャーまたはファンクションのライブラリ
- プロシージャー:ユーザープログラム(戻り値なし)
- ファンクション:ユーザープログラム(戻り値あり)
- トリガー:テーブル操作をトリガーに自動実行されるプロシージャー
スキーマにログイン
まずSQLPlusを起動しsys権限のユーザでOracle DB(スキーマ)にログインして行います。
C:\sqlplus sys/admin@orcl as sysdba
Windows Serverなら問題ないですがUNIX上ではコマンドラインで入力されたIDとPWDは「ps -ef | grep sqlplus」であっさり表示されてしまうので、SQLPlusは/nolog付きで起動してインスタンスに繋ぎに行ったほうが良さそうです。
C:\sqlplus /nolog
SQL> connect sys/admin@orcl as sysdba
Connected.
スキーマの作成と削除
スキーマTEST2を作成し権限を付与するためのスクリプトにUIDとPWDを引数として実行します。
set verify off
spool &2
create user &1 identified by &1
default tablespace users
temporary tablespace temp;
grant dba to &1;
grant connect to &1;
grant create any trigger to &1;
grant create any sequence to &1;
grant create procedure to &1;
grant unlimited tablespace to &1;
grant alter rollback segment to &1;
grant select on v_$session to &1;
grant select on v_$mystat to &1;
grant execute on dbms_lock to &1;
grant select on v_$instance to &1;
spool off
quit
SQL> @D:/createuser.sql TEST2 TEST2
User created.
スキーマを削除するには、そのスキーマーがオブジェクトを持っている場合でも削除できるようにcascadeを付けます。
drop user TEST2 cascade;
cascadeとは「滝のように上から下へ流れる」という意味であり、スキーマに含むオブジェクトまでごっそり削除というニュアンスです。CSSもCascading Style Sheetの略で、上位のセレクタに適用したプロパティの値は下位のセレクタにも適用されます。
リコンパイル
スキーマに含まれている無効なPL/SQLモジュール、無効なビュー、Javaクラス、索引タイプおよび演算子など、スキーマーの全オブジェクトを対象としてリコンパイルするにはDBMS_UTILITYパッケージのCOMPILE_SCHEMAプロシージャー、またはUTL_RECOMPパッケージを使います。
ストアドプロシージャーの実行はEXEC(UTE)またはCALLで行います。
EXECUTE DBMS_UTILITY.COMPILE_SCHEMA('TEST2');
UTL_RECOMPパッケージの場合、スキーマ名を省略すると全スキーマをまとめてリコンパイルできます。
EXECUTE UTL_RECOMP.RECOMP_SERIAL('TEST2');
EXECUTE UTL_RECOMP.RECOMP_SERIAL();
インポートとエクスポート
従来(論理)バックアップには「C:\app\HP\product\11.2.0\client_1\BIN」内のimp.exeとexp.exeを使用していました。
imp TEST2/TEST2@orcl file=D:\test2.dmp log=d:\temp\TEST2.log full=y
Oracle11gからimp/expコマンドはサポートされなくなり、その代わりにデータポンプDataPump(expdp/impdb)が使えるようになりました。imp/expとの違いはユーティリティ側で処理されるかデータベース側でジョブとして処理されるかであり、imp/expコマンドに比べてパフォーマンスが向上しています。
expdp test2/test2@orcl schemas=demo dumpfile=DEMO.dmp logfile=DEMO_exp.log
impdp test2/test2@orcl remap_schema=demo dumpfile=DEMO.dmp logfile=DEMO_imp.log
表領域の拡張
Oracleの表領域はUSERS01.DBFというように拡張子がDBFのファイルとしてインストールディレクトリの中の「C:\app\User\oradata\orcl」などに格納されていますが、スキーマが増えるにつれていずれ初期容量を超えてしまいますので表領域の拡張が必要になります。
ALTER DATABASE DATAFILE 'C:\oracle\oradata\mcf\USERS01.DBF' RESIZE 8192M;
ALTER DATABASE DATAFILE 'C:\oracle\oradata\mcf\USERS01.DBF' AUTOEXTEND OFF;alter tablespace USERS
add datafile 'C:\oracle\oradata\mcf\USERS02.DBF' size 8192m autoextend off,
'C:\oracle\oradata\mcf\USERS03.DBF' size 8192m autoextend off,
'C:\oracle\oradata\mcf\USERS04.DBF' size 8192m autoextend off,
'C:\oracle\oradata\mcf\USERS05.DBF' size 8192m autoextend off,
'C:\oracle\oradata\mcf\USERS06.DBF' size 8192m autoextend off,
'C:\oracle\oradata\mcf\USERS07.DBF' size 8192m autoextend off,
'C:\oracle\oradata\mcf\USERS08.DBF' size 8192m autoextend off,
自分のPCの場合、33GBのUSERS01.DBFが一杯一杯になり、スキーマのリストアでエラーが出るようになったので、8GBのサイズで以下のように分割して拡張しました。
Oracleクライアントからサーバーへの接続時のエラー
Oracle ClientはOracel Serverに「サーバー→リスナー→データベース」の順番に接続していきますが、僕の場合Oracleの接続エラーで一番多いのはリスナーに関係するものであり、中でもエラーの常習犯が以下のORA-12514です。
これは「クライアントのtnsnames.oraのHOSTパラメータで指定したホスト名(またはIPアドレス)上で、tnsnames.oraのPORTパラメータで指定したポート番号でサーバーのリスナーが起動していない(Listenしていない)」ということです。
PCにOracleサーバーとクライアントを両方インストールすると、サーバーのNet Configuration AssistantやNet Managerは無効になります。よってこの場合に設定するtnsnames.oraとlistener.oraはクライアントのものであり、サーバーのもの(dbhome_1フォルダ内のもの)は使用しません。
ローカルネーミングパラメータtnsnames.ora
- C:\app\HP\product\11.2.0\client_1\network\admin\tnsnames.ora
# tnsnames.ora Network Configuration File: C:\app\HP\product\11.2.0\client_1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
sqlplusからorclというデータベースサービスにアクセスするには「localhostというサーバーのポート番号1521でリスナーが起動」していればよいわけです。
リスナーパラメータlistener.ora
- C:\app\HP\product\11.2.0\client_1\network\admin\listener.ora
# listener.ora Network Configuration File: C:\app\HP\product\11.2.0\client_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = Oracle8)
(SID_NAME = ORCL)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = HP-PC)(PORT = 1521))
)
ADR_BASE_LISTENER = C:\app\HP\product\11.2.0\client_1\log
「HP-PC(localhostでもOK)というホスト名のポート番号1521でリスナーが起動」していればよいわけです。
今動いているデータベースサービス名やポート番号はサーバー上から以下のコマンドで確認の上、パラメタファイルと比較します。
ネーミングメソッドパラメータsqlnet.ora
Oracle ClientからOracle Server DBの接続は、サーバーとクライアント両方のOracle Net(アプリケーション層のプロトコル)を通じて、リスナーと接続できるようにします。Oracle Netの構成では、ネーミングメソッドパラメータsqlnet.oraでOracle Server DBの識別方法を設定します。
- C:\app\HP\product\11.2.0\client_1\network\admin\sqlnet.ora
# sqlnet.ora Network Configuration File: C:\app\HP\product\11.2.0\client_1\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.
# This file is actually generated by netca. But if customers choose to
# install "Software Only", this file wont exist and without the native
# authentication, they will not be able to connect to the database on NT.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
TNSNAMESはローカルネーミングファイルtnsnames.oraを使った接続で、EZCONNECTはネーミングパラメータを使わず、以下の簡易接続するものです。
tnsnames.oraファイルの構成パラメターをローカルネーミングパラメター、listener.oraファイルの構成パラメターはリスナーパラメーター、sqlnet.oraファイルの構成パラメータをネーミングメソッドパラメータと呼びます。