2014年9月28日日曜日

Oracle Expert RAC 11g R2 合格メモ

Oracle Expert RAC 11g R2 に合格したので、メモ。

勉強期間:なんだかんだ半年。実質は1ヶ月くらい。

勉強方法:要点まとめた部分をひたすら暗記。
     その後問題演習。問題演習は3周くらい。

オラクルマスター教科書 Oracle Expert RAC 11g R2編

→参考書らしい参考書が、これとあとネット上の問題しかない。。

 

 試験結果:1回目→不合格。50%くらいしかとれず、不合格。
       2回目→合格。88%くらいで合格!

感触:RACは構築したことあるけれども、やはり単語は覚えないといろいろ始まらない。あとオプションとか。GIとRACでセクションがわかれているけれども、GIのほうが圧倒的に出題数が多いのでたくさん勉強したほうがいいです。

LPIC Level 3 (304 仮想化)合格メモ

LPIC Level 3 (304 仮想化)、正式名称は「LPI 304 Virtualization & High Availability Exam」?に合格したのでメモ。

勉強期間:1週間。実質3日くらい。

勉強方法:ひたすら問題演習。あまり教科書とかで勉強しないで、問題演習を通じて覚えることを覚えた感じ。

<つかった問題>  
徹底攻略LPI問題集Level3[303/304]対応 (ITプロ/ITエンジニアのための徹底攻略)

→メインはこの本。

http://www.aiotestking.com/linux/
→ちょっとだけこのサイトでも勉強。

テスト結果:660点で合格!

 感触:もともとVMwareやVirtualBoxで仮想マシンを作って作業をしたことがあったので仮想化のイメージはついていたものの、ロードバランシングとかクラスタとかの製品の話は知らなかったので、そこは完全丸暗記。。設定ファイルとかデーモンとか。
「感覚」がつかめていれば、あとは用語を覚えて合格できるかなーという印象でした。

2014年3月16日日曜日

【Oracle】外部表

マニュアルを見ながら外部表の練習。

---empxt1.dat------
360,Jane,Janus,ST_CLERK,121,17-MAY-2001,3000,0,50,jjanus
361,Mark,Jasper,SA_REP,145,17-MAY-2001,8000,.1,80,mjasper
362,Brenda,Starr,AD_ASST,200,17-MAY-2001,5500,0,10,bstarr
363,Alex,Alda,AC_MGR,145,17-MAY-2001,9000,.15,80,aalda

⇒これを素直に取り込む

---empxt2.dat------
401,Jesse,Cromwell,HR_REP,203,17-MAY-2001,7000,0,40,jcromwel
402,Abby,Applegate,IT_PROG,103,17-MAY-2001,9000,.2,60,aapplega
403,Carol,Cousins,AD_VP,100,17-MAY-2001,27000,.3,90,ccousins
404,John,Richardson,AC_ACCOUNT,205,17-MAY-2001,5000,0,110,jrichard

⇒これを一度gzに固めて、preprocessor経由で取り込む。そのために解凍スクリプトを準備。

#解凍スクリプト
[oracle@single data]$ cat zcat
/bin/gunzip -c $1


その3として、datapumpと絡んだ外部表で遊びます。


ではでは、ここから外部表を作成します。


#ちょっと前準備。サンプルの日付パターンが英語なので。
SH@orcl > alter session set nls_language='AMERICAN';


#ディレクトリオブジェクトへ権限付与
SYS@orcl > grant all on directory data_dir to sh;


#外部表その1
CREATE TABLE ext_emp
                   (employee_id       NUMBER(4), 
                    first_name        VARCHAR2(20),
                    last_name         VARCHAR2(25), 
                    job_id            VARCHAR2(10),
                    manager_id        NUMBER(4),
                    hire_date         DATE,
                    salary            NUMBER(8,2),
                    commission_pct    NUMBER(2,2),
                    department_id     NUMBER(4),
                    email             VARCHAR2(25) 
                   ) 
     ORGANIZATION EXTERNAL 
     ( 
       TYPE ORACLE_LOADER 
       DEFAULT DIRECTORY data_dir
       ACCESS PARAMETERS 
       ( 
         records delimited by newline 
         badfile data_dir:'empxt%a_%p.bad' 
         logfile data_dir:'empxt%a_%p.log' 
         fields terminated by ',' 
         missing field values are null 
         ( employee_id, first_name, last_name, job_id, manager_id, 
           hire_date char date_format date mask "dd-mon-yyyy", 
           salary, commission_pct, department_id, email 
         ) 
       ) 
       LOCATION ('empxt1.dat') 
     ) 
     PARALLEL 
     REJECT LIMIT UNLIMITED; 



#外部表その2
CREATE TABLE sales_transactions_ext
                   (
                   employee_id       NUMBER(4), 
                    first_name        VARCHAR2(20),
                    last_name         VARCHAR2(25), 
                    job_id            VARCHAR2(10),
                    manager_id        NUMBER(4),
                    hire_date         DATE,
                    salary            NUMBER(8,2),
                    commission_pct    NUMBER(2,2),
                    department_id     NUMBER(4),
                    email             VARCHAR2(25) 
)
ORGANIZATION external
(TYPE oracle_loader
 DEFAULT DIRECTORY data_dir
 ACCESS PARAMETERS
  (RECORDS DELIMITED BY NEWLINE★
   CHARACTERSET AL32UTF8
   PREPROCESSOR data_dir:'zcat'★
   FIELDS TERMINATED BY "," 
   (
           employee_id, first_name, last_name, job_id, manager_id, 
           hire_date char date_format date mask "dd-mon-yyyy", 
           salary, commission_pct, department_id, email 
   )
  )
 location ('empxt2.dat.gz')
)REJECT LIMIT UNLIMITED;


#外部表その3

SH@orcl > CREATE TABLE test_pump
  2  ORGANIZATION EXTERNAL
  3  (
  4  TYPE ORACLE_DATAPUMP
  5  DEFAULT DIRECTORY data_dir
  6   LOCATION ('table2.dmp')
  7  )
  8  AS SELECT * FROM sales_transactions_ext where EMPLOYEE_ID=401;

Table created.

#確認
SH@orcl > select * from test_pump;

EMPLOYEE_ID FIRST_NAME           LAST_NAME                 JOB_ID     MANAGER_ID
----------- -------------------- ------------------------- ---------- ----------
HIRE_DAT     SALARY COMMISSION_PCT DEPARTMENT_ID EMAIL
-------- ---------- -------------- ------------- -------------------------
        401 Jesse                Cromwell                  HR_REP            203
01-05-17       7000              0            40 jcromwel


#deleteとか出来ちゃうか確認。外部表なので、いじれません。
SH@orcl > delete from test_pump;
delete from test_pump
            *
ERROR at line 1:
ORA-30657: operation not supported on external organized table




<参考マニュアル>
Oracle® Database管理者ガイド
20 表の管理
 外部表の管理
 http://docs.oracle.com/cd/E16338_01/server.112/b56301/tables.htm#i1007424
 http://download.oracle.com/otndocs/products/database/enterprise_edition/utilities/pdf/xtables_preproc11g_1009.pdf
 

Oracle® Databaseユーティリティ
11gリリース2 (11.2)
15 ORACLE_DATAPUMPアクセス・ドライバ
http://docs.oracle.com/cd/E16338_01/server.112/b56303/et_dp_driver.htm#i1006773

2014年3月15日土曜日

【Oracle】データベースリンクを作る

インスタンスorcl⇒インスタンスPROD1へのDBリンクを作る。

ユーザ名は(めんどくさかったので)systemユーザで作った。本当はちゃんとしたユーザが良いのだろうけれども・・・。


#DBリンクをつくる
SYS@orcl > create database link testprodlink connect to system identified by oracle using 'PRODTNS';


#DBリンクを使って問い合わせる。PROD1につながっていることを確認。
SYS@orcl >  select instance_name from v$instance@testprodlink;

INSTANCE_NAME
----------------
PROD1


<参考>
Oracle® Database管理者ガイド11g リリース2 (11.2)
データベース・リンク
http://docs.oracle.com/cd/E16338_01/server.112/b56301/ds_concepts.htm#i1007669

【Oracle】リスナー 動的登録と静的登録

動的登録なリスナー

[oracle@single admin]$ cat listener.ora

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = single)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )


静的登録リスナー

[oracle@single admin]$ cat listener.ora

LISTENER2 =
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=single)(PORT=1561))))

SID_LIST_LISTENER2 =
  (SID_LIST=
    (SID_DESC=
      (SID_NAME=PROD1
      (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)))
      
      
      

2014年3月10日月曜日

【Oracle】フラッシュデータアーカイブ

フラッシュバック・データ・アーカイブにより、その存続期間中、表に対するすべてのトランザクションによる変更を追跡および格納できます。
監査対応などで1年前のデータを出せと言われたときに出せる仕組み。

使うテーブルとか、とりあえずメモ。
(マニュアルより抜粋)
*_FLASHBACK_ARCHIVE
フラッシュバック・データ・アーカイブ・ファイルに関する情報
*_FLASHBACK_ARCHIVE_TS
フラッシュバック・データ・アーカイブ・ファイルの表領域
*_FLASHBACK_ARCHIVE_TABLES
データ・フラッシュバック・アーカイブ・ファイルが有効になっている表



#専用の表領域を作成する
create tablespace fla_da_tbs1 datafile '/u01/app/oracle/oradata/PROD1/fla_da.dbf' size 10M reuse autoextend on;

SYS@PROD1 > conn hr/hr
接続されました。
HR@PROD1 > select default_tablespace from user_users;

DEFAULT_TABLESPACE
------------------------------
USERS

HR@PROD1 > conn / as sysdba
接続されました。

SYS@PROD1 > alter user hr default tablespace fla_da_tbs1 quota unlimited on fla_da_tbs1;

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


#権限付与
#既存の表に対して使用するフラッシュバック・データ・アーカイブのFLASHBACK ARCHIVEオブジェクト権限が持っているとアーカイブ有効化が可能

SYS@PROD1 > grant flashback archive on fla_1year to hr;

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


#データアーカイブを作成する
SYS@PROD1 > CREATE FLASHBACK ARCHIVE DEFAULT fla_1year TABLESPACE fla_da_tbs1 QUOTA 10M RETENTION 1 YEAR;

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

HR@PROD1 > ALTER TABLE employees FLASHBACK ARCHIVE fla_1year;

#ここから実験データを入れる----------------------
・vishneyさんの給料は10500。これをupdate文によって12000までにあげる。

HR@PROD1 > select employee_id,last_name,salary from employees where last_name='Vishney';

EMPLOYEE_ID LAST_NAME                     SALARY
----------- ------------------------- ----------
        162 Vishney                        10500

HR@PROD1 > update employees set salary=salary+500 where last_name='Vishney';

1行が更新されました。

HR@PROD1 > r
  1* update employees set salary=salary+500 where last_name='Vishney'

1行が更新されました。

HR@PROD1 > r
  1* update employees set salary=salary+500 where last_name='Vishney'

1行が更新されました。

HR@PROD1 >  select employee_id,last_name,salary from employees where last_name='Vishney';

EMPLOYEE_ID LAST_NAME                     SALARY
----------- ------------------------- ----------
        162 Vishney                        12000★


-------------------------------------------------




#内部表を確認。ちゃんとアーカイブされていることがわかった。
HR@PROD1 > r
  1  select * from user_FLASHBACK_ARCHIVE_TABLES
  2*

TABLE_NAME                     OWNER_NAME                     FLASHBACK_ARCHIVE_NAME                             ARCHIVE_TABLE_NAME                                    STATUS
------------------------------ ------------------------------ -------------------------------------------------- ----------------------------------------------------- -------------
EMPLOYEES                      HR                             FLA_1YEAR                                          SYS_FBA_HIST_76257★                                    ENABLED



#昔のデータアクセスする。
HR@PROD1 > SELECT SALARY, LAST_NAME FROM employees AS OF
  2    TIMESTAMP ★TO_TIMESTAMP ('2014-03-09 23:40:00', 'YYYY-MM-DD HH24:MI:SS') where last_name='Vishney';

    SALARY LAST_NAME
---------- -------------------------
     12000 Vishney

#もとに戻せと言われたので、元に戻す。
HR@PROD1 > update employees set salary=(SELECT SALARY FROM employees AS OF TIMESTAMP TO_TIMESTAMP ('2014-03-09 23:35:00', 'YYYY-MM-DD HH24:MI:SS') where last_name='Vishney') where last_name='Vishney';

1行が更新されました。

HR@PROD1 > commit;

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

HR@PROD1 > SELECT SALARY, LAST_NAME FROM employees where last_name='Vishney';

    SALARY LAST_NAME
---------- -------------------------
     10500 Vishney
     
     
   


#データのアーカイブ期間を変更する
HR@PROD1 > select FLASHBACK_ARCHIVE_NAME,RETENTION_IN_DAYS from user_FLASHBACK_ARCHIVE;

FLASHBACK_ARCHIVE_NAME                             RETENTION_IN_DAYS
-------------------------------------------------- -----------------
FLA_1YEAR                                                        365

フラッシュバック・データ・アーカイブfla1の保有時間を2年に変更します。

HR@PROD1 > conn / as sysdba
接続されました。
SYS@PROD1 > ALTER FLASHBACK ARCHIVE FLA_1YEAR MODIFY RETENTION 2 YEAR;

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


#削除。

SYS@PROD1 > DROP FLASHBACK ARCHIVE FLA_1YEAR;

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

SYS@PROD1 > select FLASHBACK_ARCHIVE_NAME,RETENTION_IN_DAYS from user_FLASHBACK_ARCHIVE;

レコードが選択されませんでした。




<参考手順>

Oracle® Databaseアドバンスト・アプリケーション開発者ガイド
http://docs.oracle.com/cd/E16338_01/appdev.112/b56259/toc.htm

【Oracle】ファイングレイン監査

ファイングレイン監査をいじる。

権限付与→特定の表の特定列をselectしたときなどのみ、監査証跡が残るように設定。

#権限付与
GRANT EXECUTE ON DBMS_FGA TO sysadmin_fga;

#監査ポリシーの追加。ここでは、EMPLOYEES表のempolyee_id=100というselect文が投げられたときのみレコードを残す、という設定を加える

BEGIN
 DBMS_FGA.ADD_POLICY(
   OBJECT_SCHEMA => 'HR',
   OBJECT_NAME                     => 'EMPLOYEES',
   POLICY_NAME                     => 'AUDIT_EMPS_JOBID',
   ENABLE                          => True,
   STATEMENT_TYPES                 => 'SELECT',
   audit_column                    => 'EMPLOYEE_ID',
   audit_condition            =>  'EMPLOYEE_ID=100');
END;
/


#テスト。実際にselectしてみる。(監査として結果が残っているかどうかは最後でみることにする)

select EMPLOYEE_ID from hr.employees where EMPLOYEE_ID=100;


#ポリシー削除(ごみがたまるのがいやなので、こまめに消す・・・)
begin
DBMS_FGA.DROP_POLICY(
  object_schema      => 'HR',
  object_name        => 'EMPLOYEES',
  policy_name        => 'AUDIT_EMPS_JOBID');
end;
/


#違うポリシーを作成する。今度はとにかくsalary列をselectされたら監査レコードを追加するようなポリシー。
BEGIN
 DBMS_FGA.ADD_POLICY(
   OBJECT_SCHEMA => 'HR',
   OBJECT_NAME                     => 'EMPLOYEES',
   POLICY_NAME                     => 'AUDIT_EMPS_SALARY',
   STATEMENT_TYPES                 => 'SELECT',
   audit_column   => 'SALARY');
END;
/

#テスト。
select salary from hr.employees;

#ポリシー削除
begin
DBMS_FGA.DROP_POLICY(
  object_schema      => 'HR',
  object_name        => 'EMPLOYEES',
  policy_name        => 'AUDIT_EMPS_SALARY');
end;
/


#監査の証拠が残っているかを確認

SYS@PROD1 > select SESSIONID,TIMESTAMP#,POLICYNAME,LSQLTEXT ,STATEMENT from SYS.FGA_LOG$;

 SESSIONID TIMESTAM POLICYNAME                     LSQLTEXT                                                                          STATEMENT
---------- -------- ------------------------------ -------------------------------------------------------------------------------- ----------
    104650          AUDIT_EMPS_SALARY              select salary from hr.employees                                                          14
    104732          AUDIT_EMPS_SALARY              select SALARY,job_id from hr.employees                                                   10
    104732          AUDIT_EMPS_JOBID               select EMPLOYEE_ID from hr.employees where EMPLOYEE_ID=100                               28


→残っていることを確認!



<参考手順>
Oracle® Databaseセキュリティ・ガイド
http://docs.oracle.com/cd/E16338_01/network.112/b56285/auditing.htm#CEGBAFIA