2014年1月2日木曜日

MySQLのDBAは、MySQLへのPostgreSQLの第3部のPostgreSQLを見て

Original post: http://anothermysqldba.blogspot.com/2014/01/a-mysql-dba-looks-at-postgresql-part3.html

だから私は最近投稿: MySQLはデータベース管理者は、PostgreSQLを見てパート2:MySQLをPostgreSQLへの 。

この記事はからの移行を検討しますPostgreSQLのMySQLを 。 もう一度、これらのポストに長期的な目標は、データが異なるデータベース内でどのように動作するだけでなく、例が発生するタイミングを各データベースで同じような問題を解決する方法ができるショーされることになる。

MySQLはプッシュMySQLのワークベンチのデータベースの移行のためのツールです。 私は、なぜ私は好奇心旺盛だということを認めざるを得ないのMySQLユーティリティのコマンドラインオプションを提供しません。 以前のブログの記事( パート2 )コマンドラインからの移行がためだったどのように簡単に示したのMySQLへのPostgreSQLの 。 バックアップするデータを持って来るときにかかわらず、心に留めておくのMySQLデータエンジンを考慮しなければならない。

簡単に言えば、あなたが戻ってにデータを取り込むしようとしている場合はMySQLからPostgreSQLを fastオプションは、可能性がありますMySQLのワークベンチ 。 私たちはしばしば私たちのターミナルウィンドウ内にとどまることを好むので、しかし、それは全体的な解決策ではありません。 だから、次の操作を実行します。
  • からのスキーマダンプPostgreSQLをファイルに
    • MySQLのファイルを確認し、編集します。
  • 目的のスキーマとテーブルごとにCSVファイルとして実施エクスポートします。
  • 背中へのインポートMySQLの

とにかく、最初に我々はまだデータがあるのPostgreSQLからの世界データベースの例を。

world=> \dt
List of relations
Schema | Name | Type | Owner
--------+-----------------+-------+----------
public | city | table | testuser
public | country | table | testuser
public | countrylanguage | table | testuser
(3 rows)

world=> select count(ID) from City;
count
-------
4079
(1 row)

world=> 


スキーマをダンプ:

$ pg_dump -s world > world_schema.pgsql 


データ専用と - - 取るpg_dumpの使用は、単にデータの標準SQLファイルを構築するために挿入されます。

pg_dump --data-only --inserts world > world_data.pgsql 

あなたは、テーブルごとにダンプを行うことは、より良いだろうと後でわかりますが、これは動作します。

MySQLでデータベースを作成すると、バックデータを置くだけでなく、あなたの新しいスキーマをテストします。

mysql> CREATE DATABASE world_back;
Query OK, 1 row affected (0.01 sec) 


スキーマファイルを編集します。VI world_schema.pgsql
あなたは、あなたが行くようにあなたがそれらをテストすることができますように、新しいMySQLデータベースが作成されました。


CREATE TABLE city (
id integer DEFAULT nextval('city_id_seq'::regclass) NOT NULL,
name character(35) DEFAULT ''::bpchar NOT NULL,
countrycode character(3) DEFAULT ''::bpchar NOT NULL,
district character(20) DEFAULT ''::bpchar NOT NULL,
population integer DEFAULT 0 NOT NULL
);

CREATE TABLE country (
code character(3) DEFAULT ''::bpchar NOT NULL,
name character(52) DEFAULT ''::bpchar NOT NULL,
continent character varying DEFAULT 'Asia'::character varying NOT NULL,
region character(26) DEFAULT ''::bpchar NOT NULL,
surfacearea double precision DEFAULT 0::double precision NOT NULL,
indepyear smallint,
population integer DEFAULT 0 NOT NULL,
lifeexpectancy double precision,
gnp double precision,
gnpold double precision,
localname character(45) DEFAULT ''::bpchar NOT NULL,
governmentform character(45) DEFAULT ''::bpchar NOT NULL,
headofstate character(60) DEFAULT NULL::bpchar,
capital integer,
code2 character(2) DEFAULT ''::bpchar NOT NULL,
CONSTRAINT country_continent_check CHECK (((continent)::text = ANY ((ARRAY['Asia'::character varying, 'Europe'::character varying, 'North America'::character varying, 'Africa'::character varying, 'Oceania'::character varying, 'Antarctica'::character varying, 'South America'::character varying])::text[])))
);
ALTER TABLE ONLY city
ADD CONSTRAINT city_pkey PRIMARY KEY (id);

CREATE INDEX city_countrycode_idx ON city USING btree (countrycode); 


有効な文を作成できるように、関連するすべてのキーのファイルを確認する必要があります。
有効なのCREATE TABLE文を作成できるように、MySQLを理解する必要があります。


CREATE TABLE city (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(35) NOT NULL DEFAULT '',
`countrycode` char(3) NOT NULL DEFAULT '',
`district` char(20) NOT NULL DEFAULT '',
`population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
);

CREATE TABLE `country` (
`code` char(3) NOT NULL DEFAULT '',
`name` char(52) NOT NULL DEFAULT '',
`continent` char(5) NOT NULL DEFAULT '',
`region` char(26) NOT NULL DEFAULT '',
`surfaceArea` float(10,2) NOT NULL DEFAULT '0.00',
`indepyear` smallint(6) DEFAULT NULL,
`population` int(11) NOT NULL DEFAULT '0',
`lifeexpectancy` float(3,1) DEFAULT NULL,
`gnp` float(10,2) DEFAULT NULL,
`gnpold` float(10,2) DEFAULT NULL,
`localname` char(45) NOT NULL DEFAULT '',
`governmentform` char(45) NOT NULL DEFAULT '',
`headofstate` char(60) DEFAULT NULL,
`capital` int(11) DEFAULT NULL,
`code2` char(2) NOT NULL DEFAULT '',
PRIMARY KEY (`code`)
); 

それはあなた次第のコースです。 あなたは、テーブルごとに主キーをうまくしかし、一度、私はあなたがすべてのものをキャッチすることを確認することができますように、新しいスキーマを更新するには、ALTERステートメントを作成します。 あなたはPostgreSQLが、ファイル変更し、チェックであなたを保つことができることをダンププロセスとして彼らはすべての大部分は最初のCREATE文に直接追加することができますが。

必要なアルター文のいくつかの例:

ALTER TABLE city ENGINE=InnoDB;
ALTER TABLE country ENGINE=InnoDB;
ALTER TABLE countrylanguage ENGINE=InnoDB;

ALTER TABLE country DROP continent;
ALTER TABLE country ADD continent enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia' AFTER name;

ALTER TABLE city ADD KEY `countrycode` (`countrycode`),
ALTER TABLE city ADD CONSTRAINT `city_ibfk_1` FOREIGN KEY (`countrycode`) REFERENCES `country` (`code`) 


すべてのスキーマが更新され、有効なされたら。 あなたが戻って保存されたデータを置くことができます。

vi world_data.pgsql to remove the SET statements at the top.
--
-- PostgreSQL database dump
--

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog; 

ための制約この場合、テーブルごとにファイルをコピーします。 編集は、それに応じて、各ファイルは、テーブルごとにデータを持っています。 私はちょうどそのようにダンプまたは単にテーブルごとに再びダンプしておく必要があります。

$ cp world_data.pgsql world_data_city.pgsql
$ cp world_data.pgsql world_data_countrylanguage.pgsql
$ cp world_data.pgsql world_data_country.pgsql

$ mysql -u root -p world_back < world_data_country.pgsql
Enter password:
$ mysql -u root -p world_back < world_data_countrylanguage.pgsql
Enter password:
$ mysql -u root -p world_back < world_data_city.pgsql 


単にそれは簡単ではありません置くので、私は、ので、あなたの注意を必要としますが、それは行うことができ、スキーマの変更がコマンドライン経由でのMySQLへの移行を、自動化されたと言うべきである。 

mysql> select count(id) from city;
+-----------+
| count(id) |
+-----------+
| 4079 |
+-----------+
1 row in set (0.14 sec)

MySQLのワークベンチはもちろん、データベースの移行は、同じプロセスを行うことができますし、ここでそのツールの詳細について学ぶことができます-http://www.mysql.com/products/workbench/migrate/