2014年1月1日星期三

一個MySQL DBA著眼於PostgreSQL的第2部分:的MySQL改為PostgreSQL

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

所以我最近發表: 一個MySQL DBA著眼於PostgreSQL的 

這篇文章將探討從遷移的MySQLPostgreSQL的 。 我會盡快跟進與PostgreSQL的遷移回的MySQL 。 與這些職位的長期目標是要顯示的數據不同的數據庫中是如何工作的,以及如何解決每個數據庫中類似問題的時候應該出現了。 

對於遷移,我將使用經常使用的例子: 世界數據庫可在dev.mysql.com 。 

我也會承認這一點,我有更多的經驗豐富的MySQLPostgreSQL的 。 的PostgreSQL數據庫管理員可以編寫和推薦不同的解決方案這種情況。 這也是一個很簡單的例子。 

首先要保證這個過程從開始到結束: 


mysql> create database world;
Query OK, 1 row affected (0.00 sec

# mysql world < world_innodb.sql
mysql> show create table City;
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`),
KEY `CountryCode` (`CountryCode`),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `Country` (`Code`)
) ENGINE=InnoDB

mysql> select count(ID) from City\G
*************************** 1. row ***************************
count(ID): 4079 


所以,現在讓我得到了PostgreSQL的數據庫設置和準備。 

# su postgres
$ psql
psql (9.3.2)
Type "help" for help.

postgres=# CREATE DATABASE world;
CREATE DATABASE

# GRANT ALL ON DATABASE world TO testuser;
GRANT 


postgres=# \q 


這個簡單的perl腳本( mysql2pgsql.perl )有助於從遷移過程的MySQLPostgreSQL的 。 


# su testuser
$ cd
$ pwd
/home/testuser
$ wget http://pgfoundry.org/frs/download.php/1535/mysql2pgsql.perl 


收集的MySQL數據,並得到它準備好。 

mysqldump -u root -p world > mysql2postgresql.sql
$ ./mysql2pgsql.perl mysql2postgresql.sql mysql2postgresql.pgsql
table "city" will be dropped CASCADE
"city_id_seq"--
table "country" will be dropped CASCADE
table "countrylanguage" will be dropped CASCADE

$ psql world < mysql2postgresql.pgsql | more
DROP TABLE
DROP SEQUENCE
CREATE SEQUENCE
CREATE TABLE
INSERT 0 1 

..
INSERT 0 1
注意:下拉級聯到2其他對象
詳細信息:降級聯到約束countrylanguage_countrycode_fkey上表countrylanguage
瀑布跌落到約束city_countrycode_fkey上表城市
..
INSERT 0 1
INSERT 0 1
DROP TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
..
INSERT 0 1
CREATE INDEX
ALTER TABLE


因此,讓我們看看我們所擁有的。 


$ psql -d world
psql (9.3.2)
Type "help" for help.

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


從城市的世界=> SELECT COUNT(ID);
-------
4079
(1行)

世界=> SELECT * FROM城市限10;
ID |名稱|國家代碼|區|人口
---- + ------------------------------------- + ------- ------ + ---------------------- + ------------
1 |喀布爾| AFG | Kabol | 1780000
2 |坎大哈| AFG |坎大哈| 237500
3 |赫拉特| AFG |赫拉特| 186800
4 |馬扎裡 - 沙裡夫| AFG |巴爾赫| 127800
5 |阿姆斯特丹|民盟|北荷蘭省| 731200
6 |鹿特丹|民盟|南荷蘭省| 593321
7 |哈格|民盟|南荷蘭省| 440900
8 |烏得勒支|民盟|烏得勒支| 234323
9 |埃因霍溫|民盟|北布拉班特| 201843
10 |蒂爾堡|民盟|北布拉班特| 193238
(10行)

世界=> \ DT +城市
關係一覽表
架構|名稱|型號|業主|大小|說明
-------- + ------ + ------- + ---------- + -------- + ------ -------
公共|城市|表| TESTUSER | 432 KB |
(1行)


以及計數匹配和數據可用。 但現在我想看到的是MySQL版本的“SHOW CREATE TABLE”,請記住,在MySQL的 CREATE DATABASE和CREATE SCHEMA基本上是相同的東西。 


$ pg_dump -t city -s world
--
-- 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;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: city; Type: TABLE; Schema: public; Owner: testuser; Tablespace:
--

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


ALTER TABLE public.city OWNER TO testuser;

--
-- Name: city_pkey; Type: CONSTRAINT; Schema: public; Owner: testuser; Tablespace:
--

ALTER TABLE ONLY city
ADD CONSTRAINT city_pkey PRIMARY KEY (id);


--
-- Name: city_countrycode_idx; Type: INDEX; Schema: public; Owner: testuser; Tablespace:
--

CREATE INDEX city_countrycode_idx ON city USING btree (countrycode);


--
-- PostgreSQL database dump complete
-- 


正如你可以看到,看看表是一樣的的mysqldump命令 
$ mysqldump的 - ü根 - 對 - NO_DATA - 世界數據庫 - 表城 
更多的工作比一個典型的MySQL是用來不得不做只是為了看看表結構。 

但我們的數據和架構移到到PostgreSQL的MySQL的 。 

另一篇文章很快就來了... 移動回來。