2014年1月2日星期四

一個MySQL DBA著眼於PostgreSQL的第3部分的PostgreSQL到MySQL

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

所以我最近發表: 一個MySQL DBA著眼於PostgreSQL的第2部分:MySQL的PostgreSQL的 。

這篇文章將探討從遷移的PostgreSQLMySQL的 。 再次,這些職位的長期目標是要能夠顯示數據的不同的數據庫中是如何工作的,以及如何解決每個數據庫中類似的問題,當例子應該出現。

MySQL的推動工作台的MySQL數據庫遷移工具。 我必須承認,我很好奇,為什麼MySQL的工具並沒有提供一個命令行選項。 以前的博客文章( 第2部分 )顯示,通過命令行遷移多麼容易的MySQLPostgreSQL的 。 但請記住這把數據時返回的MySQL數據引擎必須考慮。

簡單來說,如果你打算把數據備份到MySQL的PostgreSQL的一個快速的選擇很可能是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=> 


dump出來的架構:

$ 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) 


編輯schema文件: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); 


你將需要審查該文件的所有相關鍵,以便您可以創建有效的報表。
你需要了解MySQL的,因此您可以創建有效的CREATE TABLE語句。


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語句的一些例子:

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/