現在運用中の業務に新たな業務を追加するとき、運用中のデータベースの定義に対して、定義の変更が必要となる場合があります。Symfoware/RDBでは、24時間運用を行うために、アプリケーションを停止することなく以下の定義変更を行うことができます。
列の追加
DSIの追加
DSIの分割値変更
動的定義変更機能を利用することで、運用中のアプリケーションがアクセスするデータベース資源(表やDSIなど)の定義情報を、運用中のアプリケーションの動作に影響を与えることなく変更することができます。
動的定義変更機能による定義情報の変更は、あらかじめ目的とする定義変更を準備しておき、一括して定義変更の内容を確定することで行います。定義変更の準備は、rdbddlexコマンドのlオプション(準備モード)で行います。準備した定義変更の確定は、rdbddlfixコマンドで行います。
たとえば、運用で使用中の表に表のDSIを追加する場合、追加する表のDSIの定義と表に定義されたインデックスに対応するインデックスのDSIの定義を実施しますが、rdbddlexコマンドのlオプション指定で、これらの表DSI定義とインデックスDSI定義を実行し、定義変更の準備を行います。その後、rdbddlfixコマンドを実行し準備状態の定義変更内容を一括して確定します。
rdbddlexコマンドの準備モード(lオプション)で定義した内容は、rdbprtコマンドで確認することができます。
参照
rdbddlexコマンド、rdbddlfixコマンドおよびrdbprtコマンドの指定方法の詳細については、“コマンドリファレンス”を参照してください。
注意
rdbddlexコマンドの準備モードで定義した内容は、Symfoware/RDB停止後も引き継がれます。
rdbddlexコマンドの準備モードで定義した資源が確定する前の状態である場合、その状態を一括して無効にすることができます。一括して無効にする場合は、rdbddlfixコマンドでcオプションを指定して実行してください。
準備状態の資源に対して、通常の定義操作を実行することはできません。
rdbddlfixコマンドはrdbddlexコマンドのlオプションで定義変更の準備を行った利用者のみ実行することができます。
業務で扱うデータの種類を拡張する方法として、既存の表に列を追加することが考えられます。このような場合でも、表をアクセスするアプリケーションを停止することなく、表に列を追加することができます。
追加する列の定義情報を確定後、追加した列をアクセスする新規のアプリケーションの実行を開始することができます。列定義追加直後は、追加した列にはデフォルト句で指定したデフォルト値が設定されています。追加した列にデータを格納後に新しいアプリケーションの実行を開始する場合は、運用中の業務と並行して、追加した列にアプリケーションでデータを格納し、そのあとで新しい運用を開始してください。
アプリケーション実行中に列を追加する場合の操作の手順と操作例を以下に示します。
表を支店ごとにDSI分割している場合、支店の追加に伴いDSIの追加が必要となります。
運用中にこのような用件が発生した場合でも、運用を停止することなく表と関連するインデックスのDSIを動的に追加することができます。
動的に追加したDSIはrdbsloaderコマンドで創成するか、またはrdbfmtコマンドで初期化することで活性状態となり、アプリケーションの処理対象となります。
アプリケーション実行中にDSIを追加する場合の操作の手順と操作例を以下に示します。
(1) 準備モードで、データベースの定義を変更します。 ――― rdbddlexコマンド (lオプション) (2) 定義変更の内容を、一括して確定します。 ――― rdbddlfixコマンド (3) 追加したDSIを運用から除外します。(注) ――― rdbexdsiコマンド (monオプション) (4) DSIが除外されたことを確認します。(注) ――― rdbexdsiコマンド (mwオプション) (5) DSIの創成または初期化をします。 ――― rdbsloaderコマンドまたは rdbfmtコマンド (6) 追加したDSIを運用に組み込みます。(注) ――― rdbexdsiコマンド (moffオプション)
注) rdbexdsiコマンドによるDSIの除外操作をすべてのユーザを対象にして実施します(rdbexdsiコマンドのuオプションを指定せずに実行)。
DSIの除外操作がすべてのユーザに対して実施されていない場合、アプリケーションでDSIに関連する表をアクセス中は、rdbfmtコマンドによるDSIの初期化またはrdbsloaderコマンドによるDSIの創成を行うことができない場合があります。
$ rdbddlex -d 在庫管理DB -l /rdb2/tbl01.ddl $ rdbddlfix -a $ rdbexdsi -mon -i 在庫管理DB.東海発注表DSI $ rdbexdsi -mw $ rdbsloader -mi -i 在庫管理DB.東海発注表DSI -f 20 -s /home/rdb1/work -k /home/rdb1/stock.data $ rdbexdsi -moff -i 在庫管理DB.東海発注表DSI
/rdb2/tbl01.ddlの内容を以下に示します。
CREATE DSI 東海発注表DSI DSO 発注表DSO USING(80,89) ALLOCATE DATA ON DBSP_3 SIZE 1024M; CREATE DSI 東海取引先IXDSI INDEX DSO 取引先IXDSO BASE 東海発注表DSI ALLOCATE INDEX ON DBSP_1 SIZE 40M, BASE ON DBSP_1 SIZE 200M;
ポイント
rdbsloaderコマンドは、分割格納が定義された表のDSIを処理するとき、入力ファイル内に分割値範囲外のデータが含まれている場合、該当データを処理対象とせずに処理を続行し、正常終了します。分割範囲外のデータをエラーとし、入力ファイルの作成ミスや指定ミスによるデータ抜けを検出するためには、Eオプションを使用します。
参照
各コマンドの指定方法の詳細については、“コマンドリファレンス”を参照してください。
DSIを循環使用する運用では、たとえば月の変わり目で、最も古い月(2006年3月)のデータを格納するDSIの分割値を変更して、新しい月(2007年3月)のデータを格納するDSIにします。
アプリケーションが動作中の場合は、変更対象のDSIをrdbexdsiコマンドにより運用から除外してDSIの分割値を変更します。
rdbexdsiコマンドについては、“4.9.5 DSIの切離し”を参照してください。
アプリケーション実行中にDSIの分割値を変更する場合の操作の手順と操作例を以下に示します。
(1) 変更対象のDSIを運用から除外します。(注) ――― rdbexdsiコマンド (monオプション) (2) DSIが除外されたことを確認します。(注) ――― rdbexdsiコマンド (mwオプション) (3) DSIをバックアップします。 ――― rdbunlコマンド (4) DSIを初期化します。 ――― rdbfmtコマンド (5) DSIの分割値を変更します。 ――― rdbddlexコマンド (6) 変更対象のDSIを運用に組み込みます。(注) ――― rdbexdsiコマンド (moffオプション)
注) rdbexdsiコマンドによるDSIの除外操作をすべてのユーザを対象にして実施します(rdbexdsiコマンドのuオプションを指定せずに実行)。
DSIの除外操作がすべてのユーザに対して実施されていない場合、アプリケーションでDSIに関連する表をアクセス中は、ALTER DSI文によるDSIの分割値の変更を行うことはできません。
2006年3月のデータが格納されたDSIを2007年3月のデータが格納されたDSIに変更する場合の操作例を以下に示します。
$ rdbexdsi -mon -i 在庫管理DB.発注DSI3月 $ rdbexdsi -mw $ rdbunl -i 在庫管理DB.発注DSI3月 /rdb2/backup/DSI200603.dat $ rdbfmt -mid -i 在庫管理DB.発注DSI3月 $ rdbddlex -d 在庫管理DB /rdb2/alterdsi.ddl $ rdbexdsi -moff -i 在庫管理DB.発注DSI3月
/rdb2/alterdsi.ddlの内容を以下に示します。
ALTER DSI 発注DSI3月 ALTER USING(2007,3);