2011-01-20

Hyper-V ゲスト OS 用仮想ハードディスクが膨れ上がって大慌て (イベントID 16060)

Hyper-V のゲスト OS が一斉に一時停止になってさあ大変

 Hyper-V のゲスト OS から共有しているフォルダにアクセスしようとすると、ネットワークリソースにアクセスできないという旨のメッセージが出ました。



 そこで、Hyper-V マネージャーを見てみると、すべてのゲスト OS が一時停止状態となっていたため、イベントビューアを調べてみると、以下のエラーが記録されていました。
 このエラーは、イベントビューアより、「アプリケーションとサービスログ」→「Microsoft」→「Windows」→「Hyper-V-VMMS」から参照することができます(イベントID 16060)。




 どうやら、ゲスト OS 用に割り当てた仮想ハードディスク (.vhd) が膨れ上がってしまい、ハードディスクの空き容量が少なくなってしまったたために、登録されているすべてのゲスト OS が Hyper-V の 仮想マシン管理サービスプロセス(VMMS)によって一時停止状態となったようです。

 仮想ハードディスクが膨れ上がった原因を調べてみると、次のことがわかりました。

  1. 仮想ハードディスクの形式が可変になっていた。

  2. スナップショットが複数存在していた


 上記のために、いつの間にか膨れ上がった仮想ハードディスクが実際のハードディスク領域を圧迫していた模様です。

こうなったら仮想ハードディスクを固定にするしかない

 限りあるコンピュータ資源であるハードディスクの空きがあまりないということで、今回のような現象が発生すると、これ以上仮想ハードディスクが膨らまないように対応するしかありません。

 仮想ハードディスクの形式を可変から固定に変換すれば、ディスク容量はそれ以上は大きくなりません。
 仮想ハードディスクの形式を可変から固定に変換する作業自体はそれほど難しくはないのですが、スナップショットが存在する場合は、先にスナップショットを親仮想ディスクに結合しなければなりません。

 以下のような仮想ハードディスク構成になっているとします。

Windows Server 2000 x86.vhd <--- 親仮想ディスク
  Windows Server 2000 x86[ユニークID].avhd <--- 差分仮想ディスク1
  Windows Server 2000 x86[ユニークID].avhd <--- 差分仮想ディスク2
  Windows Server 2000 x86[ユニークID].avhd <--- 差分仮想ディスク3(最新)

 上記で.avhd がスナップショットで作成される差分仮想ハードディスクとなります。
 このように、一つでも差分仮想ハードディスクが存在する場合は、ディスク形式を変換する前に親ディスクにディスクを結合しなければならなくなりますので、注意が必要です。

 上記の例では 3 の差分仮想ハードディスクが最新となっていますので、3、2、1 の順に計 3 回の結合作業が必要となります(3 回結合が完了すると、Windows Server 2000 x86.vhd だけになる)。


差分仮想ハードディスクの結合方法

 差分仮想ハードディスクを親仮想ディスクに結合するには、ゲスト OS をシャットダウンしてから、ディスクを解除します。

1. Hyper-V マネージャより、当該のゲスト OS を選択して設定画面を開き、下図のように IDE コントローラーから仮想ディスクを削除し、“適用”ボタンをクリックします。



 「削除」という表現が紛らわしいですが、Hyper-V の管理下から解除されるという意味ですので、仮想ハードディスク自体はそのまま残ります。

2. 下図のように、Hyper-V のマシン名をマウスで右クリックするとサブメニューが開きますので、その中から「ディスクの編集(E)...」というメニュー項目を選択します。



 仮想ハードディスクの編集ウィザードが開きますので、以下のように最新の差分仮想ディスク(.avhd)を指定します。



3. 仮想ハードディスクに対するアクションを選択するための画面に移りますので、下図のように「結合(M)」を選択し、“次へ”をクリックします。



4. 差分ディスク変更の結合をするための画面に映りますので、下図のように「親仮想ハードディスクに結合する(P)」を選択し、“次へ”をクリックします。



5. 以下のような確認画面が表示されますので、この内容でよければ“完了(F)”をクリックします。
差分仮想ハードディスクが親仮想ハードディスクに結合されます。



注意)この手順を繰り返し、すべての差分仮想ハードディスクを親仮想ハードディスクに結合する必要がありますので、ディスク領域に余裕のあるハードディスク上でこの操作を行ってください。


仮想ハードディスクを最適化する

 上記で差分仮想ハードディスクがすべて結合されると、ディスクの中は下図のように仮想ハードディスクのみになります。



 仮想ハードディスクのサイズ形式を可変から固定に変換する前に、以下の手順で仮想ハードディスクを最適化することによって、不使用の領域を取り除いておくことをお勧めします。


1. 下図のように、Hyper-V のマシン名をマウスで右クリックするとサブメニューが開きますので、その中から「ディスクの編集(E)...」というメニュー項目を選択します。



2. 仮想ハードディスクの編集ウィザードが開きますので、先ほど結合した仮想ハードディスクを指定し、“次へ”をクリックします。



3. 仮想ハードディスクに対する操作のメニュー項目が表示されますので、その中から一番上の「最適化(C)」を選択し、“次へ”をクリックします。



4. 確認画面が表示されますので、操作内容が最適化になっていることと、指定した仮想ハードディスクが正しいことを確認してから、“完了”をクリックすると、仮想ハードディスクが最適化されます。



仮想ハードディスクのサイズ形式を可変から固定に変換する

 仮想ハードディスクを最適化した後は、サイズ形式を可変から固定に変換します。

1. 下図のように、Hyper-V のマシン名をマウスで右クリックするとサブメニューが開きますので、その中から「ディスクの編集(E)...」というメニュー項目を選択します。



2. 仮想ハードディスクの編集ウィザードが開きますので、先ほど結合した仮想ハードディスクを指定し、“次へ”をクリックします。



3. 仮想ハードディスクに対する操作のメニュー項目が表示されますので、その中から真ん中の「変換(V)」を選択し、“次へ”をクリックします。



4. 変換対象の仮想ハードディスクを選択するための画面に移りますので、先ほど最適化した仮想ハードディスクを選択してから、“次へ”をクリックします。



5. 確認画面が表示されますので、操作内容が「容量固定に変換」になっていることと、指定した仮想ハードディスクが正しいことを確認してから、“完了”をクリックすると、仮想ハードディスクのサイズ形式が固定に変換されます。




変換済みの仮想ハードディスクを Hyper-V のIDE コントローラに繋ぎ直す

 これで仮想ハードディスクのサイズ形式が固定になりましたので、Hyper-V の IDE コントローラに繋ぎ直して起動できれば操作は完了です。


1. Hyper-V マネージャより、当該のゲスト OS を選択して設定画面を開き、下図のように IDE コントローラーを左ペインで選択し、右ペインで「ハードドライブ」を選択してから“追加(D)”ボタンをクリックします。




2. 仮想ハードディスクファイルを選択する画面に移りますので、“参照(B)...”をクリックして先ほどサイズ形式を固定に変換した仮想ハードディスクを選択してから、“適用(A)”をクリックします。




3. IDE コントローラに仮想ハードディスクが適用されると、“適用(A)”ボタンが灰色反転しますので、“OK”をクリックします。



4. 今回適用したハードディスクを使ったゲスト OS を起動し、問題なく操作できれば完了です。


 今回の障害で得られた教訓は次のとおりです。

1) 最初に仮想ハードディスクを割り当てる際は、予想されるディスク容量の形式を固定にする。
2) スナップショットはある時点のシステム状態を再現するには便利な機能だが、仮想ハードディスク絡みのトラブルが発生して最適化や変換が必要になった場合に、すべてのスナップショットを一旦親ディスクに結合しなければならなくなるので、スナップショットを多用するのは得策とは言えない。

2011-01-17

『売上猫くん on MySQL』開発日記 - 番外21 - βリリースしまつた

ダウンロード再開しまつた。 MySQL 5.5 に対応させようとしましたが、簡単には修正できなさそう。当面は諦めモード。 ということで、本製品は、現段階では、MySQL 5.5 には非対応!ですので、ご注意ください。 (11/01/21 土屋追記)



最新版のMySQL 5.5で動作しないことが判明したため、一時ダウンロード停止! トホホ…(11/01/20 土屋追記)



ようやく「売上猫くん on MySQL 5.0」のβ版(フリーウェア)をリリースすることになりました。
売上明細のテーブルに200万程度のレコードを入れてテストを行っています。
現時点でできるかぎりの巨大テーブル対応と、ストアドプロシジャやトリガを使用した高速化を行っています。 200万行のテーブルがあっても、起動が若干遅いこと、起動後最初に売上明細テーブルにアクセスにいくと10秒位コーヒーマークがでる位で、使用できるレベルではないか、と思ってます。 1000万件クラスのテーブルになると、今以上の対策がいるかも知れないです。

ご興味のある方は下記からダウンロードしてくださいね。 

売上猫くん on MySQL 5.0βのサイト
http://www.tpc.jp/product/neko/50/index.htm

ダウンロードページ


尚、バージョンを 5.0 としているのは、FileMaker Pro 5/6 で作成した旧製品「売上猫くん 4.5」の機能のほとんどを継承しているからです。データベース(バックエンド)に MySQL を使用した猫くん製品は、これが最初となります。


2010-11-16

『売上猫くん on MySQL』開発日記 - 番外20 - ウィンドウ内容の再表示ステップ実行時のクエリ

SQLデータベースを使用時、あるユーザが行った更新は他のユーザの画面に即時反映されることは無い。他のユーザが更新を行ったか否かを確認するには、[ウィンドウ内容の再表示]ステップを使用するが、このステップには、「キャッシュ結合結果を書き込む」「キャッシュされたSQLデータ」という2つのオプションがある。 オプションによって、SQLデータベースに送られるクエリにはどういう違いがあるのか?

1.キャッシュ結合結果を書き込む/キャッシュされたSQLデータの両オプション選択時
SELECT ID,`〒`,`住所` FROM vw_zips WHERE ID IN(121013,121014,~) 等のクエリを発行、画面は更新される

2.キャッシュ結合結果を書き込のみ
クエリ実行されず、画面未更新

3.キャッシュされたSQLデータのみ
上記1と同様

4.オプション無
クエリ実行されず、画面未更新

FileMakerの[レコード]-[ウィンドウ内容の再表示]を実行すると、1と同じ結果となり、画面は更新される。


注:
  • Selectクエリの対象となるフィールドは、レイアウトテーブルの全フィールドと、そのレイアウト上の関連フィールドに限られる。 よって、関連フィールドの値を最新に更新したい場合は、そのフィールドをレイアウト上に明示的に配置しなければなならい点に要注意。
  • 他ユーザが追加したレコードについては、[ウィンドウ内容の再表示]ステップでは表示できない。追加されたレコードをSelcectするような検索を実行すること。
参考URL
http://www.filemaker.co.jp/help/html/scripts_ref2.37.9.html


2010-11-08

Windows 2008 R2 64 ビットで 32 ビット用の ODBC ドライバを動かす

 Windows Server 2008 R2 64 ビット環境で 32 ビット版用に開発された ODBC アプリケーション(例:FileMaker Server 11) は、通常の ODBC データソースアドミニストレーターからは参照することも使用することもできません。

 32 ビット用の ODBC データソースアドミニストレーターは以下のディレクトリに配置されています。

C:\Windows\SysWOW64\odbcad32.exe

たとえば、接続先のアプリケーションが 32 bit 版にしか対応していない場合は、odbcad32.exe を使用して ODBC 接続設定を行います。

2010-11-05

『売上猫くん on MySQL』開発日記 - 番外19 - FMで大きなSQLテーブルは扱えるのか? ― その4

前回は、FM社製のドキュメント(日本語版英語版)内の一文を引用し、それを小生なり解釈すると「他のフロントエンド開発ツールに比べるとFileMakerのESSはかなり限定されていること、また一見してFileMaker単体のシステムと同じ結果を返すように見えても異なることがある。ユーザはESSの限界と特性を意識して使用すべし」となる旨のことを書いた。これに加えて、同ドキュメントにもう一つ気になる文章がある。
    ESS は、FileMaker Pro ソリューションを、FileMaker Pro のみをベースにしたソリューションの限界を超えてスケールアップできる手段として設計されたものではありません。(ESS is not designed as a means to allow a FileMaker Pro solution to scale beyond the limits of a purely FileMaker Pro based solution.)
この一文は何のことを言っているのか? この日記番外シリーズにも書いたように、FileMakerソリューションであっても、当然ながら、SQLデータベースの多くの機能---ビュー、ストアドプロシジャ、トリガ、ログ照会、バイナリ/トランザクションログからのリカバリ等----FileMaker純正データベースエンジンでは不可能だった機能の恩恵に浴せる。この場合、主語を“ESS”ではなく“FileMaker”にすれば、「FileMaker Pro のみをベースにしたソリューションの限界を超えてスケールアップできる」のである。

とするとこの文は、「FileMaker純正データベースエンジンが実用的には(“論理的”にではない)取り扱うことができない大きなテーブルをSQLデータベースのそれに置き換えても、やはり実用的には取り扱うことはできない」と言っているのだと思われる。 タイトルにある「 FMで大きなSQLテーブルは扱えるのか?」という命題への直接否定のようだ。

直接否定だとすると、FileMakerの理論上、仕様上の限界はデータベース単位で8TBであるが、実用上の“限界”はどのくらいなのだろう? 古い記事だが、「(個人的な意見だがテーブルベースで)100万を超える位なら大丈夫だよ」とある。 小社でも数十フィールドあるFileMakerテーブルに100万~200万弱のレコードを収納して数年間、運用している。 200万レコード程度をFileMakerの“限界”と仮定すると、その“限界”を超えて、と主張するには、レコード件数的には400万レコード以上をテスト時の最大数とすれば十分だろうか。ちなみに、『売上猫くん on MySQL』のテスト環境で、いまのところ一番大きなテーブルのレコード数は約180万件である。

ただレコード件数をいくら増やそうとも、ユーザが強いストレスを感じたり、安定性が無いシステムでは“実用的”とは言えない。 “実用的”と言うには、その1とその2で書いたような問題をできる限り顕在化させてはいけない。問題6の激遅ソートは回避策がないので、ユーザによるカスタムソートの実用性は非常に低い。 その他の問題については、回避策を施したり、 運用で調整する(例えば、.fp7ファイルをサーバ上に置かず、ローカルに置く)ことにより、緩和できるものと判断している。 だが結局、「FileMaker Pro のみをベースにしたソリューションの限界を超えてスケールアップでき」たかどうかというのは、公正なエンドユーザの判断に拠る、としかいいようがない。

(土屋)

注:
「~限界を超えて~」については、上記の英文をキーにググってみたが(その3の参考URLを参照)、2007年当時は否定的な見方が優勢だった。 2008年以降は関連する記事を見つけることができなかった。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-11-04

『売上猫くん on MySQL』開発日記 - 番外18 - FMで大きなSQLテーブルは扱えるのか? ― その3

FileMaker のVer9リリース時位にFM社が作成した不思議なドキュメントがある。『Introduction to External SQL Sources』(邦題:外部SQLソース入門)というタイトルが付いており、日本語版英語版がある。 読んでみると、

    ESS 機能セットは、FileMaker Pro をSQL データソースの「フロントエンド」として利用できるようにすることを意図したものではありません。 (The ESS feature set is not intended to allow FileMaker Pro to act as a “front end” to SQL data sources.)

と、衝撃の1文がある。ハァ? SQLデータベースに接続してFileMakerを使用しようとする者ならだれてもFileMakerまたはFileMakerで作成したアプリ(.fp7)がSQLデータベースのフロントエンドとなる、と思っている筈だ。 試しに「filemaker フロントエンド」をキーにググってみると、そう確信して記事を書いている人がたくさんいることがわかる。ところが、FM社の公式見解は、FileMaker(のESS)は、
「フロントエンド」として利用できるようにすることを意図したものではない、のである。 では、FM社がESSとか呼んでる機能なんなの?、ということである。 小生はフロントエンドとは、「ユーザが操作する部分=ユーザインタフェイス」位に理解していたのだが、念のためググってみると、こんな感じである。

Wikipedia
フロントエンドは、ユーザーと直接やりとりするソフトウェアシステムの部分を指し、バックエンドはフロントエンドへの出力を生成する部分を指す

IT用語辞典バイナリ
フロントエンドは、一般的に、表示やデータ入力を行うための仕組みを指し、ユーザーインターフェースUI)と同義と同義で用いられることも多い。
IT用語時点
ユーザからの操作の受付や画面表示などを担当するGUI(グラフィカルユーザインタフェース)プログラムなどがこれに当たる。

元々の小生の理解と大差は無い。であれば“ESS”はバックエンド(データベース)を操作するためのユーザインタフェイス=フロントエンドと言ってもいい筈だ。ただのユーザインタフェイスなんだから。 にもかかわらず、「FileMaker はフロントエンドじゃないんだ!」と宣言するFM社の意図はなんなのだろう?

ユーザはこの文章についてどう思っているのかと思いググってみたが、それらしき記事は日本のサイトには見当たらなかった。 海外のサイトには、上記のドキュメントに関する記事・投稿がいくつかある。

参考URL
SQL as backend? (2007年7月、V9当時?)
SQL performance: Alpha Five vs. Filemaker 9 benchmarks (2007年9月)
07.12.07FileMaker 9 SQL Link… ish(2007年9月)
beginners odbc question

特に3つめのURLは、Servoyという開発ツールと比較しながら、FileMakerの問題点を以下のように列挙している。

  1. SQLデータ変更時、その変更が他のユーザの画面に反映されない
  2. レコードレベルのロック機能がない
  3. テーブルやフィールドへの変更が自動的に反映されない
  4. ユーザが作成するSQLクエリを発行できない(SQLクエリは全てESSにお任せ)
  5. 未サポートのデータ型がある
  6. 検索が遅い
  7. ソートはさらに遅い(バックエンドでソートを行わず、一旦FMにデータをロードした後にそのデータをソートするため)
  8. データベース/テーブルをALTERできない

なんとなく解ってきた気がする。 開発者はFileMakerをフロントエンド開発ツールとして使用し始めると、他ツールと比較していろいろと不便な点があることに気がつく。 特に1.データ型、2.ユーザ独自のSQLクエリが実行不能、よって、3.検索、特にソートが非常に遅くなるというのは大問題で、簡単な回避策は無い。 ところが、多くのフロントエンド開発ツールは、何の問題もなくこれらのことを実行できる。 つまり、FM社が「フロントエンドにはなりませんよ」というのは、「他のフロントエンドツールにできることでも、FileMakerではできないことがあります。 その代り、FileMakerっぽくSQLのデータをある程度なら扱えますよ。 でも、FileMaker純正データベースとは違った結果が返ることも大いにありうるので、そこら辺、凄く注意して使ってね!」というのがかなりホントのところではないかと思われる。

(土屋)






関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-10-26

『売上猫くん on MySQL』開発日記 - 番外17 - FMで大きなSQLテーブルは扱えるのか? ― その2

前回の続き

問題4.検索実行時のデータの並び

郵便番号レイアウトの住所で「北海道」を検索すると、MySQL側では以下のようなクエリが走る。

SELECT ID FROM vw_zips WHERE `住所` LIKE '%北海道%'

MySQLは検索対象となったフィールドの文字コード順にデータを返し、それがそのまま表示される(ORDER BY PrimayKey は実行されない)。 この点、FileMakerのデータベースエンジンはテーブル内の並び順(作成順)にデータを返すので、この差異には注意を要す。 尚、その1で書いたように、SQLデータは一旦ロードされると取り込んだ順で保持されるので、プライマリキーにも文字コードにも関係なく、検索結果がぐちゃぐちゃに表示される可能性があることにも注意を要す。


問題5.新規レコード作成時の不審な挙動
a)検索がかかった状態で新規レコードを作成すると、レコードを確定した瞬間にその作成したレコードから新規レコード作成コマンド実行時点で選択されていたレコードに移動してしまう。レコードは作成されているのだが、ブックツールが正しく動作せず、そのままでは作成したレコードに移動できない。 これは単純にバグと思われる。 すぐに気付きそうなものだが、FileMaker社はなぜこのバグを放置したままでいるのだろう?

b)だらだらクエリ---新規レコード作成後のコミット時に、その1で書いた『だらだらクエリ』が走る(レコード数が10万位あると、顕著にだらだら加減が解る)。 我慢できずにエスケープすると、作成したレコードが消失する(FileMaker上でロールバックされる)。


以上で見た問題1~5のようにSQLデータベースの大きなテーブルを扱う際は、レコード(レイアウト)表示、レコード間移動、検索といった基本操作に問題があり、開発者はなんらかの回答を用意しなければならない。 尚、削除、更新については今のところ大きな問題は見当たらない。

問題6 ソートが著しく遅い
FileMaker 側でのソートは著しく遅く、少数のレコードが対象というのでなければ、実用的ではない。 バックエンド側のビューで ORDER BY しておくことは可能だが、解決策とは言えない。


(土屋)

2010/11/05 問題6を追記


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-10-21

『売上猫くん on MySQL』開発日記 - 番外16 - FMで大きなSQLテーブルは扱えるのか? ― その1

MySQLを使用するメリットの一つは、何百万、何千万もの大量のレコードを持つ巨大なテーブルを扱えること。 ところが、そうした巨大テーブルをFileMaker アプリから操作しようとすると、大きな問題にぶつかる。(尚、下記の環境は、クライアントからFileMaker Server上のアプリファイル(NekoApp50.fp7)にアクセスしている。ローカルでNekoApp50.fp7を実行すれば、実行速度は改善される。)

問題1. だらだらクエリ
例えば、12万件のレコードを持つ郵便番号テーブルをFileMaker のレイアウト上に表示し、一番最後のレコードに移動してみる。移動すると「検索実行中...  クエリーを処理中」と数十秒またされることになる。これはMySQLのログを見てみるとわかるが、

SELECT DISTINCT ID FROM vw_zips WHERE ID>19 ORDER BY ID
SELECT DISTINCT ID FROM vw_zips WHERE ID>1019 ORDER BY ID
SELECT DISTINCT ID FROM vw_zips WHERE ID>2019 ORDER BY ID
SELECT DISTINCT ID FROM vw_zips WHERE ID>3019 ORDER BY ID
・・・
・・・ 中略
・・・
SELECT DISTINCT ID FROM vw_zips WHERE ID>119019 ORDER BY ID

といったクエリをテーブルの全レコード件数(この例では12万件)に達するまで延々と発行し続け、FileMakerにこれまた延々とロードし続ける、という仕様なのである。 実務上、これではユーザから苦情が来るのは必至。 さらに、テーブルデータが100万、1000万件に達する場合は、実用に耐えない。

尚、一度ロードしてしまえば、アプリを閉じるまで、上記の『だらだらクエリ』は実行しないようである。


問題2. 検索を実行すればするほどデータの並びがグチャグチャに?
FileMakerはクエリを実行した順にデータをロードし、一旦ロードされると再ロードは行わない。ユーザの検索実行数が増せば増すほど、レコードは作成順に並ばず、グチャグチャに並んでるように見える。

例えば、郵便番号レイアウトを開くと、FileMakerはそのレイアウトに割り当てられたテーブル(レイアウトテーブル)のレコードの1番目から数十番目までをSELECTする以下のようなクエリを実行し、レイアウト上に表示する(SELECTされるレコード数は、レイアウトの形状、ウインドウの大きさにより異なる)。 

SELECT ID,`〒`,`住所` FROM 郵便番号 WHERE ID IN (1,2,3,4, ~中略~ ,26,27)

次に、ユーザ自ら郵便番号の「9071801」(沖縄県)を検索し、次に「2010004」を検索し、その後レコードメニューから「全レコードを表示」を行うと、以下のような並びになってしまう。


郵便番号「2010004」の後に「0600012」移行が並ぶのは、上記の「全レコード表示」の直後にスクロールダウンした為、SELECT ID,`〒`,`住所` FROM 郵便番号 WHERE ID IN (28,29,~,40,41)というクエリが実行され、該当するレコードがロードされた結果だ。 

FileMaker は内部の SELECTクエリを実行した順にレコードをロードする。 再度検索を行っても、プライマリキーが同じものは再ロードされない。 ユーザが該当件数が少ない検索条件を実行すればする程、レコードは作成順には並ばないため、ユーザからみればグチャグチャに見える。


問題3. レコード総数取得クエリ
SQLテーブルをレイアウトに最初にロードすると以下のクエリが走る。

SELECT COUNT(*) FROM (SELECT DISTINCT ID FROM vw_salesdtls) COUNTER_TABLE 

この SELECT DISTINCT には時間がかかり、180万件のテーブルだとレイアウトにレコードを表示するだけで30秒程度はかかってしまう(但し、一旦レイアウトテーブルをロードすると、アプリファイルを閉じるまで、このクエリは再発行されない)。巨大なテーブルを扱う場合は、VIEWによりレコード総数を制限する必要がある。


問題3については、数百万レコード程度であれば、ユーザも我慢できるかもしれないが、1と2ついてはなんらかの対応が必要だろう。


土屋 


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-10-13

『売上猫くん on MySQL』開発日記 - 番外15 - 再び権限(私的メモ)

特定のテーブルにGRANTできる権限/グローバルにしかGRANTできない権限
できる権限は以下。
SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT OPTION, INDEX, and ALTER

つまり、上記以外の権限はテーブル毎に設定することはできない。

  • " The EXECUTION, FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN, and SUPER privileges are administrative privileges that can only be granted globally (using ON *.* syntax)."
参考URL
Re: Grant Execute on selected procedures
MySQL - How to grant FILE privilege?

Privileges Provided by MySQL 権限の詳細説明

(土屋)


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-10-12

『売上猫くん on MySQL』開発日記 - 番外14 - テーブル毎に権限を設定する(ほぼ私的メモ)

MySQLにロールやグループは無い
かねがね疑問だったんだけど、権限をまとめて管理する機能(FileMakerのアクセス権限セット/グループ定義のようなもの)はMySQL本体にはないことがわかった。 コミュニティーで「他のDBにあんだから、付けてよー」って要望はあるけど、Priority は LOW なので期待薄。 Ver5.5 ではどうなんだろうか。

参考URL:
Creation of user groups http://bugs.mysql.com/bug.php?id=13131


ちなみに、MySQL Workbench には、DBA、BackupAdmin といった権限の“Role”が用意されており、これを選択することにより User に対して簡単に Role を割り当てることができる。 また、下図のように、Role そのものをユーザが定義することができる。


GRANT ~ ON scheme.* すると、 Revoke ~ ON scheme.table できない
あるデータベース内のすべてのテーブルに権限を与え、その後、そのデータベースの特定のテーブルから与えた権限を剥奪=revoke しようとしても、

Error Code: 1147 There is no such grant defined for user 'testuser' on host '%' on table 'infos'

とエラーになってしまう。


GRANTでテーブルの列記はできない
GRANT ~ on dbname.table1, dbname.table2 ~ のようなテーブルの列記はできない 。



ということで、多数のユーザ登録が必要で、且つテーブル毎/コラム毎に権限を設定する場合は、大量のGRANT文を書かなければならない。


(土屋)


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-10-07

『売上猫くん on MySQL』開発日記 - 番外13 - MySQL Workbenchの憂鬱(ほぼ私的メモ)

『売上猫くん on MySQL』の開発もようやく終盤戦に突入。いままでは root 権限を主に使用して開発をすすめてきたが、リリース版のテストを行うにあたり、できるだけリスクを伴わないユーザ権限を作成し、これによりテストを行わなければならない。

そこでユーザ・権限を“お手軽に”管理・変更できる筈の、MySQL Workbench の Server Administration 機能を使うことにしたが、実はこれが全く“お手軽”ではなかったという御笑いの一席。

MySQL Workbench Ver5.2.16 OSS Beta→5.2.28 CE へアップグレード
このアップグレードを行った途端、Object Browser に mysql / information_schema が表示されなくなる。 「なんかとんでもないことやったかなぁ…?」と思いつつも、 これは以下を見つけて解決。

Information_Schema and mysql databases not shown(http://bugs.mysql.com/bug.php?id=53154)

Please, check "Show Metadata Schemata" checkbox in the Query Editor group of the SQL Editor tab in the Workbench Preferences dialog box. Use Edit > Preferences... menu item to open it. Don't forget to click "Refresh all" in the Object Browser's context menu after that.

Server Administration機能を“リモートから使用するにはSSHサーバが必要
5.2.28CEへアップグレード直後、元々Connection登録してあったリモートサーバについては、SSHサーバが無くても、Server Administration 機能を使用できた(ここが不思議なところ)。 ところが新規にConnection登録したリモートサーバについては、SSHサーバがないとServer Administration 機能は利用できない。
ちなみに、元々あったConnectionについても、“Store in Vault...”ボタンで登録してあるパスワードを消去してしまうと、それ以降はリモート接続できなくなってしまった。

FreeSSHd=SSHサーバを入れる
そんなわけで、MySQLを積んだリモートサーバにSSHサーバを入れることにする。
Windowsでフリーで利用できるなSSHを探してみると、FreeSSHd (FreeSSHd.exeのダウンロード)というのが簡単・お手軽らしい。 インストール方法はここ
インストール時の注意は、
  • 「Shell」ととももに「SFTP」も選択すること。
  • SFTPのタブの「SFTP Home Path」にmy.iniが入っているボリュームを指定する。例えば、my.iniがEドライブに入っているなら、「E:\」と指定する。
New Server Instance でエラー
さて、準備完了となり、“New Server Instance”を実行。ところが途中で下図のエラーが発生する。


Operation failed: File %ProgramFiles%\MySQL\MySQL Server 5.1\my.ini doesn't exist

というエラーが出る。 例によってググり、下記のサイトを見つける。

参考URL:
Workbench doesn't autodetect my.ini properly if %programfiles% not on C:
The second thing which was wrong, was the path to the my.ini file in MySQL Workbench. I have changed it from C:\Programme\mysql\MySQL Server 5.1\my.ini to /Programme/mysql/MySQL Server 5.1/my.ini
OS Language small problem - Server Administration
...someone pointed out that I could ignore this error and continue. This is not obvious. The error message should probably say "Warning", not "Error" and it should indicate that you can specify the exact location in a later step.

つまり上図のエラーが出たら、構わず“Next”をクリック。続くダイアログで[Change Parameters]ボックスをチェックして“Next”。 次のウインドウで「my.ini」の場所を“...”ボタンをクリックして指定する。


次に“OK”して、以下、指示に従いつつ最後までいく。
尚、ここでmy.ini を正しく指定しなくても最後まで一応たどり着くが、その場合は、“Manage Import / Export” を実行した時に、「Workbench "AttributeError:NoneType object has no attribute parametervalues」というエラーが出てしまった。 これでとりあえずは、Server Administration 機能をリモートからも使用できるようになった。

ここでは略したがその他にもエラーが出て散々。またまた2日を潰してた。Workbenchもそうだが、MySQL 関連を動かすのはやはり大変だわ。

土屋


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-09-22

『売上猫くん on MySQL』開発日記 - 番外12 - トリガの制約

CREATE OR REPLACE View はストアドプロシージャでは実行可能ですが、トリガから呼び出すと以下のようなエラーが返ります。

ERROR 1422: Explicit or implicit commit is not allowed in stored function or trigger.

ネット検索してみたところ、以下の命令を含むストアドプロシージャをトリガ呼び出しすると、暗黙のコミットが起こり、肝心のストアドプロシージャが実行されないらしいです。

ALTER FUNCTION, ALTER PROCEDURE, ALTER TABLE, BEGIN, CREATE DATABASE, CREATE FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE TABLE, DROP DATABASE, DROP FUNCTION, DROP INDEX, DROP PROCEDURE, DROP TABLE, LOAD DATA INFILE LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, START TRANSACTION, TRUNCATE TABLE, UNLOCK TABLES

参ったな...。

参考:暗黙のコミットを引き起こすステートメント



関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-09-17

Officejet H470 の無線LANがおかしい

知人が「一昨日からHP Officejet H470(無線接続)で印刷できない」という。 このプリンタは本年8月に知人が購入したもので、軽量ポータブル、バッテリ可動可、無線LAN接続可能で2万弱(本体)というなかなかの優れモノ(いや、HPのプリンタは紙詰まりが多発することを除くと、なかなか良い)。
そこで復旧にトライ。先ず電源OFFができないので、電源コードを引きぬき、バッテリも外し、再度装着し、電源をいれる。 こんどはONに成功。 ところがやはりPCからは接続も印刷できない。 よくみると、プリンタのワイヤレスLANアダプタのランプが点灯していない。 これはこのアダプタが壊れたに違いない、と確信してHPに電話をかけると、「電源とバッテリとアダプタを抜いて3分待って、再度装着してください」とのこと。「そんなことやっても駄目だよ、LANアダプタの故障なんだからさぁ~」と思いつつ、渋々言われたとおりに3分待って装着、電源投入。

「ぬ、ぬ、ぬ、ぬぅ!!!」、なんと、LANアダプタのランプが青色に点灯するではないか。あっさり、印刷もできるようになった。
疑ってごめんなさい > 
 サポートの人

土屋

2010-09-15

ドメインにログインできなくなって泣かされる

 先日、64ビット版の Windows Server 2008 を Windows Server 2008 R2 にアップグレードしましたが、一見何の問題もなく成功したかのように思われたアップグレードも、イベントを見てみると結構エラーが出ていました。
 特に気になったのが、別サーバで運用している Active Directory ドメインコントローラから今回アップグレードした Windows Server 2008 R2 マシンがうまく対話しなくなってしまったので、一度 Active Directory のメンバから外して再登録をしてみたところ、ログイン不能となってしまいました。

 結論から言うと、OS のアップグレードを行うと Active Directory とクライアントマシンとのセキュアチャネルの一部に不整合が生じるため、これをリセットすると解決するようです。

良い例
 OS をアップグレードした後に、Active Directory ドメインコントローラを運用しているマシンから Active Directory ユーザーとコンピュータを開き、アップグレードを行ったコンピュータを右クリックし、サブメニューから「アカウントのリセット」を選択します。

 すると、アカウントがリセットされたコンピュータの再度起動時に認証情報の再同期が行われ、ログイン可能な状態となります(セキュアチャネルが修復されるので、認証絡みのエラーや警告がイベントログに記録されなくなる)。

悪い例(当方の失敗例)
 Active Directory ユーザーとコンピュータを開き、アップグレードを行ったコンピュータを右クリックし、サブメニューから「削除」を選択し、再度同名のコンピュータを登録すると、再起動時にセキュアチャネルが破損した状態となり、ログインできなくなります。
 よほどのことがないかぎり、コンピュータは削除しないようにしましょう。

 万が一、この手順でコンピュータを削除してしまったために、ドメインにログインできなくなってしまった場合は、下図のようにコンピュータを一度ドメインから外し(任意のワークグループに参加させるなど)てコンピュータを再起動し、再度ドメインに参加させるように構成するとセキュアチャネルが再構築されるようになります。


重要
 対象のコンピュータが証明書サーバ(証明書サービスをインストールしている)の場合、ドメイン変更やコンピュータ名の変更ができなくなるため、アカウントのリセットやコンピュータの削除を行う前に証明書サービスを一旦アンインストールする必要があります。

ドメインセキュアチャネルが破損しているかどうか調べる方法
 ドメインにログインしようとしたときに「サーバーのセキュリティ データベースにこのワークステーションの信頼関係に対するコンピュータ アカウントがありません。」というメッセージが表示されてログインできなくなっている場合には、セキュアチャネルに何らかしらの問題がある可能性があります。

 クライアントマシンのコマンドラインからセキュアチャネルのリセットを試みることで、セキュアチャネルが破損しているかどうか判断できます。

a. netdom コマンドを使ってリセット

 netdom reset /d:[ドメイン名]

例:netdom reset /d:local.jp
このコマンド実行が失敗する場合は、セキュアチャネルが確立されていない(破損している)可能性があります。

b. nltest コマンドを使ってリセット

 nltest [ローカルマシン名] /SC_Reset:[ドメイン名]

例:nltest MyMachine /SC_Reset:local.jp
このコマンド実行が失敗する場合はセキュアチャネルが確立されていない(破損している)可能性があります。

Windows Server 2008 サーバーマネージャの役割が表示されないときの対応方法

さて困った...役割追加したいだけなのになぜか真っ白

 Windows Server 2008 のサーバーマネージャから新しい役割を追加をしようしたところ、画面にさり気なく「エラー」と表示され、役割欄は真っ白いままという状況が起こりました。
 こうなってしまってはインストール済みの役割を参照することも、役割を追加したり削除したりすることもできません。

 以下の画面は、画面下の「エラーの詳細」リンクをクリックしたときに表示されたエラーメッセージです。

サーバー マネージャーの更新中に予期しないエラーが発生しました:
リモート プロシージャー コールに失敗しました。(HRESULT からの例外: 0X800706BE)


 このエラーはイベント ID1601 として記録されています。
 エラーの詳細はイベントビューアより、「アプリケーションとサービス ログ」→「Microsoft」→「Windows」→「Server Manager」→「Operational」の順に辿ることによって確認できます。

 この画面のように、イベント ID1601 が大量に記録されている場合は、おそらく当方が遭遇した障害とほぼ同じと考えても良いのではないかと思います。

Microsoft 技術情報を頼りに対応してみる

 この現象については回避策が Microsoft 社で提示されているのですが、自動翻訳があまりにも酷いため英語版を参考に対応してみました。

参考ページ:You receive an error message in Windows Server 2008 if you click Roles under the Server Manager console(Windows Server 2008 のサーバー マネージャーコンソールの役割をクリックするとエラーが返る)

1. 「スタート」→「ファイル名を指定して実行」の順に選択し、表示されたボックスに dcomcnfg.exe と入力して OK を押すと、コンポーネントサービスが開きます。


2.左ペインのツリーより、「コンポーネント サービス」→「コンピュータ」の順に展開すると、右ペインに[マイ コンピュータ]というアイコンが表示されるので、それを右クリックしてプロパティを表示させてから、「既定のプロパティ」タブを選択します。
 下図のように、設定の確認と変更を行います。


[既定の認証レベル] --- 接続(「なし」に設定されていたときのみ。)
[既定の偽装レベル] --- 識別する

3.“OK”をクリックしてプロパティシートを閉じ、コンポーネントサービスを閉じます。

 これでもう一度サーバー マネージャを開いて役割が参照できるか試してみてください。
(因みに当方ではこれでは解決しませんでした)

騙されたと思って当ててみようパッチ

 前述の方法を試してみてもエラーが再現する場合は、システム更新準備ツールという名前のパッチが Microsoft 社から出ていますので、それを当ててみます。
 (注意:アップデート関連作業は予期しない不具合を引き起こすことがあります。あくまでも自己責任でお願いします。)

Windows Server 2008 R2 x64 Edition 用システム更新準備ツール(KB947821) [2010 年 4 月]

 このパッチを当てたところ、サービス マネージャがサクサクと役割情報を表示するようになり、この問題は一気に解決してしまいました。

 当方の場合は Windows Server 2008 R2 x64 環境でこの現象が発生しましたが、ID1601 や同様のエラーが他の OS で発生している場合は、それらの環境に応じたパッチも出ているようですので、試してみると良いかもしれません。

その他 OS 向けパッチ:
Windows Vista 用システム更新準備ツール(KB947821) [2010 年 4 月]
Windows Vista for x64-based Systems 用システム更新準備ツール(KB947821) [2010 年 4 月]
Windows Server 2008 用システム更新準備ツール(KB947821) [2010 年 4 月]
システム更新準備ツール (Windows Server 2008 for Itanium-based Systems 用) (KB947821) [2008 年 8 月]
Windows Server 2008 x64 Edition 用システム更新準備ツール(KB947821) [2010 年 4 月]
Windows Server 2008 R2 for Itanium-based Systems 用システム更新準備ツール(KB947821) [2010 年 4 月]
Windows 7 用システム更新準備ツール(KB947821) [2010 年 4 月]
Windows 7 for x64-based Systems 用システム更新準備ツール(KB947821) [2010 年 4 月]

2010-09-13

IIS 運用中のマシンでイベント ID 115 のエラーが発生したらポート番号を疑ってみる

 Windows Server 環境で IIS による Web サーバを運用している場合、マシン起動時や WWW サービス起動時にイベント ID 115 のエラーが出ることがあります。

エラー内容:
「サービスはインスタンス 2 をバインドできませんでした。このデータはエラー コードです。
このメッセージに関する追加情報については、以下のマイクロソフト オンライン サポートのサイトを参照してください: http://www.microsoft.com/contentredirect.asp」


 上記ではインスタンスが 2 になっていますが、1 や他の番号が返されることもあります。
 これは IIS に設定されている Web サイトに対応する番号になっています。たとえば、Windows Server 2000 の IIS はインストール時に「既定の Web サイト」と「管理者 Web サイト」の 2 つのサイトを生成します。

 よって、サイトとインスタンスの関係は次のようになります。
 「既定の Web サイト」--- インスタンス 1
 「管理者 Web サイト」--- インスタンス 2

 今回のエラーはインスタンス 2 (= 管理者 Web サイト)で発生していたことになります。
 管理者 Web サイトの場合、IIS が 2000 ~ 9999 の範囲内で勝手にポート番号を自動割り当てするようになっているそうで、割り当てられたポート番号が別のアプリケーションにすでに使用されている場合は当然競合エラーが起こります。

 このサーバに自動割当されていたポート番号は 5900 で、これが VNC ポートと競合していました。


 ポート番号を任意の番号に変更して IIS を再起動したところ、エラーは解消しました。
 イベントビューアで同じようなエラーが発生している方は、一度ポート番号の競合を疑ってみると良いかもしれません。

参考サイト:
Web サイトおよび FTP サイトについて

Hyper-V を導入中の Windows Server 2008 を Windows Server 2008 R2 にアップグレードする方法

 Windows Server 2008 → Windows Server 2008 R2 へのアップグレードについては Microsoft 社の技術ページや個人サイトでも参考になるページがいくつかありますが、すでに Hyper-V を導入中の Windows Server 2008 を R2 にアップグレードする方法を紹介します。

注意:本ブログの投稿内容は当方の環境での動作検証記録を紹介しているにすぎません。情報はあくまでも参考程度にご利用ください。

1. サーバ環境のバックアップを取る。
 重要度の高いサーバを扱う場合は、全く同じ構成の予備機を用意しておくのがベストと言えますが、マシンに余裕がない場合でも外部メディアに OS 全体のバックアップを取り、ホスト OS、ゲスト OS ともにいつでも復旧できる状態にしておきます。
 DNS、Web、メールサーバなどを運用している場合は、設定内容のエクスポートおよび設定ファイル群のバックアップコピーを取っておきます。

2. Hyper-V のすべてのゲスト OS をエクスポートする。
 Hyper-V のすべてのゲスト OS をシャットダウンしてから、Hyper-V マネージャよりそれらの OS を外部メディアにエクスポートします。
 ゲスト OS のエクスポート方法は以下のサイトが参考になると思います。
Hyper-Vの仮想マシンをエクスポート/インポートする

3. Windows Server 2008 R2 をインストールする
 開いているアプリケーションをすべて終了させた後で、Windows Server 2008 R2 インストールディスクを挿入します。
 起動してきたインストーラがインストールの種類を尋ねてきますので、「アップグレード」を選択してアップグレードインストールを実行します。

 アップグレードの所要時間は元のインストール構成に左右されると思いますが、当方の場合は約 2 時間半ほどかかりました。

4. コンピュータのプロパティより、プロダクトキーを更新する
 アップデート直後は古い Windows Server 2008 のプロダクトキーが設定されたままになっていますので、Windows Server 2008 R2 用のプロダクトキーを入力しなおします。


5. Hyper-V マネージャを起動して、元のゲスト OS 群を起動してみる。
 たいていの場合は元のゲスト OS 群の状態は保持されているはずですので、普通に起動されてくると思いますが、当方ではゲスト OS のうち一つがファイルが見つからないという理由で起動に失敗しました。
 当方の場合はそのゲストOS の仮想マシン設定で物理 CD/DVD ドライブが「不明」になっていたため、ドライブ文字('D')の再割り当てを行うことで事なきを得ました。
参考サイト:Hyper-Vにおける仮想OSの起動エラー

 万が一、アップグレードの過程で Hyper-V の仮想ディスクや設定ファイル群が破損してしまい、起動ができなくなってしまった場合は、上記 2. の手順でエクスポートしておいたゲスト OS 環境をインポートするようにします(当方では Hyper-V 環境はアップグレード後も無事に動いたため、今回はインポート作業は行っていません。)。

 インポートの仕方は以下のサイトが参考になると思います。
Hyper-Vの仮想マシンやスナップショットをエクスポート/インポートする(Hyper-V 2.0編)

その他の参考サイト:
Hyper-V の役割がインストールされた Windows Server 2008 を実行しているコンピューターを Windows Server 2008 R2 にアップグレードする方法
[PC]Windows Server2008をR2にアップグレード。 ←おすすめ。

Hyper-V でゲスト OS として Windows Server 2000 を導入した際の Panda エラー発生条件

 以前投稿したPanda のせい?複数のサーバで障害多発に関連して、当方で検証済みの Hyper-V ゲスト環境における Windows Server 2000 の Panda エラー発生条件を以下のようにまとめてみました。
(Panda エラーとは、Panda Office Cloud Protection を導入した環境において、Panda が原因で発生したシステムエラー/アプリケーションエラーを指します。)

ホスト OSPanda 導入動作結果
Windows Server 2008 64bitOK
Windows Server 2008 64bitNG
Windows Server 2008 64bit有(再インストール)NG
Windows Server 2008 64bit R2OK
Windows Server 2008 64bit R2NG
Windows Server 2008 64bit R2有(再インストール)OK

 上記のように、Hyper-V ゲスト OS としてインストールされている Windows Server 2000 環境で Panda を動作させるには、ホスト OS となる Windows Server 2008 を R2 にアップグレードし、Panda を再インストールする必要があることがわかりました。

2010-09-11

FileMaker:No-break space 書出し時の文字化け

客先より「書き出した文字が化ける」と連絡が入る。 具体的には、スペースが「?」に化けてしまっている。化けた文字を調べてみると、No-break space と呼ばれるASCII/Unicodeで160(A0)のコードだった。 書きだしたフィールドの索引は“日本語”、書出し時の文字セットは「日本語(shift-jis)」である。 ところが、FileMaker索引の“日本語”というのが shift-jis とは異なり、shift-jis では文字が割り当てられていない No-break space をも表示してしまう。 結果、FileMaker内ではちゃんとスペースとして認識されるNo-break spaceは、一旦「日本語(shift-jis)」で書き出されると、shift-jis はこの文字コードに対応していないので、「?」に文字化けしてしまう。 では、FileMakerの“日本語”索引とななんなのか? FileMaker独自の非公開仕様ということらしい。

さて、下記のサイトによると、英語のWebサイトで使用されるこのNo-break space (後続の文字との間に改行を許さないスペース) は、日本語環境のキーボードから入力することは難しいとあるのだが、客先のユーザはどのように入力をおこなったのだろうか? 


参考サイト:

ノーブレークスペース - Wikipedia

大量ファイルのコピー時に、ネットワーク障害を引き起こすPanda Cloud Office Protectionのファイヤウォール

二、三か月前から Windows Server 2003 x32 機(以下、2003機)でネットワーク障害が続く。
障害発生のタイミングは、毎日17時のFドライブ(データが入っているドライブ)のバックアップ時。このバックアップは他機にインストールされたBunBackupというソフトを使用し、毎日17時にタスクスケジュールによりネットワーク越しに実行される。過去1年位はなんの障害もなくNASへバックアップできていたのだが、二、三か月前から急に障害が発生するようになった。
具体的な症状としては、ネットワークを利用する多くのアプリケーションで通信が切断されたり、実行不能に陥る。
例えば、2003機からLAN内のノードに対してpingを実行すると、「PING: transmit failed, error code 1450」や「ping.exe - アプリケーション エラー: アプリケーションを正しく初期化できませんでした。…」といったエラーが返ってくる。 ただ、バックアップジョブが始まって30~40分程度すると、ping が通るようになり、ネットワークは復旧する。  

調べてみると、「ネットワークカードを替えてみろ」という人がいたので、高級品?=INTEL PRO/1000 PT SERVER ADAPTER を刺してみても効果無。 いろいろ見ているうちに「このping のエラーはウィルス絡みのエラーかも」というのコメントがあり、ピンときた。 「またPandaか!」と。
例によって、Panda Clound Office Protection (以下、PCOP)が怪しい。 ただ、バックアップジョブはPCOP を搭載した他の複数のOPC/サーバ機でも実行していて問題はないので、頭に?が点滅。 Pandaの設定を確かめることにする。 PCOP ではブラウザ上でセキュリティのプロファイル(ポリシー)を複数作成し、PC/Server毎に作成したプロファイルを割り当てることができる。 


チェックしてみて、問題の2003機は他機とは異なり、ファイヤウォールが適用されるプロファイルに属していた(他機はファイヤウォールが非適用)。 そこで、2003機をファイヤウォールが適用されないプロファイルに移してみたら、数か月悩まされたネットワーク障害がピタリと治まった。 やはり、原因はPanda(PCOP) であった。 ちなみに、問題を引き起こしたプロファイルはローカル機側でファイヤウォールをOFFにできる設定にしたあり、実際、2003機のローカル設定でファイヤウォールをOFFにしてみたが、それでもネットワーク障害は解消されなかった。


つまり、管理者がブラウザでファイヤウォールをONにしているプロファイルにPC/Serverを割り当ててしまうと、ローカルのファイヤウォールの設定に関わらず、当該エラーは発生するようだ。

土屋

2010-09-10

『売上猫くん on MySQL』開発日記 - 番外11 - 外部キー ってさぁ… orz

MySQL Workbench 5.2 の外部キー作成クエリがオカシイっぽいことは 番外10 書いた通り。 今回もなかなか思ったように動いてくれない。


この Referenced Column で選択したいのは estimatedId なのだが、候補として表示されるのはなぜか[customerNo]のみ。 どうにもならないので、構わず“Apply”を実行すると、次のようなSQL文が表示される。

ALTER TABLE `neko`.`estimatedtls`
ADD CONSTRAINT `fk_purchaseId_est`
FOREIGN KEY (`purchaseId` )
REFERENCES `neko`.`estimates` (`customerNo` )
ON DELETE CASCADE
ON UPDATE NO ACTION
, ADD INDEX `fk_purchaseId_est` (`purchaseId` ASC) ;

ここで cutomerNo を強引に estimateId に書きかえて、“Apply SQL” を実行してみると

ERROR 1005: Can't create table 'neko.#sql-be8_19b' (errno: 150)

なんてエラーが出る。 そこでしばし調べてみると、

, ADD INDEX `fk_purchaseId_est` (`purchaseId` ASC) ;

が機能していないようで、仕方なく、purchaseId の索引を別途作成。 その後、上記SQL文から「,ADD ~」移行を削除して、実行するとどうにか外部キーが作成できた。
Workbench の生成するSQL文はそのままではエラーが出ることがしばしばあるようだ。

土屋

追記(10/09/10)
companies というテーブルからあるフィールド(cmnKey)を削除しようとすると、

  ERROR 1025 (HY000): Error on rename of...(errno: 150)

と表示される。 削除しようとしているフィールドが他から参照されているから削除できない、とのことだが、この cmnKey フィールドはどこからも参照されていない。 companydepts というテーブルからは外部キー制約を companies に対して設定しているが、この制約の REFERECES フィールドは cmnKeyではない。 要するにどう考えてもオカシイ。 どうもMySQLのバグらしいことがわかったので、cmnKey とは全く関係ないこの外部キー制約を一旦削除。 その後、cmnKey を削除することができた。 どうもMySQLはオカシナことが多発し過ぎる。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-09-09

SonicWALLの新製品テクニカルセミナー 2010/08/26

 ブログ記述が遅れてしまいましたが、8月26日(木)に SonicWALL ネットワークセキュリティアプライアンス テクニカルセミナーに参加してきました。

 セミナー内容はビジネスセッションとテクニカルセッションの基本的な部分は前回出席した SonicWALL セミナーとほぼ同様で特に真新しいと感じるところはなかったのですが、 SonicWALL が投資家グループ Thoma Bravo およびオンタリオ教師年金基金によって買収されたことにより SonicWALL 社が非上場企業になったことに触れていました。

 今回の買収は、プライベート・エクイティファインドである Thoma Bravo から安定した資金調達を確立することにより、製品ロードマップはそのままに製品開発に注力していくことを目的とした、前向きなものであるということでした。

参考:SonicWALL、7億1700万ドルで投資家グループが買収へ

 SonicWALL UTM 製品で前回のセミナーに追加されていた項目で目についたのは、消費電力の低さで、たとえば NSA 4500(製品情報はこちら)でも消費電力は 66W で、Fortinet の FG310B (製品情報はこちら)の 120W と比較しても約半分の消費電力となっています。

 テクニカルセッションも基本的には前回とほぼ同様の内容でしたが、SSL-VPN 機能について少々詳しい内容が盛り込まれていました。

SSL-VPN 機能の特徴
- Windows, Linux, Mac に対応(IPSec 機能では Windows のみ対応)
- 初回ログイン時に NetExtender モジュールをインストールし、NetExtender が SonicWall に対し SSL で暗号化されたトンネルを構築
- 1 要素認証のみサポート。高度な認証や同時接続ユーザ数が必要な場合は専用 SSL-VPN 装置を用意する必要あり。

参考:Introduction to the SonicWALL SSL VPN 200 (英語)

2010-09-03

Panda のせい?複数のサーバで障害多発

 最近になってやたらとサーバ機の不具合が多発するため、試しに Panda をアンインストールしてみたら突然快調に動き出したので、どうやら Panda が障害を引き起こしている可能性が高いと思い始めています。

 弊社が遭遇したトラブルを以下にまとめてみました。
 ちなみに、Windows Server 2008 で使用している Hyper-V は OS に付属のものを使用しています。

Windows Server 2008 32bit
現象:Blue Screen 障害の後、勝手にサーバ機が再起動するという現象が二ヶ月ほど前から断続的に発生。
サーバ機の診断を行うと、NIC がユーザによって無効になっているというメッセージが表示される(実際は NIC は動作しており、ネットワーク接続も可能となっている)。

Windows Server 2008 64 ビット環境の Hyper-V のゲスト OS としてインストールされている Windows Server 2000
現象:起動に 5 分以上かかり、ネットワーク関連のイベントエラーが大量に記録される。
常時起動させたままにしている FileMaker 5.5 Unlimited で開いているネットワーク共有データベースが切断されることがある。

* ちなみに、別サーバ機の Windows Server 2008 64 ビット R2 の Hyper-V のゲスト OS Windows Server 2000 の Panda は問題なく動作しているようです。

Windows Server 2003
現象:自動バックアップを実行する時間になると、ネットワークが一時的に遮断される。

 上記いずれも Panda をアンインストールした途端に快調に動き出します。

 また、以下の環境ではまだ Panda のアンインストールはしていなのですが、現象が現象だけにどうしても Panda の影響を疑いたくなってきています。

Windows Server 2008 64 ビット環境の Hyper-V のゲスト OS としてインストールされている Windows Server 2003
現象:起動が若干遅い。FileMaker Server 10 の起動に時間がかかる。また、FMS 10 の管理ツールの起動にも時間がかかるだけでなく、データベースが自動公開されない。
(仕方なくいつも手動で公開するが、すぐに公開された試しがない。)

 今まで Hyper-V 搭載機で Panda エンジンの自動更新後の不具合で散々泣かされてきていますが、今度は通常の OS インストールで使用中のサーバ機にも影響が出てきているため頭が痛いところです。

 本記事はまだ記述中ですが、今後解決策が見えてきたところで情報を更新したいと思います。

2010/09/13追記:
 Windows Server 2008 32bit のBlue Screen 障害は、NIC の再インストール、Panda の再インストールを行った後に診断ツールでのエラーが解消しました。こればかりでは Blue Screen 現象自体が解決したとは言い切れませんが、診断ツールが警告を出さなくなったという点では、Panda 絡みの問題が発生していたと考えても良いと思います。

 Windows Server 2008 64 ビット環境の Hyper-V のゲスト OS としてインストールされている Windows Server 2000 でのイベントエラー大量発生については、Windows Server 2008 を R2 にアップグレードしてから Panda を再インストールしたらエラーイベント記録が治まりました。

 結論としては、Panda 導入によるマシン環境の不具合は、どうやら OS のバージョンや構成に依るところが大きいようです。
 当方で検証したエラー発生条件については改めて投稿します。

2010-08-23

『売上猫くん on MySQL』開発日記 - 番外10 - 開発再開

4月末に入ったヘビーで超急ぎの仕事が入った。 終わってみると、風薫る5月も紫陽花の6月もとっくに過ぎて夏真っ盛りになっていた。 今年も紫陽花は見れないまま。 ということで、大中断していた『売上猫くん on MySQL』の開発をまたぁーりと再開。 一旦、開発の慣性がなくなると、再加速し走らせるのは異常に大変なのですよ。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-07-06

Panda Cloud Office Protection 保護エンジンのアップデート と Hyper-V の 問題は健在

 2009/12/08 の投稿「Panda Cloud Office Protection エンジン更新後に Hyper-V 搭載サーバ機でトラブル発生」で、Panda Cloud Office Protection エンジン更新後に NIC の挙動がおかしくなる件について述べましたが、この現象は今もなお健在です。

 当方では 2010/07/06 02:025:21 に保護エンジンのアップデートが行われた模様で、今朝出社してみたところホスト OS、ゲスト OS 共に NIC の動作が不安定な状態となっており、暫く操作すると Hyper-V 環境のすべてのゲスト OS にまともにアクセスできなくなってしまいました。

 幸い、前述の経験を活かして仮想 NIC の削除、追加を行って何とかネットワークを復旧させましたが、Hyper-V でサーバ運用をバリバリ行っている場合にはこのようなトラブルは非常に迷惑であり、業務が滞ってしまうため、Panda Software 社には是非この点を改善していただきたいところです(前回本トラブル発生時に改善を求めるメールを送ったのですが、この様子ですと残念ながら放置されたままのようですね)。

 愚痴はこの辺にしておきますが、もし Hyper-V 環境に Panda Cloud Office Protection をインストールされている方で、急にネットワークの挙動がおかしくなったという方は、前述の記事が参考になればと思います。

 また、次回の保護エンジンアップデート時にこのようなトラブルが発生しないようにするためにも、プロファイルにある[アップデートの詳細設定]の[保護エンジンのアップデート]オプションを無効にしておくことを強くお勧めします。

 手動で保護エンジンをアップデートしたあとにネットワークの挙動がおかしくなるのは恐らく避けられないでしょうから、仮想 NIC 削除、追加作業は必要になると思います。

 朝来てみたらネットワークがダウンしていて、冷や汗かきながら原因を突き止めたところ実は Panda が原因だったとわかるまでに数時間無駄にすることを考えれば、手動で保護エンジンをアップデートした方がまだマシ、と考えるべきなのかもしれません。

2010-05-06

登記変更とか

昨年5月に事務所を狛江から調布へ移転したが、登記を変更していなかった。 税務署と社会保険事務所にも住所変更届けを出さなければならないが、本店移転登記が前提となり登記簿謄本がないと原則、住所変更ができない。
というわけで渋々いままでほったらかしてあったいくつかの登記変更(本店移転、役員変更、役員住所変更、解散事由の破棄)を同時に行うことにした。

普通の会社であれば、行政書士とか司法書士とかいう人に依頼してこの種の手続きを行うのだろうが、小社は文字通りの小社なので社員=小生が自ら行う。 もっとも法務省のサイトに各種申請フォームの雛型が用意されているので、トウシロの小生でも上記4つの申請書+株主総会議事録+取締役会議事録等というものを一日強で仕上げることができた。
申請書等の準備ができたので調布市管轄の法務局=東京法務局府中支局に行くことになる。ところがこの支局、府中駅から数キロも離れており激しく不便。 府中社会保険事務所や武蔵府中税務署は駅から近いのだが、やはり法務局などというところは普通の会社・個人はそう頻繁に訪れる場所ではないから不便なところで良い、ということか。 しょうがないので、運動も兼ね多摩川サイクリングロード(当事務所は多摩川に近接している)を通って府中支局に行くことにする。 今日は天気は素晴らしく良かったのだが風が強く激しく疲れる。約1時間半で到着。案内された3階の法人登記課(?)に作成した申請書等を提出。あっさり受理され、「書類に問題がなければ5/13に謄本が出ますよ」とのこと。
費用(印紙代)は本店移転と解散事由廃止が各3万、役員住所変更と役員変更が各1万、計8万円、解っていたけどやっぱ、「たっけぇー!」
ということで、傷心のまま、強風且つ一時間半の帰路についたのであった。
(終わり)

注:
インターネットでの申請も可能なようでちょっと調べたのだが、JAVAのバージョンが違うと動作しない(つまりネット申請を行うためにJAVAをアップデートしない申請専用PCを用意しなけらばならない)というような恐ろしいことが書いてあったので、ネット申請は止めることにした。 さすがお役所仕事と言うべきか。

2010-04-28

Hyper-V のゲスト OS として bkf アーカイブを復元してみる(2/2)

 さて、前回の ASR バックアップセットによる自動復旧の失敗を踏まえ、今回は Hyper-V のゲスト OS 環境に Windows Server 2003 をインストールした後で、手動でシステム情報を復旧する方法について記述します。

【操作方法】
1. ゲスト OS に Windows Server 2003 をインストールする。
 Hyper-V の仮想マシン設定については割愛します。
 Windows Server 2003 の仮想マシンへのインストールについては、過去記事(Hyper-V にゲスト OS をインストール(覚え書き))で紹介しているとおり、SP2 以降のインストールディスクを使用しなければブルースクリーンが出てクラッシュするので注意が必要です。

2. 1. でインストールした Windows Server 2003 をネットワークに参加させる。
 既存ドメインや既存ワークグループへ参加させるようにゲスト OS の Windows Server 2003 の設定を変更して、ネットワーク経由でバックアップアーカイブ(.bkf) にアクセスできるようにしておきます。

3. バックアップツールを起動し、復旧コマンドでシステム状態を復旧する。
 ゲスト OS より「スタート」→「すべてのプログラム」→「アクセサリ」→「システムツール」→「バックアップ」の順に選択してバックアップツールを起動し、「復元ウィザード(詳細)(R)」をクリックします。



 すると復元ウィザードが表示されますので、2. のネットワーク上に配置されているバックアップアーカイブを指定し、左ペインの[System State]項目にチェックを付けます。
(バックアップアーカイブは DVD-R に焼いたものをゲスト OS に認識させても構いません。)



 “次へ”をクリックすると、以下のような警告メッセージが出ますので、本当にシステム状態がバックアップのもので上書きされても良ければ“OK”をクリックして復元を実行します。



【システム状態復元によって発生する不具合】
 前述の操作によってシステム状態を復元すると、旧環境のシステム状態が引き継がれた形となりますので、次のような問題が起こります。

1) コンピュータ名の重複
 同一ネットワーク上に同じコンピュータ名のマシンが複数台存在すると、警告メッセージがデスクトップに表示されます。
 新環境の方のコンピュータ名を適切なものに変更するか、旧環境のコンピュータをネットワークから切り外してください。

2) IP アドレスの重複
 コンピュータ名と同様に、同一ネットワーク上に複数の同一 IP アドレスを割り当てることはできませんので、新環境または旧環境の IP アドレスを適切なものに変更してください。

3) Windows のライセンス認証の不具合(特に注意)
 上記 1)、2) を行う前に、Windows ライセンス認証を促すメッセージが表示された場合、その時点で仮想ネットワークカードが動作停止状態となるため、インターネット経由でのライセンス認証はできなくなります。
 このため、認証手続きはライセンス認証ウィザードの電話認証の手続きを選択し、音声ガイダンスに従って認証を行う必要があります。

4) アンチウィルスソフトを始めとする、システム関連ソフトウェアの再インストール
 システム状態復旧ではソフトウェアまでは復旧されないため、Windows Server 2003 起動時にソフトウェアがインストールされていないという旨のエラーメッセージが表示されることがあります。必要に応じてインストールし直してください。

5) 旧環境で発生していたイベントエラー
 旧環境のシステム状態を復旧した場合、旧環境で発生していたイベントエラーの一部がそのまま継承されることがあります。
 イベントビューアで発生しているエラーを調べ、必要に応じて修正する必要があります。

 その他の不具合や問題点などは見つけ次第こちらに記述していく予定です。

 今後の課題としては以下のものがありますが、また機会ができたときに対応したいと思います。

1. 複数ボリュームを持つ BKF の Hyper-V ゲスト OS への復旧
2. VHD の復旧

2010-04-27

Hyper-V のゲスト OS として bkf アーカイブを復元してみる(1/2)

 既存の Windows Server 2003 サーバ機の環境を Hyper-V のゲスト OS にごっそり移行してみようということになり、試してみたのですが Hyper-V では自動システム回復 (ASR) セットからの復旧はやはり無理があることがわかりました。

 今回は失敗談を踏まえて、手動によるシステム状態の復旧までをまとめることにします。

 操作にあたり、以下のMicrosoft 社の技術情報ページを参考にしました。
 ハード的に独立したマシンを準備して、ページの記載どおりに操作すれば復旧はそれほど難しくないのではないかと思います。
Windows Server 2003 のデータをバックアップおよび復元する

 今回は Hyper-V のゲスト OS 環境で復旧作業をするということで、以下の問題がネックとなりました。

A. フロッピーディスクをどうやってゲスト OS に認識させるか。
 自動システム回復 (ASR) を行う場合は、元環境のパーティション情報はフロッピーディスクに記録されているため、フロッピーディスクを読み込ませる仕組みが必要となります。
 しかし Hyper-V のゲスト OS 環境では、物理的なフロッピーディスクを認識できないため、フロッピーディスクのイメージファイルを仮想フロッピーディスクファイル(.vfd)として保存し、それを読み込ませる必要があります。

 .vfd ファイル(イメージファイル)を作成するツールは Microsoft 社では提供されていないため、適当なツールをどこからか調達する必要があります。

 今回は K.Takata さんが公開している Read/Write FD というツールを使いました。
  Read/Write FD の仕様およびダウンロードページはこちら

 使い方は仕様のページに書かれているとおりですが、フロッピードライブを丸ごとイメージファイル化するには次のように指定します(.vfd 拡張子前のファイル名は任意です)。

 rwfd a: c:\fdimageW2003.vfd

 この操作で作成した .vfd ファイルをゲスト OS に認識させるための設定を行います。
 この .vfd ファイルは Hyper-V のホスト OS の適当な場所に保存しておきます(今回は f:\に入れることにします)。
 Hyper-V マネージャを開き、Windows 2003 用の仮想ハードディスクを割り当てた後で、設定を開き、以下の図のように仮想フロッピーディスクを割り当てて適用させます。
 


 この操作を行うことによって、ゲスト OS からフロッピーディスクを仮想的に読み込ませることが可能となります。

B. バックアップアーカイブ(.bkf)をどうやってゲスト OS に認識させるか。

 ASR による自動システム回復を行うにあたり、途中で .bkf の指定を求められるわけですが、Windows 2003 のインストーラでは、このファイルの配置場所として物理的に接続されている HDD デバイスを想定しているようで、ここで躓いてしまいました。
 この時点で自動システム復旧操作は断念せざるを得なかったわけですが、操作としてはなかなか面白いものでしたので、掲載することにします。

【操作手順】
1. ASR バックアップセットを作成する。
「スタート」→「すべてのプログラム」→「アクセサリ」→「システムツール」→「バックアップ」の順に選択すると、次のような画面が表示されるので、[常にウィザードモードで開始する]のチェックボックスを外して一度“キャンセル”をクリックしてプログラムを終了させます。



 もう一度バックアップツールを開くと、今度はバックアップウィザードが開きますので、画面一番下の「自動システム回復ウィザード(A)」を選択します。



 すると自動システム回復の準備ウィザードが開きますので、図のようにバックアップアーカイブ名を指定します(.bkf 前のファイル名は任意です)。
 “次へ”をクリックすると、バックアップが始まります。



注意:この操作を行うにあたり、パーティション情報がフロッピーディスクに書き込まれます(前述の仮想フロッピーの記述参照)。このため、フォーマット済のフロッピーディスクをフロッピーディスクドライブに入れておいてください。

 フロッピーディスクを作り忘れてしまった場合は、手動でも作成できます。
 フォーマット済のフロッピーディスクを用意し、C:\WINDOWS\repair\ 配下の asr.sif および asrpnp.sif をこのフロッピーディスクにコピーしてください。

2. Hyper-V 環境を準備する。
 Hyper-V 環境にゲスト OS 用の領域を割り当てておきます。
 このとき、システムドライブとなる vhd の容量は移行元のシステムドライブの容量と同じか、それ以上になるように設定します。
 この時点で前述にあったとおり、仮想フロッピーの設定も行います。

3. Windows Server 2003 インストーラーディスクを入れてゲスト OS を起動し、途中で ASR による復旧モードに入る。

 インストーラーディスクを入れてゲスト OS を起動するとインストールが始まります。
 程なくして Press F2 to run Automated System Recovery (ASR) というメッセージが画面下に表示されますので、ここで F2 キーを押すと、次の画面に切り替わります。



 フロッピーディスクを入れてくださいというメッセージですが、すでに仮想フロッピーディスクを設定してありますので、任意のキーを押すことによって、次のような画面が表示されます。



 C キーを押してパーティションの削除、修復を行うと、システムが一旦インストールされます。

 ある程度までインストールが進むと、インストーラがシステム状態のバックアップアーカイブを読み込もうとして以下のエラーが発生します。



 ローカル環境にバックアップアーカイブが無いのでこのようなエラーが発生するのは当然と言えば当然ですが、上記 1. の手順で作成した .bkf ファイルを DVD-R に焼いて読み込ませようとしても、この段階では Windows Server 2003 のインストーラが DVD ドライブの認識を行っていないようで、このバックアップアーカイブを読み込ませることができなかったため、この時点で自動復旧操作は断念しました。

 もし、同じような方法で ASR 操作がうまく行った方がいらっしゃったら、情報をいただけると幸いです。

 次回は手動システム復旧と、復旧後の注意事項についてまとめます。

2010-04-13

『売上猫くん on MySQL』開発日記 - 番外9 - 外部キー制約設定でのたうちまわる

システム開発、運用に様々なトラブルは付き物で、ストレスの元。 特に「マニュアル通りにやってるはずなのにできない、直らない」というのは凹む。 それでも最近は「トラブルも経験のうち」、「(自社の)ナレッジベースに入れてノウハウにしよう」、「ブログに書いて世の中に貢献しよう(笑)」とか、達観しはじめた。が、あまり長い時間、しょんもないことで時間を浪費すると、凄まじく凹む。

さて、今回は外部キー制約の設定について。ここでも凹んだというか、疲弊した。FileMakerのリレーションのところでそれらしきことは簡単にできる。 ただ、このシステムは折角MySQLをデータベースとして使うのだから、PHPやフレームワーク等の多言語、他環境での開発も視野に入れている(というより、実は、当初はFileMaker よりもCakePHPでのWeb開発が先行していたが、大人の事情で優先順位を変更した)。 であれば、MySQL側でできることはできるかぎりMySQLに任せた方が、開発効率が(システムのパフォーマンスも)上がる。 閑話休題。


データが入力されているテーブルに外部キーを設定しようと以下を実行。

alter table neko.estimatedtls
add foreign key estimatedtls(estimateId) references estimates(ID)
ON DELETE cascade ON UPDATE NO ACTION
,add index estimateId (estimateId);


いろいろシンタクスを弄ってみたが駄目。 そこでデータが無い同様のテーブルを作ってやってみると旨くいく。どうやら既存のデータに問題があるらしいことがわかったので、テーブルを一旦空にして外部キー制約を設定、データを取り込み直そうとするとエラーが出る。 MySQL有名某サイトにそれらしい記事を発見。 苦節2日、どうにか原因は分かった。親テーブルの参照キー(ID)にない外部キー(estimateID)が子テーブルにあることが原因らしい。 そこで、そのはぐれ者の子レコードを削除しようと以下を実行。

delete from estimatedtls where
(select ID from estimatedtls where estimateId not in
(select ID from estimates))

と、「Error Code : 1093 You can't specify target table 'estimatedtls' for update in FROM clause」と出る。 どうもこういうサブクエリはUpdataやDeleteでは使用できないらしい。しかたなく、サブクエリの結果をテンポラリテーブルに一旦納めて、それをwhere句に使用することにした。

create temporary table temp(id int);
insert into temp select ID from estimatedtls
where estimateId not in (select ID from estimates);
delete from estimatedtls where Id in (select id from temp);

結果、成功。 親テーブルに属さないはぐれ者の子レコードを削除できた。 そこで、上記の Alter table以下を再実行すると、めでたく外部キー制約を設定できた。 これにより、FileMakerのリレーションでの設定に関わりなく、見積を削除すると見積明細も自動的に削除されるようになった。
以上、めでたし。

追記(10/08/23)
MySQL Workbench 5.2.16 Beta のGUIを利用して外部キー制約を設定しようとすると、[Column]でフィールドのチェックボックスをチェックできないことがある。 どうもWorkbenchのバグのようだ。 この場合はしょうがないので、外部キーのSQL文を書いて実行すること。 尚、Workbenchの最新版では解消している可能性も。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-04-02

『売上猫くん on MySQL』開発日記 - 3 - FMからストアド、トリガ

単純な操作であってもFileMaker(以下、FM)からMySQLには実に多くのクエリが発せられてしまう。 これはシステムのパフォーマンスの低下を招く。 また、複数テーブルにまたがる処理とそれに伴う冗長なFMスクリプトはさらにパフォーマンスを低下させる。 よって、FMの組み込みのSQL発行機能に頼らず、ビュー、ストアドプロシージャ(以下、SP)、ストアドファンクション、トリガを用いて高速化を図ることが開発者には要求される。 (尚、高速化の手段としてい一時テーブル(Create temparary table)は、残念ながらFileMakerからは認識できない。痛い!)

◇SP(ストアドプロシージャ)を実行し、FM側で戻り値を取得する
FMには「SQLを実行」スクリプトステップがあるので、DB側で作成したSPを利用するには、クライアントPCにODBCを入れて、

   Call procedure(param1,param2...) 

と書いて、実行すればよい。 ところが問題がある。 FMはエラーを除き、実行した結果を返さない(MySQLの場合はエラーメッセージそのもので、SQLSTATEの番号は拾わないようだ)。 SQLに限らず、FM(特にWindows版)の外部アプリケーションとの連携の悪さは定評がある。実際、「メッセージ送信」を利用してVBSやコマンドプロンプトを実行しても送信しっぱなし、戻り値無し、で困った人も多いと思う。面倒な回避方法はないこともないが…
さて、今回は「SQLを実行」ステップの話である。この場合は比較的楽ちんな対策がある。SP側で結果をテーブルに書き込み、FMアプリ側から読み込めばいい。 以下、実装方法例。
  1. session(primary_key,return) テーブルを用意し、FMアプリ起動時にsession に行を追加し、FMアプリ上でそのprimary_key の値(pVal)を記憶する
  2. SPのコードの終りには、 update session set return=戻り値 where primary_key=pVal を追記する。
  3. 「SQLを実行」で、Call SP(pVal,......)  を実行。
  4. sessionテーブルレイアウトのpValのレコードに移動し、returnを取得。
かくして、FMアプリでも、SQLの戻り値を無理矢理取得できる。


◇SPをトリガから起動する
以前に書いたように上記の「SQLを実行」ステップを利用するにはクライアントPCにODBCがインストールされていなければならならい。 FMクライアント(ODBC無)→FMServer(ODBC有)→MySQL の場合、SPは使用できないのか?  答はNo、トリガからSPを起動すればよい。
具体的にはMySQL で トリガ実行専用の「trigs」テーブルを用意。FM側にもtrigsのレイアウトを作成する。trigsへのInsert発生時に上記SPが起動するように、 「CREATE TRIGGER trig_name after insert ON trigs」を書く。 最後にFM側で、上記で作成したtrigsレイアウトに移動し、レコードを新規作成(確定させた瞬間にSPが実行される)するように、スクリプトを書く。 尚、トリガでは、NEW.field を利用し、上述の pValやその他の必要情報をSPに渡す。


◇まとめ
一連の動きをまとめると以下のようになる。

FMアプリ起動→スタートアップスクリプトで、sessionテーブルにレコードを追加→sessionのユニークなpVal を取得しアプリ終了まで保持→trigsレイアウトに移動し新規レコード作成→SPが実行される→SPにより、pVal を持つ session レコードの return フィールドに戻り値が返る→その戻り値により、必要な処理を行う。

10/4/7 追記&修正

以上

2010-03-31

『売上猫くん on MySQL』開発日記 - 番外8 - insert...select構文とODBC

以下、ODBC 5.1.5だと×、5.1.6だとOK

INSERT INTO estimates(customerNo) SELECT customerNo FROM estimates WHERE ID=5

これ、痛い。 この構文使えずに困っている人、結構いるんじゃなかろうか? 回避方法も見つからないし。


参考サイト:Bug #42905


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-29

『売上猫くん on MySQL』開発日記 - 番外7 - FileMaker内にMySQLの一般ログを表示する

MySQL の一般ログをFileMakerで表示する方法。

1.MySQLのMySQLデータベースをDSN登録する。
2.my.ini に log-output=TABLE,FILE を指定。
3.以下をMySQLコマンドラインで実行。
mysql> SET @old_log_state = @@global.slow_query_log;
mysql> SET GLOBAL general_log = 'OFF';
mysql> ALTER TABLE mysql.general_log ENGINE = MyISAM;
mysql>ALTER TABLE `mysql`.`general_log` ADD COLUMN `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`id`);
mysql> SET GLOBAL general_log = @old_log_state;
4.MySQL を再起動。
5.FileMaker のリレーションシップで、上記1で作成したDSNのmysql.general_logテーブル選択。このとき、上記で作成した id を指定。(以下、略)

するとこんな感じでログを表示できる。


FMの自動発行SQLクエリで「?」が頭に点灯したら、ログをチェックするのがよろしいかと。

尚、FM標準コマンドでは general_log テーブルのログは削除できないので、truncate(テーブル内の全行削除) を使用する。以下はFMの「SQLを実行」ステップを使用して、truncate を実行。

参考サイト:一般クエリとスロー クエリのログ出力先の選択

2010/9/24 追記
ログが出力されない場合、mysqlコマンドで
SET GLOBAL general_log = 'ON';
を実行してみる。

2010/10/25 追記
id の属性に AUTO_INCREMENT を追加。

2010/10/15 追記
slow_query についても、上記の要領でFileMaker上に表示可能だが、ログ対象となるクエリ時間の閾値がデフォルトでは10(秒)になっている。この為、ログ書き込みされないと思いこんでしまう。このデフォ値は、my.ini で long_query_time = 1 とするか、set global long_query_time = 1 を実行することにより変更できる。



関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-27

『売上猫くん on MySQL』開発日記 - 2 - 開発環境

『売上猫くん on MySQL』の開発環境は以下の通り。


アプリケーションファイル(NekoApp.fp7)は、FileMaker Server Advanced 10(以下、FMServerAdv)上に置き、開発PC1、2、3及び開発Mac 10.6 の FileMaker Pro Advanced 10(以下、FMPA)からそのファイルにアクセスして開発を行う。FMServerAdv を使用する理由には、複数人が開発を安定して行えること、オンラインバックアップがスケジュールできる、という2点が挙げられる。 
サーバ側にODBCをインストールしておけば、クライアント(開発PC)にはODBCは不要である(例外は後述)。
アプリケーション/ODBCの配布・アップグレードの容易さを考えれば、この構成は運用においても一考の価値はあると思う。 
なお、図の「開発PC3 Win2008/TS」は Terminal Service を載せたWindows Server 2008機で、各クライアントがリモートデスクトップ接続によりFMPAを起動し、FMServerAdv にアクセスできるようにしている。(もともと、FileMaker は Terminal Service との相性が良く、Ver5位より常用しているが、近年のTerminal Service はローカルプリンタへの印刷、ローカルディスクの利用も格段に簡単にできるようになり、加えて接続遮断時にも接続を自動で復旧してくれたりする)。

前述のように FMSA (FileMaker Server無印も同様)にODBCをインストールすればクライアントにODBCを入れる必要はないが、例外がある。それは「SQLを実行」スクリプトステップを使用する場合である。 FileMaker は通常、開発者自らSQLを記述する必要はないが、FileMaker が用意していないコマンドを実行する場合は「SQLを実行」を使用する。また、FileMaker の外部DBに対する処理の中には非常に遅いものがあり(激遅処理)、その典型的なものに多数のレコードに及ぶ一括処理がある。CSV等のファイル取込、全置換、ループ等がそれである。 その回避策として 「SQLを実行」スクリプトステップにSQL文を埋め込み実行すると直接外部データベースに素のSQLが送られるので、FileMakerのレコード取込やループ処理を使うのに比べれて、桁違いにパフォーマンスが向上する。尚、FileMaker の外部DB使用時の激遅処理については、機会を改めて書きたい。

さて、開発PC1、ここには予備用のMySQLを入れ、リストアやリカバリをテストを行うので、データベースを全部削除したりとか無茶をやる。無茶をやると「あー、なるほど」と新たな発見もあったりする。また、ローカルにアプリケーションファイル(NekoApp.fp7)を置いても、FMSAサーバの環境と同様に諸機能が動作するかのチェックも行う。


以上

『売上猫くん on MySQL』開発日記 - 番外6 - リモートのログを mysqlbinlog できない

市販のソフトウェアでログ(MySQLではバイナリログ)からのリカバリ機能を実装しているものはあまり無いような気がする。 以前、某有名財務ソフトのSEに、「ログからのリカバリはできるんですか?」と聞いたことがある。 答えは「そういうのが必要なときは、うちのSEがやりますよ」とのこと。 確かに、下手にユーザがリカバリを行うと大変なことになるので、こういう機能は組み込まないのが正解なのかもしれない。 また、小中規模のデータベースシステムなら、フルバックアップを日に何回か取って、障害発生時には最新のフルバックアップでリストアまでし、最終フルバックアップ以降の更新は、ユーザがせっせと入れる、というが実態なのかとも思う。 また、“ユーザがせってと”できないようなクリティカルなシステムは、自社のシステム管理者や外部のSI業者がしっかりリカバリする体制ができているのだろう。 

さて、『売上猫くん on MySQL』には、一応、バックアップ、フルバックアップからのリストア、バイナリログからのリカバリ機能を実装する予定で、バイナリログからのリカバリをテストしている。 MySQLが載っているサーバ機を使用し、そのサーバ上のログによりリカバリ(mysqlbinlog)を実行するのは、マニュアル通りに動く。 
ところが、ローカルPCからリモートサーバ上のログをリモートサーバに対してリカバリすべく下記を実行すると失敗する。

> mysqlbinlog --disable-log-bin --read-from-remote-server //remote-server/***/log-bin mysql --user=root --password=passord --host=remote-server --database=neko"

例によってググりながら、疑わしきところを弄りながら、異なる2台のサーバに対して試すこと数時間。 どうしても「Misconfigured master - server id was not set」 とか、「error reading packet from server: binary log is not open」みたいなエラーが出力される(この2つのエラーはレプリケーション絡みで出力されるようだが…)。

諦めかけたところ、いきなりプロンプト画面に正常な出力が行われる。データを見ると、確かに更新分が反映されている。そこで実行文を見直してみると、--read-from-remote-server を入れ忘れて実行していた。結果、成功。
--read-from-remote-server はマニュアルによると、「バイナリログをローカルファイルから読み取らずにMySQLサーバから読み取ります」とあるので、このオプションは必要と思ったのだが…

結局、半日以上を費やして、--read-from-remote-server の正しい使用方法は分からずじまいだが、目的は達したので良しとしよう。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-26

『売上猫くん on MySQL』開発日記 - 番外5 - ポータルで検索できない

MySQL等の外部DBを使用し、複数のリレーションを設定したポータル内では、検索を実行できません。 たとえば、売上と売上明細のテーブルを[売上No]と[区分]という二つのフィールドでリレートし、ポータルに売上明細のフィールドを置き、これらで検索しても失敗します。
FMのバグでしょう。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-23

『売上猫くん on MySQL』開発日記 - 番外4 - mysqldump で文字化け?

mysqldumpで作成したテキスト(sql)ファイルを WordPad で開いてみる。 文字化けだらけ。
MySQLクライアントを使用しても、phpMyAdmin を使用しても結果は変わらず。ただ、phpMyAdminで実行結果を画面に出力するとちゃんと表示される奇怪。
「mysqldump 文字化け」でググってみるといろいろと記事があり、それを見ながら --default-character-set やら、my.ini やらでいろいろ試してみるが解決には至らず。 
半日ほど頑張ってみたが埒があかないので、念のため、隣の人に聞いてみた。すると「WordPadを使ってませんか?」 。 「はぁ?」 、固まる小生。 WordPadって、NotePadの上位エディタじゃないの? NotePadで 確かに、NotePadは UTF-8とUnicodeの保存オプションがあるのに、 WordPadにはUnicodeのみ。 読み込みできるキャラクタセットが違うらしい。 WordPad のUnicodeはUTF-16LE対応.
Notepadはこれに加えてUTF-8対応。 あー、とんんだ恥さらし記事だけど、小生の同類がいるかもしれないので、恥を忍んで上げておこう。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-22

『売上猫くん on MySQL』開発日記 - 番外3 - 0を書き込みできない

売上明細テーブル( vw_salesdtls)のInt型のフィールド(balanceFlg)に値を書き込もうとする。他の値は書き込みできるのだが、“0”の書き込みが実行できない。 ログで何が起こっているのか確認する。

Commitに失敗している場合はバイナリログには記録されないので、mysqlbinlog は使えない。 そこで、一般ログというものを、

mysql> set global general_log="ON";

で作成してみる。 以下、1を立てて成功したログと、0で失敗したログ(一部抜粋)。

【1立てで成功】
9 Query SELECT ID,`売上番号`,balanceFlg, ~略~ FROM vw_salesdtls WHERE ID=8340 FOR UPDATE
9 Query UPDATE vw_salesdtls SET balanceFlg=1 WHERE ID=8340

【0立てで失敗】
8 Query SELECT ID,`売上番号`,balanceFlg, ~略~ FROM vw_salesdtls WHERE ID=8341

失敗したほうでは、なぜか FOR UPDATE 以下が発行されず、当然これでは更新できない。 当初はInnoDB側に何か問題があるのかと疑ったが、FileMakerが適切なクエリを発行していないことがわかった。 ちなみに、類似した他のテーブルでは、1、0の値に関係なく、更新(Update)は成功する。

いろいろとやってみた。FMのファイルを修復したり、レイアウトモードにして数字の書式を変更してみたり、フィールド定義を眺めてみたり。 そして、これが FileMaker のバグだと判明。 なんと、FileMaker は 空欄(null)→0 への変更は変更と認識しない、null=0 と認識するのである。 更新と認識しないので、 Update が発行されない。 恐ろしい。

結論
ということで、null と 0 を区別して扱う必要がある場合は、非常に注意が必要だ。 0 を参照キーするのは極力避けるべきた。 MySQL側で初期値を0に設定しておく、というのは一案かもしれない。
ちなみに、上述のように「null=0 と認識」するので、0→空欄lに変更を行っても、コミットすると 0 のままである。



関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-16

『売上猫くん on MySQL』開発日記 - 番外2 - MySQLミラーサイト

MySQL サイトが今朝から落ちてる。 レファレンスマニュアルが見れない、つまり開発できない。Googleのキャッシュは遅すぎる。 MySQLの全機能を網羅し、信頼の置けるドキュメントはここにしかない(と思う)。「MySQLの開発者はこういうときどうしているのだろう?」等と思いつつ、、、ミラーサイトをみつけた。これタイの大学のサイト。Googleキャッシュよりはずっと早い。 この大学のトップページにはなぜか秋篠宮殿下が…



関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-15

『売上猫くん on MySQL』開発日記 - 番外1 - 全データベース削除→リストア

あるサーバにあるデータベースダンプを別のサーバに移動。その後、MySQLのすべてのデータベースを削除し、リストアのテストを行おう思い、まず、

> drop database information_schema
(だったと思う)

を実行してみた。 すると、「information_schemaは削除できない」旨のメッセージが表示される。
その後、mysqlを再起動しようとするとエラーが出て起動しない。 データフォルダをみると、mysqlを含むすべてのデータベースは削除されている。エラーログをチェック(←これ大事)すると、 mysql データベースは起動に必須らしい。そこで、元のサーバから無理やりこのmysql フォルダをコピーし(サーバ停止無、こんなことやっていいいのか?)、丸ごと、起動しなくなった別サーバ内にコピー。 その後は再起動できた(ここまで半日潰れる)。

そこで、

> show databases

を実行すると、やはり表示されるのは、mysql データベースのみ。 そこで、コマンドプロンプトからリストアを実行すると、以下のようなエラーが出る。

InnoDB: Error: table test/parent already exists in InnoDB internal
InnoDB: data dictionary. Have you deleted the .frm file
InnoDB: and not used DROP TABLE? Have you used DROP DATABASE
InnoDB: for InnoDB tables in MySQL version <= 3.23.43? InnoDB: See the Restrictions section of the InnoDB manual. InnoDB: You can drop the orphaned table inside InnoDB by InnoDB: creating an InnoDB table with the same name in another
InnoDB: database and moving the .frm file to the current database.
InnoDB: Then MySQL thinks the table exists, and DROP TABLE will
InnoDB: succeed.

InnoDB内部の記録と不整合があるらしいので、一旦、同名の空のデータベースを作成し、それを削除したあとにもう一度リストアをやってみるとやっと成功。 めでたし、めでたし

参考サイト:トラブルシューティング InnoDB データ ディクショナリ操作



関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-03

SonicWALLの新製品テクニカルセミナー

先日、SonicWALLの新しいTotalSecure TZシリーズ(TZ100/TZ200/TZ210のセミナーに行ってきた。

セミナーは2時間で最初の一時間がマーケ、後の一時間がテクニカルな内容であった。以下、その備忘録。

マーケ
2008年、UTM製品の国内の出荷台数シェアは、Juniper(NetScreen)、SonicWALL、Fortinet、Cisco、Checkpointの順。 同年の金額によるシェアは、Fortinet、Juniper、Cisco、SonicWALL、Checkpointの順。 Sonicは台数は出てるのに金額が低い、つまり、Sonicは中小向けの安いUTM製品に強みを持っている。

あと、営業さんが資料等で強調していたのは、「他社製品に比べ、コストパフォーマンスがいいですよ」ということ。


テクニカル---新製品の特徴
  1. TZ180以前の機種で標準付属していたSonicOS Standardが無くなり、全機種がEnhanced(5.x) に統合された
  2. TZ180に比しUTMパフォーマンスが2.5~5倍Up(10Mbps→25Mbps~50Mbs)
  3. GAVシグネチャーが上位機種(NSA?)と同等に。 TZ100も?
  4. アプリケーションファイヤウォール(TZ210のみ)
  5. SSL-VPN(ユーザ数:1~10、機種/オプションにより異なる)
  6. 冗長構成 --- 予備機(同機種)を一台用意し、障害発生時に切り替えて運用
アプリケーションファイヤウォールは近頃流行らしく、WinnyやSkypeといった企業にとって都合の悪いアプリの通信を遮断、またはユーザ毎に管理できる。 また、企業がブラウザをFirefoxに統一しようとする場合、IEによる通信を遮断してしまい、間接的にFirefoxのインストールを強制する、という使いかたもあるらしい。 社員が一杯いたらGoogle Chrome をインストールしてシークレットモードで使おうとする不心得者もいる筈だが、どこまでのアプリケーションに対応可能なのか、アプリケーションのシグネチャはカスタマイズできるのかは、次回聞くことにしよう。 確か、カスタマイズはできると記憶している。

エンジニアは、TZより上位のシリーズはマルチコアCPUによりDPI(パケットのIPヘッダ部分だけではなく、データ部分を検査する機能)が高速化されていることを強調していた(が、今回のTZとは関係ないので、"マルチコアアーキテクチャ"と言いたかっただけと違うんかと)。
また、RFDPI(Reassembly Free Deep Packet Inspection)も強調。本機能は、他メーカー機と異なり、パケットをメモリ上に展開すること無く直接検査するため、非常に高速だとか。 こちらはTZシリーズでも採用している。
この2つの機能はSonicWALLの"売り"であるらしく、昨年のハイエンドのE-Class(ベンツかいな)のセミナーでも濃い説明があった。


尚、今回配布された「かんたんUTM導入ガイド」という小冊子(非売品)には、UTMのことがとてもよくまとめられている。 巻末の 文言によるとこの小冊子は、アスキーの「NETWORK MAGAZINE」の08/9月~09/2月号でSonicWALLのエンジニアが書いた記事を再編集したもの、とのこと。



以上

見つけモノ
SonicWALLのYouTube動画サイト(英語)

2010-02-19

サイト証明書の更新方法

 SSL で Web サイト証明書を使っている企業は多いと思いますが、事務所移転やサーバ移転等の理由から、内容を一部変更してサイト証明書の更新を行いたい場合があると思います。
 Windows Server 環境の場合は、もう一つ仮想 Web サイトを用意すれば、比較的容易にサイト証明書の更新申請を行うことができます。

 手順は次のとおりです。

1. 仮想 Web サイトの準備
 IIS の場合は、「規定の Webサイト」の他に「管理者のWebサイト」が用意されていますので、「管理者のWebサイト」を使うだけで問題はありませんが、必要に応じて Web サイトを追加してください。
 以下の図のように、仮想 Web サイトは停止中のままでかまいません。


2. CSR(証明書発行要求書)の発行と証明書申請
 仮想 Web サイトの「ディレクトリのセキュリティ」タブより CSR の発行を行います。

 途中、証明書の名前や組織名といった情報を求められますが、ここで最新のものを入力していきます。
 この画面より発行した CSR を、証明書発行サービスサイト(Global Sign 等)の証明書更新申請画面の CSR 欄に貼り付けて申請を行うと、更新済のサイト情報で証明書の発行が可能となります。

 Global Sign 社のマニュアルに詳しく発行方法が記載されていますので、それに倣って CSR を作成し、証明書更新申請画面の SCR 貼り付け欄に貼り付けて申請を行うと便利でしょう。

(参考)[CSR生成] Microsoft Internet Information Services 6.0(新規)の CSR 発行方法