IBM i (旧AS400）の自己学習メモ　コマンド／ツール／運用　CPYFでテーブルデータのバックアップなど

# 自己学習メモインデックス

[IBM i (旧AS400）の自己学習メモ　インデックス](https://qiita.com/You_name_is_YU/items/3964849e7803c8eaf767)

# 概要

Oracleであっても、AS400のDB2 for iであっても、RDBMSとして利用している場合、システムのリリースやテーブル定義変更などのタイミングで、テーブルのデータをバックアップしておきたいケースがあります。
そんな時に便利なのが`CPYF`コマンドです。

# CPYFコマンドでバックアップ

`CPYF`と入力してF4キーを押下し、Copy File画面を表示します。
Copy File画面で以下のようにパラメータを入力し、Enterを押下することで、From file→To fileにコピーすることが可能です。

|項目|設定|備考|
|:--|:--|:--|
|From file|MTOKISKP|コピー元のファイル名を指定する。<br>ここでは例としてMTOKISKPを指定しています。|
|  Library|YAMAGUCHI1|コピー元のファイルが格納されているライブラリを指定します。|
|To file|MTOKISKP@1|コピー**先**のファイル名を指定する。<br>ここでは例としてMTOKISKP@1を指定しています。<br>AS400の制限上、ファイル名は10文字までとなっているため、MTOKISKP_20210101などと指定することができないので、簡易的に名前を指定しています。|
|  Library|YAMAGUCHI1|コピー**先**のファイルを格納するライブラリを指定します。<br>コピー元のファイルとは別のライブラリ（例えばYAMABKLIBなどのバックアップ用のライブラリ）を指定することも可能です。|
|Replace or add records|*replace|*replaceはコピー先のライブラリ内にすでに同じ名前のファイルが存在した場合、上書き保存する指定です。|
|Create file|*yes|コピー先のライブラリ内にファイルが存在しない場合、新規でファイルを作成するか？というオプションです。<br>*yesと指定した場合、ファイルが存在しない場合は作成してくれます。<br>ファイルが存在しない場合に、*noだとCPYFコマンドがエラーとなります。|

![スクリーンショット 2021-01-01 13.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/2acc0573-20d2-42db-f062-282cf19f5a8d.png)

コマンドで実行する場合は以下のような感じになります。

```
CPYF FROMFILE(YAMAGUCHI1/MTOKISKP) TOFILE(YAMAGUCHI1/MTOKISKP@1) MBROPT(*REPLACE) CRTFILE(*YES)                                                           
```

CPYFコマンドの実行が完了すると、以下のようにファイルが作成されていることが確認できます。
（strpdm -> 2 -> Library=YAMAGUCHI1 , Type=*FILE でWork with Objects Using PDM画面へ遷移）
![スクリーンショット 2021-01-01 13.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/c3981497-64e3-284e-5115-7fe54019c150.png)

# バックアップしたファイルのテキストを変更

バックアップは完了しましたが、`MTOKISKP@1`というファイル名だけでは、これが何を表すものなのか、いまいちよくわかりません。（時間が経てば経つほど記憶が薄れていくものです。）
なので、Work with Objects Using PDM画面から、バックアップしたファイルのテキストをメンテナンスします。

Opt=13を指定してEnter
![スクリーンショット 2021-01-01 13.37.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/7dc3d9e5-19d0-f860-1847-4c8f26e35e5c.png)

Text Descriptionをメンテナンスする画面で、このファイルがどんな役割のものなのかを表すテキストを入力してEnter
![スクリーンショット 2021-01-01 13.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/c6a03e2e-fb12-23be-bf5a-9e2bab4c65d3.png)

このように、テキストにこのファイルの説明を入れておくことで、後から見返した際に、どんなファイルなのかその役割を把握することが可能です。
![スクリーンショット 2021-01-01 13.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/ba912d48-d30d-9d2f-3bc1-c162e90bb6a0.png)

# CPYFでコピーするデータを条件指定する

CPYFはバックアップをするためだけではなく、例えばテスト環境などへ本番環境のデータをコピーして動作確認を行う場合などにも有効です。
その場合、本番環境にある大量のデータをコピーすると、データベースのディスクサイズも圧迫しますし、コピーする時間も非常に掛かってしまいます。
そんな時に、CPYFでコピーするデータの条件を絞り込んでコピーすることが可能です。

CPYFコマンドの画面で、F10を押下することでオプションパラメータを設定することが可能となります。
オプションパラメータの画面でPageDownしていき、INCRELのパラメータ設定画面を表示し、次のように設定していきます。
ここでは、TOKRMT（得意先マスタの利用限度額項目）が、120万円を超えている得意先情報のみをコピーする。という条件を指定しています。

![スクリーンショット 2021-01-01 13.48.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/597f10df-42d9-df53-ebd9-eb0d2eb9afd5.png)

コマンドだと以下のようなコマンドになります。

```
CPYF FROMFILE(YAMAGUCHI1/MTOKISKP) TOFILE(YAMAGUCHI1/MTOKISKP@1) MBROPT(*REPLACE) CRTFILE(*YES) INCREL((*IF TOKRMT *GT 1200000))
```

複数の条件を指定したい場合は、`+for more values`に`+`を入力してEnterを押下すると、さらに条件を追加指定できます。
![スクリーンショット 2021-01-01 13.51.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/ab29951a-2bed-bc6e-f07a-bab44fa522b6.png)
![スクリーンショット 2021-01-01 13.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/9989d4ef-ab1d-3176-0407-19a3e986ffe3.png)