Windows10にOracle12cをインストールしたので手順を残しておこうと思う。

# Orcle 12cをWindows10にセットアップする
## この作業のゴール
* Oracle 12c がWindows10上で動作する
* データベースにユーザーとして`user/pass`を作成する
* Oracle 12c へ外部からユーザー`user/pass`としてアクセスができる
* Oracle 12c へ古いOracleから出力されたdmpファイルをインポートし、  
`user/pass`がローカル/リモートでインポートされたデータへアクセスできる

## 1. Oracle 12c のインストール
* ### 1-1 setup.exeの実行
    * #### Oracle 12c のsetup.exeを右クリックメニューから管理者として実行を選択し、以下の手順でインストール作業を行う
        * ##### ステップ1/9 セキュリティアップデートの構成  
        -> メールアドレスを空欄にし、セキュリティアップデートをMyOracleSupport経由で受け取ります のチェックを外す  
        -> [次へ]を選択し、「電子メールアドレスが指定されていません」のダイアログで[はい]を選択する  

        * ##### ステップ2/9 インストール・オプションの選択  
        -> [データベースの作成及び構成]を選択し、[次へ]を選択する

        * ##### ステップ3/9  システム・クラス  
        -> [サーバー・クラス]を選択し、[次へ]を選択する

        * ##### ステップ4/9 Oracleホーム・ユーザーの指定  
        -> [新規Windowsユーザーの作成]を選択し、標準ユーザーアカウントを作成する  
        （今回はuser/passをuser/passとした）  
        * ##### ステップ5/9 標準インストール構成  
        -> デフォルトで埋められた内容を変更せず、パスワードとしてpasswordを設定し[次へ]を選択  
        -> パスワード強度が弱いため警告が表示されるが処理続行のために[はい]を選択

        * ##### ステップ6/9 前提条件のチェック  
        -> 環境変数、レジストリなどを自動で検証してくれるため処理が終わるのを待つ  

        * ##### ステップ7/9 サマリー  
        -> 検証結果が表示されるので確認を行う。念のため[レスポンス・ファイルの保存]を選択し検証結果を保存しておく  
        -> [インストール]を選択し、インストール処理を実行する  

        * ##### ステップ8/9 製品のインストール  
        -> インストールが自動的に始まるので完了まで待つ  

        * ##### ステップ9/9 終了  
        -> データベースがインストールされたことを確認したのちにインストーラを終了する
* ### 1-2 インストール結果の確認
    * #### Oracle 12cのインストールとデータベースの構築に成功していることを確認する  
        * [コントロールパネル]->[システムの詳細]->[環境変数]->[システム環境変数]のPathに  
            ```
            C:¥app¥[ユーザー名]¥product¥12.0.1¥dbhome_1¥bin
            ```  
            が宣言されていることを確認する

        * Windows管理ツールのサービスからOracleのサービスが存在していること、状態が[実行中]であることを確認する  

        * sqlplusに
        
            ```
            sqlplus / as sysdba
            ```
            でログインし、  

            ```
            SQL> select instance_name from v$instance;
            ```
            と打つと

            ```
            INSTANCE_NAME
            ----------------
            orcl
            ```

            とインスタンス名が表示されることを確認する  

        * sqlplus上で
        
            ```
            SQL> shutdown immediate
            ```

            及び

            ```
            SQL> startup
            ```

            を実行してデータベースが停止、起動できることを確認する。

## 2. ユーザーの作成とリスナーの設定
* ### 2-1 リスナーサービスの存在確認
    * コマンドプロンプトから
    
        ```
        lsnrctl status
        ```

        を実行し、実行結果として  

        ```
        サービスのサマリー...  
        サービス"CRLExtProc"には、1件のインスタンスがあります。
            インスタンス"CLRExtProc"、状態UNKNOWNには、このサービスに対する1件のハンドラがあります...
        サービス"orcl"には、1件のインスタンスがあります。
            インスタンス"orcl"、状態READYには、このサービスに対する1件のハンドラがあります...
        サービス"orclXDB"には、1件のインスタンスがあります。
            インスタンス"orcl"、状態READYには、このサービスに対する1件のハンドラがあります...
        サービス"pdborcl"には、1件のインスタンスがあります。
            インスタンス"orcl"、状態READYには、このサービスに対する1件のハンドラがあります...
        ```  

        のように、CDB、PDBを含むリスナーサービスのステータスが表示されることを確認する  
* ### 2-2 pdbの存在確認と起動
    * sqlplusに
    
        ```
        sqlplus / as sysdba
        ```

        でログインし、

        ```
        SQL> show pdb
        ```

        でPDBORCLがPDBとして存在していることを確認する。 
 
        ```
        |CON_ID  |CON_NAME|OPEN MODE |RESTRICTED|
        |--------|--------|----------|----------|
        |2       |PDB$SEED|READ ONLY |NO        |
        |3       |PDBORCL |READ WRITE|NO        |
        ```

        のようになっていれば、PDBORCLが存在している。         
    * また、`OPEN MODE` が`MOUNTED`の場合は、PDBが起動していないため、
   
        ```
        SQL> alter pluggable database pdborcl open;
        ```

        でPDBを起動する。また、

        ```
        alter pluggable database PDB名 save state;
        ```

        でpdbの自動起動設定を行える
* ### 2-3 pdbに接続しユーザーを作成する
    * sqlplusに入った状態で`show con_name`を実行すると
   
        ```
        SQL> show con_name;

        CON_NAME
        ------------------------------
        CDB$ROOT
        ```

        と表示されCDBに接続していることを確認できる
        ここで

        ```
        SQL> alter session set container=pdborcl;

        セッションが変更されました。
        ```

        として、pdbへ接続する。また、

        ```
        SQL> show con_name;

        CON_NAME
        ------------------------------
        PDBORCL
        ```

        と表示されればpdbに接続されていることが確認できる
    * ユーザーアカウントの作成
    
        ```
        SQL> create user user identified by pass;

        ユーザーが作成されました。

        SQL> grant all privileges to user;

        権限付与が成功しました。

        SQL> grant dba to user;

        権限付与が成功しました。
        ```

        でユーザーuserを作り、全権限とpdborclコンテナの管理権限を付与する
        このままでは接続できないため、
        `C:¥app¥[user]¥product¥12.1.0¥dbhome_1¥NETWORK¥ADMIN`の`tnsnames.ora`に

        ```
        PDBORCL =
            (DESCRIPTION =
                (ADDRESS = (PROTOCOL = TCP)(HOST = [ホスト名])(PORT = 1521))
                (CONNECT DATA =
                    (SERVER = DEDICATED)
                    (SERVICE_NAME = pdborcl)
                )
            )
        ```

        を追記して

        ```
        sqlplus user/pass@pdborcl
        ```

        で接続できることを確認する

## 3. dmpファイルのインポートと確認
* ### 3-1. dmpファイルをimpコマンドでインポートする
    * sqlplusからログアウトして、コマンドプロンプトで
    
        ```
        imp user/pass@pdborcl file=[dmpファイルのパス] full=y log=[logファイルのパス];
        ```

        としてインポート処理を行う
        必要ならばプロンプトログをリダイレクトしてテキストデータとして出力したり、
        sqlコマンドをspoolを用いてテキストデータとして出力する
        ログはlogオプションで指定した先に出力されるので上記のテキストデータ出力等々は必要でない限りは特に必要ない
* ### 3-2. インポートしたデータの確認
    * インポートが終了したらselect文などでデータがインポートできていることを確認し、正しくインポートができたことを確かめる

## 4. リモートからのアクセス
* ### 4-1. クライアントのセットアップ
    * クライアントとして利用したMacにOracle Instant Client(12.1.0.2)を導入する。
    Oracle公式ページ( http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html )から、`instantclient-basic-macos.x64.12.1.0.2.0.zip`をダウンロードする
    また、`sqlplus`コマンドセットである`instantclient-sqlplus-macos.x64-12.1.0.2.0.zip`も同様にダウンロードする。
    両方を解凍したのち、`instantclient_12_1`に展開後のディレクトリ内のファイルをまとめる
    * まとめたものを任意のディレクトリ(今回は~/oracle/)に保存して、sqlplusコマンドにパスを通す
    
        ```
        export ORACLE_HOME=/User/[User]/oracle
        export SQLPATH=$ORACLE_HOME/instantclient_12_1/

        export PATH="$HOME/.rbenv/bin:$PATH:$SQLPATH"
        ```

        を`.bashrc`に追記後、`tnsnames.ora`を`~/oracle/network/admin/`以下に作る
        今回は

        ```
        PDBORCL =
            (DESCRIPTION =
                (ADDRESS = (PROTOCOL = TCP)(HOST = [ホスト名またはIP])(PORT = 1521))
                (CONNECT_DATA = (SERVICE_NAME = pdborcl))
            )
        ```

        と記述
        保存後`$source ~/.bashrc`で設定を反映させる。
        ターミナルからsqlplusが起動したら成功
* ### 4-2. リモートからのアクセスを行う
    * **とりあえずsqlplus user/pass@pdborcl してみてDBに入れたら以下のlistener.oraの書き換えは不要です**
    * Oracleが動作しているサーバーのlistener.oraファイルのHOSTをサーバーのホスト名に書き換え、`SID_LIST_LISTENER`に
    
        ```
        (SID_DESC =
            (GLOBAL_DBNAME = ORCL)
            (ORACLE_HOME = C:¥app¥[Windowsユーザー名]¥product¥12.1.0¥dbhome_1)
            (SID_NAME = ORCL)
        )
        ```

        を追記し、サービスからリスナーのサービスを再起動する

    * また、1521番のポートを解放、`C:¥Windows¥System32¥drivers¥etc`下の`hosts`ファイルにホスト名とローカルIPアドレスを記述。はしておいてください
    * 設定が終了したらMacで`splplus user/pass@pdborcl`を用いてログイン、任意のデータベース操作を行いリモートからログインできていることを確認する


## 29 Oct ちょこっと追記
#### 追記1
ストアドパッケージがimportコマンドだときっちりインポートされず、
一部はパッケージボディがINVALIDステータスを示していたり、
他にはそもそもパッケージヘッダのみ入っていてパッケージボディがないとかいうことが起きました。
その場合は、INVALIDなパッケージは再コンパイルをしてみてください。
パッケージヘッダがあるのにボディがない場合は、パッケージのソースhoge.sqlをsqlplusにコピペしてみてください。
なんかいい感じに入ります。
パッケージまたはテーブルなどに依存関係があるとインポート順序によってこういう不具合が起きるみたいです。
ステータスが改善されたらexecuteとかで実行して確認してみてください。

#### 追記2
サーバー側のlistener.oraのHOSTはPCのホスト名にしておくとなんか繋がります。
IPアドレスだと繋がらない。localhostとかにするとそもそも外から繋がらないです



＊　Oracleって新規導入よりもリプレースやアップデートの案件が多いかと思います。
そしておそらく個人で好き好んで触ったり利用する人もあまりいないのかなとも。




* とりあえずメモ書きmdからuser/passとか漏らしたらいけないやつを修正して投下。いろいろこまごま知見を得たりしてて修正が必要な部分もあるのでその辺はおいおい追記したり修正したりします。