はるか昔、はるか遠くのシステムで...
データベースをMySQLからPostgreSQLに移行しようとしています。私が読んだすべてのドキュメントは、構造を移行する方法を非常に詳細にカバーしています。データの移行に関するドキュメントはほとんど見つかりませんでした。スキーマには、13個のテーブル(正常に移行されました)と9GBのデータがあります。
MySQLバージョン:5.1.x
PostgreSQLバージョン:8.4.x
Rプログラミング言語を使用して、SQLselectステートメントを使用してデータを分析したいと思います。PostgreSQLにはPL/Rがありますが、MySQLには何もありません(私が知る限り)。
新たな希望
データベースの場所を作成します(/var
十分なスペースがありません。また、PostgreSQLのバージョン番号をどこにでも置くことは嫌いです。アップグレードするとスクリプトが壊れます!):
sudo mkdir -p /home/postgres/main
sudo cp -Rp /var/lib/postgresql/8.4/main /home/postgres
sudo chown -R postgres.postgres /home/postgres
sudo chmod -R 700 /home/postgres
sudo usermod -d /home/postgres/ postgres
ここまですべて良い。次に、サーバーを再起動し、次のインストール手順を使用してデータベースを構成します。
sudo apt-get install postgresql pgadmin3
sudo /etc/init.d/postgresql-8.4 stop
sudo vi /etc/postgresql/8.4/main/postgresql.conf
data_directory
に変更/home/postgres/main
sudo /etc/init.d/postgresql-8.4 start
sudo -u postgres psql postgres
\password postgres
sudo -u postgres createdb climate
pgadmin3
pgadmin3
データベースを構成し、スキーマを作成するために使用します。
エピソードは、と呼ばれるリモートシェルで続行されbash
、両方のデータベースが実行され、かなり珍しいロゴが付いた一連のツール(SQL Fairy )がインストールされます。
perl Makefile.PL
sudo make install
sudo apt-get install perl-doc
(不思議なことに、それは呼ばれていませんperldoc
)perldoc SQL::Translator::Manual
PostgreSQL対応のDDLとすべてのMySQL
データを抽出します。
sqlt -f DBI --dsn dbi:mysql:climate --db-user user --db-password password -t PostgreSQL > climate-pg-ddl.sql
- 識別子を編集
climate-pg-ddl.sql
して小文字に変換し、スキーマ参照を挿入します(VIMを使用)。:%s/"\([A-Z_]*\)"/\L\1/g
:%s/ TABLE / TABLE climate./g
:%s/ on / on climate./g
mysqldump --skip-add-locks --complete-insert --no-create-db --no-create-info --quick --result-file="climate-my.sql" --databases climate --skip-comments -u root -p
MySQLのテーブルと列の名前を小文字に変更するだけの価値があるかもしれません。
select concat( 'RENAME TABLE climate.', TABLE_NAME, ' to climate.', lower(TABLE_NAME), ';' ) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='climate';
- 前の手順のコマンドを実行します。
- おそらく、列に対して同じことを行う方法があります。クエリの書き方を理解するよりも速かったので、手動で変更しました。
データベースの逆襲
次のようにPostgreSQLで構造を再作成します。
pgadmin3
(それに切り替えます)- [任意のSQLクエリを実行する]アイコンをクリックします
- 開ける
climate-pg-ddl.sql
TABLE "
置換を検索しTABLE climate."
ます(スキーマ名を挿入しますclimate
)on "
置換を検索しon climate."
ます(スキーマ名を挿入しますclimate
)- を押し
F5
て実行
これにより、次のようになります。
Query returned successfully with no result in 122 ms.
ジェダイの返信
この時点で私は困惑しています。
- PostgreSQLに対して実行できるように変換するためにここからどこに行くのですか(手順は何ですか)?
climate-my.sql
climate-pg.sql
- インデックスが正しくコピーされていることを確認するにはどうすればよいですか(参照整合性を維持するため。現時点では、移行を容易にするための制約はありません)。
- PostgreSQLに新しい行を追加すると、最後に挿入された行のインデックスから列挙が開始されるようにするにはどうすればよいですか(シーケンスの既存の主キーと競合しないようにするため)。
- データをMySQLからPostgreSQLインサートに変換するときに、スキーマ名が確実に伝わるようにするにはどうすればよいですか?
資力
これを実現するには、かなりの情報が必要でした。
- https://help.ubuntu.com/community/PostgreSQL
- http://articles.sitepoint.com/article/site-mysql-postgresql-1
- http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#MySQL
- http://pgfoundry.org/frs/shownotes.php?release_id=810
- http://sqlfairy.sourceforge.net/
ありがとうございました!