オラクる。

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

2015年02月

Windows Serverのライセンス認証はオフラインでも電話さえあれば行なうことが出来ます。
2012を例にオフラインでのライセンス認証方法を確認してみます。

ILMT000000

オンラインの場合、サーバマネージャからプロダクトIDのリンクをクリックして、プロダクトキーを入力します。
キーの入力後、すぐにオンラインでの認証が始まります。

ILMT000002

ただし、オフラインの場合「このキーは使用できません」と出力されます。
(使用できないのではなく、インターネットに接続できないだけなのだが・・・)

ILMT000003

オフラインの場合、コマンドラインから「slmgr -ipk <プロダクトキー>」を実行することでプロダクトキーを登録します。

ILMT000004

登録後、上記のようなメッセージが出力されます。

ILMT000005

登録後、電話によるライセンス認証を行なうためにslui 04を実行します。

ILMT000008

国を選んで「次へ」をクリックします。

ILMT000009

表示される電話番号に電話をかけて、インストールIDを伝えます。

ILMT000010

電話で伝えられる確認IDを入力して、「ライセンス認証」ボタンをクリックでライセンス認証が完了です。

expdpでエクスポートしたデータはimpdpでインポートすることが出来ます。
またインポートする際に、スキーマを変更したり、表名を変更したりするように設定することが出来ます。

[oracle@test01 export]$ impdp system/password DIRECTORY=TEST_DIR DUMPFILE=hrexp1.dmp LOGFILE=hrimp1.log REMAP_SCHEMA=hr:tiger TABLES=hr.regions

Import: Release 11.2.0.1.0 - Production on 水 2月 25 00:29:29 2015

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
マスター表"SYSTEM"."SYS_IMPORT_TABLE_01"は正常にロード/アンロードされました
"SYSTEM"."SYS_IMPORT_TABLE_01"を起動しています: system/******** DIRECTORY=TEST_DIR DUMPFILE=hrexp1.dmp LOGFILE=hrimp1.log REMAP_SCHEMA=hr:tiger TABLES=hr.regions
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
. . "TIGER"."REGIONS"                           5.476 KB       4行がインポートされました
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/INDEXの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
ジョブ"SYSTEM"."SYS_IMPORT_TABLE_01"が00:29:32で正常に完了しました


「REMAP_SCHEMA=hr:tiger」でスキーマをhrからtigerに変更しています。
また、「TABLES=hr.regions」はエクスポートデータからregions表を抜き出すという意味です。

SQL> select owner,table_name from dba_tables
  2  where owner = 'TIGER';

OWNER                TABLE_NAME
-------------------- --------------------
TIGER                REGIONS


TIGERスキーマにregions表がインポートされたことを確認しています。

Data Pumpを利用することによって、データベースのデータを高速にエクスポートしたりインポートすることが出来ます。
今回はData Pumpを利用したエクスポート、インポートの手順を確認します。
まずはエクスポートから
データベース全体、スキーマ、表単位とエクスポートする範囲を指定できますが、今回はスキーマを指定しています。

[oracle@test01 ~]$ mkdir /tmp/export

Oracleユーザーでログインして、エクスポートの保管先ディレクトリを作成します。

[oracle@test01 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 火 2月 24 00:14:13 2015

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



Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
に接続されました。
SQL> CREATE DIRECTORY test_dir AS '/tmp/export';

ディレクトリが作成されました。


Data Pumpではディレクトリの指定をディレクトリオブジェクトで行ないます。
そのため、先ほど作成したディレクトリからディレクトリオブジェクトを作成しています。

SQL> SELECT * FROM DBA_DIRECTORIES;
OWNER      DIRECTORY_NAME                 DIRECTORY_PATH
---------- ------------------------------ ------------------------------
SYS        TEST_DIR                       /tmp/export

(省略)


ディレクトリオブジェクトが作成されていることをDBA_DIRECTORIESビューで確認しています。

SQL> GRANT read,write on directory TEST_DIR to hr;

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


作成したディレクトリオブジェクトに対して、読み取りと書き込みのアクセス権を与えています。

[oracle@test01 ~]$ expdp hr/hr DIRECTORY=TEST_DIR SCHEMAS=hr DUMPFILE=hrexp1.dmp LOGFILE=hrexp1.log

Export: Release 11.2.0.1.0 - Production on 火 2月 24 00:41:06 2015

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
"HR"."SYS_EXPORT_SCHEMA_01"を起動しています: hr/******** DIRECTORY=TEST_DIR SCHEMAS=hr DUMPFILE=hrexp1.dmp LOGFILE=hrexp1.log
BLOCKSメソッドを使用して見積り中です...
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
BLOCKSメソッドを使用した見積り合計: 512 KB
オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型SCHEMA_EXPORT/SEQUENCE/SEQUENCEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/INDEXの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/COMMENTの処理中です
オブジェクト型SCHEMA_EXPORT/PROCEDURE/PROCEDUREの処理中です
オブジェクト型SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDUREの処理中です
オブジェクト型SCHEMA_EXPORT/VIEW/VIEWの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TRIGGERの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
. . "HR"."COUNTRIES"                            6.367 KB      25行がエクスポートされました
. . "HR"."DEPARTMENTS"                          7.007 KB      27行がエクスポートされました
. . "HR"."EMPLOYEES"                            16.81 KB     107行がエクスポートされました
. . "HR"."JOBS"                                 6.992 KB      19行がエクスポートされました
. . "HR"."JOB_HISTORY"                          7.054 KB      10行がエクスポートされました
. . "HR"."LOCATIONS"                            8.273 KB      23行がエクスポートされました
. . "HR"."REGIONS"                              5.476 KB       4行がエクスポートされました
. . "HR"."REGIONS2"                             5.476 KB       4行がエクスポートされました
マスター表"HR"."SYS_EXPORT_SCHEMA_01"は正常にロード/アンロードされました
******************************************************************************
HR.SYS_EXPORT_SCHEMA_01に設定されたダンプ・ファイルは次のとおりです:
  /tmp/export/hrexp1.dmp
ジョブ"HR"."SYS_EXPORT_SCHEMA_01"が00:41:52で正常に完了しました

早速、エクスポートを実施しています。
実行ログファイルは「LOGFILE=」で指定したファイルに書き込まれます。

表をコピーしたい場合、CREATE TABLE文にAS SELECT * FROM 表名を付与します。

SQL> SELECT * FROM regions;

 REGION_ID REGION_NAME
---------- ---------------------------------------------------------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa


regionsという表をコピーして新規にregions2という表を作成します。

SQL> CREATE TABLE regions2 NOLOGGING PARALLEL
  2  AS SELECT * FROM regions;

表が作成されました。


regionsのコピーであるregions2表が作成されました。
なお、NOLOGGING PARALLELを付与することで高速に表を作成できます。

SQL> SELECT * FROM regions2;

 REGION_ID REGION_NAME
---------- ---------------------------------------------------------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa


データもコピーされています。
なお、AS SELECT~にWHERE 1 <> 1という条件式を付与することで表の構造だけをコピーすることが出来ます。

SQL> SELECT constraint_name,constraint_type,table_name,status FROM user_constraints
  2  WHERE table_name = 'REGIONS';

CONSTRAINT_NAME      CON TABLE_NAME           STATUS
-------------------- --- -------------------- ------------------------
REGION_ID_NN         C   REGIONS              ENABLED
REG_ID_PK            P   REGIONS              ENABLED

SQL> SELECT constraint_name,constraint_type,table_name,status FROM user_constraints
  2  WHERE table_name = 'REGIONS2';

CONSTRAINT_NAME      CON TABLE_NAME           STATUS
-------------------- --- -------------------- ------------------------
SYS_C0012243         C   REGIONS2             ENABLED


データはコピーされましたが、primaryキー制約に関してはコピーされません。
NOT NULL制約はコピーされています。

SQL> SELECT index_name, table_owner, table_name, status FROM user_indexes
  2  WHERE table_name = 'REGIONS';

INDEX_NAME           TABLE_OWNER          TABLE_NAME           STATUS
-------------------- -------------------- -------------------- ------------------------
REG_ID_PK            HR                   REGIONS              VALID

SQL> SELECT index_name, table_owner, table_name, status FROM user_indexes
  2  WHERE table_name = 'REGIONS2';

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


INDEXも同様にコピーされていません。
CREATE文の実行後に対処する必要があります。

デッドロックの再現実験をやってみます。
デッドロックとはお互いがロックされているデータのロックが解除されるのを待っている状態です。 

例えばセッションAとセッションBという2つのセッションが存在していたとします。

セッションA

SQL> select * from hr.regions;

 REGION_ID REGION_NAME
---------- ---------------------------------------------------------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa

SQL> UPDATE regions SET region_name='aaa'
  2  WHERE region_id=1;

1行が更新されました。

SQL> select * from hr.regions;

 REGION_ID REGION_NAME
---------- ---------------------------------------------------------------------------
         1 aaa
         2 Americas
         3 Asia
         4 Middle East and Africa 

UPDATE文により「region_id=1」がロックされました。

セッションB

SQL> select * from hr.regions;

 REGION_ID REGION_NAME
---------- ---------------------------------------------------------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa

SQL> UPDATE regions SET region_name='bbb'
  2  WHERE region_id=2;

1行が更新されました。

SQL> select * from hr.regions;

 REGION_ID REGION_NAME
---------- ---------------------------------------------------------------------------
         1 Europe
         2 bbb
         3 Asia
         4 Middle East and Africa
 
UPDATE文により「region_id=2」がロックされました。
 
セッションA

SQL> UPDATE regions SET region_name='aaa'
  2  WHERE region_id=2; 

UPDATEにより「region_id=2」をロックしようとしますが、すでにセッションBによりロックされているので待ちが発生します。

セッションB

SQL> UPDATE regions SET region_name='bbbb'
  2  WHERE region_id=1; 

UPDATEにより「region_id=1」をロックしようとしますが、すでにセッションAによりロックされているので待ちが発生します。 

お互いがお互いのロック解除を待っている状態です。
いずれのセッションもトランザクションを終了できず、ロック競合を解消できません。
→デッドロックの発生です。
 
セッションA

SQL> UPDATE regions SET region_name='aaa'
  2  WHERE region_id=2;
UPDATE regions SET region_name='aaa'
       *
行1でエラーが発生しました。:
ORA-00060: リソース待機の間にデッドロックが検出されました。

SQL> select * from hr.regions;

 REGION_ID REGION_NAME
---------- ---------------------------------------------------------------------------
         1 aaa
         2 Americas
         3 Asia
         4 Middle East and Africa

SQL> rollback;

ロールバックが完了しました。

デッドロックが発生した場合、最後のセッション(セッションB)でロックしようとしている行をロックしているセッション(セッションA)でエラーORA-00060が発生します。
結果として、セッションAの最後のSQL文がロールバックされます。
また、トランザクション全体をコミット、ロールバックすることでセッションBのロック待ちが解除されます。

セッションB

SQL> UPDATE regions SET region_name='bbbb'
  2  WHERE region_id=1;

1行が更新されました。

SQL> select * from hr.regions;

 REGION_ID REGION_NAME
---------- ---------------------------------------------------------------------------
         1 bbbb
         2 bbb
         3 Asia
         4 Middle East and Africa 

セッションAのrollback後、セッションBのロック待ちが解除され、UPDATE文が完了しました。

このページのトップヘ