マンガでよめる痔のこと・薬のこと

PostgreSQLのpg_dumpを用いたバックアップで困っています。

OSはVineLinux 2.2.17-0vl10です。
あるサーバ(PostgreSQL7.0.2)のデータベースtest_db(EUC_JP)に対して、
pg_dump -D -v -i -f test.dump test.db
でダンプファイルを作成しました。
COPYでは不確実な場合があるということでINSERT文で出力しました。
(データの日本語の部分が数字に変換されています)

それを別のサーバ(PostgreSQL8.2.5)のデータベースtest2_db(EUC_JP)にリストアしました。
psql test2_db < test.dump

すると、"(株)"という文字を含む文字列が化けてしまっていました。
同じレコードの他のカラムは大丈夫です。

このような場合の対策がありましたら教えていただきたいと思います。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

もう解決したかもしれませんが。



pg_dump/pg_restore実行前に
export PGCLIENTENCODING=***
で文字コード指定で動作するような気がします
    • good
    • 0
この回答へのお礼

大変遅くなり、申し訳ありません。
無事、解決しました。

お礼日時:2008/07/15 16:44

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qpostgresのdatabase名と、そのencodingを取得する

postgresのdatabase名と、そのencodingを取得する方法を教えてください。



postgres8.1です。

システムカタログ
http://www.postgresql.jp/document/pg811doc/html/catalogs.html

pg_databaseの項目として持っているだろうと思い、見てみました。

encodingint4 このデータベースの文字符号化方式

これか?と思いましたが、数値IDのみでした。

この数値から、utf8やsjisといった情報にどうやったら繋がりますか?

Aベストアンサー

pg_encoding_to_char関数で文字エンコーディング名に変換できます。

=> SELECT datname, pg_encoding_to_char(encoding) FROM pg_database;
datname | pg_encoding_to_char
-----------+---------------------
template1 | UTF8
template0 | UTF8
postgres | UTF8
(4 rows)

QWindows版 pg_dumpの結果をログ取得

お世話になっております。

Windows版のPostgreSQL8.1を使用しています。
Windowsのバッチファイルで毎週自動実行で
pg_dumpによるバックアップを取得しようと思っています。
バックアップは正常に取得できるのですが、
どうしてもログファイルが出力できません。
手動でバッチを動かすと、プロンプトには表示が出ます。
『pg_dump: テーブル×××の内容をダンプしています』
のように。それをどうやったらファイルに残せるかを知りたいです。

実行しているコマンドは、

pg_dump.exe -f "DBバックアップファイル" -i -v -h ホスト名 -p ポート -U "ユーザ名" -F c "DB名">>"ログファイル名"

としています。

以上です。宜しくおねがいします。

Aベストアンサー

画面に出てファイルに残らないなら標準出力じゃなくエラー出力なんでしょう。

コマンド >> ログファイル 2>&1

QPOSTGRESのデータの格納場所はどこでしょうか?

RedHat7.2/PostgreSQL7.2/という環境で、サーバーがクラッシュしてしまい、データを他のサーバに移し変えないといけなくなりました。そこで、PostgreSQLを再インストールしないとデータベースが使えない状況となりました。

データベースを再インストールするのは良いとして、どこかに格納されているはずのデータベースの内容を取り出し、復帰させたいのですが、方法はありますか?大変困っております。よろしくお願いします。

Aベストアンサー

No.1の追加です。
データの移設でよかったと思います。
または、データを読み込むときに、「iオプション」でディレクトリを指定して、元のファイルを読み込んでもよかったと思います。

Qpsqlコマンド接続によるパスワードについて

psqlコマンドでDBへの接続を行っております。

/usr/local/pgsql/bin/psql -U postgres -h xxx.xxx.xxx.xxx testdb

上記コマンドをコマンドラインから実行するとパスワードが聞かれます。
パスワード設定をmd5にしているためですが、
その設定を変更せずコマンドラインでパスワードを渡すなどしてパスワードの入力を促す処理をスルーしたいのですが全然出来ません。

どのなたかご存知の方、いらっしゃいましたらご教示の程お願い致します。

Aベストアンサー

PGPASSWORD=○○○ /usr/local/pgsql/bin/psql -U postgres -h xxx.xxx.xxx.xxx testdb

Qデータがリストアできない!!

以下のようにバックアップ後、リストアし、ODBCを利用し、ACCESSでレコード追加したところ、再度、リストアしようとするとエラーが出て、復元できません。

(1)バックアップ
sudo -u test pg_dump -O testdb > /home/test/test-back-1.dmp
(2)リストア
sudo -u test dropdb testdb
sudo -u test createdb -EEUC_JP testdb
sudo -u test psql -e testdb < /home/test/test-back-1.dmp
(3)ODBCを利用し、ACCESSの追加クエリでtbl_tensuのレコードを追加
(4)再度、リストア
sudo -u test dropdb testdb
sudo -u test createdb -EEUC_JP testdb
sudo -u test psql -e testdb < /home/test/test-back-1.dmp

以下のようなエラーが、レコード追加したテーブルも何もしていないテーブルにも出てしまい、正しく復元できません。

ALTER TABLE ONLY tbl_tensu
ADD CONSTRAINT tbl_tensu_primary_key PRIMARY KEY (hospnum, srycd, yukostymd, yukoedymd);
ERROR: multiple primary keys for table "tbl_tensu" are not allowed

CREATE INDEX idx_tensu_formalname ON tbl_tensu USING btree (formalname);
ERROR: relation "idx_tensu_formalname" already exists
CREATE INDEX idx_tensu_kananame ON tbl_tensu USING btree (kananame);
ERROR: relation "idx_tensu_kananame" already exists
CREATE INDEX idx_tensu_kensagrp ON tbl_tensu USING btree (hospnum, srykbn, knsjisgrpkbn);
ERROR: relation "idx_tensu_kensagrp" already exists
CREATE INDEX idx_tensu_name ON tbl_tensu USING btree (name);
ERROR: relation "idx_tensu_name" already exists

何が原因でどうすれば、復元したときにエラーが出なくなるでしょうか?
どなたか、わかる方ご教示ください。
よろしくお願いします。

以下のようにバックアップ後、リストアし、ODBCを利用し、ACCESSでレコード追加したところ、再度、リストアしようとするとエラーが出て、復元できません。

(1)バックアップ
sudo -u test pg_dump -O testdb > /home/test/test-back-1.dmp
(2)リストア
sudo -u test dropdb testdb
sudo -u test createdb -EEUC_JP testdb
sudo -u test psql -e testdb < /home/test/test-back-1.dmp
(3)ODBCを利用し、ACCESSの追加クエリでtbl_tensuのレコードを追加
(4)再度、リストア
sudo -u test dropdb testdb
sudo -u test ...続きを読む

Aベストアンサー

すでにテーブルが存在する状態で、ダンプファイルからリストアしようとした時のエラーのようです。
「(4)再度、リストア」の時の、データベースの再作成(dropdb/createdb) は本当に成功していますでしょうか。
(3)のODBCで接続した時に、testdbにコネクションが張られた状態となり、
 testdbがdropできず、残ったままで、リストアしているのではないかという気がします。
 (SQL実行中でなくても、コネクションが1つでも張られている限り、
 データベースのdropはできません。)
(4)のsudo -u test dropdb testdb 実行後に、psql -l で確認すると、testdbは
 消えておりますでしょうか。

(外していたらすいません)

QデフォルトのCLIENT_ENCODINGを変更したい

データベース、またはPostgresql本体の CLIENT_ENCODING のデフォルトを設定するにはどうしたらよいでしょうか。
ご存知の方いらっしゃいましたら教えてください。

【現状】
Linux機にインストールしたPostgresqlのCLIENT_ENCODINGをSJISにしたいのですが、DBにconnectする毎に SET CLIENT_ENCODING 'SJIS'; することで対処していますが、出来ればソフト側ではなくDB側の設定で対処したいと考えています。

■ デフォルト設定のWindowsとLinuxの差異
Windows:
 サーバ:euc
 CLIENT_ENCODING:sjis ※

Linux[centos4]:
 サーバ:euc
 CLIENT_ENCODING:euc

※ Windowsと同じ設定になるようにしたいです。
  またはCREATEDBのオプションとかでそういうのがあると良いのですが。

PostgreSQLのversion:8.1.5

Aベストアンサー

dateフォルダにあるpostgresql.confのclient_encodingの値を変更しておけばいいのではないでしょうか。

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Q接続中のユーザを表示する方法

こんにちは。Postgresで接続中ユーザの表示をするには(コマンド)どうすればよいか教えてください。

Aベストアンサー

(ソースのリダイレクトです)
postgreSQL v8.0.2で
select * from pg_stat_activity;
とすれば出て来ました。

一応、探すのに苦労しましたが
23.2. 統計情報収集器
にその他統計情報の閲覧テーブルが記載されています(参考までに)
http://www.postgresql.jp/document/pg800doc/html/monitoring-stats.html

参考URL:http://ml.postgresql.jp/pipermail/pgsql-jp/2003-August/014272.html

QpgAdminIIIでのリストア

こんばんは。
pgAdminIIIを最近使いはじめました。
テーブルAを作成し、その後、そのテーブルのバックアップをCOMPRESSで作成しました。
そのバックアップファイルをデータを削除したテーブルAにリストアしようとしたのですが、
SET check_function_bodies = false
というコマンドがエラーだと表示され、うまくリストアできませんでした。
何が間違っているのでしょうか?
ご回答よろしくお願い致します。
ちなみにデータの文字コードはUnicodeでPostgreSQL7.3.9を利用しています。

Aベストアンサー

pgAdminIIIに付属のpg_dump と、postgresqlのバージョンの不整合により発生するのでしょう。

pgAdminIIIを使いたいのであれば、Postgresqlのバージョンをあげるしかないのでは?
(でも こんな発想は本末転倒ですが...)

COMPRESS にしなければ、バックアップファイルの編集で対応可能でしょうが、そんなことまでして、使用する意味がないような気がします。

Qテーブル単位のリストア

pg_dumpall > [出力ファイル名]

で作成したバックアップからテーブル単位でリストアする方法はないのでしょうか?

pg_dumpallのマニュアルを読むと、リストアはpsqlで行うことになっていますが、psqlのマニュアルには
テーブル単位で取り出すオプションなどはないようです。

また:pg_dumpallで作成したファイルを:

pg_restore -l [入力ファイル名]

の入力ファイルにすると、"pg_restore: [archiver] input file does not appear to be a valid archive"
エラーが発生します。

webでも調べてみたのですが、該当するページが見あたりません。
お手数ですがご教授ください。

Aベストアンサー

> 通常のエディタで開くことはもちろん、手作業で行うことは気が遠くなってしまいます。

そういうことでしたら、思いつくのは下記の様な方法でしょうか。

a. pg_dumpall ではなく pg_dump を使ってダンプする
 元のDBに接続でき、現在の状態のリストアでよいならば、この方法が簡単でしょう。
 例) pg_dump -h localhost -p 5432 -U user_hoge -t table_hoge db_hoge > dump.txt;
http://www.postgresql.jp/document/9.2/html/app-pgdump.html

b. スクリプト言語を使って対象のテーブルの箇所を抽出する
 perl や ruby などを使えば、対象部分を抽出するプログラムが割りと簡単に作れるかと思います。

c. サイズの大きいファイルも扱えるエディタを使って抽出する
 例えば、 vim などではサイズが大きくてもさほど不自由なく編集はできたと思います。
 検索機能で該当箇所への移動・選択を行い、新旧の2ファイルを開いてコピーすれば良いかと。

> 通常のエディタで開くことはもちろん、手作業で行うことは気が遠くなってしまいます。

そういうことでしたら、思いつくのは下記の様な方法でしょうか。

a. pg_dumpall ではなく pg_dump を使ってダンプする
 元のDBに接続でき、現在の状態のリストアでよいならば、この方法が簡単でしょう。
 例) pg_dump -h localhost -p 5432 -U user_hoge -t table_hoge db_hoge > dump.txt;
http://www.postgresql.jp/document/9.2/html/app-pgdump.html

b. スクリプト言語を使って対象のテーブルの箇所を抽出する
 pe...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報