Adaptive Server Anywhere (SQL Anywhere) データベースが
アサーションエラーに遭遇したか判断する

このマニュアルでは、ハード・アサーションとソフト・アサーションの違いと、アサーションの発生時に情報が格納される場所について説明します。

Adaptive Server Anywhere (SQL Anywhere) データベース・サーバには、不正な結果やデータベースの破損につながる可能性がある状況を検出するためのさまざまなメカニズムがあります。状況を単一の文にローカライズできる場合、通常は、問題の原因を示すために適切なSQLSTATE でその文がキャンセルされます。ただし、その状況が未知数の接続や物理データベース・ファイルに影響する可能性がある場合、Adaptive Server Anywhere (SQL Anywhere) データベース・サーバはアサーションエラーに遭遇し、新たな要求の実行をやめます。アサートしたサーバを停止するには、(a) [サーバーメッセージ] ウィンドウの [シャットダウン] ボタンを使用するか、(b) 停止ユーティリティ (dbstop) を使用するか (ネットワーク・サーバを実行している場合は -gk オプションを指定する必要があります)、(c)適切な OS コマンドを使用して外部的にサーバ・プロセスを終了します。

一般に、Adaptive Server Anywhere (SQL Anywhere) アサーションは 2 つのカテゴリに分けることができます。
最初のカテゴリ (ハード・アサーションと呼ばれる) は、物理データベース・ファイルまたはトランザクション・ログの整合性が損なわれてきていることを示すアサーションを表します。少なくとも、ハード・アサーションはデータベース・リカバリを必要とします。リカバリによってファイルの整合性が復旧されない場合は、以前のバックアップからのリカバリが必要になります。そのようなアサーションの 1 つの例は、データベースのリカバリ中に LOAD TABLE 文の入力データが見つからないケースです。もう 1 つの例は、データベース・ページのチェックサムと内容が一致しないことを検出するケースです。これは、外部プロセスまたはハードウェア障害による変更の結果としてデータベースの内容が損なわれることを示しています。
2 番目のカテゴリのアサーション (ソフト・アサーションと呼ばれる) は、物理データベース・ファイルに損傷が見受けられない場合に発生する可能性があります。不正なクエリ結果、バックグラウンド・プロセスの不適当な動作、または潜在的に複数の接続に影響するその他の予期しない障害につながる可能性がある状況に Adaptive Server Anywhere (SQL Anywhere) が遭遇すると、ソフト・アサーションが発生することがあります。このタイプのアサーションの例は、データベース・キャッシュ内からページを正常に割り当てることに失敗するケースです。外部イベントまたは構成の問題はいくつかのソフト・アサーションをトリガする可能性がありますが、ほとんどのソフト・アサーションはソフトウェアの欠陥によってトリガされ、問題の確認と解決のために iAnywhere テクニカル・サポートに報告される必要があります。

データベース・アサーション・エラーの根本的な原因は物理データベース・ファイルの問題である可能性があるため、アサーションの原因が特定されるまでは、影響を受けるデータベースを使用しないでください。詳細については、“アサーションエラーが発生しました。どうしたらよいでしょう?” を参照してください。このアーティクルでは、アサーションの発生時にそのアサーションが記録される場所を識別します。これは、データベース・サーバがサイレントに実行されている構成では特に重要です (たとえば、-qi または -qw サーバ・オプションを使用して実行されている場合や、Windows サービスまたは UNIX デーモン・プロセスとして実行されている場合)。アサーションに関連する情報がどこに記録されるのかが分かると、それらのソースを監視して、アサーションが発生したかどうかを検出し、状態に問題があるデータベースの使用を防止できます。

確認方法

以下の手順は、データベースでアサーションを生成するために使用されました。トランザクション・ログは、書き込みモードに設定され、ファイルの最終行を削除することによってテキスト・エディタで変更されています。その結果、サーバは予期しない状態を識別し、”Assertion failed: 201129 File is shorter than expected — transaction rolled back (アサーションに失敗しました:
201129 ファイルが予想よりも短くなっています — トランザクションはロールバックされました)” をレポートしました。
このテストは、Adaptive Server Anywhere (SQL Anywhere) 9.0.2.3044 を使用して実施されましたが、通常はどのバージョンにも適用されます。

全てのプラットホーム上のアサーションの記録

サポートされるデータベース・プラットフォームでは、アサーションは以下の場所に記録されます。
[サーバーメッセージ] ウィンドウ:-o オプションを使用すると、このウィンドウの内容をファイルにリダイレクトできます。以下はアサーションの出力を示します。
I. 05/20 16:10:17. Starting database “asademo” (C:\asademo.db) at Fri May 20 2005 16:10
I. 05/20 16:10:17. Transaction log: asademo.log
E. 05/20 16:10:17. *** ERROR *** Assertion failed: 201129 (9.0.2.3044)
E. 05/20 16:10:17. File is shorter than expected
I. 05/20 16:10:17. *** ERROR *** Assertion failed: 201129 (9.0.2.3044)
I. 05/20 16:10:17. File is shorter than expected
I. 05/20 16:10:17.
E. 05/20 16:10:17. Internal database error *** ERROR *** Assertion failed: 201129 (9.0.2.3044)
E. 05/20 16:10:17. File is shorter than expected — transaction rolled back

Adaptive Server Anywhere (SQL Anywhere) コンソール・ユーティリティ (dbconsole) と Sybase Central 4.3 (Adaptive Server Anywhere (SQL Anywhere) 9に付属) は、[サーバーメッセージ] ウィンドウの内容の最終部分を表示します。
検証ユーティリティ (dbvalid):一般に、ハード・アサーションは dbvalid の出力でレポートされます。
ファイル・システム:アサーションのサブセットは、「Assertion Failed (アサーションに失敗しました)」メッセージを受信するデータベース・ファイルと同じディレクトリに assert.dmp ファイルを生成します。テクニカル・サポートに問題を報告する場合は、assert.dmp ファイルが作成されていれば、そのファイルを含めてください。
SQL エラー:アサーションは、以下に示すエラー・コードを使用してデータベース・サーバによってレポートされます。クライアント・アプリケーションは、この情報をデータベース・エラー処理ロジックの一部として使用できます。

Internal database error %1 — transaction rolled back (内部データベース・エラー %1 — トランザクションはロールバックされました)

項目
SQLCODE -301
Constant SQLE_DATABASE_ERROR
SQLSTATE 40W01
Sybase error code 13665
ODBC 2 State ERROR
ODBC 3 State ERROR
Parameter 1 Identification of the error.

ウインドウズ・プラットフォーム上のアサーションの記録

注意:このアーティクルの目的では、Windows プラットフォームには Windows NT、2000、XP、2003 が含まれます。
メッセージ・ボックス:アサーションエラーは、発生時にエラーとしてレポートされます。データベース・サーバや Interactive SQLなどの Adaptive Server Anywhere (SQL Anywhere) 実行プログラムの場合は、アサーションが発生するとメッセージ・ボックスが表示されます。他のアプリケーションは、メッセージを表示しない場合や、Adaptive Server Anywhere (SQL Anywhere) データベース接続から生じるエラーを記録するための別のメカニズムを備えている場合があります。アプリケーション開発者と連絡をとって、これらのエラーがどのように処理されるかを確認してください。
イベント・ログ (Windows プラットフォーム):アサーションが発生すると、システム・ログには、サービス・コントロール・マネージャがソースである情報メッセージが含まれます。ログに記録されたイベントを右クリックし、ポップアップ・メニューから [プロパティ] を選択して、イベントの詳細を表示します。以下に示すように、サービスが停止したことを除き、システム・ログには詳細情報があまり存在しないことに注意してください。

以下のように、問題の詳細はイベント・ビューアのアプリケーション・イベント・ログとして記録されます。

エラー・イベントのプロパティを表示すると、データベース・サーバのアサーションエラーが原因でサービスの起動に失敗したこと
を確認できます。

サービスとして実行 (Windows プラットフォームのみ):データベース・サーバをサービスとして実行した場合は、LOCALSYSTEM アカウントを使用するようにサービスを設定して [デスクトップとの対話を許可する] を有効にしない限り、エラー・メッセージは表示されません。データベース・サーバをサービスのコンテキストで実行していると、データベース・サーバ・エラーはイベント・ログに記録されます。その結果、サービスの起動に失敗した場合に、より多くの情報を取得するには、イベント・ビューア・ログを使用する必要があります。

UNIXプラットフォーム

このアーティクルの目的では、UNIX プラットフォームには Linux ベースのディストリビューションが含まれます。
デーモンとして実行:デーモンとして実行した場合、データベース・サーバ・コンソールは非表示になります。メッセージは、そのプラットフォーム (たとえば、Linux) のメッセージ・ログ・ファイルにすべてリダイレクトされます。

例:/var/log/messages on Linux.