たきるブログ

C#やOracleなどの情報を書いています。

【VMware】起動タイミングをいじったりブートメニューやBIOS起動

vmwareで仮想OSを起動する際、BIOSをいじってブート順序を変更したかったりする場合、こんな感じにする。

BIOSを起動させたい】
vmwareで仮想OSを起動した瞬間、仮想OSをクリックしてアクティブ状態にし、F2を押す。

【ブートメニューを起動させたい】
vmwareで仮想OSを起動した瞬間、仮想OSをクリックしてアクティブ状態にし、ESCを押す。

で、これが大変。起動が速すぎて、間に合わない。
そこで、vmxファイルに、必要に応じて以下を追加することで素敵になれる。

【ブートをnミリ秒待つ(例は5秒)】

bios.bootDelay = "5000"

【ブート時、必ずBIOSメニューを起動させる】

bios.forceSetupOnce = "TRUE"

正直、これに凄い助かった。

【ツール】Oracle テーブル定義の抽出とINSERT文の生成

随分前に、Oracleのテーブル定義の抽出と、そこからINSERT文を生成するマクロを作っていたので、アップしておきます。

アップしていたと思っていたのに、アップしていなかった・・・。



作った経緯は、ネット接続不可、定められたアプリケーションのインストール以外は不可、みたいな環境。
INSERT文をちまちま書くのが面倒だし、そんな環境だからレコードの投入もいちいちsqlplusを使わないとダメだとか、不便で原始的な状態を脱したかった為です。
今は色んなツールがあるし、そういう環境が特殊かもしれませんが、似たような環境下にいる方には、意外と使えます。

  • ExcelOracleのテーブル定義を抽出できる!
  • Oracleのレコードをグリッドで残しておける!
  • グリッドに入っているデータからINSERT文を生成できる!

たったそんだけ、と思うかもしれませんが、意外とそれが出来ない環境よりよっぽど捗りますよ。
と言っても、ネットに繋がらないと、このツールのダウンロードすらままならないわけですが・・・。
微妙にシートクリア処理にバグがありますが、ご愛嬌で。
Oracle テーブル項目定義取得・INSERT文生成

※oo4oのインストールが必須です。

【Oracle】Oracle Instant Client をセットアップするバッチを作った

Oracle Instant Client をセットアップする時に、いちいちオペレーションするのが面倒だったのでバッチ実行できるようにした。

UnZipとFastCopyの力を借りて、バッチ一発実行でOK!
ライセンス上、問題があるならご連絡ください。

一応、環境変数の設定も調べまくって、少しは融通の利いたものになってます。

【内容】

  • Instant Client を任意のディレクトリに配置します。
  • tnsnames.oraを任意のディレクトリに配置します。
  • システム環境変数にNLS_LANG、TNS_ADMIN、PATHを設定します。(Administrators権限を要します。)

【システム要件】

【問題】

  • 指定したディレクトリに半角スペースが含まれるとダメ。
    (どうしてもしたいようならパスを処理してるところをダブルクォーテーションで括ってね☆
    それでもAdministrators権限がないユーザーで実行すると環境変数の設定部分が正確なパスを渡せずダメだと思う。)
  • ソースが汚い。

Oracle Instant Client セットアップ

【Oracle】Oracleの使用メモリ容量、SGA容量を変更するのと、トラブルシューティング

DBAの知識ないから、DBの設定ぶっ壊して、1から入れなおしかなーなんて思える状態から脱却できたので、メモっておこう!


SGAの現在のメモリ割当を確認。

sqlplus / as sysdba
show parameter sga_;
NAME TYPE VALUE
------------- ------------ -------
sga_max_size big integer 2G
sga_target big integer 2G

ここで、以下のように容量変更を実行するのはダメ。

sqlplus / as sysdba
alter system set sga_max_size = 4G scope=spfile;
alter system set sga_target = 4G scope=spfile;

なぜなら、メモリの物理的な割当を超過したSGAを設定すると、壊れる
以下を実行し、memory_max_target、memory_targetがそれにあたる。
メモリ割当容量を変更する場合には、この物理的な割当容量を確認する手順は必須だ。

sqlplus / as sysdba
show parameter memory_;
NAME TYPE VALUE
------------------------- ------------ --------
hi_shared_memory_address integer 0
memory_max_target big integer 3G
memory_target big integer 3G
shared_memory_address integer 0

MEMORY_MAX_TARGETMEMORY_TARGETの説明によると、MEMORY_TARGETがOracleが利用するメモリ割当量で、その範囲内でSGAやPGAを設定する。
つまり、いきなりSGAのメモリ割当量を変更し、MEMORY_TARGET割当量≦SGA割当量となると、設定としてはNGだ。

よって、まず変更すべきはSGAではなくMEMORY_TARGETだ。
また、SGAに4GBを割り当てたいなら、MEMORY_TARGETは4GBより大きくなければならない
それぞれの項目の説明はSGA_MAX_SIZESGA_TARGETを参照してほしい。

sqlplus / as sysdba
alter system set memory_max_target = 5G scope=spfile;
alter system set memory_target = 5G scope=spfile;

そのあとにSGAを変更する。

sqlplus / as sysdba
alter system set sga_max_size = 4G scope=spfile;
alter system set sga_target = 4G scope=spfile;

んでインスタンス再起動

sqlplus / as sysdba
shutdown immediate
startup

これで、Oracleで利用する物理メモリ容量の増加と、SGA容量の増加を行える。



で、これから俺がやらかした状態と、解消手順。
壊した経緯

  1. もともと物理的に1.6GBくらいしか割り当ててない。
  2. 物理割当を確認せずにSGAを4GBに変更。
  3. インスタンスの再起動ができなくなる。

再起動すると、こんなメッセージが。

ORA-00844: Parameter not taking MEMORY_TARGET into account
ORA-00851: SGA_MAX_SIZE 4294967296 cannot be set to more than MEMORY_TARGET 1690304512.

SGA_MAX_SIZEがMEMORY_TARGETを超えてんぞコラってことみたい。
こうなると、もうインスタンスへの接続もできないので、以下の手順を踏まないと直せない。

  1. spfileからpfileを生成する。
    sqlplus / as sysdba プラガブルの場合、コンテナを指定する必要がある。 sqlplus /@コンテナ名 as sysdba
    create pfile from spfile;
    %ORACLE_HOME%\database\INIT<SID>.ORAが作成されます。
    %ORACLE_HOME%は、11gのデフォルトなら「D:\app\Administrator\product\11.2.0\dbhome_1」とかで、
    INIT<SID>.ORAは、インスタンス名が「HOGE」なら「INIThoge.ORA」ってファイルがある。
  2. INIT<SID>.ORAをテキストエディタで編集する。
    以下では、MEMORY_TARGETを5GB、SGAを4GBに設定してみる。
    <SID>.__sga_target=4294967296
    *.memory_target=5368709120
    *.sga_max_size=4294967296
    *.sga_target=4294967296
  3. INIT<SID>.ORAを利用してインスタンスを起動する。
    注意する点は、指定するのはファイル名だけではなくてフルパスで指定する。
    sqlplus / as sysdba
    startup pfile="D:\app\Administrator\product\11.2.0\dbhome_1\database\INIT<SID>.ORA"
  4. 起動できたら、pfileの設定をspfileに書き戻す。
    注意する点は、指定するのはファイル名だけでいい。
    / as sysdba
    create spfile='SPFILE<SID>.ORA' from pfile='INIT<SID>.ORA';
  5. んでいつも通りのインスタンスの再起動をしてみて、起動すればOK。
    sqlplus / as sysdba
    shutdown immediate
    startup

【Oracle】Oracleで、データポンプによるエクスポート(expdp)、インポート(impdp)

いっつもOracle10gから追加されたデータポンプによるエクスポート・インポートのやり方を忘れるのでメモしとく!

準備として、処理を行うディレクトリが登録されていないとダメ。
SYSTEMユーザーなどで以下のようにディレクトリを切る。

CREATE OR REPLACE DIRECTORY BACKUP_DIR AS 'D:\Backup';

エクスポート
(スキーマhogeの全オブジェクトをtest.dmpにエクスポートする。同名のファイルがあったら上書きする)

expdp system/manager@service DUMPFILE=test.dmp DIRECTORY=BACKUP_DIR SCHEMAS=hoge REUSE_DUMPFILES=YES

インポート
(スキーマhogeのエクスポートデータをスキーマtestにインポートする)

impdp system/manager@service DIRECTORY=BACKUP_DIR DUMPFILE=test.dmp REMAP_SCHEMA=hoge:test

インポートの際、インポート先のスキーマは存在しなくてもインポートできて、勝手に対象スキーマが作成される。
が、パスワードが何だか分からない状態(ランダムに生成されてる?)になるので、インポートが終わったらパスワードを変更しよう。

【WSH】WSHで環境変数を操作する

setx.exeが全く使い物にならない為、WSHによる実行が最適だという判断に至り、作成しました。

WindowsXPのsetx.exeを入手する方法

  1. Windows XP Service Pack 2 サポート ツールからWindowsXP-KB838079-SupportTools-ENU.exeをダウンロードする。(Windows正規品チェックが必要)
  2. WindowsXP-KB838079-SupportTools-ENU.exeを、WinRARなどの解凍ツールを使って解凍する。
  3. 解凍されたファイルにsuptools.msiというのがあるので、msiexecコマンドでsuptools.msiを解凍する。
    msiexec /a suptools.msi targetdir="C:\hoge" /qn
    ※targetdirは、解凍先ディレクトリを指定する。
  4. 解凍されたファイル群に、setx.exeがあるので、必要な場所へコピーする。
    恒久的に利用したい場合は、C:\Windows\System32など、環境変数PATHが通っている場所へ置く。

使い方

ユーザー環境変数を設定したい場合
setx 変数名 値
システム環境変数を設定したい場合
setx 変数名 値 -m

Windows7のsetx.exeとの違い

システム環境変数を指定するパラメータなどの指定方法が異なる。
WindowsXP用だと、ハイフンで指定するのに対し、Windows7用のだとスラッシュで指定する。
大文字/小文字も違う。
WindowsXP用 setx 変数名 値 -m
Windows7用  setx 変数名 値 /M

setx.exeが使い物にならない理由

  • 値が1024文字を超える環境変数を設定することができない。(超過分は切り捨てられる)
  • 値が「\」で終わると正しくコマンドが実行されない。(ユーザー環境変数におかしな値で設定される)
  • バッチで実行するが故に、環境変数名の値が全て展開される。
    例えば、元々PATHには%SYSTEMROOT%と登録されている状態で、setx PATH %PATH% -mとすると、設定される値はC:\Windowsになる。

WSHがいい理由

  • WindowsXPの場合、Windows7の場合と、切り分けて動作させる必要がない。
  • setx.exeでダメな部分が全て解消される。
  • わざわざバッチ処理だけにこだわらなくても動作する。(WindowsXP SP3, 7×86, 7×64で確認済み)



ということで、環境変数WSHで操作しましょう。
バッチから呼び出せば済む話です。
環境変数設定スクリプト