本日頂いたQAです。
Q.Db2 for i のテーブル(物理ファイル)にHibernateからアクセスしたらSQL7008エラーが発生した
原因:SQL7008 はDb2 for iのテーブルでジャーナル(トランザクション・ログ)が取得しない設定となっているため
SQL7008を検索すると、Db2でトランザクション処理がreadyになっていない、ジャーナル処理がされていない、などがヒットすると思うのですが、わかりにくいですよね。。
回避策:対象の物理ファイルでジャーナル取得を開始する
となります。
ジャーナルの取得開始手順
手順1. ジャーナルレシーバーを作成
任意のライブラリーにジャーナルレシーバーを作成してください。
ジャーナル取得するPF(テーブル)と同一のライブラリーでもジャーナル専用に別のライブラリーを作成してもOKです。
例: CRTJRNRCV JRNRCV(GOMALIB/JRNRCV01) TEXT('TEST JRNRCV')
手順2. ジャーナルを作成
一般には①のジャーナルレシーバーと同じライブラリーにジャーナルを作成してください。この際、①で作成したジャーナルレシーバーの名前をジャーナルレシーバーのパラメーターに指定します。
例:CRTJRN JRN(GOMALIB/JRN01) JRNRCV(GOMALIB/JRNRCV01)
手順3. 物理ファイル(テーブル)でジャーナル取得を開始
SQL7008エラーが出ている物理ファイルに対してジャーナルを開始します。STRJRNPFコマンドを使用します。
*例;STRJRNPF FILE(GOMALIB/TESTPF1) JRN(GOMALIB/JRN01) IMAGES(BOTH)
上記コマンド実行後、再度P.1のDSPFDコマンドでジャーナル取得が開始されているかご確認ください。
IMAGESパラメーターは *AFTERでもいいと思われます。
ちなみにテーブルのジャーナル取得が開始されているか、終了しているか(ENDJRNPFコマンドを実行するとテーブル単位にジャーナル取得しないこともできる)は、DSPFDコマンドで確認できます。
下記のように ファイルは現在ジャーナル処理中がNOなら取得していない、YESなら取得している、となります。
補足:Db2 for i ではトランザクション・ログ(ジャーナル)をテーブル単位で取得する・しないが選択できる。
とくに、昔作られたアプリケーションではジャーナルを取得しない場合が多数派を占めると予想されます。
なぜ?大昔、1980~90年代前半、HDDは1台200~400GBでなおかつ現代に比べ大変高価でした。結果、ジャーナルを取得するとバンバン原価が上がる、という事になったわけです。そんなわけでジャーナルを取らないアプリケーションが多かったですし、パフォーマンス面でも(ジャーナル取らないのは)メリットが明確にありました。(ジャーナル取ると10~20%程度?処理時間が伸びる的な負荷があったと思います。)
最近では上記の制限は(ストレージ単価、ハードウェア性能の劇的な低価格化・高速化などで)すべて無くなっているため他のデータベースと一緒でジャーナルを取得する方が増えていると思います。
最近のIBM i (IBM i 7.1以降あたりでしたでしょうか。)では、SQLで、CREATE SCHEMA, CREATE TABLEすると自動でジャーナル・ジャーナルレシーバーが作成されてジャーナルはデフォルトで取得されるようになっています。(当記事の手順1~3が自動で設定されます)