DDLの失敗およびリカバリの例
次の例は、DDLを発行してそのステータスを監視するステップ、およびエラーが発生した場合の対処方法を示しています。
シャードでDDLが失敗した場合、その失敗が解決されてGDSCTLのrecover shard
コマンドが実行されるまで、そのシャードに対するその後のすべてのDDLはブロックされます。
これらのGDSCTLコマンドを実行するには、GSM_ADMIN
権限が必要です。
次の例では、SQL*Plusを使用してDDLが発行されたが、GDSCTL SQL
コマンドを使用した場合に同じステータス・チェックおよび修正処理が適用される場合を示します。
例6-1 シャード・カタログでのDDL処理エラー
この例では、ユーザーがCREATE USER
コマンドで入力ミスをしています。
SQL> alter session enable shard ddl;
Session altered.
SQL> CREATE USER example_user IDENTRIFIED BY out_standing1;
CREATE USER example_user IDENTRIFIED BY out_Standing1
*
ERROR at line 1:
ORA-00922: missing or invalid option
シャード・カタログでDDLの実行が失敗し、すべてのシャードでDDLが実行されなかったことがGDSCTLのshow ddl
コマンドに予想どおり表示されます。
GDSCTL> show ddl
id DDL Text Failed shards
-- -------- -------------
その後、ユーザーが正しいスペリングでコマンドを実行し直します。同じセッションを使用しているため、alter session enable shard ddl
を再度実行する必要はありません。
SQL> CREATE USER example_user IDENTIFIED BY out_Standing1;
User created.
今度は、DDLがシャード・カタログ・データベースで正常に実行され、オンラインのシャードで失敗していないことがshow ddl
に示されます。
GDSCTL> show ddl
id DDL Text Failed shards
-- -------- -------------
1 create user example_user identified by *****
ノート:
DDLの処理時に停止していたシャードの場合、DDLはそのシャードがアクセス可能になったときに自動的に適用されます。
例6-2 シャードで修正処理を発行することによって、シャードでのエラーをリカバリする
この例では、ユーザーはシステム管理のシャード表のための表領域セットを作成しようとします。ただし、1つのシャードのデータファイル・ディレクトリが書込み可能ではないため、DDLはカタログでは正常に実行されますが、そのシャードでは失敗します。
SQL> connect example_user/out_Standing1
Connected
SQL> create tablespace set tbsset;
Tablespace created.
ユーザーexample_userはシャード・データベース・ユーザーとして作成され、SHARD DDLがデフォルトで有効にされるため、alter session enable shard ddl
を実行する必要はありません。
GDSCTLのshow ddl
を使用してステータスを確認します。
GDSCTL> show ddl
id DDL Text Failed shards
-- -------- -------------
1 create user example_user identified by *****
2 create tablespace set tbsset shard01
このコマンド出力は、シャードshard01でDDLが失敗したことを示しています。GDSCTLのconfig shard
コマンドを実行して、詳細情報を取得します。
GDSCTL> config shard -shard shard01
Conversion = ':'Name: shard01
Shard Group: dbs1
Status: Ok
State: Deployed
Region: east
Connection string: (DESCRIPTION=(ADDRESS=(HOST=shard01-host)(PORT=1521)(PROTOCOL=tcp))
(CONNECT_DATA=(SID=shard01)))
SCAN address:
ONS remote port: 0
Disk Threshold, ms: 20
CPU Threshold, %: 75
Version: 18.0.0.0
Failed DDL: create tablespace set tbsset
DDL Error: ORA-02585: create tablepsace set failure, one of its tablespaces not created
ORA-01119: error in creating database file \'/ade/b/3667445372/oracle/rdbms/dbs/
SHARD01/datafile/o1_mf_tbsset_%u_.dbf\'
ORA-27040: file create error, unable to create file
Linux-x86_64 Error: 13: Permission denied
Additional information: 1 \(ngsmoci_execute\)
Failed DDL id: 2
Availability: ONLINE
「Failed DDL:」で始まるテキストは問題を示しています。それを解決するには、ユーザーはシャード・データベースのホストにログインして、そのディレクトリを書込み可能にする必要があります。
ディレクトリの権限を表示します。
cd $ORACLE_HOME/rdbms/dbs
ls –l ../ | grep dbs
dr-xr-xr-x 4 oracle dba 102400 Jul 20 15:41 dbs/
ディレクトリを書込み可能に変更します。
chmod +w .
ls –l ../ | grep dbs
drwxrwxr-x 4 oracle dba 102400 Jul 20 15:41 dbs/
GDSCTL コンソールに戻って、recover shard
コマンドを発行します。
GDSCTL> recover shard -shard shard01
ステータスを再度確認します。
GDSCTL> show ddl
id DDL Text Failed shards
-- -------- -------------
1 create user example_user identified by *****
2 create tablespace set tbsset
GDSCTL> config shard -shard shard01
Conversion = ':'Name: shard01
Shard Group: dbs1
Status: Ok
State: Deployed
Region: east
Connection string: (DESCRIPTION=(ADDRESS=(HOST=shard01-host)(PORT=1521)(PROTOCOL=tcp))
(CONNECT_DATA=(SID=shard01)))
SCAN address:
ONS remote port: 0
Disk Threshold, ms: 20
CPU Threshold, %: 75
Version: 18.0.0.0
Last Failed DDL:
DDL Error: ---
DDL id:
Availability: ONLINE
この出力に示されているように、失敗したDDLエラーが表示されなくなりました。
例6-3 他のすべてのシャードで修正処理を発行することによって、シャードでのエラーをリカバリする
この例では、ユーザーは別の表領域セットtbs_setを作成しようとしますが、同じ名前の既存のローカル表領域がすでに存在するため、シャードでDDLが失敗します。
シャード・カタログで次のコマンドを実行します。
SQL> create tablespace set tbs_set;
Tablespace created.
GDSCTLのshow ddl
コマンドを使用してステータスを確認します。
GDSCTL> show ddl
id DDL Text Failed shards
-- -------- -------------
1 create user example_user identified by *****
2 create tablespace set tbsset
3 create tablespace set tbs_set shard01
GDSCTL> config shard -shard shard01
Conversion = ':'Name: shard01
……
Failed DDL: create tablespace set tbs_set
DDL Error: ORA-02585: create tablespace set failure, one of its tablespaces not created
ORA-01543: tablespace \'TBS_SET\' already exists \(ngsmoci_execute\)
この問題を解決するには、ローカル・データベース管理者としてshard01にログインし、表領域TBS_SETを削除して、GDSCTLのrecover shard -shard shard01
を実行します。ただし、この表領域を維持して、かわりに名前が競合している新しく作成した表領域セットを削除し、別の名前(tbsset2など)を持つ別の表領域セットを作成するとします。次の例では、シャード・カタログで実行する方法を示します。
SQL> drop tablespace set tbs_set;
SQL> create tablespace set tbs_set2;
GDSCTLを使用してステータスを確認します。
GDSCTL> show ddl
id DDL Text Failed shards
-- -------- -------------
1 create user example_user identified by *****
2 create tablespace set tbsset
3 create tablespace set tbs_set shard01
4 drop tablespace set tbs_set
5 create tablespace set tbsset2
DDL 3がshard01で失敗したため、DDL 4および5はshard01で実行されなかったことがわかります。このシャードがシャード・カタログと整合性を持つようにするには、GDSCTLのrecover shard
コマンドを実行する必要があります。ただし、DDL 3は再び失敗し、実際には表領域セットtbs_setをもう作成するつもりがないため、このシャードでDDL 3を実行することは意味がありません。DDL 3をスキップするために、–ignore_first
オプションを指定してrecover shard
を実行します。
GDSCTL> recover shard -shard shard01 –ignore_first
GSM Errors: dbs1 shard01:ORA-00959: tablespace \'TBS_SET\' does not exist
(ngsmoci_execute)
GDSCTL> show ddl
id DDL Text Failed shards
-- -------- -------------
1 create user sidney identified by *****
2 create tablespace set tbsset
3 create tablespace set tbs_set
4 drop tablespace set tbs_set shard01
5 create tablespace set tbsset2
DDL 3がスキップされたため、今度はDDL 3で失敗しません。ただし、次のDDL (4 - drop tablespace set tbs_set)が適用され、削除する表領域セットがシャードに存在しないため、エラーとなります。
–ignore_first
オプションは最初のDDLのみをスキップするため、recover shard
を再び実行してdrop
文もスキップする必要があります。
GDSCTL> recover shard -shard shard01 –ignore_first
GDSCTL> show ddl
id DDL Text Failed shards
-- -------- -------------
1 create user sidney identified by *****
2 create tablespace set tbsset
3 create tablespace set tbs_set
4 drop tablespace set tbs_set
5 create tablespace set tbsset2
失敗は表示されなくなり、すべてのDDLがシャードに正常に適用されました。
–ignore_first
オプションを指定してrecover shard
を実行した場合、失敗したDDLは増分デプロイメントで無視とマークされます。このため、新しいシャードがシャード・データベースに追加されたとき、DDL番号3および4はスキップされ、DDL番号1、2および5のみが適用されます。