Mysqlからエクスポートしたデータを、Postgresにインポートすることは可能でしょうか。

現在、phpMyadmin で、SQL、csv、XML形式でデータをダウンロードしてあります。Postgresのほうは、サーバーにphpPgadminをインストール後にログインできませんでしたので、コマンドでリストアするしかないかと思います。
phpMyadmin でエクスポートしたデータだと都合が悪い場合は、ダンプするコマンドも教えていただければうれしいです。

用語をいろいろ書きましたが、知識はまったくの素人です。コマンドを使うソフトもほとんどさわったことがありません。
よろしく宜しくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2008/12/25 00:05:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:skipsstep No.1

回答回数161ベストアンサー獲得回数3

ポイント27pt

たんなるテキストデータなので、様式のちがいをsedで書き換えれば可能です。

id:masato-7

ありがとうございます。案外簡単にできるのでしょうか。

すみません、sedで書き換えるにはどうすればいいのでしょうか?

形式は、SQLがいいのでしょうか?

まったくの素人同然ですので、具体的に教えていただけると、ありがたいです。

宜しくお願い致します。

2008/12/18 13:37:19
id:chuken_kenkou No.2

回答回数722ベストアンサー獲得回数54

ポイント27pt

PostgreSQLのCOPY文で、csvファイルとデータベース間のインポート/エクスポートを行えます。

まずは、使用例が記載されたサイト

PostgreSQL 入門第2回:PostgreSQL 有効活用術


こちらは、マニュアルの掲載箇所です。

http://www.postgresql.jp/document/pg820doc/html/sql-copy.html

※ここ数日間、マニュアルを公開している日本PostgreSQLユーザ会のサーバ移行トラブルで接続できませんでしたが、現在は復旧しています。

id:masato-7

ご丁寧にご回答いただき、ありがとうございます。

申し訳ございません。質問の文章の説明が足りませんでした。

状況を説明いたしますと、2つのサーバにそれぞれ別のデータベースが存在していたのですが、そのうち片方のサーバ(移行元)の契約を止めて、1つのサーバ(移行先:さくらインターネットのレンタルサーバ)上で管理することになったので、次のURLを参考に移行元のphpMyAdminからデータベースをエクスポートしました。

http://www.koikikukan.com/archives/2006/06/12/

そして、それを移行先のサーバにphpPgAdminを設置してインポートしようと考えていたのですが、"ログインに失敗しました" というエラーメッセージが表示され、ログインができません。

仕方がないので、phpPgAdminでのインポートをあきらめ、コマンドラインで試みましたが、次のエラーメッセージが大量に出力されてしまいます。

# psql -U userinfo userinfo < userinfo.sql

ERROR: syntax error at or near "`" at character 13

LINE 1: INSERT INTO `user_list_30` (`user_id`, `state_id`, `city_id`...

`(バッククォート)が良くないのかと思い、"(ダブルクォート)に置換して試してみましたが、今度は別のエラーが出て失敗してしまいました。

以下はその一部です。

NOTICE: table "user_list_38" does not exist, skipping

DROP TABLE

ERROR: syntax error at or near "serial" at character 56

LINE 2: "user_id" int NOT NULL serial,

^

ERROR: relation "hosp_list_38" does not exist

WARNING: nonstandard use of escape in a string literal at character 448

HINT: Use the escape string syntax for escapes, e.g., E'\r\n'.

何か良い解決策をご存知でしたら、ご教授いただけないでしょうか?

宜しくお願い致します。

2008/12/20 16:06:05
id:chuken_kenkou No.3

回答回数722ベストアンサー獲得回数54

ポイント26pt

#2への返答は、「SQL」での移行をしようとした時ですよね?

PostgreSQLとMySQLには、それぞれ独自仕様の部分があります。


ERROR: syntax error at or near "`" at character 13

LINE 1: INSERT INTO `user_list_30` (`user_id`, `state_id`, `city_id`...

`(バッククォート)が良くないのかと思い、"(ダブルクォート)に置換して試してみました

これは、適切な対処です。

標準SQLや主要なRDBMSでは、表や列の名前に予約語と同じキーワードを使用したり、特殊記号を使う場合、「"」(二重引用符)を使いますが、MySQLでは「`」(バッククォート)を使うという独自仕様になっています。


NOTICE: table "user_list_38" does not exist, skipping

DROP TABLE

これは、移行先に表を未定義であるのに、DROP TABLEしようとしたということで、問題ありません。


ERROR: syntax error at or near "serial" at character 56

LINE 2: "user_id" int NOT NULL serial,

「serial」はPostgreSQLの独自機能ですが、phpMyAdminでMySQLからエクスポート(SQLを生成)後、ご自身で「auto_increment」から修正したのでしょうか?

もしそうであれば、この前後のSQLの構文に問題があるのではないでしょうか?

primary keyにしてますよね?

なお、PostgreSQLのバージョンにより、確か仕様変更(「serialなら自動的にprimary keyと仮定されたのが、明示指定が必要になった(?)」とかだったかな)があったと思います。


ERROR: relation "hosp_list_38" does not exist

これも移行先で未定義なのに、削除や変更をしようとしたからですね。

ただ、WARNINGでなくERRORなので、MySQLとPostgreSQLでの非互換の部分でのエラーの可能性が高いかも知れません。

(実際のSQLを見ないと、判断はできません)


MySQLとPostgreSQLは、それぞれバージョンは何でしょう。

また、OSは何を使っているのでしょう?

また、文字コードは、何なのでしょうか?


まず、SQLレベルでの移行の場合、上述のように、特にDDL(表定義やインデクス定義など)で独自機能が多いです。そのため、何箇所か手作業による変更が必要になります。

#2でも回答したCSV形式のファイルでの移行は、どうでしょうか?

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません