2014年3月10日月曜日

【Oracle】パーティション

1.参照パーティション表をつくる


親子関係を持つ表は、親表のパーティションキーを継承して論理的にパーティション化してくれる。
キー列を複製しなくてもいい。

<例>
・(親)orders表
・(子)order_items表
・orders表にあるorder_date列をorder_items表が外部参照している。
→orders表がorder_date列をキーとしてパーティション化されている場合、参照パーティション表を使えばorder_items表も親と同じ単位でパーティション化できる。

#準備
SYS@PROD1 > show parameter  NLS_DATE_LANGUAGE

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_date_language                    string      JAPANESE



#親表の作成

SH@PROD1 > conn hr/hr
接続されました。

HR@PROD1 > CREATE TABLE orders2
  2      ( order_id           NUMBER(12),
  3        order_date         date,
  4        customer_id        NUMBER(6),
  5        order_total        NUMBER(8,2),
  6        sales_rep_id       NUMBER(6),
  7        CONSTRAINT orders_pk PRIMARY KEY(order_id)
  8      )
  9    PARTITION BY RANGE(order_date)
 10      ( PARTITION Q1_2005 VALUES LESS THAN (TO_DATE('01-4月-2013','dd-MON-yyyy')),
 11        PARTITION Q2_2005 VALUES LESS THAN (TO_DATE('01-7月-2013','dd-MON-yyyy')),
 12        PARTITION Q3_2005 VALUES LESS THAN (TO_DATE('01-10月-2013','dd-MON-yyyy')),
 13        PARTITION Q4_2005 VALUES LESS THAN (TO_DATE('01-1月-2014','dd-MON-yyyy'))
 14  );

表が作成されました。
     
#子表の作成。参照パーティション化のため「PARTITION BY REFERENCE」が入る。
CREATE TABLE order_items
    ( order_id           NUMBER(12) NOT NULL,
      line_item_id       NUMBER(3)  NOT NULL,
      product_id         NUMBER(6)  NOT NULL,
      unit_price         NUMBER(8,2),
      CONSTRAINT order_items_fk
      FOREIGN KEY(order_id) REFERENCES orders(order_id)
    )
    PARTITION BY REFERENCE(order_items_fk);
   
#確認。

HR@PROD1 > set linesize 300
HR@PROD1 > SELECT table_name, partitioning_type, ref_ptn_constraint_name FROM user_part_tables;

TABLE_NAME                     PARTITION REF_PTN_CONSTRAINT_NAME
------------------------------ --------- ------------------------------
ORDERS                         RANGE
ORDER_ITEMS                    REFERENCE ORDER_ITEMS_FK

set linesize 400
HR@PROD1 > r
  1  SELECT table_name, partition_name, high_value,tablespace_name FROM user_tab_partitions;
  2*

TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ --------------------------------------------------------------------------------
ORDER_ITEMS★                    Q4_2005
ORDER_ITEMS★                   Q3_2005
ORDER_ITEMS★                    Q2_2005
ORDER_ITEMS★                    Q1_2005
ORDERS                         Q4_2005                        TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                         Q3_2005                        TO_DATE(' 2013-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                         Q2_2005                        TO_DATE(' 2013-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                         Q1_2005                        TO_DATE(' 2013-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

8行が選択されました。


#削除。

HR@PROD1 > drop table order_items purge;

表が削除されました。


#明示的に表領域が指定されない場合は同じ表領域。明示的に指定するとちゃんと変わることを確認する。
#また、パーティション名を明示的に指定しない場合は、親と同じパーティション名になる。明示的に指定した場合は、その指定したパーティション名になることを確認する。

CREATE TABLE order_items
    ( order_id           NUMBER(12) NOT NULL,
      line_item_id       NUMBER(3)  NOT NULL,
      product_id         NUMBER(6)  NOT NULL,
      unit_price         NUMBER(8,2),
      CONSTRAINT order_items_fk
      FOREIGN KEY(order_id) REFERENCES orders(order_id)
    )
    tablespace par_tmp★
    PARTITION BY REFERENCE(order_items_fk);


HR@PROD1 > SELECT table_name, partition_name, high_value,tablespace_name FROM user_tab_partitions;

TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE                                                                       TABLESPACE_NAME
------------------------------ ------------------------------ -------------------------------------------------------------------------------- ------------------------------
ORDER_ITEMS                    Q4_2005                                                                                                         PAR_TMP★
ORDER_ITEMS                    Q3_2005                                                                                                         PAR_TMP★
ORDER_ITEMS                    Q2_2005                                                                                                         PAR_TMP★
ORDER_ITEMS                    Q1_2005                                                                                                         PAR_TMP★
ORDERS                         Q4_2005                        TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA USERS◎
ORDERS                         Q3_2005                        TO_DATE(' 2013-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA USERS◎
ORDERS                         Q2_2005                        TO_DATE(' 2013-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA USERS◎
ORDERS                         Q1_2005                        TO_DATE(' 2013-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA USERS◎

8行が選択されました。

→元表はデフォルト表領域のUSERS,参照パーティションは指定したPAR_TMP表領域に乗っかっていることが確認できた。


HR@PROD1 > CREATE TABLE order_items
  2      ( order_id           NUMBER(12) NOT NULL,
  3        line_item_id       NUMBER(3)  NOT NULL,
  4        product_id         NUMBER(6)  NOT NULL,
  5        unit_price         NUMBER(8,2),
  6        CONSTRAINT order_items_fk
  7        FOREIGN KEY(order_id) REFERENCES orders(order_id)
  8      )
  9      PARTITION BY REFERENCE(order_items_fk)
 10      (PARTITION hoge1,PARTITION hoge2,PARTITION hoge3,PARTITION hoge4);★

表が作成されました。

HR@PROD1 > SELECT table_name, partition_name, high_value,tablespace_name FROM user_tab_partitions;

TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE                                                                       TABLESPACE_NAME
------------------------------ ------------------------------ -------------------------------------------------------------------------------- ------------------------------
ORDER_ITEMS                    HOGE4★                                                                                                           USERS
ORDER_ITEMS                    HOGE3★                                                                                                           USERS
ORDER_ITEMS                    HOGE2★                                                                                                           USERS
ORDER_ITEMS                    HOGE1★                                                                                                           USERS
ORDERS                         Q4_2005                        TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA USERS
ORDERS                         Q3_2005                        TO_DATE(' 2013-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA USERS
ORDERS                         Q2_2005                        TO_DATE(' 2013-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA USERS
ORDERS                         Q1_2005                        TO_DATE(' 2013-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA USERS

8行が選択されました。


→パーティション名が「HOGE」になっていることを確認できた。



2. 時間隔パーティションの作成

レンジパーティションの一種。完全自動化でレンジパーティションを作ってくれる。操作の自動化という意味で楽ちん。
例えば月単位でパーティションします という定義をした時間隔パーティション表を作成すると、
パーティションを明示的に作成しなくても自動で必要な月のパーティションをデータ insert 時に作成してくれる。

#作成

CREATE TABLE interval_sales
    ( prod_id        NUMBER(6)
    , cust_id        NUMBER
    , time_id        DATE
    , channel_id     CHAR(1)
    , promo_id       NUMBER(6)
    , quantity_sold  NUMBER(3)
    , amount_sold    NUMBER(10,2)
    ) 
  PARTITION BY RANGE (time_id) 
  INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
    ( PARTITION p0 VALUES LESS THAN (TO_DATE('1-1-2008', 'DD-MM-YYYY')),
      PARTITION p1 VALUES LESS THAN (TO_DATE('1-1-2009', 'DD-MM-YYYY')),
      PARTITION p2 VALUES LESS THAN (TO_DATE('1-7-2009', 'DD-MM-YYYY')),
      PARTITION p3 VALUES LESS THAN (TO_DATE('1-1-2010', 'DD-MM-YYYY')) );

※参照パーティションのときは、親を PARTITION BY RANGE(order_date)でふつうにつくって子でPARTITION BY REFERENCE(order_items_fk);だった。
今度は、親とか子とかそういうのではないので、
  PARTITION BY RANGE (time_id)
  INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))でOK。

#確認

SH@PROD1 > SELECT table_name, partitioning_type FROM user_part_tables;

TABLE_NAME                     PARTITION
------------------------------ ---------
COSTS                          RANGE
INTERVAL_SALES                 RANGE
SALES                          RANGE★

SELECT table_name, partition_name, high_value FROM user_tab_partitions ORDER BY table_name, partition_position;

TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ --------------------------------------------------------------------------------
INTERVAL_SALES                 P0                             TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES                 P1                             TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES                 P2                             TO_DATE(' 2009-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES                 P3                             TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA


#データを1件入れて、パーティションが自動で追加されるかを確認

SH@PROD1 > INSERT INTO interval_sales(prod_id, time_id) VALUES(1, TO_DATE('2013-10-07', 'YYYY-MM-DD'));

1行が作成されました。



SELECT table_name, partition_name, high_value FROM user_tab_partitions ORDER BY table_name, partition_position;

TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ --------------------------------------------------------------------------------
INTERVAL_SALES                 P0                             TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES                 P1                             TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES                 P2                             TO_DATE(' 2009-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES                 P3                             TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES                 SYS_P41★                        TO_DATE(' 2013-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA




#先ほどは「MONTH」の単位でやったので、今度は「YEAR」でやる。

CREATE TABLE interval_sales2
    ( prod_id        NUMBER(6)
    , cust_id        NUMBER
    , time_id        DATE
    , channel_id     CHAR(1)
    , promo_id       NUMBER(6)
    , quantity_sold  NUMBER(3)
    , amount_sold    NUMBER(10,2)
    ) 
  PARTITION BY RANGE (time_id) 
  INTERVAL(NUMTOYMINTERVAL(1, 'YEAR'★))
    ( PARTITION p0 VALUES LESS THAN (TO_DATE('1-1-2008', 'DD-MM-YYYY')),
      PARTITION p1 VALUES LESS THAN (TO_DATE('1-1-2009', 'DD-MM-YYYY')),
      PARTITION p2 VALUES LESS THAN (TO_DATE('1-7-2009', 'DD-MM-YYYY')),
      PARTITION p3 VALUES LESS THAN (TO_DATE('1-1-2010', 'DD-MM-YYYY')) );
     
#データを挿入し年単位でパーティションが自動作成されるかを確認する

INSERT INTO interval_sales2(prod_id, time_id) VALUES(1, TO_DATE('2013-10-07', 'YYYY-MM-DD'));
INSERT INTO interval_sales2(prod_id, time_id) VALUES(1, TO_DATE('2013-12-07', 'YYYY-MM-DD'));
INSERT INTO interval_sales2(prod_id, time_id) VALUES(1, TO_DATE('2014-03-07', 'YYYY-MM-DD'));


TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ --------------------------------------------------------------------------------
INTERVAL_SALES2                P0                             TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES2                P1                             TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES2                P2                             TO_DATE(' 2009-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES2                P3                             TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES2                SYS_P42                        TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
INTERVAL_SALES2                SYS_P43                        TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA


<参考マニュアル>
Oracle® Database VLDBおよびパーティショニング・ガイド
11g リリース2 (11.2)
http://docs.oracle.com/cd/E16338_01/server.112/b56316/part_admin001.htm#BAJHFFBE

2014年3月9日日曜日

SQL*Plusをもっと便利に。

プロンプトの表示をもっと便利に。


$cd /u01/app/oracle/product/11.2.0/dbhome_1/sqlplus/admin

$ ls
glogin.sql  help  libsqlplus.def  plustrce.sql  pupbld.sql

$ vi glogin.sql

以下を追記。

SET SQLPROMPT '_USER@&_CONNECT_IDENTIFIER > '

→上書き保存

接続してみる。
$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on 日 3月 9 18:38:27 2014

Copyright (c) 1982, 2011, Oracle.  All rights reserved.



Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
に接続されました。
SYS@PROD1 >

ユーザを変えてみる。

SYS@PROD1 > conn scott/tiger

接続されました。

SCOTT@PROD1 >

【Oracle】SecureFiles LOB

SecureFiles LOBを含んだテーブルの作り方

create table sh.t01 (empid number,c01 clob) tablespace securefile_tbs
lob (c01) store as securefile(
compress high
DEDUPLICATE
);

#確認を行う
SH@PROD1 > select table_name,TABLESPACE_NAME,COMPRESSION,DEDUPLICATION from user_lobs;

TABLE_NAME                     TABLESPACE_NAME                COMPRE DEDUPLICATION
------------------------------ ------------------------------ ------ ---------------
DR$SUP_TEXT_IDX$R              EXAMPLE                        NONE   NONE
DR$SUP_TEXT_IDX$I              EXAMPLE                        NONE   NONE
T01                             SECUREFILE_TBS                       HIGH   LOB

#圧縮率をhighからlowに変えてみる
ALTER TABLE t01 MODIFY
LOB(c01) (
COMPRESS LOW
);

SH@PROD1 > select table_name,TABLESPACE_NAME,COMPRESSION,DEDUPLICATION from user_lobs;

TABLE_NAME                     TABLESPACE_NAME                COMPRE DEDUPLICATION
------------------------------ ------------------------------ ------ ---------------
DR$SUP_TEXT_IDX$R              EXAMPLE                        NONE   NONE
DR$SUP_TEXT_IDX$I              EXAMPLE                        NONE   NONE
T01                             SECUREFILE_TBS                       LOW    LOB

BasicFiles LOB から SecureFiles LOB への移行

オンライン再定義を行う必要を試す。
オンライン定義そのもののマニュアルは管理者ガイド。
http://docs.oracle.com/cd/E16338_01/server.112/b56301/tables.htm#i1006790


#接続
conn scott/tiger

#表作成
create table cust
(
c_id number primary key,
c_zip number,
c_name varchar(30) default null,
c_lob clob
);

#データを入れる
INSERT INTO cust VALUES(1, 94065, 'hhh', 'ttt');


#オンライン再定義するのに必要な権限をつける
#後半二つはDBMS_REDEFINITION.COPY_TABLE_DEPENDENTSを実行するのに必要
GRANT EXECUTE ON DBMS_REDEFINITION TO scott;
GRANT ALTER ANY TABLE TO scott;
GRANT DROP ANY TABLE TO scott;
GRANT LOCK ANY TABLE TO scott;
GRANT CREATE ANY TABLE TO scott;
GRANT SELECT ANY TABLE TO scott;
GRANT CREATE ANY TRIGGER TO scott;
DECLARE
error_count pls_integer := 0;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS
('scott', 'cust', 'cust_int',
1, TRUE,TRUE,TRUE,FALSE, error_count);
   
DBMS_OUTPUT.PUT_LINE('errors := ' || TO_CHAR(error_count));
END;
/


#オンライン再定義をするための仮表をつくる(仮表はSecureFilesのLOBを持った表)
conn scott/tiger
CREATE TABLE cust_int
(c_id NUMBER NOT NULL,
c_zip NUMBER,
c_name VARCHAR(30) DEFAULT NULL,
c_lob CLOB
)
LOB(c_lob)
STORE AS SECUREFILE (NOCACHE FILESYSTEM_LIKE_LOGGING);

#元表と仮表の列名の紐づけを行う。
#col_mappingが長いので変数化して外だししているっぽい。

DECLARE
col_mapping VARCHAR2(1000);
BEGIN
col_mapping :=
'c_id c_id , '||
'c_zip c_zip , '||
'c_name c_name, '||
'c_lob c_lob';
DBMS_REDEFINITION.START_REDEF_TABLE('scott', 'cust', 'cust_int', col_mapping);
END;
/

#依存オブジェクト(索引や権限など)をコピーする。
マニュアルではCONS_ORIG_PARAMSという定数を使っているが、値=1(索引コピーしますという意味)なので
最初から1を入れておく。なので、

DECLARE
error_count pls_integer := 0;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS
('scott', 'cust', 'cust_int',
1, TRUE,TRUE,TRUE,FALSE, error_count);
   
DBMS_OUTPUT.PUT_LINE('errors := ' || TO_CHAR(error_count));
END;
/

#エラーがあるか確認
select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS where BASE_TABLE_NAME='SCOTT.CUST';
SYS@PROD1 > select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS where BASE_TABLE_NAME='CUST';

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


#再定義を完了
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('scott', 'cust', 'cust_int');

#変換できたか確認
select TABLE_NAME,SECUREFILE,COLUMN_NAME from user_lobs


TABLE_NAME                     SEC COLUMN_NAME
------------------------------ --- ------------------------------
CUST_INT                       NO  C_LOB
CUST                           YES C_LOB



<全体的な参考箇所>
Oracle® Database SecureFilesおよびラージ・オブジェクト開発者ガイド
4 Oracle SecureFiles LOBの使用
http://docs.oracle.com/cd/E16338_01/appdev.112/b56263/adlob_smart.htm#BABDIEGE

2012年7月7日土曜日

デリバティブについて勉強メモ

完全に「ノリ」で、デリバティブを勉強してみる。

#一応ルーツはあるんだけど。。。
#高校生のときは金融工学とかに結構興味があって、そういうところを志望校にしてたんだけど、大学入って気分が変わった。。。笑

*************************


デリバティブの概要
金融派生取引とも呼ぶ。
元となる金融取引(対象取引or対象資産)を派生
大きくわけて以下の3つに分類できる

  1. フューチャーズ(先物取引)→将来売買することを前もって約束する取引
  2. オプション取引→将来売買する権利を前もって売ったり買ったりする取引
  3. スワップ取引→経済価値の等しいキャッシュフローをあらかじめ取り決めた条件に従い、一定期間お互いが交換する取引


*************************



デリバティブの効果1〜リスクヘッジ
不確実な将来の価格を現時点で確定できる。収益を安定させることができる。→これをリスクヘッジという。
リスク(危険)+ヘッジ(損失や不利を避けるために先物で買っとく)
投機(Speculation)にも利用可能。
例えば6ヶ月後に欲しいものがあれば、現時点での原価を確定させる
50円と決めておいたとして、購入時点で100円に値上がりしてれば、50円の利益をゲットできる。
逆に購入時点で20円に値下げしてたら、30円損するけど。
リスクヘッジと投機は動機が違うだけで、行為(=先物を買う)は一緒



*************************


リスクヘッジについて
ヘッジ対象取引(=国債取引とか)+デリバティブ取引がワンセット
例えば国債。先物(=デリバティブ)の価格と現物取引はほぼパラレル
現物取引は100円→90円に下がったとする
80円に下がるであろう先物取引を100円のときに売っておく
そうすると現物取引で10円損しているが、先物取引で将来的には20円得するようになっている。つまりトータルで10円得


*************************



デリバティブの効果2〜レバレッジ
少ない投資金額で大きな取引ができることを指す
証拠金(Margin)を積むことで、現物取引に必要な資金と比べたら遥かに少ない少額の資金で取引ができる

*************************



自分的に、何かにまとめるときにスライドを使うのが好きなのでそうしてみたってだけなんですが、だったら図かなにか入れろって話ですね。はい。次回から。

【参考〜本記事を書くにあたり、以下のページ・文献を参照しました】

Oracle Master Gold 11g 合格メモ



6月下旬に、Oracle Master Gold 11g に合格したので、メモ。

<勉強期間>
Silverに合格してから、1ヶ月。
すぐにGoldの参考書を買い、研修を予約し、Gold受験の準備に入りました。


<研修>
受講したのはこちら。Gold受ける人はだいたいこれっぽい。
受講者全員、Goldこれから受けようとしていた人でした。
Oracle Database 11g: 管理ワークショップ II

「講義→演習」の流れで5日間。
この教材をみると、市販参考書はこの研修教材を参考にしてつくったんだなとしみじみ感じます。

演習では、データファイル壊してリカバリしたり、パッチをあえて削除してアラート吐いた事を確認するなどなど。
自作自演でトラブル起こして自分で消火をします。
手順が全部書いてあるので、それを見ればできるといえばできるのですが、自分が今なにやっててどういう意味があるのかを考えないと身に付きません。ま、なんでもそうか。

#あとから聞いた話ですが、やはり研修はオラクルが青山でやっているのが一番いいらしい。いろんな研修会社もこのワークショップを担当してますが、やはりオラクル製品はオラクルで学ぶのが良いみたい。


<勉強法>
①教科書としては以下の参考書を利用。

オラクル認定資格試験対策書】ORACLE MASTER Gold[Gold DBA11g](試験番号:1Z0-053)完全詳解+精選問題集 (オラクルマスタースタディガイド)

オラクルマスター教科書 Gold Oracle Database DBA11g編 (試験番号:1Z0-053)

Goldは「問題集」がないので、それぞれの章末問題をやりました。
巻末に「模擬試験」がついていて、2冊から合計3回分をやりました。
受験前の、かなり土壇場にやったので正答率は55〜60くらい。合格ラインは65%なので、届いてませんでした。。。

なので、テスト前はミスった問題をノートにまとめて必死に頭の中を整理しました。

②上記とは別に、Oracleの研修(=管理ワークショップ2)でゲットした教材PDFをiPadに入れて、通勤中などに見てました。
このPDFはなかなかいい感じで、結構役立ちました。


<試験>
バックアップ/リカバリとフラッシュバック機能の話が盛りだくさん。

バックアップ/リカバリは、研修でもかなり時間を割いて重点的にやったので、そこまで苦労しませんでしたが、フラッシュバック機能の整理がちょっとできてなかったので、間違えまくりました。たぶん。

#受験後に渡されるスコアシートに間違えた問題のジャンルが書いてあるんですが、そこの8割くらいが「フラッシュバック機能」に関するものでした。。

フラッシュバック機能については、①前提条件はなにか ②使用するデータは何か(=UNDO?ごみ箱?)の2つを押さえておけばどうにかなるんじゃないかという感触です。

バックアップ/リカバリについては、
「Silverで概要固めたのでそれを具体的にコマンドで書くとどういう順番でしょうか?」
っていう問題が大半です。


結果は、正答率67%で合格でした。


次も頑張ります。

2012年6月17日日曜日

Oracle Master Silver 11g 合格メモ


5月下旬に、Oracle Master Silver 11g に合格したので、メモ。

<勉強期間>
だらだらと3ヶ月。。実質1ヶ月くらい。
→Bronze取ったのが12月で、そこからLPICに浮気をしたため、Oracleの知識を復活させるのに少々時間がかりました。

<勉強法>
教科書としては以下の参考書を利用。

【オラクル認定資格試験対策書】ORACLE MASTER Silver[Silver DBA11g](試験番号:1Z0-052)完全詳解+精選問題集 (オラクルマスタースタディガイド) [単行本]

1章ずつ読んで、ノートにまとめなおして、電車の中とかで見返す。。を繰り返し。
EMのキャプチャが非常に多いのでとんでもない分厚さになっていますが、説明は割合丁寧に書かれているので、理解しやすい1冊でした。
演習問題もついています(1章につき10〜15問)。
ただしこれだけの演習量では足りない気がしたので、以下の問題集も使用しました。

徹底攻略ORACLE MASTER Silver DBA11g 問題集[1Z0-052J] (ITプロ/ITエンジニアのための徹底攻略) [単行本]

出版社が違うので、ページとか章分けに100%互換性があるわけではありませんが、だいたい同じです。
むしろ、視点がちょっとずつ違っているので勉強にもなりました。
重要だと強調する部分が同じだった場合も、「あ、ここは本当に大事なんだなー」とわかるので、ますます勉強になります。

問題演習は1.5週程度です。ちょっと足りないかなとも思いつつ、受験しました。


<試験>
バックアップ/リカバリの話が多かったです。

Bronzeでは相当ざっくりな内容を聞かれますが、Silverではもう少々つっこんだところが聞かれます。ただしコマンドレベルでの質問ではなく、あくまで「定義」とか「手順」などが特に聞かれたかなーという印象です。

定義はしっかり覚えるとして、手順に関してはだいたい理にかなっています。
(このファイルはこういう特性があるから、こういう操作をしなければいけない(というかそれしかできない)とか)
たまに「こういう仕様です」っていうのもありますけど、そこはまあ置いといて。
とにかく定義を覚えて理屈を抑えれば、Silver合格はできるかなと感じました。


#変な話、実機を一度もいじったことなくても頑張れば合格すると思います。
#逆にSilver合格したからといって、Silverの参考書に書かれているあんなことやこんなことが全て自力でできるかと言われるとハッキリ言って無理です。少なくとも私は無理です。

あと余談ですが、ネットワークがいけないのかPCのスペックがいけないのか、「次の問題」をクリックしてもなかなかページが切り替わらずちょっと焦りました(クリックしすぎてもなんか嫌だし。。)


結果は、正答率69%で合格でした。


次も頑張ります。

2012年5月2日水曜日

curlコマンド便利!


ギガバイト級のファイルをダウンロードするとき、ブラウザからやってみるとなんとなく嫌だったのでコマンドでどうにかできないかと模索していたのでメモ。
wgetでも良かったが、今回はcurlというものを使ってみた。便利!
#OS X限定のようですが、、、、

あ、以下の説明では
△=半角スペース としています。

#ファイルをダウンロードする
curl△-O△URL


#例。というか実際やったコマンド(Windows8のisoイメージダウンロード)

curl△-O△http://iso.esd.microsoft.com/(中略)Windows8-ConsumerPreview-32bit-Japanese.iso


で、さらに便利、というか多用しまくったのがこちら。

#中断したダウンロード再開
curl△-C△-△-o△ファイル名△URL


#例。というか実際やったコマンド(一度中断したWindows8のisoイメージダウンロード)
curl△-C△-△-o△Windows8-ConsumerPreview-32bit-Japanese.iso△http://iso.(中略)〜se.iso

イーモ○イルなど無線な環境でやっているとどうしてもネットワークが不安定だったら制限かけられて、途中で切れるのです。。。それがこのコマンドなら、切れても続きからできるので便利です。
(これに気づくのにかなり時間がかかって、相当ロスしました。。。)


以下にリンクを載せたページをみると、正規表現的なものを使って、一気にファイルを落としたり、アップロードもできるらしい。便利。。。

【参考にさせていただいたページ】