Quantcast
Channel: SQL Anywhere Japan
Viewing all articles
Browse latest Browse all 49

SQL Anywhere 17 - よりグローバルな sa_validate() プロシージャー

$
0
0

このページは、以下の英語ページの抄訳です。最新の情報については、英語ページを参照してください。

http://scn.sap.com/community/sql-anywhere/blog/2015/09/17/sql-anywhere-17--a-more-wordly-savalidate-procedure

 

 

sa_validate() procedureは、本番システムがダウンする状況になる前に、あらゆるデータの破損をキャッチして対処できるようデータベースの様々な側面のバリデーションに使用できます。一般的にバックアッププロセスの一部としてバリデーションを実行することが好ましいとされています。

SQL Anywhere では、SQL Anywhere のイベントシステムを利用することで、これを自動化することができます。

以下にバックアップを実施する前にデータベースのバリデーションを実行するバックアップイベントの一例を紹介します。もし問題があれば、管理者に e-mail が送信されるようにします。

 

 

  1. CREATE EVENT "DBA"."BackupDatabase" DISABLE

  2. ATALL HANDLER
  3. BEGIN


  4.   DECLARE res_validate VARCHAR(250);
  5.   DECLARE res_backup VARCHAR(250);
  6.   DECLARE backup_dir VARCHAR(250);
  7.   DECLARE crsr_validate dynamic scroll cursor FOR CALL sa_validate();
  8.   -- 最初に、破損したデータベースをバックアップしないよう確認するためデータベースのバリデーションを実行します。
  9.   OPEN crsr_validate;
  10.   FETCH NEXT crsr_validate INTO res_validate;
  11.   IF res_validate <> 'No error detected'THEN
  12.     CALL xp_startsmtp('mailuser','mailserver.xyz.com&rsquo;);
  13.     CALL xp_sendmail('admin@xyz.com','Database Backup Failed!',NULL,NULL,NULL,'Validation failed for database: ' || res_validate);
  14.     CALL xp_stopsmtp();
  15.     RETURN
  16.   END IF;
  17.   --データベースが良いコンディションであると満足した場合には、データベースをバックアップしログを記録します。

  18.   -- ローリングバックアップ7日のセットを使用します。

  19.   SET backup_dir = 'c:\backup\ ' + dayname(today());
  20.   BACKUP DATABASE DIRECTORY backup_dir;
  21.   EXCEPTION WHEN OTHERS THEN
  22.     SELECT errormsg() INTO res_backup;
  23.     CALL xp_startsmtp('mailuser','mailserver.xyz.com’);
  24.     CALL xp_sendmail('admin@xyz.com','Database Backup Failed!',NULL,NULL,NULL,'Backup failed for database: ' || res_backup);
  25.     CALL xp_stopsmtp();
  26. END;
  27. --毎日実施されるようにバックアップイベントにスケジュールを追加します。

  28. ALTER EVENT "BackupDatabase"ADD SCHEDULE "BackupSched" START TIME'23:00:00'ON('Sunday','Saturday','Friday','Thursday','Wednesday','Tuesday','Monday')

 

上記の例でおかしな点に気づかれたかもしれません。バリデーションの失敗を検出するには、特定の文字列を見つける必要があります。

 

  1.   IF res_validate <> 'No error detected'

 

 

SQL Anywhere の以前のバージョンでは、バリデーションエラーがないかどうか判断する唯一の方法は、‘No error detected’ という文字列を結果セットの中から見つけることでした。

しかしながら、これに関連する問題として、この文字列はまた SQL Anywhere がサポートしている全ての言語にローカライズされているため、全ての言語でこのチェックをコード化する直接的な方法がありませんでした。

 

version 17 では、sa_validate() 結果セットの既存の “Messages” カラムに新しく2つのカラムが追加されました。これにより、ディプロイメント言語を問わず、成功を継続的にチェックできるようになりました。

最初のカラムは “IsValid”で、bit 値です。バリデーションがクリーンな場合は 1 に設定され、バリデーションエラーがある場合は 0 に設定されます。

次のカラムは、“ObjectName” で、バリデーションがクリーンな場合は、空です。バリデーションエラーがある場合は、このカラムにはバリデーションに失敗したデータベースまたはテーブルの名前が含まれます。

 

上のバックアップイベントを、sa_validate() 結果セットにこの2つのカラムが含まれるようアップデートしてみます。

シンプルに “IsValid” カラムをチェックして、バリデーションの成功/失敗を判断することができます。

 

  1. CREATE EVENT "DBA"."BackupDatabase" DISABLE
  2. AT ALL HANDLER
  3. BEGIN
  4.   DECLARE res_backup VARCHAR(250);
  5.   DECLARE backup_dir VARCHAR(250);
  6.   DECLARE res_messages VARCHAR(250);
  7.   DECLARE res_isvalid integer;
  8.   DECLARE res_object VARCHAR(250);
  9.   DECLARE crsr_validate dynamic scroll cursor FOR CALL sa_validate();
  10.   -- 最初に、破損したデータベースをバックアップしないよう確認するためデータベースのバリデーションを実行します。

  11.   OPEN crsr_validate;
  12.   FETCH NEXT crsr_validate INTO res_messages, res_isvalid, res_object;
  13.   IF res_isvalid = 0 THEN --バリデーションが失敗しました。
  14.     CALL xp_startsmtp('mailuser','mailserver.xyz.com');
  15.     CALL xp_sendmail('admin@xyz.com','Database Backup Failed!',NULL,NULL,NULL,'Validation failed for database: ' || res_object || '\n ' || res_messages );
  16.     CALL xp_stopsmtp();
  17.     MESSAGE 'Validation failed for database: ' || res_object || '\n ' || res_messages;
  18.     RETURN
  19.   END IF;
  20.   --データベースが良いコンディションであると満足した場合には、データベースをバックアップしログを記録します。
  21.   -- ローリングバックアップ7日のセットを使用します。

  22.   SET backup_dir = 'c:\backup\ ' + dayname(today());
  23.   BACKUP DATABASE DIRECTORY backup_dir;
  24.   EXCEPTION WHEN OTHERS THEN
  25.     SELECT errormsg() INTO res_backup;
  26.     CALL xp_startsmtp('mailuser','mailserver.xyz.com’);
  27.     CALL xp_sendmail('admin@xyz.com','Database Backup Failed!',NULL,NULL,NULL,'Backup failed for database: ' || res_backup);
  28.     CALL xp_stopsmtp();
  29. END;
  30. --毎日実施されるようにバックアップイベントにスケジュールを追加します。

  31. ALTER EVENT "BackupDatabase"ADD SCHEDULE "BackupSched" START TIME'23:00:00'ON('Sunday','Saturday','Friday','Thursday','Wednesday','Tuesday','Monday')

 

 


======================

ご購入に関するお問い合わせ

 

こちらよりお問い合わせください。


Viewing all articles
Browse latest Browse all 49

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>