クリアフィルター
記事
Tomoko Furuzono · 2020年11月24日
これは、InterSystems FAQサイトの記事です。
MaxIRISTempSizeAtStartという構成パラメータを設定することにより、IRIS起動時のIRISTempデータベースの最大サイズを設定できます。
システムは、設定後、次のIRIS起動時に、設定された値(MB)にIRISTempの切り捨てを行います。 指定した MaxIRISTempSizeAtStart よりも現在サイズが小さい場合は、切り捨ては行われません。また、0 を指定すると切り捨てが行われないため、サイズは変わらないまま起動します。(デフォルト) 設定は、以下メニューから行います。
管理ポータル[システム管理]>[構成]>[追加の設定]>[開始]>"MaxIRISTempSizeAtStart"
詳細は下記ドキュメントページをご確認ください。MaxIRISTempSizeAtStart
記事
Mihoko Iijima · 2020年12月15日
これはInterSystems FAQ サイトの記事です。
デフォルトでは、セキュリティ脆弱性対応の観点でウェブサービス用テストページの実行を許可していません。
テスト目的等で利用する場合は、テストページへのアクセスを有効にする必要があり、以下グローバル変数のセットを %SYS ネームスペースで実行する必要があります。
set ^SYS("Security","CSP","AllowClass",0,"%SOAP.WebServiceInvoke")=1
set ^SYS("Security","CSP","AllowClass",0,"%SOAP.WebServiceInfo")=1
詳細については、以下のドキュメントもご参照下さい。
カタログおよびテスト・ページについて【IRIS】
カタログおよびテスト・ページについて
記事
Mihoko Iijima · 2021年4月15日
これは InterSystems FAQ サイトの記事です。
クラスに定義されたプロパティの情報については、以下システムクラスを利用して情報を取得できます。
%Dictionary.ClassDefinetion
%Dictionary.PropertyDefinition
コード記述例は以下の通りです。
Class ISJ.Sample
{
ClassMethod getPropInfo(classname As %String)
{
set cls=##class(%Dictionary.ClassDefinition).%OpenId(classname,,.status)
if $$$ISERR(status) {
write "指定クラスは存在しません",!
quit // または return
}
set x=cls.Properties
for i=1:1:x.Count() {
// プロパティ情報を取得(%Dictionary.PropertyDefinition)
set prop=x.GetAt(i)
if prop="" {
continue
}
set propname=prop.Name // プロパティ名
set proptype=prop.Type // プロパティタイプ
if propname="" {
continue
}
write propname," ",proptype,!
}
}
}
実行例は以下の通りです。
USER>do ##class(ISJ.Sample).getPropInfo("Taxi.Driver")
DriverID %String
Name %String
Phone %String
関連記事:指定のテーブルの全フィールドをSQLで取得する方法
記事
Megumi Kakechi · 2021年11月15日
これは InterSystems FAQ サイトの記事です。
SELinuxの機能が有効になっているとファイルアクセス時にセキュリティコンテキストのチェックで permission エラーになります。
CSP のページについても同様に permission エラーになっているため、Apache にて 403 Forbidden エラーになります。
以下の設定でSELinuxの機能を無効にすることで回避できます。
設定ファイル /etc/selinux/config の SELINUX=disableに設定し、OS の再起動を行います。
例:
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values:< # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - SELinux is fully disabled. SELINUX=disabled # SELINUXTYPE= type of policy in use. Possible values are: # targeted - Only targeted network daemons are protected. # strict - Full SELinux protection. SELINUXTYPE=targeted
記事
Tomoko Furuzono · 2025年4月17日
これは、InterSystems FAQサイトの記事です。
メソッドの実装に使用する言語を明示する場合は、下記のようにメソッドキーワードで「Language=~~~」と指定します。
Method name(formal_spec) As returnclass [ Language = language ]
{ //implementation }
指定できるLanguageの値は下記のとおりです。
objectscript (既定) — ObjectScript
python — 組み込み Python
tsql — Transact-SQL
ispl — Informix ストアド・プロシージャ言語
ドキュメント:Language (メソッド・キーワード)
上記の通り、ObjectScriptで記載する場合は、「Language=objectscript」と指定します。但し、CSP内の<SCRIPT>タグ内で指定する場合は、下記の通り、「LANGUAGE=’cache’」と指定することにご注意ください。
<SCRIPT LANGUAGE='cache', ~~~>
ドキュメント:<SCRIPT>
※CSPページは、IRISでは非推奨の機能です。
記事
Minoru Horita · 2020年7月21日
この連載記事では、InterSystemsデータプラットフォーム用の[Python Gateway](https://openexchange.intersystems.com/package/PythonGateway)について説明します。 また、InterSystems IRISからPythonコードなどを実行します。 このプロジェクトは、InterSystems IRIS環境にPythonの力を与えます。
- 任意のPythonコードを実行する
- InterSystems IRISからPythonへのシームレスなデータ転送
- Python相互運用アダプタでインテリジェントな相互運用ビジネスプロセスを構築する
- InterSystems IRISからのPythonコンテキストの保存、調査、変更、復元
# その他の記事
現時点での連載計画です(変更される可能性があります)。
- [パート I:概要、展望、紹介](https://jp.community.intersystems.com/post/python%C2%A0gateway%C2%A0%E3%83%91%E3%83%BC%E3%83%88%C2%A0i%EF%BC%9A%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)
- [パート II:インストールとトラブルシューティング](https://jp.community.intersystems.com/post/python%C2%A0gateway%C2%A0%E3%83%91%E3%83%BC%E3%83%88%C2%A0ii%EF%BC%9A%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%C2%A0)
- パート III:基本機能 InterSystems IRIS
PythonからInterSystems IRISに変数の値を渡す方法は、シリアル化の必要性に応じて4種類から選べます。
- `String` は単純なデータ型とデバッグに使用します。
- `Repr` は単純なオブジェクトの保存とデバッグに使用します。
- `JSON` はInterSystems IRIS側でデータを処理しやすくするために使用します。
- `Pickle` はオブジェクトを永続化するために使用します。
以下のメソッドを使用すると、Pythonから変数を文字列またはストリームとして取得できます。
- `GetVariable(variable, serialization, .stream, useString)` - `variable` の `serialization` を`stream` に取得します。 `useString` が1で、変数をシリアル化したものが文字列に収まる場合、ストリームの代わりに文字列が返されます。
- `GetVariableJson(variable, .stream, useString)` - 変数をJSONでシリアル化した結果を取得します。
- `GetVariablePickle(variable, .stream, useString, useDill)` - 変数をPickle(またはDill)でシリアル化した結果を取得します。
`y` 変数を取得してみましょう。
```
set sc = ##class(isc.py.Main).GetVariable("y", , .val, 1)
w val
>6
```
### InterSystems IRIS -> Python
そして最後に、InterSystems IRISから一部のデータをPythonに読み込みます。
- `ExecuteQuery(query, variable, type, namespace)` - SQLクエリから結果セット(pandasの `データフレーム` または `リスト`)を作成し、`variable` に設定します。 `isc.py` パッケージは `namespace` でアクセスできなければなりません。
- `ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)` - `global` のデータ(`start` から `end` まで)を、 `type`(タプルの `list` または pandas の `dataframe`)を持つPython変数に転送します。 `mask`および ` labels` 引数の仕様については、クラスのドキュメントと[データ転送のドキュメント](DataTransfer.md)を確認してください。
- `ExecuteClass(class, variable, type, start, end, properties, namespace)` - クラスデータをPythonのタプルリスト、またはpandasのデータフレームに転送します。 `properties` - データフレームを構成するプロパティをカンマで区切ったリストです。 * および ? ワイルドカードを使用できます。 デフォルトは *(すべてのプロパティ)です。 %%CLASSNAME プロパティは無視されます。 保存されているプロパティのみを使用できます。
- `ExecuteTable(table, variable, type, start, end, properties, namespace)` - クラスデータをPythonのタプルリスト、またはpandasのデータフレームに転送します。
`ExecuteQuery` は汎用的です(有効なSQLクエリはPythonに転送されます)。 ただし、`ExecuteGlobal` とそのラッパーである `ExecuteClass` と `ExecuteTable` の動作にはいくつかの制限があります。 その代わり、はるかに高速に動作します(ODBCドライバーより3〜5倍高速で、`ExecuteQuery` より20倍高速です)。 詳細は、[データ転送のドキュメント](DataTransfer.md)を確認してください。
これらのメソッドはすべて、任意のローカルネームスペースからのデータ転送をサポートしています。 `isc.py` パッケージは `namespace` でアクセスできなければなりません。
## ExecuteQuery
`ExecuteQuery(query, variable, type, namespace)` - 有効なSQLクエリの結果をPythonに転送します。 これは最も遅いデータ転送方法です。 `ExecuteGlobal` とそのラッパーが利用できない場合に使用してください。
引数:
- `query` - SQLクエリ。
- `variable` - Python側のターゲット変数。
- `type` - `list` または Pandasの `dataframe` を指定します。
## ExecuteGlobal
`ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)` - グローバルデータをPythonに転送します。
引数:
- `global` - `^`を含まないグローバル名。
- `variable` - Python側のターゲット変数。
- `type` - `list` または Pandasの `dataframe` を指定します。
- `start` - 最初のグローバルキー。 整数でなければなりません。
- `end` - 最後のグローバルキー。 整数でなければなりません。
- `mask` - グローバル値のマスク(文字列)です。 マスクはグローバル値のフィールドの数よりも短い場合があります(この場合、最後のフィールドはスキップされます)。 マスクの書式を以下に記載します。
- `+` フィールドをそのまま使用します。
- `-` フィールドをスキップします。
- `b` - ブール値(0 - False、それ以外 - True)。
- `d` - 日付($horologから起算。Windowsでは1970年以降、Linuxでは1900年以降の日付。詳細は注意事項を参照してください)。
- `t` - 時間($horolog、午前0時からの秒数)。
- `m` - (現在)「年-月-日 時間:分:秒」形式のタイムスタンプ文字列。
- `labels` - カラム名の%リストです(最初の要素がキーとなるカラム名です)。 したがって、リストの長さはマスク文字列の長さより1つ長くなければなりません。
## ExecuteClass
`ExecuteGlobal` のラッパーです。 コンパイルされたクラス定義を効果的に解析し、`ExecuteGlobal` 引数を作成して呼び出します。
`ExecuteClass(class, variable, type, start, end, properties, namespace)` - クラスデータをPythonのタプルリスト、またはpandasのデータフレームに転送します。 `properties` - データフレームを構成するプロパティをカンマで区切ったリストです。 * および ? ワイルドカードを使用できます。 デフォルトは *(すべてのプロパティ)です。 %%CLASSNAME プロパティは無視されます。 保存されているプロパティのみを使用できます。
引数:
- `class` - クラス名。
- `variable` - Python側のターゲット変数。
- `type` - `list` または Pandasの `dataframe` を指定します。
- `start` - 最初のオブジェクトID。 整数でなければなりません。
- `end` - 最後のオブジェクトID。 整数でなければなりません。
- `properties` - データフレームを構成するプロパティをカンマで区切ったリストです。 * および ? ワイルドカードを使用できます。 デフォルトは `*`(すべてのプロパティ)です。 `%%CLASSNAME` プロパティは無視されます。 保存されているプロパティのみを使用できます。
特定のタイプ(`%Date`、`%Time`、`%Boolean`、`%TimeStamp`)のプロパティを除き、すべてのプロパティはそのまま転送されます。 これらはそれぞれのPythonデータ型に変換されます。
## ExecuteTable
`ExecuteClass` のラッパーです。 テーブル名をクラス名に変換し、`ExecuteClass` を呼び出します。 署名:
`ExecuteTable(table, variable, type, start, end, properties, namespace)` - クラスデータをPythonのタプルリスト、またはpandasのデータフレームに転送します。
引数:
- `table` - テーブル名。
その他の引数はそのまま `ExecuteClass` に渡されます。
## 注意事項
- `ExecuteGlobal`、`ExecuteClass`、`ExecuteTable` の実行速度は概して同じです(クラス定義の解析にはごくわずかな時間しかかからないため)。
- `ExecuteGlobal` は測定可能なワークロード(0.01秒超)で、`ExecuteQuery` よりも最大20倍高速です。
- `ExecuteGlobal`、`ExecuteClass`、`ExecuteTable` は、`^global(key) = $lb(prop1, prop2, ..., propN)` の構造を持つグローバルでのみ機能します(`key` は整数でなければなりません)。
- `ExecuteGlobal`、`ExecuteClass`、`ExecuteTable` の場合、サポートされている `%Date` の範囲は `mktime` の範囲([Windows](https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/mktime-mktime32-mktime64?view=vs-2019):1970-01-01、[Linux](https://linux.die.net/man/3/mktime):1900-01-01、[Mac](https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/mktime.3.html))と同じです。 この範囲から外れた日付を転送するには、`%TimeStamp` を使用してください。 または、pandas データフレームを使用してください(これはリストの制限であるため)。
- `ExecuteGlobal`、` ExecuteClass`、`ExecuteTable` の場合、ソース(グローバル、クラス、テーブル)および変数以外のすべての引数は省略可能です。
## 例
仮に [isc.py.test.Person](https://github.com/intersystems-community/PythonGateway/blob/master/isc/py/test/Person.cls) クラスがあるとしましょう。 この場合、次のようにすべてのデータ転送メソッドを使用できます。
```
// すべてのデータ転送方法
set global = "isc.py.test.PersonD"
set class = "isc.py.test.Person"
set table = "isc_py_test.Person"
set query = "SELECT * FROM isc_py_test.Person"
// 共通の引数
set variable = "df"
set type = "dataframe"
set start = 1
set end = $g(^isc.py.test.PersonD, start)
// 方法0:引数なしのExecuteGlobal
set sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 0, type)
// 方法1:引数付きのExecuteGlobal
// グローバル転送の場合、ラベルは自動的に計算されません
// globalKey - グローバル添え字です
set labels = $lb("globalKey", "Name", "DOB", "TS", "RandomTime", "AgeYears", "AgeDecimal", "AgeDouble", "Bool")
// "globalKey" はグローバル添え字ラベルであるため、マスクはラベルより1要素短くなります
// ここでは %%CLASSNAME フィールドをスキップします
set mask = "-+dmt+++b"
set sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 1, type, start, end, mask, labels)
// 方法2:ExecuteClass
set sc = ##class(isc.py.Main).ExecuteClass(class, variable _ 2, type, start, end)
// 方法3:ExecuteTable
set sc = ##class(isc.py.Main).ExecuteTable(table, variable _ 3, type, start, end)
// 方法4:ExecuteTable
set sc = ##class(isc.py.Main).ExecuteQuery(query, variable _ 4, type)
```
`do ##class(isc.py.test.Person).Test()` を呼び出すと、これらのデータ転送メソッドの動作を確認できます。
## 補助
補助的なメソッドです。
- `GetVariableInfo(variable, serialization, .defined, .type, .length)` - 変数に関する情報(定義の有無、型、シリアライズ後の長さ)を取得します。
- `GetVariableDefined(variable, .defined)` - 変数定義の有無を取得します。
- `GetVariableType(variable, .type)` - 変数のFQCNを取得します。
- `GetStatus()` - Pythonで最後に発生した例外を返し、それをクリアします。
- `GetModuleInfo(module, .imported, .alias)` - モジュールのエイリアスを取得し、現在インポートされているかどうかを取得します。
- `GetFunctionInfo(function, .defined, .type, .docs, .signature, .arguments)` - 関数の情報を取得します。
# 要約
Python Gatewayを使用すると、InterSytems IRISとPythonをシームレスに統合できます。 これを使用することで、コードを実行してデータを双方向に転送できます。
# リンク
- [Python Gateway](https://openexchange.intersystems.com/package/PythonGateway)
- [Python 3.6.7(64ビット版)のインストール](https://www.python.org/downloads/release/python-367/)
- [Pythonのドキュメント/チュートリアル](https://docs.python.org/3.6/tutorial/index.html)
# イラスト付きガイド
ML Toolkitユーザーグループには、イラスト付きのガイドもあります。 ML Toolkitユーザーグループは、InterSystems社のGitHub組織の一部として設定されている非公開GitHubリポジトリです。 このリポジトリは、Python Gatewayを含むML Toolkitコンポーネントをインストール、学習、またはすでに使用している外部ユーザーを対象としています。 ML Toolkitユーザーグループに参加するには、以下の内容を含む簡単なメールを [MLToolkit@intersystems.com](mailto:MLToolkit@intersystems.com?subject=MLToolkit%20user%20group&body=Hello.%0A%0APlease%20add%20me%20to%20ML%20Toolkit%20user%20group%3A%0A%0A-%20GitHub%20username%3A%20%0A%0A-%20Name%3A%20%0A%0A-%20Company%3A%20%0A%0A-%20Position%3A%0A-%20Country%3A%20%0A%0A) 宛に送信してください(グループメンバーが議論中にあなたを認識して特定するために必要です)。
- GitHubのユーザー名
- 氏名(英文字表記の名前、姓の順)
- 組織(勤務先、通学先、または在宅勤務)
- 役職(組織での実際の役職、「学生」、または「無所属」)
- 国(本拠地としている国)
記事
Hiroshi Sato · 2021年3月3日
これは InterSystems FAQ サイトの記事です。
InterSystems製品を停止しないバックアップ方法は、3種類あります。
① 外部バックアップ② オンライバックアップ③ レガシー並行外部バックアップ
各詳細については、以下ドキュメントをご参照ください。
バックアップ方法について【IRIS】バックアップ方法についてそれぞれの特徴について、簡単に解説します。
① 外部バックアップ外部バックアップでは、SANシステム等のストレージ機能を利用して、データベースファイル(InterSystems IRIS の場合は IRIS.DAT、Caché/Ensemble/HealthShareの場合は CACHE.DAT)のスナップショットを作成する間だけ、データベースへの書き込みを停止させます。スナップショット作成中は、データベースへの書き込みは停止されますが、ユーザ・プロセスによるメモリ内の更新は引き続き実行できます。しかし、スナップショット機能がなく、バックアップ対象のデータベースを、退避エリアにコピーするような場合、データベースファイル(*.DAT)のファイルサイズが大きければ大きい程、コピーに時間がかかります。コピーに時間がかかれば、データベースへの書き込み停止時間も長くなります。また停止時間が長時間に及ぶことで、ユーザからの更新量も増え、データベースキャッシュが一杯になる事も予測され、その結果、ユーザプロセスが停止してしまいます。データベースへの書き込み停止状態が、長時間に及ぶ事が予測できるような場合は、③のレガシー並行外部バックアップを利用したほうが、書き込み停止時間を短くできます。
② オンラインバックアップオンラインバックアップでは、データベース内でデータに割り当てられているブロック全てがバックアップされます。オンラインバックアップ中も、データベース内のブロックが更新されることがあるため、更新が継続する限り、繰り返し更新ブロックのバックアップを行います。 最終的には、完全なバックアップを取る必要があるため、必ずどこかの時点で静止状態を作る必要があります。このためオンラインバックアップでは、データベースへの書き込みを停止する状態が、何度か続きます。データベースへの書き込み停止については、①の外部バックアップと同様で、ユーザ・プロセスによるメモリ内の更新は引き続き実行できます。しかし、オンラインバックアップの場合、バックアップ対象のデータベース容量が大きければ大きいほど、バックアップにかかる時間は長くなるため、「書き込み停止」合計時間が長くなります。できるだけ、書き込み停止時間を短くしたい場合には、①の外部バックアップ、または、③のレガシー並行外部バックアップを利用します。
③ レガシー並行外部バックアップレガシー並行外部バックアップは、InterSystems製品のユーティリティを利用して、データベースファイル(*.DAT)のスナップショットの作成(または、バックアップエリアへの退避)と、オンラインバックアップの差分バックアップを組み合わせたバックアップ方法です。方法は、以下の通りです。
================================================================(1) バックアップ開始のフラグをデータベースにセットし、(2) データベースファイル(*.DAT)をコピーし、(3) そのコピー時間中に変更されたデータに対して、「オンラインバックアップ」の差分バックアップを実行する================================================================データベースへの書き込み停止状態になるのは、(3)の差分バックアップの最終処理のみです。
この時のバックアップ対象データは、データベースファイル(*.DAT)コピー中に変更されたデータのみであるため、フルバックアップを行う時間と比べ、停止時間は極端に短くなります。
実際の利用方法は以下の通りです。
詳細については、ドキュメントもご参照ください。
バックアップのリストアについて【IRIS】バックアップのリストアについて===============================================================(1) バックアップ開始のフラグをデータベースにセット
set ^ClearOK=$$CLRINC^DBACK("QUIET")
(2) OS上で データベースファイル(*.DAT)をコピー (3) 外部バックアップユーティリティを使用したことを示すための実行
set x=$$BACKUP^DBACK("","E","dirty backup","","","")
(4) 差分バックアップを実行
set x=$$BACKUP^DBACK("","I","incremental",bckfile,logfile,"QUIET","Y","Y","Y","")
===============================================================
上記、InterSystems製品内の処理をルーチンやクラスメソッド化し、バッチ処理と組み合わせることで、運用できます。
以下は、Caché2009.1以降で動作するサンプルルーチンです。InterSystems IRIS でお試しいただく場合には、データベースファイルを退避する箇所を「IRIS.DAT」に変更してからお試しください。
Backupサンプルルーチン
レガシー並行外部バックアップで利用する^DBACKルーチンについて詳細は、以下ドキュメントをご参照ください
^DBACKルーチンについて^DBACKルーチンについて【IRIS】^DBACKルーチンについて^DBACKルーチンについて
記事
Megumi Kakechi · 2022年1月12日
これは、InterSystems FAQサイトの記事です。ミラージャーナルファイルの削除(パージ)のタイミングは以下のようになります。
・プライマリ・フェイルオーバー・メンバ
以下の期限のうち長い方に該当するもの -ローカルジャーナルファイルの削除条件が満たされたとき ("ジャーナル設定の構成" を参照) -バックアップメンバとすべての非同期メンバに受信されたとき ただし、非同期メンバが14日間(既定値)を経過してもジャーナルファイルを受信しない場合は、そのジャーナルファイルは削除対象になります。 「既定の14日間」は、以下のコマンドで設定が可能になります。 この保持期間を過ぎると、ジャーナルが削除されてしまいその非同期メンバでは同期が取れなくなるのでご注意ください。
%SYS>write ##class(SYS.Mirror).JrnPurgeDefaultWait(10) // 引数で保持期間を渡す
・バックアップ・フェイルオーバー・メンバ およびすべての災害復旧 (DR) 非同期メンバ
以下の期限のうち長い方に該当するもの -ローカルジャーナルファイルの削除条件が満たされたとき -そのメンバで完全にデジャーナルされたとき -すべての非同期メンバに受信されたとき ただし、非同期メンバが14日間(既定値)を経過してもジャーナルファイルを受信しない場合は、そのジャーナルファイルは削除対象になります。
・レポート非同期メンバ
-既定では、ミラージャーナルファイルがデジャーナルされ、トランザクションロールバックで不要になったとき 管理ポータル:[システム管理] > [構成]> [ミラー設定] > [非同期の構成を編集] にて変更可能 ("非同期メンバの編集または削除" を参照)
ミラーではデジャーナリングが完了したジャーナルファイルは逐次システムが削除するので、手動でのミラージャーナルファイルの削除は行わないようにしてください。もし、プライマリ側で未完了トランザクションが存在する場合、そのトランザクションのデータを含むジャーナルファイルは削除されずにトランザクション終了まで保持されます。現在開いているトランザクションを含むミラージャーナルファイルはどのミラーメンバでも削除されません。どのジャーナルファイルまでデジャーナリングが完了しているかは、管理ポータルで確認することができます。 [システム オペレーション] > [ミラーモニタ] で各データベース毎にどのジャーナルファイルまで処理したかを確認できます。
ミラーリングではジャーナルデータの不整合/更新データの欠落を防ぐため、ジャーナルファイルへの書き込みができなくなった場合にデータベースへの更新アクセスをフリーズする動作となっています(この動作は変更できません)。ジャーナルファイルのディスクの空き容量不足により、業務がその復旧まで停止することとならないよう、代替えディレクトリの設定をするようにしてください。("ジャーナリングの最善の使用方法 "を参照)
詳細は、以下のドキュメントをご覧ください。ミラー・ジャーナル・ファイルの削除
どうしても手動で削除したい場合
ディスク容量が逼迫しどうしても手動で削除する必要がある場合、緊急の処置として以下のユーティリティまたはクラスメッソドにてジャーナルファイルのパージを行うことができます。ただし、バックアップ取得以降のジャーナルファイルも削除されますので早急にデータベースのバックアップを行うようにしてください。
トランザクションのロールバックに必要なジャーナルファイルを除き全てのジャーナルを削除する場合は、以下の2つの方法があります。
(1) PURGE^JOURNAL ユーティリティ
%SYS>do PURGE^JOURNAL
1) Purge any journal NOT required for transaction rollback or crash recovery
2) Purge journals based on existing criteria (2 days or 2 backups)
Option? 1
(2) %SYS.Journal.File クラス の PurgeAll() クラスメソッド
Set RET=##class(%SYS.Journal.File).PurgeAll()
ジャーナルファイルの日付・番号を指定し、指定されたファイルより過去のジャーナルファイルを削除する場合は以下の方法になります。
(3) SYS.Mirror クラス の PurgeJournalFiles() クラスメソッド
%SYS>set CheckOnly=1 // 1の場合はP urge対象のファイルをリストするだけ、 0 の場合は削除%SYS>set StartFile="c:\intersystems\18p\mgr\journal\MIRROR-NAME-20210714.001" // 開始ファイル、これより古いファイルが削除対象%SYS>write ##class(SYS.Mirror).PurgeJournalFiles(CheckOnly,StartFile,,,.PurgeCount,.PurgeMB,.PurgeRange,.PurgeFiles)1%SYS>zwritePurgeCount=4PurgeFiles("NAME")=4PurgeFiles("NAME",1)="c:\intersystems\18p\mgr\journal\MIRROR-NAME-20210708.001"PurgeFiles("NAME",2)="c:\intersystems\18p\mgr\journal\MIRROR-NAME-20210712.001"PurgeFiles("NAME",3)="c:\intersystems\18p\mgr\journal\MIRROR-NAME-20210713.001"PurgeFiles("NAME",4)="c:\intersystems\18p\mgr\journal\MIRROR-NAME-20210714.001"PurgeMB=9PurgeRange=" 66 69"
あわせて、以下の関連記事も是非ご覧ください。
Cache Mirroring 101:簡単なガイドとよくある質問 ミラーリングの機能について
記事
Hiroshi Sato · 2021年9月26日
これは InterSystems FAQ サイトの記事です。リストコレクション(Property XXX As list of %String;)で定義したプロパティは、SQL関数: $LISTBUILD() 、$LISTFROMSTRING() を使用して操作できます。
各SQL関数については、下記ドキュメントページをご参照ください。
InterSystems SQL リファレンス - $LISTBUILD() 【IRIS】IRIS SQL リファレンス - $LISTFROMSTRING() 【IRIS】Caché SQL リファレンス - $LISTBUILD()Caché SQL リファレンス - $LISTFROMSTRING()
/// クラス定義例Class ISJ.ListOfData Extends %Persistent{Property listdata As list Of %String;}
SQL文実行例は以下の通りです。
USER>do $system.SQL.Shell()--- 表示省略 ---USER>>insert into ISJ.ListOfData (listdata) values($LISTBUILD('あ','い','う'))10. insert into ISJ.ListOfData (listdata) values($LISTBUILD('あ','い','う'))1 Row Affected--- 表示省略 ---↓次は $LISTFROMTOSTRING()を使用した例↓USER>>insert into ISJ.ListOfData (listdata) values($LISTFROMSTRING('か,き,く'))12. insert into ISJ.ListOfData (listdata) values($LISTFROMSTRING('か,き,く') )1 Row Affectedstatement prepare time: 0.0180s, elapsed execute time: 0.0001s.---------------------------------------------------------------------------USER>>quitUSER>set obj=##class(ISJ.ListOfData).%OpenId(1) // オブジェクトで確認USER>write obj.listdata.Count()3USER>write obj.listdata.GetAt(1)あUSER>write obj.listdata.GetAt(2)いUSER>write obj.listdata.GetAt(3)うUSER>set obj=##class(ISJ.ListOfData).%OpenId(2)USER>for i=1:1:obj.listdata.Count() {write obj.listdata.GetAt(i),!}かきく
ODBC形式でアクセスするとカンマ区切りデータとして取り扱えます。
※表示形式変更方法は、DATE型やTIME型カラムに対する方法と同じです。
詳細は関連トピックをご参照ください。
USER>do $system.SQL.Shell()-- 表示省略 --USER>>set selectmode = odbc // ←ODBCモードへの切り替えselectmode = odbcUSER>>select * from ISJ.ListOfData14. select * from ISJ.ListOfDataID listdata1 あ,い,う2 か,き,く2 Rows(s) Affectedstatement prepare time: 0.0003s, elapsed execute time: 0.0006s.---------------------------------------------------------------------------USER>>update ISJ.ListOfData set listdata='さ,し,す' where ID=115. update ISJ.ListOfData set listdata='さ,し,す' where ID=11 Row Affectedstatement prepare time: 0.0007s, elapsed execute time: 0.0003s.---------------------------------------------------------------------------USER>>select * from ISJ.ListOfData16. select * from ISJ.ListOfDataID listdata1 さ,し,す2 か,き,く2 Rows(s) Affectedstatement prepare time: 0.0003s, elapsed execute time: 0.0005s.USER>>quit---------------------------------------------
記事
Megumi Kakechi · 2021年6月16日
これは InterSystems FAQ サイトの記事です。
InterSystems製品のシステムモニタが色々なリソースの使用状況を監視しています。
そしてその使用状況に応じてアラートやワーニング情報をコンソールログ(message.log/cconsole.log)に出力します。
アラート情報が表示するCPUのリソースについては、以下のものが定義されています。
ECP* ECP関連システムプロセスLICENSESRV ライセンスサーバシステムプロセスSLWDTYPE (WDSLAVE) スレーブライトデーモンシステムプロセスWDTYPE (WRTDMN) ライトデーモンシステムプロセスJDTYPE (JRNDMN) ジャーナルデーモンシステムプロセスGCTYPE (GARCOL) ガベージコレクタシステムプロセスCSPDMNTYPE (CSPDMN) CSPシステムプロセスCSPSRV CSPシステムプロセスODBCSRV ODBCシステムプロセスMirror* Mirroring関連システムプロセス
表示される数値は、各システムプロセス生成以降のCPU使用時間をmsecで算出、前回計測時との差分で集計期間の使用時間の割合(%)を算出しています。
(ただし、2015.1 より前のバージョンでは、CPU使用時間の集計に正確さが欠け、100%を上回る場合があります。)
Alertの場合:ある期間のセンサの読み取り値が 3 回連続してセンサの最大値を上回った場合にアラート (深刻度 2 の通知) を生成します。
Warningの場合:ある期間のセンサの読み取り値が 5 回連続してセンサの警告値を上回った場合にワーニング (深刻度 1 の通知) を生成します。
以下ドキュメントをご参照ください。
ヘルスモニタについて【IRIS】
Caché ヘルスモニタについて
記事
Mihoko Iijima · 2021年8月30日
これは InterSystems FAQ サイトの記事です。
InterSystems 製品には、テーブルのコンテンツに関する統計を収集し、クエリの最適化に役立てる「テーブルチューニング機能」があります。
設定方法は、以下のドキュメントをご参照ください。
テーブルのチューニングについて【IRIS】
テーブルのチューニングについて
ターミナルでは次のコマンドを実行します。
Do $system.SQL.TuneTable("<テーブル名>",0,1)
また、以下の資料もご参照ください。
1) パフォーマンス調査の基礎知識として必要なグローバル構造の解説やSQLの動作の仕組みからクエリプランの見方の解説
インターシステムズ・シンポジア2011の資料
2) パフォーマンスチューニングの例(P13~)
インターシステムズ・シンポジア2012の資料
3) ビットマップ・インデックスの圧縮やオプティマイザ・ヒントなど、Caché SQLのパフォーマンスを最大限に引き出すための情報について
インターシステムズ・シンポジア2014の資料
4) パフォーマンスに困ったときにどこに着目し、どのツールで調べていくか、お客様から日々ご相談をいただくカスタマーサポートから、解決に向かうアプローチの「イロハ」をご紹介するビデオ
動画:Performance 101
5) 開発者コミュティのパフォーマンス関連情報(performanceタグ)
performanceタグ
関連する以下記事、FAQトピックも併せてご参照ください。
クエリプランの見方を教えてください
外れ値について
選択性の数値について
記事
Toshihiko Minamoto · 2022年6月7日
Postgres から IRIS にデータとデータスキーマを転送または移行する必要がある場合があります。 これを現時点で実行するにはいくつかのオプションがありますが、最も一般的なオプションは、DBeaver(https://openexchange.intersystems.com/package/DBeaver)または SQLGateway を使用する 2 つの方法です。 最初のオプションはこの記事で紹介しますが、2 つ目のオプションは Robert Cemper が書いた「SQLgateway を使ったデータベース移行」(https://community.intersystems.com/post/db-migration-using-sqlgateway)という優れた記事で紹介されています。この記事では、DBeaver を使った移行の実行方法を説明します。
## 移行プロセスにサンプルデータを取得
GitHub では、2 つのデータベースをビルドして実行する docker compose プロジェクトをダウンロードできます。
* **ソースデータベース**: サンプルデータベースを含む Postgres データベースの Docker インスタンス。
* **ターゲットデータベース**: ソースデータベースを受け取る準備のできたスキーマを含む InterSystems IRIS データプラットフォームの Docker インスタンス。
サンプルを取得して実行するには、以下の手順に従います。
1. https://github.com/yurimarx/migration-pg-iris に移動し、[Download]をクリックして git リポジトリに移動します。
2. プロジェクトを Clone します。git clone https://github.com/yurimarx/migration-pg-iris.git
3. migration-pg-iris プロジェクトフォルダに移動します。
4. ビルドを実行します: docker-compose build
5. コンテナを実行します: docker-compose up -d
6. Docker のデスクトップでインスタンスが OK であることを確認します。
.png)
## 移行するデータについて
移行されるデータは以下の通りです。
.png)
PostgreSQL から IRIS への移行プロセスによって以下が移行されます。
* 8 個のテーブル
* sale の 1000000 行
* users の 250000 行
* product の 300 行
* store の 500 行
* country の 100 行
* city の 30 行
* status_name の 5 行
移行先は、InterSystems IRIS データベースの USER ネームスペース内にある dc_test スキーマです。
## PostgreSQL から IRIS に移行するためのオープンソースツール: DBeaver
DBeaver は、市販の主要データベース製品に接続し、データオブジェクトを作成、ドロップ、選択、更新、および削除するデータベースツールです。 https://openexchange.intersystems.com/package/DBeaver からダウンロードできます。 インストール手順に従って、この優れた製品をノートパソコンかデスクトップにインストールしてください。
DBeaver は、データベースのメーカーやバージョンが異なる場合であっても、データベース接続間でデータを移行するために使用できます。
## DBeaver を使って、ソースデータベースとターゲットデータベースを接続
移行するデータベース接続を設定します。
**DBeaver への PostgreSQL 接続を設定するには:**
1. DBeaver で、[ファイル]>[新規作成]に移動します。
2. [データベース接続]を選択して、[次へ]をクリックします。
.png)
3. [SQL]タブ >[PostgreSQL]を選択して、[次へ]をクリックします。
.png)
4. 以下の図のように、PostgreSQL 接続のフィールドに入力します。
ホスト: localhost、ポート: 5438、データベース: postgres、ユーザー名: postgres、パスワード: postgres、と入力し、[終了]をクリックします。
**DBeaver への InterSystems IRIS 接続を設定するには:**
1. DBeaver で、[ファイル]>[新規作成]に移動します。 2. [データベース接続]を選択して、[次へ]をクリックします。
.png)
3. [SQL]タブ >[InterSystems IRIS]を選択して、[次へ]をクリックします。
.png)
4. DBeaver が InterSystems IRIS ドライバーのダウンロードを要求したら、[はい]または[OK]を押します。
5. 以下の図のように、InterSystems IRIS 接続のフィールドに入力します。
ホスト: localhost、データベース/スキーマ: user、ユーザー名: _SYSTEM、パスワード: SYS、と入力し、[テスト接続]と[終了]をクリックします。
6. 接続(postgres と user)がデータベースナビゲーターで利用できるようになります。
.png)
## 移行を行う
**移行を行うには、以下の手順に従います。**
1. postgres 接続 > public を展開し、すべてのテーブルを選択します。 以下の図のように、選択されたテーブルを右クリックして[データをエクスポート]を選択します。
.png)
2. 以下の図のようにデータベースを選択して、[次へ]をクリックします。
.png)
3. [選択]ボタンをクリックします。
.png)
4. dc_test を選択して、[OK]をクリックします。
.png)
5. ターゲットデータベースのデータ型構成を変更する必要があります。IRIS と PostgreSQL では、整数値と10進値で異なるデータ型を使用するためです。
public.country テーブルを展開し、最初のフィールド(country_id)を選択して[列...]をクリックします。
.png)
7. [ターゲットの型]を int4 から integer に変更し、[OK]をクリックします。
.png)
8. 以下のテーブルでこのプロセスを繰り返します。
a. public.productb. public.status_namec. public.usersd. public.city(city_id と country_id の型を integer に変更します)e. public.store(store_id と city_id の型を integer に変更します)f. public.sale(amount の型を double に、product_id、user_id、store_id の型を integer に変更します)
.png)
g. public.order_status(status_name_id を integer に変更します)
9. ターゲットデータ型の変更が完了したら、[次へ]をクリックします。
.png)
10. [フェッチサイズ]を 1000000 に設定して、[次へ]をクリックします。
.png)
11. データ読み込み設定のデフォルト値を受け入れて、[次へ]をクリックします。
.png)
12. [確認]で[続行]をクリックします。
.png)
13. データベースナビゲーターで、InterSystems IRIS dc_test スキーマ内にすべての PostgreSQL テーブルが表示されます。
.png)
テーブルの移行プロセスは非常に単純でしたが、ビュー、関数、トリガー、およびストアドプロシージャについては、ObjectScript か SQL で SQL ソースコードを書き直す必要があります。
IRIS に移行するメリット
以下は、IRIS で得られる機能を要約したリストです。
* API 管理
* 視覚的レポート(IRIS レポート)
* AutoML(IntegratedML)
* 多言語アプリケーション/データ開発(Python、Java、.NET、JavaScript)
* ESB
* BI/分析
* NLP
* マイクロサービス開発
* マルチモデルデータベース(SQL、JSON、分析キューブ、オブジェクト指向)
* シャーディング
まとめると、IRIS に移行するというのは、データベースしかなかった状態からデータプラットフォームに移行できるということです。
記事
Hiroshi Sato · 2020年10月29日
これはInterSystems FAQ サイトの記事です。
以下のようにユーザ名、パスワードを引数に持ち、認証が成功した場合はユーザ名、失敗したときは""(NULL)を返すルーチン(SecTest^SecTest)を作成し、標準の認証システムを書き換えることができます。
SecTest(user,pass) // user1のパスワードがuser1の場合、認証OKのログを作成 if user="user1",pass="user1" { set ^sqllog($i(^sqllog))="認証OK;"_$horolog_";"_user quit user } // 認証できなかった場合、認証NGのログを作成 set ^sqllog($i(^sqllog))="認証NG;"_$horolog_";"_user quit ""
このルーチンを$SYSTEM.SQL.SetSQLLoginOverride()関数を使用して置き換えます。
do $SYSTEM.SQL.SetSQLLoginOverride("SecTest^SecTest")
ただし標準の認証ができなくなりますので、パスワードを別に保管、参照する仕組みを記述する必要があります。
記事
Tomoko Furuzono · 2020年11月24日
これは、InterSystems FAQサイトの記事です。
(a) 現在使用中のライセンス数:現時点のライセンスユニット使用数です。
(b) 最大ライセンス使用:インスタンスが起動した後、現在に至るまでで最もライセンス使用の大きかった時点の "現在使用中のライセンス数"です。
(c) 許可されたライセンス数(Cache.Key/iris.keyの値):該当システムで許可されている最大ライセンスユニット数です。
(d) 現在の接続:現時点のクライアントからの接続数です。
(e) 最大接続:インスタンスが起動した後、現在に至るまでで最も接続数の大きかった時点の"現在の接続"です。
記事
Hiroshi Sato · 2021年2月1日
これは InterSystems FAQ サイトの記事です。
ドキュメント上は明確に記述されていませんが、エクスポートの追加ボタンを押した時に表示されるファイルダイアログのファイル名にグローバル名 + .GBLと入力することでグローバルをエクスポートの対象にすることができます。(例: ^aaaの場合、^aaa.gblと指定)
この機能はクラス、ルーチン等と一緒にグローバルデータを一括してエクスポート/インポートする際に、便利な機能ですが、XMLで表現されるため、データ容量は実データに比較し大きくなりますので、大量データを処理する場合には必要な容量に注意が必要です。