このページは、以下の英語ページの抄訳です。最新の情報については、英語ページを参照してください。
sa_validate() procedureは、本番システムがダウンする状況になる前に、あらゆるデータの破損をキャッチして対処できるようデータベースの様々な側面のバリデーションに使用できます。一般的にバックアッププロセスの一部としてバリデーションを実行することが好ましいとされています。
SQL Anywhere では、SQL Anywhere のイベントシステムを利用することで、これを自動化することができます。
以下にバックアップを実施する前にデータベースのバリデーションを実行するバックアップイベントの一例を紹介します。もし問題があれば、管理者に e-mail が送信されるようにします。
- CREATE EVENT "DBA"."BackupDatabase" DISABLE
- ATALL HANDLER
- BEGIN
- DECLARE res_validate VARCHAR(250);
- DECLARE res_backup VARCHAR(250);
- DECLARE backup_dir VARCHAR(250);
- DECLARE crsr_validate dynamic scroll cursor FOR CALL sa_validate();
- -- 最初に、破損したデータベースをバックアップしないよう確認するためデータベースのバリデーションを実行します。
- OPEN crsr_validate;
- FETCH NEXT crsr_validate INTO res_validate;
- IF res_validate <> 'No error detected'THEN
- CALL xp_startsmtp('mailuser','mailserver.xyz.com’);
- CALL xp_sendmail('admin@xyz.com','Database Backup Failed!',NULL,NULL,NULL,'Validation failed for database: ' || res_validate);
- CALL xp_stopsmtp();
- RETURN
- END IF;
- --データベースが良いコンディションであると満足した場合には、データベースをバックアップしログを記録します。
- -- ローリングバックアップ7日のセットを使用します。
- SET backup_dir = 'c:\backup\ ' + dayname(today());
- BACKUP DATABASE DIRECTORY backup_dir;
- EXCEPTION WHEN OTHERS THEN
- SELECT errormsg() INTO res_backup;
- CALL xp_startsmtp('mailuser','mailserver.xyz.com’);
- CALL xp_sendmail('admin@xyz.com','Database Backup Failed!',NULL,NULL,NULL,'Backup failed for database: ' || res_backup);
- CALL xp_stopsmtp();
- END;
- --毎日実施されるようにバックアップイベントにスケジュールを追加します。
- ALTER EVENT "BackupDatabase"ADD SCHEDULE "BackupSched" START TIME'23:00:00'ON('Sunday','Saturday','Friday','Thursday','Wednesday','Tuesday','Monday')
上記の例でおかしな点に気づかれたかもしれません。バリデーションの失敗を検出するには、特定の文字列を見つける必要があります。
- 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” カラムをチェックして、バリデーションの成功/失敗を判断することができます。
- CREATE EVENT "DBA"."BackupDatabase" DISABLE
- AT ALL HANDLER
- BEGIN
- DECLARE res_backup VARCHAR(250);
- DECLARE backup_dir VARCHAR(250);
- DECLARE res_messages VARCHAR(250);
- DECLARE res_isvalid integer;
- DECLARE res_object VARCHAR(250);
- DECLARE crsr_validate dynamic scroll cursor FOR CALL sa_validate();
- -- 最初に、破損したデータベースをバックアップしないよう確認するためデータベースのバリデーションを実行します。
- OPEN crsr_validate;
- FETCH NEXT crsr_validate INTO res_messages, res_isvalid, res_object;
- IF res_isvalid = 0 THEN --バリデーションが失敗しました。
- CALL xp_startsmtp('mailuser','mailserver.xyz.com');
- CALL xp_sendmail('admin@xyz.com','Database Backup Failed!',NULL,NULL,NULL,'Validation failed for database: ' || res_object || '\n ' || res_messages );
- CALL xp_stopsmtp();
- MESSAGE 'Validation failed for database: ' || res_object || '\n ' || res_messages;
- RETURN
- END IF;
- --データベースが良いコンディションであると満足した場合には、データベースをバックアップしログを記録します。
- -- ローリングバックアップ7日のセットを使用します。
- SET backup_dir = 'c:\backup\ ' + dayname(today());
- BACKUP DATABASE DIRECTORY backup_dir;
- EXCEPTION WHEN OTHERS THEN
- SELECT errormsg() INTO res_backup;
- CALL xp_startsmtp('mailuser','mailserver.xyz.com’);
- CALL xp_sendmail('admin@xyz.com','Database Backup Failed!',NULL,NULL,NULL,'Backup failed for database: ' || res_backup);
- CALL xp_stopsmtp();
- END;
- --毎日実施されるようにバックアップイベントにスケジュールを追加します。
- ALTER EVENT "BackupDatabase"ADD SCHEDULE "BackupSched" START TIME'23:00:00'ON('Sunday','Saturday','Friday','Thursday','Wednesday','Tuesday','Monday')
======================
ご購入に関するお問い合わせ
こちらよりお問い合わせください。