以下のようにバックアップ後、リストアし、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

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

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

A 回答 (1件)

すでにテーブルが存在する状態で、ダンプファイルからリストアしようとした時のエラーのようです。


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

(外していたらすいません)
    • good
    • 0
この回答へのお礼

copymasterさんありがとうございます。

ACCESSを終了してから、再度、リストアしたら、エラーがでなくなりました。

お礼日時:2011/03/06 08:40

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

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

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

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

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

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

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...続きを読む

QLinuxからWindowsへのリストアについて

Linux版PostgreSQL7.Xからのバックアップファイルを使用し、Windows版PostgreSQL8.04へリストアをしたいと考えております。

具体的にどのようにしたら出来るのでしょうか?
ざっくばらんな質問で申し訳ありません、現在試しているのですが、Window版のpgadminIIIを使用しリストアしようとしても、Linux版のバックアップファイルが認識できないようで、OKボタンが押せない状態です。

Aベストアンサー

大変失礼いたしました。今回はキチンと
Windows版PostgreSQL8.0.4をインストールして
やってみました。

(3)の操作はやはりおっしゃるとおりになりますので、
かわりに次のようにしてください。


(2)の続き、
<1>新しく作ったDBにpsqlで接続する。

>psql -U postgres -h localhost windb

<2>ダンプファイルを読み込む。

windb=# \i C:/temp/out.sql

これでいかがでしょうか?

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

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

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

Aベストアンサー

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

QPostgreSQL 8.0.2 の ERROR: relation does not exist.

エラーの詳細は以下のとおりです。

まず、ダウンロード後解凍したpostgresql-8.0-ja.msiを
ダブルクリックして、Windows2000serverSP4 に
postgreSQL8.02 をインストールしました。
このときユーザpostgreも新規作成しました。

つぎに、ツールpgAdmin3を使用して上記postgreユーザで
データベースtemplate1のpublicスキームの中に、
ID(int4), Book(text)の2フィールド、IDフィールドをキーとして、
tblBooksという名称の練習用の簡単なテーブルを作成しました。

さらに、pgAdmin3を使用して、このtblBooksテーブルに適当なレコードも4件追加でき、
pgAdmin3のテーブルビューで追加したこのレコード4件を確認できました。

また、pgAdmin3のクエリツールを用いて、クエリの下記を実行すると
正常に実行してくれます。
select version();
"PostgreSQL 8.0.2 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special)"

ところが、上で作成したtblBooksテーブルを含めたクエリを実行させると、
何回やっても次のようなエラーとなります。
select * from tblBooks;
ERROR: relation "tblbooks" does not exist.------(1)

pgAdmin3でなく、ツールpgSQLを使っても同じエラー(1)がでます。
この"relation does not exist"とは一体どんなエラーなんでしょうか?

環境は, Windows 2000 Server SP4 で、
template1,tblBooksは次のようになっています。

CREATE DATABASE template1
WITH OWNER = postgres
ENCODING = 'EUC_JP'
TABLESPACE = pg_default;
GRANT ALL ON DATABASE template1 TO postgres;

CREATE TABLE "tblBooks"
(
"ID" int4 NOT NULL,
"Book" text,
CONSTRAINT "key" PRIMARY KEY ("ID")
)
WITHOUT OIDS;

エラーの詳細は以下のとおりです。

まず、ダウンロード後解凍したpostgresql-8.0-ja.msiを
ダブルクリックして、Windows2000serverSP4 に
postgreSQL8.02 をインストールしました。
このときユーザpostgreも新規作成しました。

つぎに、ツールpgAdmin3を使用して上記postgreユーザで
データベースtemplate1のpublicスキームの中に、
ID(int4), Book(text)の2フィールド、IDフィールドをキーとして、
tblBooksという名称の練習用の簡単なテーブルを作成しました。

さらに、pgAdmin3を使用して、こ...続きを読む

Aベストアンサー

テーブル名に大文字と小文字が混在しているせい
でしょうか。。。
"tblbooks" か "TBLBOOKS" にしたほうがよい
とは思います。

(SQL文としては、大文字小文字どちらか一方
に統一されていれば、
"tblbooks"でCREATEしたテーブルでも、
"TBLBOOKS"でSELECTできるはずです。)

検証したわけではないので、はずしているかもしれませ
んが、CREATE TABLE "tblbooks" で作ってみても、
再現するでしょうか?

QPostgreSQLが起動しない・・・

はじめまして、tanu_2です。
玄箱HGをDebian化し、いろいろと遊んでいます。

PostgreSQLをapt-getでインストールし、Webアプリを動かしていたのですが、昨日より突然、PostgreSQLが動かなくなってしまいました。
原因が分からず、サーバを再起動し、
# /etc/init.d/postgresql start

$ pg_ctl start
などを試してみたのですが、動きません。
念のため、初期化(initdb)も試みたのですが、これも失敗してしまいます。
/var/log/postgresql/postgres/logを覗いてみると、

FATAL: could not write lock file "/var/lib/postgres/data/postmaster.pid": No space

となっており、上記ディレクトリにpostmaster.pid書き込みできないよ、と言われているっぽかったので、パーミッションを変更したりして
みましたが、postgresql startにしろ、pg_ctl startにしろ、それぞれのコマンドで起動すると、強制的にパーミッションが「700」に変更されてしまうようで、結果は同じでした。

どなたか、解決策をご教示願えませんでしょうか?

よろしくお願いします。m(_ _)m

はじめまして、tanu_2です。
玄箱HGをDebian化し、いろいろと遊んでいます。

PostgreSQLをapt-getでインストールし、Webアプリを動かしていたのですが、昨日より突然、PostgreSQLが動かなくなってしまいました。
原因が分からず、サーバを再起動し、
# /etc/init.d/postgresql start

$ pg_ctl start
などを試してみたのですが、動きません。
念のため、初期化(initdb)も試みたのですが、これも失敗してしまいます。
/var/log/postgresql/postgres/logを覗いてみると、

FATAL: could not wri...続きを読む

Aベストアンサー

それ以外にも、以下のようなコマンドを使ってデータベースサーバプログラムの起動が出来ますよね。

postmaster -D /usr/local/pgsql/data

ただ、以下のURLのドキュメント内には、次のような記述があります。

「何を実行するにしても、サーバはPostgreSQLユーザアカウントで起動させなければなりません。 rootであってはいけませんし、他のユーザでもいけません。」

パッケージによるインストールであれば、自動でpostgresユーザが作られているはずだと思うけど。(Debianは使ったことないので、確証はなし。)

su - postgres

上記のコマンドでログインするなり、パスワードを忘れたのならroot権限にてpasswdコマンドから変更するなりした後、もう一度postmasterを起動してみよう!

ちなみに、パーミッション関係のエラーは、「Permission denied」ですよね。

参考URL:http://www.postgresql.jp/document/pg803doc/html/postmaster-start.html

それ以外にも、以下のようなコマンドを使ってデータベースサーバプログラムの起動が出来ますよね。

postmaster -D /usr/local/pgsql/data

ただ、以下のURLのドキュメント内には、次のような記述があります。

「何を実行するにしても、サーバはPostgreSQLユーザアカウントで起動させなければなりません。 rootであってはいけませんし、他のユーザでもいけません。」

パッケージによるインストールであれば、自動でpostgresユーザが作られているはずだと思うけど。(Debianは使ったことないので、確証は...続きを読む

Qsqlに記述できない文字

いつもお世話になっております。
WEB画面から入力された項目を対象にPostgresに検索しに行っているのですが、シングルクォート(')が入っていた場合、エラーになってしまいました。

JavaからSQLを生成し、Postgresに接続しているのですが、シングルクォートを検索させるにはどうするのが良いでしょうか。

またSQLに記述できない文字は、シングルクォートのほかに何かありますでしょうか。

よろしくお願いします。

Aベストアンサー

下記のページにPostgreSQLのSQLの文字列定数についての説明が有りますので、記述できない文字などについてはここを見ると良いでしょう。
http://www.postgresql.jp/document/pg837doc/html/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS

さて、シングルクウォートを含む文字列定数への対応としては下記の3つが考えられます。
1. 文字列中のシングルクウォートとバックスラッシュ(\)を\でエスケープする。
2. ドル引用符を使用する。
3. プレースフォルダを使用する。


2は、$xxxx$ のようなドル記号で囲まれた文字列を引用符代わりに使う、PostgreSQL 独自の機能です。
'hoge' と書く代わりに $xxxx$hoge$xxxx$ の様に書けます。
詳しくは下記のページを見て下さい。
http://www.postgresql.jp/document/pg837doc/html/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING

3は、SQLの定数の位置に?を書き、PreparedStatement の set~~() メソッドを使って値を指定する方法です。下記のページが参考になるでしょう。
http://www.atmarkit.co.jp/fjava/rensai2/webopt11/webopt11.html
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/guide/jdbc/getstart/preparedstatement.html

参考URL:http://www.postgresql.jp/document/pg837doc/html/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS

下記のページにPostgreSQLのSQLの文字列定数についての説明が有りますので、記述できない文字などについてはここを見ると良いでしょう。
http://www.postgresql.jp/document/pg837doc/html/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS

さて、シングルクウォートを含む文字列定数への対応としては下記の3つが考えられます。
1. 文字列中のシングルクウォートとバックスラッシュ(\)を\でエスケープする。
2. ドル引用符を使用する。
3. プレースフォルダを使用する。


2は、$xxxx$ のようなドル記号で囲...続きを読む

Qファイルに記述されている複数のSQL文を一度に実行させたい

こんにちわ。

ファイルに記述されているSQL文を、Linuxのコマンドラインなどから
実行したいと考えています。

ファイルに
insert into DB_NAME(aaa,bbb,ccc) values(111,222,333);
insert into DB_NAME(ddd,eee,fff) values(333,777,222);
insert into DB_NAME(aaa,ttt,ddd) values(111,000,999);
...

などのSQL文が複数行(例えば1000個ほど)記述しているのを用意して
なんかしらの方法で一度に実行させたいのです。

mySQLでは、このようなやり方があるのですが
postgreではどのようにすればいいのか、わかりません。

どなたかご存知の方、よろしくお願い致します。

OSはLinuxです。

Aベストアンサー

#1の方も指摘されている通り、 psql を使えば出来ます。

psql で、-f オプションを使うか、該当のDBに接続して \i コマンドを使えば良いでしょう。
http://www.postgresql.jp/document/pg746doc/html/app-psql.html

SQLが記述されているファイルを insert_data.sql、
DBを testdb としますと
例1)-------------------------------------------------------------
$ psql testdb
Welcome to psql x.x.x, the PostgreSQL interactive terminal.




testdb=> \i insert_data.sql
testdb=> \q
-----------------------------------------------------------------

例2)-------------------------------------------------------------
$ psql testdb -f insert_data.sql
-----------------------------------------------------------------

注) ユーザのDBへのアクセス権によっては -U オプションや -W オプションも必要になります。

#1の方も指摘されている通り、 psql を使えば出来ます。

psql で、-f オプションを使うか、該当のDBに接続して \i コマンドを使えば良いでしょう。
http://www.postgresql.jp/document/pg746doc/html/app-psql.html

SQLが記述されているファイルを insert_data.sql、
DBを testdb としますと
例1)-------------------------------------------------------------
$ psql testdb
Welcome to psql x.x.x, the PostgreSQL interactive terminal.




testdb=> \i insert_data.sql
testdb=> \q...続きを読む

Qcastの使用法について(初心者です)

始めまして。初心者ですので基本的な質問になるかもしれませんがよろしくお願いします!

なぜかPostgreSQLを仕事に使うことになり、四苦八苦しています。

テーブルを作成しているときに、
create table syouhin (shinamono text, nedan int);
とするとします。
で、insert でデータを入れていきますが、
例:
shinamono | nedan
------------------
みかん |100
マンゴー |200

例えば、nedan のcast が今、int にしましたが、これをchar やfloatに変えたいときはどうすればよろしいのでしょうか?

どなたか御存じの方、お手数ですがお教え下さい!!!

Aベストアンサー

CAST関数の文法は、CAST(○ AS △) となります。
○:変換する値
△:変換する型

Select CAST(nedan AS char(10)) ~
とすればできると思いますよ

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&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報