terça-feira, 31 de dezembro de 2013

A DBA MySQL olha para PostgreSQL parte2: MySQL para o PostgreSQL

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

Então, eu recentemente postou: Um DBA MySQL olha para PostgreSQL 

Este post vai explorar a migração do MySQL para PostgreSQL . Em breve vou segui-lo com umPostgreSQL migração de volta para MySQL . O objetivo a longo prazo com estas mensagens é mostrar como os dados funciona dentro das diferentes bases de dados, bem como a forma de resolver problemas semelhantes em cada banco de dados, quando deveria surgir. 

Para as migrações Vou usar o exemplo usado com freqüência: banco de dados mundialdisponível em dev.mysql.com . 

Além disso, vou reconhecer isso, estou mais experiente, com MySQL de PostgreSQL .PostgreSQL DBAs pode escrever e recomendar soluções diferentes para tais situações. Este também é um exemplo muito simples. 

Primeiro para garantir este processo é do início ao fim: 


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 


Então, agora deixe-me ver o PostgreSQL banco de dados configurado e pronto. 

# 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 


Este script perl simples ( mysql2pgsql.perl ) ajuda o processo de migração do MySQL paraPostgreSQL . 


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


Reúna os MySQL dados e deixá-lo pronto. 

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 

..
INSERIR 0 1
AVISO: As cascatas de cair para dois outros objetos
DETALHE: Gota cascatas de restrição countrylanguage_countrycode_fkey na mesa countrylanguage
soltar cascatas de restrição city_countrycode_fkey na cidade de mesa
..
INSERIR 0 1
INSERIR 0 1
DROP TABLE
CREATE TABLE
INSERIR 0 1
INSERIR 0 1
..
INSERIR 0 1
CREATE INDEX
ALTER TABLE


Por isso, vamos ver o que temos. 


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


mundo => select count (ID) da Cidade;
contar
-------
4079
(1 linha)

mundo => SELECT * FROM limite Cidade 10;
id | nome | countrycode | Distrito | população
---- + ------------------------------------- + ------- ------ + ---------------------- + ------------
1 | Cabul | AFG | Kabol | 1780000
2 | Kandahar | AFG | Kandahar | 237500
3 | Herat | AFG | Herat | 186800
4 | Mazar-e-Sharif | AFG | Balkh | 127800
5 | Amsterdam | NLD | Noord-Holland | 731200
6 | Rotterdam | NLD | Zuid-Holland | 593321
7 | Haag | NLD | Zuid-Holland | 440900
8 | Utrecht | NLD | Utrecht | 234323
9 | Eindhoven | NLD | Noord-Brabant | 201843
10 | Tilburg | NLD | Noord-Brabant | 193238
(10 linhas)

mundo => \ dt + Cidade
Lista de relações
Esquema | Nome | Tipo | Dono | Tamanho | Descrição
-------- + ------ + ------- + ---------- + -------- + ------ -------
pública | cidade | mesa | testuser | 432 KB |
(1 linha)


Bem as contagens corresponder e os dados estão disponíveis. Mas agora eu quero ver a versão do MySQL de um "SHOW CREATE TABLE"; Tenha em mente que em MySQL CREATE DATABASE e CREATE SCHEMA são basicamente a mesma coisa. 


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


Como você pode ver para ver a tabela é o mesmo que um comando mysqldump 
$ Mysqldump-u root-p - NO_DATA - mundo de banco de dados - tabelas Cidade 
Mais trabalho do que um típico MySQL é usado para ter que fazer só para ver a estrutura da tabela. 

Mas os nossos dados eo esquema é movido sobre para PostgreSQL a partir de MySQL . 

Outro post que virá em breve ... Movendo-lo de volta.