検索

記事
· 2024年5月16日 9m read

インターシステムズ製品をバックアップする前に確認したいこと

開発者の皆さん、こんにちは。

この記事では、InterSystems製品のバックアップ方法(4種類)のご紹介と、バックアップを行う前に確認しておきたい内容について解説します。

また、この記事に続くシリーズ記事では、それぞれのバックアップの仕組みと操作例を交えたバックアップとリストア手順を解説していきます。

シリーズ記事の中で行っているバックアップ練習、リストア練習の内容については、インターシステムズの講師付きトレーニングコースの中でも取り入れている内容で、一人1環境の演習環境内で実際にお試しいただいています。

参加者の皆さんと一緒に演習を進めて行きますと、データベースリストアの後に行うジャーナルリストアについては、ユーティリティから出力される確認項目が多いため、皆さん慎重に確認されながらリストアの指示を入力されています。そのため、リストア開始前の手続きや準備に意外と時間がかかっています。(実行例

普段なかなかバックアップやリストアを行う機会がないかと思いますが、万が一の場合に備え練習いただくことで実際のリストア作業が発生した際も落ち着いて対処できるようになるかと思います。

また、試さなくてもどんな感じになるのかをお読みいただくことで手続きの大枠がつかめ、心の準備ができるかと思います。まだ体験されたことない方はぜひご興味あるバックアップ手法に対するバックアップ・リストア方法をご確認下さい!


最初は、バックアップの種類について簡単にご紹介します。

 

InterSystems製品のバックアップ方法(4種類)

以下の4種類の方法を選択できます。

推奨方法) 外部バックアップは主に、論理ディスク・ボリュームの有効な ”スナップショット” を迅速に作成するテクノロジと共に使用します。 ここでは、バックアップ時、データベースへの書き込みをフリーズさせてからスナップショットを実行します。

この ”スナップショット” のようなテクノロジは、ストレージアレイからオペレーティング・システム、ディスクの単純なミラーリングに至るまで、さまざまなレベルで存在します。

InterSystems製品が用意するバックアップ機能を利用する方法で、バックアップ対象に設定した全データベースの使用済ブロックをバックアップする方法です。

管理ポータルメニューやタスクスケジュールにも含まれるメニューでお手軽ですが、データベースの使用済ブロック数が多くなればなるほどバックアップ時間も長くなりバックアップファイルサイズも大きくなってしまう方法です。

バージョン2024.1以降では、実験的機能としてオンラインバックアップの高速化機能を提供しています。

データベースファイル(DATファイル)の退避(ファイルコピーのような対退避方法も含)とオンライン・バックアップを組み合わせて利用する方法で、外部バックアップで使用するスナップショットのようなテクノロジが利用できない環境に対して素早くバックアップを取得できる方法です。(オンラインバックアップより高速にバックアップを実行できますが、手順は複雑です。)

InterSystems製品を停止できる場合に利用できる方法で手順がシンプルです。

 

シリーズ記事では、それぞれのバックアップ方法とリストア方法を解説していきますがその前に、 バックアップを取得する前に必ず確認しておきたい事 があります。

さて、それは何でしょうか・・・・・

 

👇

👇

それは、バックアップを取るデータベースの物理的な整合性が保たれているかどうかをバックアップ前に確認すること です。

万が一に備えてバックアップをとっていたとしても、バックアップ対象データベースの物理的な整合性が崩れている状態のバックアップはリストア対象として利用できません。

物理的な整合性=ディスク上のデータベース・ブロックの整合性

整合性が崩れた状態で取得したバックアップでは、正常な状態のデータベースに復旧させることができないためデータ喪失につながり、バックアップの目的が果たせず、非常に危険です。

バックアップが正常に成功していることを確認することも重要ですが、最も重要なことは データベースの整合性が保たれているデータベースをバックアップしているか ということです。

種類別のバックアップ方法、リストア方法紹介の前に、まずはデータベースの整合性チェックについて確認していきましょう。

 

データベースの物理的な整合性チェックツール

整合性チェックは、管理ポータルメニュー([システムオペレーション] > [データベース] > [整合性チェック]ボタン)や ^Integrity 、タスクスケジュールを使用して実行することができます。

管理ポータルメニューは以下の通りです。

システムルーチン:^Integrity を使用する場合は、IRISにログインし%SYSネームスペースに移動します。

チェックしたいデータベースを指定した実行もできますが、まずはシステム全体のチェックを実行してみます。

カレントデバイスに出力することもできますが、整合性チェックのログは長くなるので、例ではファイル出力先をフルパスで指定しています。

USER>set $namespace="%SYS"
%SYS>do ^Integrity
This utility is used to check the integrity of a database
and the pointer structure of one or more globals.

Output results on
Device: /usr/irissys/mgr/integ0424.log
Parameters? "WNS" =>
Stop after any error?  No=>
Do you want to check all databases?  No=> yes

ログ例は以下の通りです。

整合性チェックは全てのデータベースブロックについての検査結果を出力する長いログのため、一部省略+コメントを追記しています。

Intersystems IRIS Database Integrity Check on 04/08/2024 at 15:23:20
System: 733fea287670  Configuration: IRIS
IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2024.1 (Build 263U) Wed Mar 13 2024 15:21:28 EDT


《コメント》データベースディレクトリ毎に中身に含まれるデータベースブロックのつながりを検査します。

---Directory /usr/irissys/mgr/---

Global: %
 トップ/ボトムポインタレベル: ブロック数=1      8kb (充填率 0%)
 データレベル:           ブロック数=2      16kb (充填率 79%)
 合計:                ブロック数=3      24kb (充填率 53%)
 経過時間 = 0.204/08/2024 15:23:26
Global: %IRIS.SASchema
 トップ/ボトムポインタレベル: ブロック数=1      8kb (充填率 0%)
 データレベル:           ブロック数=1      8kb (充填率 11%)
 合計:                ブロック数=2      16kb (充填率 5%)
 経過時間 = 0.204/08/2024 15:23:26
<省略>

Global: rOBJ
 トップ/ボトムポインタレベル: ブロック数=1      8kb (充填率 37%)
 データレベル:           ブロック数=205      1,640kb (充填率 73%)
 ビッグストリング:          ブロック数=1,374      10MB (充填率 81%) カウント = 539
 合計:                ブロック数=1,580      12MB (充填率 80%)
 経過時間 = 0.204/08/2024 15:23:40
---Total for directory /usr/irissys/mgr/---
        95 Pointer Level blocks         760kb (16% full)
     6,634 Data Level blocks             51MB (83% full)
     1,574 Big String blocks             12MB (79% full) # = 696
     8,318 Total blocks                  64MB (81% full)
     1,279 Free blocks                10232kb

Elapsed time = 14.3 seconds 04/08/2024 15:23:40
《コメント》データベースディレクトリに対してチェックが終わると上記サマリを出力し、エラーがない場合は以下出力します。

No Errors were found in this directory.


《コメント》次のデータベースに対する整合性チェックを開始します。

---Directory /usr/irissys/mgr/HSCUSTOM/---

Global: EnsDICOM.Dictionary
 トップ/ボトムポインタレベル: ブロック数=1      8kb (充填率 0%)
 データレベル:           ブロック数=1      8kb (充填率 0%)
 合計:                ブロック数=2      16kb (充填率 0%)
 経過時間 = 0.204/08/2024 15:23:40
<省略>

Global: rOBJ
 トップ/ボトムポインタレベル: ブロック数=1      8kb (充填率 2%)
 データレベル:           ブロック数=19      152kb (充填率 76%)
 ビッグストリング:          ブロック数=259      2,072kb (充填率 60%) カウント = 259
 合計:                ブロック数=279      2,232kb (充填率 61%)
 経過時間 = 0.104/08/2024 15:23:47
---Total for directory /usr/irissys/mgr/HSCUSTOM/---
        48 Pointer Level blocks         384kb (11% full)
     2,150 Data Level blocks             16MB (70% full)
       272 Big String blocks           2176kb (60% full) # = 272
     2,485 Total blocks                  19MB (67% full)
       203 Free blocks                 1624kb

Elapsed time = 7.6 seconds 04/08/2024 15:23:47
No Errors were found in this directory.

《コメント》以降同様にデータベース毎にチェックを行い、エラーがある場合はその対象ブロックに対してエラー情報を出力します。エラーがない場合は各データベースのチェックの終わりに「No Errors were found in this directory.」と出力します。

すべてのデータベースの検査を終え、エラーがない事を確認すると以下1行出力し、整合性チェックが終了します。

No Errors were found.

 

タスクスケジュールについては、インストール時に毎週月曜日深夜2時に実行するタスクとして登録されていますが、一時停止状態で登録されています。

管理ポータル > [システムオペレーション] > [タスクマネージャ] > [タスクスケジュール] > Integrity Check 

整合性チェックは指定したデータベースの全データベースブロックを検査するため、チェック時間は、データ量、チェックするデータベース数、HWスペックに依存します。

目安となるような計測時間は特になく、実際稼働中の環境で実測した値を参考に予測していただく必要があります。

万が一の場合に備え、データベース整合性チェック時間のおおよその検討が付けられるように、実環境でテスト実行を行っていただくことを推奨します。

また、整合性チェック時間は環境により異なりますので、実稼働環境の状況に合わせ実行のタイミングをご検討ください。

もし、整合性チェックでエラーが出た場合は、すぐにサポートセンターまでご連絡ください。

 

以上、整合性チェックツールの使い方でした。

次は、いよいよバックアップ種類別のバックアップとリストア方法について解説します。

​​​​​​

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
InterSystems公式
· 2024年5月15日 2m read

InterSystems 製品 2024.1.0.267.2 リリースのご案内 (Ubuntu 24.04 サポート他)

インターシステムズは、InterSystems IRIS データ・プラットフォーム、InterSystems IRIS for Health 、HealthShare Health Connect のバージョン 2024.1.0.267.2 をリリースしました。
 

このリリースには、Ubuntu 24.04 オペレーティング・システムのサポートが追加されています。 Ubuntu 24.04 には、Linux カーネル 6.8、セキュリティの改善、インストーラおよびユーザ・インタフェースの改善が含まれています。 InterSystems IRIS IntegratedML は、Ubuntu 24.04 ではまだご利用いただけません。
 

さらにこのリリースでは、すべてのプラットフォームで以下の2つの不具合が修正されています:

  • "NOT %INLIST" を使用した SQL クエリが不正な結果を返す問題を修正しました。以前、このエラーに関する警告 を発行しました。
  • 特定の状況で不完全なスタック・トレースが発生する問題を修正しました。


ソフトウェアの入手方法

通常、拡張メンテナンス(EM)リリースには、サポートされているすべてのプラットフォーム用のクラシックインストールパッケージと、Dockerコンテナ形式のコンテナイメージがあります。サポートされるプラットフォームのリストについては サポートプラットフォーム一覧(英語) を参照してください。
 

インストーラパッケージ

各製品のインストーラパッケージは WRC Directの 製品ダウンロードページ から入手できます。評価サービス のサイトからもキットを入手できます。
 

コンテナイメージ

InterSystems IRIS、IRIS for Health および関連コンポーネントのエンタープライズエディション、コミュニティエディションのコンテナイメージはInterSystems コンテナレジストリ(ICR) のウェブインターフェースから入手できます。

コンテナには、「2024.1」 または 「latest-em」 のタグが付けられています。

ディスカッション (0)0
続けるにはログインするか新規登録を行ってください
質問
· 2024年5月15日

Modification d'un objet dynamique provenant d'un JSON

Bonjour, 

Je souhaite réaliser une méthode générique pour modifier des propriétés d'une classe dynamique. Lorsque je fais un JSONImport() cela fonctionne très bien pour certains objet, or dans le cas d'un objet contenant une liste cela m'ajoute un élément en plus au lieu de la modifier. J'ai essayée de vérifier le type lors de l'itération du JSON afin de faire un Insert mais je n'arrive pas à utiliser les $METHOD sur le Insert ou même le %Set. 

Voici la classe : 

Class Epc.conf.poste Extends (%Persistent, %JSON.Adaptor)
{

Property NomPoste As %String(%JSONFIELDNAME = "NomPoste", MAXLEN = "");
Property tPrinter As list Of EpErp.conf.printer(%JSONFIELDNAME = "tPrinter", SQLPROJECTION = "table/column", STORAGEDEFAULT = "array");
}
Class EpErp.conf.printer Extends (%SerialObject, %JSON.Adaptor)
{

Property Service As %String(%JSONFIELDNAME = "NomService", MAXLEN = "");
Property Print As %String(%JSONFIELDNAME = "NomImprimante", MAXLEN = "");
}

Mes données actuelles : 

Le fichier que j'envoie afin de modifier ma liste, je souhaite donc modifier un des éléments de ma list  : 

{
	"NomPoste":"Poste",
	"tPrinter":
	[
		{
			"NomService":"Petite",
			"NomImprimante":"EPFR_12"
		},
		{
			"NomService":"Grande",
			"NomImprimante":"Modif"
		}
	]
}

Ma méthode de modification générique : 

ClassMethod update(){
    
set payload={}.%FromJSON(%request.Content)

 set itr           = payload.%GetIterator()  

 if ##class(%Dictionary.ClassDefinition).%ExistsId(className){
  set class = $CLASSMETHOD(className,"%OpenId",id)
   if $ISOBJECT(class){
       if payload '= ""{
          while itr.%GetNext(.prop,.val) {
              if prop.%IsA("%DynamicArray"){
                    ?                 
                }else{
                    Set $PROPERTY(class, prop) = val
                }
               
                  do class.%Save()
                 }
             }
        }
     }
}

Merci par avance pour votre aide. 

2 Comments
ディスカッション (2)2
続けるにはログインするか新規登録を行ってください
質問
· 2024年5月15日

How to insert data to Third party Database?

hi !

now I want to insert data to third party database directly,  Link Table wizard how to insert  except by sql? 

obj=##class(YBFXJC.LABINFO).%New()
  ;s obj.ID="1"
  obj.HISID="1"
  obj.APPYNO="1"
  obj.HOSPITALID="1"
  obj.BILGDRNAME="1"
  sc=obj.%Save()
  sc_$System.Status.GetErrorText(sc),!

 there is error  <CANNOT SET THIS PROPERTY>zSaveData+3^YBFXJC.TestSaveObj.1

4 Comments
ディスカッション (4)3
続けるにはログインするか新規登録を行ってください
質問
· 2024年5月14日

Mongodb integration

Hi. In a project I'm involved in I need to connect to a MongoDB database, read some data and store it in some internal table. 

I'm wondering what's the best way to connect to MongoDB, as it seams to me there's no native Intersystems adapter.

Did anyone have handled such a scenario?

 

Thank you. Best regards 

Davide Cecchetto

2 Comments
ディスカッション (2)2
続けるにはログインするか新規登録を行ってください