次のコマンドを使用したpostgresファイルのSQLスクリプトがあります。
COPY product_master(productId, productName) FROM 'product.txt' DELIMITERS ',' CSV;
このコマンドのエラーを処理したい(エラーをログに記録する)
例
エラー:重複するキー値に違反しています。
コマンドはCOPY
値を返しますか?いいえの場合、シェルスクリプトの出力をログに記録する方法は?
次のコマンドを使用したpostgresファイルのSQLスクリプトがあります。
COPY product_master(productId, productName) FROM 'product.txt' DELIMITERS ',' CSV;
このコマンドのエラーを処理したい(エラーをログに記録する)
例
エラー:重複するキー値に違反しています。
コマンドはCOPY
値を返しますか?いいえの場合、シェルスクリプトの出力をログに記録する方法は?
すべてのメッセージ (エラー、警告など) をデータベース ログ ファイルに大量の追加情報とともに記録できます。これは標準的な動作です。もちろん、データベース クラスタはそのように構成する必要があります。ここで細かいマニュアルを読んでください。
クライアントによっては、データベース サーバーからの直接の応答としてエラー メッセージを取得できるはずです。エラーは、データ出力とは異なるストリームで報告されることに注意してください。とシェルのようstout
に。stderr
シェルからはpsql -f
、スクリプトを実行するためにおそらく呼び出します。このデモで何が起こるか見てみましょう:
シェルでダミーの SQL スクリプトを作成します。
vim test.sql
このようなものをそれに入れます:
CREATE temp table x (a int primary key, b int);
insert into x values (1,2),(3,4);
COPY x TO '/var/lib/postgres/dev/test.out';
COPY x FROM '/var/lib/postgres/dev/test.out';
それを実行します:
psql mydb -f test.sql
出力は、次のようなさまざまな設定client_min_messages
に依存します。
psql:test.sql:2: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "x_pkey" for table "x"
CREATE TABLE
INSERT 0 2
psql:test.sql:4: ERROR: duplicate key value violates unique constraint "x_pkey"
KONTEXT: COPY x, line 1: "1 2"
log_statement = all
(とりわけ)構成したので、サーバーログは次のようになります。
2011-11-15 22:36:23 CET postgres LOG: statement: CREATE temp table x (a int primary key, b int);
2011-11-15 22:36:23 CET postgres LOG: statement: insert into x values (1,2),(3,4);
2011-11-15 22:36:23 CET postgres LOG: statement: COPY x FROM '/var/lib/postgres/dev/test.out';
2011-11-15 22:36:23 CET postgres ERROR: duplicate key value violates unique constraint "x_pkey"
2011-11-15 22:36:23 CET postgres CONTEXT: COPY x, line 1: "1 2"
2011-11-15 22:36:23 CET postgres STATEMENT: COPY x FROM '/var/lib/postgres/dev/test.out';
log_statement = all
生産的なサーバーでは使用しません。これにより、巨大なログ ファイルが生成されます。