オラクる。

oracle専門ブログにしてみようかな~っと

2016年07月

Oracle Enterprise Manager Cloud Control(oemc)はレポジトリ情報を保管するためにOracle Databaseのを利用します。
oemcのインストール時にDatabaseの詳細を構成することも可能ですが、事前に構成することも可能です。
これで、oemcのインストール時間短縮につながります。

今回、検証環境では12cがインストールされています。
また、dbの作成時にテンプレートを使用しますが、そのテンプレートは下記からダウンロード出来ます。

Oracle Enterprise Manager Downloads
http://www.oracle.com/technetwork/oem/enterprise-manager/downloads/index.html

ダウンロードしてきたテンプレートをOracleサーバにアップロードします。

[oracle@DB01 oem]$ unzip 12.1.0.2.0_Database_Template_for_EM13_1_0_0_0_Linux_x64.zip -d /u01/app/oracle/product/12.1.0/dbhome_1/assistants/dbca/templates

ダウンロードしたファイルを$ORACLE_HOME/assistants/dbca/templatesに解凍します。

000001

GUIからdbcaを起動し、「データベースの作成」を選択します。

000002

テンプレートを選択するため拡張モードを選択します。

000003

テンプレートは3種類あります。
上から2番目から順番で大規模、中規模、小規模です。
規模の詳細は下記の通りです。

小規模:1 OMS、1000未満のターゲット、100未満のエージェント、10未満の同時ユーザー・セッション
中規模:2 OMS、1000以上10,000未満のターゲット、100以上1000未満のエージェント、10以上25未満の同時ユーザー・セッション
大規模:2つのOMS、10,000以上のターゲット、1000以上のエージェント、25以上50以下の同時ユーザー・セッション

000004

インスタンス名を設定します。

000005

Enterprise Managerのチェックは外しておきます。

000009

「データベースの作成」にチェックが入っていることを確認して次へをクリックします。

000010

サマリーを確認し、終了ボタンをクリックします。

000011

DBの作成中・・・

000012

作成完了です。

Oracle Enterprise Manager Cloud Control(oemc)をインストールしてみます。
バージョンは最新の13c
OSはRHEL6を利用します。
まずは事前準備から

yum install make
yum install binutils
yum install gcc
yum install libaio
yum install glibc-common
yum install libstdc++
yum install libXtst
yum install sysstat
yum install glibc-devel
yum install glibc-devel.i686


必要なパッケージのインストール
Oralce Databaseよりは少なめです。

[root@node01 ~]# more /etc/oraInst.loc
/etc/oraInst.loc: そのようなファイルやディレクトリはありません


Oracleインベントリが存在しないこと、つまりは他のOracle製品がインストールされていないことを確認します。

[root@node01 ~]# groupadd oinstall
[root@node01 ~]# id oracle
id: oracle: そのようなユーザは存在しません
[root@node01 ~]# useradd -g oinstall oracle
[root@node01 ~]# passwd oracle


必要なグループとユーザーを追加します。

[oracle@node01 ~]$ less .bash_profile



umask 022


作成したoracleユーザーにはbash_profileにumask 022を追記します。

[oracle@node01 ~]$ /bin/sh -c "ulimit -n"
1024
[oracle@node01 ~]$ /bin/sh -c "ulimit -Hn"
65536

[root@node01 ~]# less /etc/security/limits.conf



oracle soft nofile 4096
oracle hard nofile 16384

[oracle@node01 ~]$ /bin/sh -c "ulimit -n"
4096
[oracle@node01 ~]$ /bin/sh -c "ulimit -Hn"
16384

さらにoracleユーザーにはリソース制限の設定を行ないます。
/etc/security/limits.confに必要な設定を追記します。

[root@node01 ~]# vi /etc/hosts



172.17.9.40     node01


hostsに自ホスト名とIPアドレスを記載します。

次回は既存のOracle DBにoemc専用のインスタンスを作成します。

oracle 12cの新機能にIdentity Columnという機能があります。
これは、簡単に言えばユニークな値を自動的に生成してくれる列のことです。
テーブル作成時にIdentity Columnの列を設定することが出来ます。
なお、Identity Columnの列を作成した場合、裏ではシークエンスが作成されています。
1回目の記事で大まかな機能を確認し、2回目の記事でシークエンスの動きを確認してみます。

SQL> CREATE TABLE identity_test_tab (
  2  id NUMBER GENERATED ALWAYS AS IDENTITY,
  3  description VARCHAR2(30)
  4  );

表が作成されました。


表を作成します。
id列の「GENERATED ALWAYS AS IDENTITY」でIdentity Columnを指定しています。

SQL> INSERT INTO identity_test_tab (description) VALUES ('Just Description');

1行が作成されました。

SQL> INSERT INTO identity_test_tab (description) VALUES ('Just Description2');

1行が作成されました。


id列を明示的に指定せずにinsertします。


SQL> SELECT * FROM identity_test_tab;

        ID DESCRIPTION
---------- ------------------------------
         1 Just Description
         2 Just Description2

id列にはユニークな値、1、2・・・設定されています。

SQL> INSERT INTO identity_test_tab (id,description) VALUES (5,'Just Description');
INSERT INTO identity_test_tab (id,description) VALUES (5,'Just Description')
                               *
行1でエラーが発生しました。:
ORA-32795: GENERATED ALWAYSで作成されたアイデンティティ列には挿入できません

SQL> INSERT INTO identity_test_tab (id,description) VALUES (NULL,'Just Description');
INSERT INTO identity_test_tab (id,description) VALUES (NULL,'Just Description')
                               *
行1でエラーが発生しました。:
ORA-32795: GENERATED ALWAYSで作成されたアイデンティティ列には挿入できません


明示的に値を指定した場合、NULL値を指定した場合、エラーが発生します。

SQL> DROP TABLE identity_test_tab;

表が削除されました。


CREATE TABLE identity_test_tab (
id NUMBER GENERATED BY DEFAULT AS IDENTITY,
description VARCHAR2(30)
);

表が作成されました。


次に別オプションの「GENERATED BY DEFAULT AS IDENTITY」で表を作成してみます。

SQL> INSERT INTO identity_test_tab (description) VALUES ('Just Description2');

1行が作成されました。

SQL> INSERT INTO identity_test_tab (description) VALUES ('Just Description');

1行が作成されました。

SQL> SELECT * FROM identity_test_tab;

        ID DESCRIPTION
---------- ------------------------------
         1 Just Description2
         2 Just Description


この設定の場合はid列は未指定→OK

SQL> INSERT INTO identity_test_tab (id,description) VALUES (NULL,'Just Description');
INSERT INTO identity_test_tab (id,description) VALUES (NULL,'Just Description')
                                                       *
行1でエラーが発生しました。:
ORA-01400: ("TEST"."IDENTITY_TEST_TAB"."ID")にはNULLは挿入できません。

SQL> INSERT INTO identity_test_tab (id,description) VALUES (1,'Just Description');

1行が作成されました。


id列に明示的に値を指定する→OK、NULL値を指定する→NGと言った設定になります。

QL> DROP TABLE identity_test_tab;

表が削除されました。

SQL> CREATE TABLE identity_test_tab (
  2  id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
  3  description VARCHAR2(30)
  4  );

表が作成されました。


「GENERATED BY DEFAULT ON NULL AS IDENTITY」で列を作成した場合

SQL> INSERT INTO identity_test_tab (description) VALUES ('Just Description');

1行が作成されました。

SQL> INSERT INTO identity_test_tab (id,description) VALUES (2,'Just Description');

1行が作成されました。

SQL> INSERT INTO identity_test_tab (id,description) VALUES (NULL,'Just Description');

1行が作成されました。

SQL> SELECT * FROM identity_test_tab;

        ID DESCRIPTION
---------- ------------------------------
         1 Just Description
         2 Just Description
         2 Just Description


id値は未指定、明示的に値を指定、NULL値を指定(「id値は未指定」と同じ結果)、ともにOKです。

Flashback Data Archive機能を利用して、過去データの参照、及び過去データへのフラッシュバックを行なってみましょう。

SQL> SELECT empno,ename,sal FROM emp
  2  WHERE ename = 'SMITH';

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             800


Archiveを有効にしたemp表を利用します。
SMITHの給与(SAL)は800です。

SQL> UPDATE emp
  2  SET sal = sal + 1000
  3  WHERE ename = 'SMITH';

1行が更新されました。

SQL> commit;

コミットが完了しました。


SMITHの給与を3回、+1000します。

SQL> SELECT empno,ename,sal FROM emp
  2  WHERE ename = 'SMITH';

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH            3800


給与が更新されたことを確認します。

SELECT empno,ename,sal FROM emp
AS OF TIMESTAMP
(SYSTIMESTAMP - INTERVAL '10' MINUTE)
WHERE ename = 'SMITH';

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             800


emp表はArchiveを有効にしているので過去データを参照可能です。
「(SYSTIMESTAMP - INTERVAL '10' MINUTE)」で10分前のデータを参照します。
更新前の給与が表示されていることを確認できます。

SQL> explain plan for
  2  SELECT empno,ename,sal FROM emp
  3  AS OF TIMESTAMP
  4  (SYSTIMESTAMP - INTERVAL '10' MINUTE)
  5  WHERE ename = 'SMITH';

解析されました。

SQL> @$ORACLE_HOME/rdbms/admin/utlxpls

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2504078639

----------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name               | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |                    |     2 |    66 |   285   (1)| 00:00:01 |       |       |
|   1 |  VIEW                     |                    |     2 |    66 |   285   (1)| 00:00:01 |       |       |
|   2 |   UNION-ALL               |                    |       |       |            |          |       |       |
|*  3 |    FILTER                 |                    |       |       |            |          |       |       |
|   4 |     PARTITION RANGE SINGLE|                    |     1 |    61 |   274   (0)| 00:00:01 |   KEY |     1 |
|*  5 |      TABLE ACCESS FULL    | SYS_FBA_HIST_92153 |     1 |    61 |   274   (0)| 00:00:01 |   KEY |     1 |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|*  6 |    FILTER                 |                    |       |       |            |          |       |       |
|   7 |     MERGE JOIN OUTER      |                    |     1 |  2054 |    11  (19)| 00:00:01 |       |       |
|   8 |      SORT JOIN            |                    |     1 |    26 |     7  (15)| 00:00:01 |       |       |
|*  9 |       TABLE ACCESS FULL   | EMP                |     1 |    26 |     6   (0)| 00:00:01 |       |       |
|* 10 |      SORT JOIN            |                    |     1 |  2028 |     4  (25)| 00:00:01 |       |       |
|* 11 |       TABLE ACCESS FULL   | SYS_FBA_TCRV_92153 |     1 |  2028 |     3   (0)| 00:00:01 |       |       |
----------------------------------------------------------------------------------------------------------------


explainの解析データでflashback表を参照していることがわかります。

UPDATE emp
SET sal = (
SELECT sal FROM emp
AS OF TIMESTAMP
(SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE ename = 'SMITH'
)
WHERE ename = 'SMITH';

1行が更新されました。


Archiveを利用して、現在の値を更新します。
つまりは、更新の取り消しです。

SQL> SELECT empno,ename,sal FROM emp
  2  WHERE ename = 'SMITH';

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             800


更新前の状態になったことを確認できました。

Flashback Data Archive機能はトランザクションの変更履歴を長期保管する機能です。
同じように変更履歴を保管するUNDOよりも長期の保管を可能にします。

CREATE TABLESPACE fla_tbs1
DATAFILE '+DATA/fla_tbs1.dbf'
SIZE 10M AUTOEXTEND ON NEXT 640K MAXSIZE 32767M;


Flashback Data Archiveの変更履歴は表に保管されます。
まずは、その表を保管する表領域を作成します。

SQL> GRANT FLASHBACK ARCHIVE ADMINISTER TO test;

権限付与が成功しました。
SQL> alter user test quota unlimited on fla_tbs1;

ユーザーが変更されました。


Flashback Data Archiveは表単位で有効、無効が出来ます。
有効にする表を所持するユーザーに対して、archiveを管理する権限と、arichive用表領域の無制限割り当ての権限を与えます。

[oracle@DB01 ~]$ sqlplus test/password@pdb1

CREATE FLASHBACK ARCHIVE fla1
TABLESPACE fla_tbs1
QUOTA 10M
RETENTION 1 YEAR;

フラッシュバック・アーカイブが作成されました。


Archiveを有効にする表の所有者ユーザーで接続し、変更履歴を保管する表を先ほど作成した表領域に作成します。

ALTER TABLE emp
FLASHBACK ARCHIVE fla1;

表が変更されました。


特定の表に対してArchiveを有効にします。
これで準備は完了です。

このページのトップヘ