miércoles, 1 de enero de 2014

Un DBA MySQL mira PostgreSQL part2: MySQL a PostgreSQL

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

Así que recientemente he publicado: Un DBA MySQL mira PostgreSQL

Este post va a explorar la migración de MySQL a PostgreSQL . Pronto voy a seguir con unaPostgreSQL migración de regreso a MySQL . El objetivo a largo plazo con estos mensajes es mostrar cómo funciona la información dentro de las diferentes bases de datos, así como la forma de resolver problemas similares en cada base de datos, cuando debería surgir.

Para las migraciones Voy a usar el ejemplo de uso frecuente: la base de datos del mundodisponibles en dev.mysql.com .

También voy a reconocer esto, tengo más experiencia con MySQL a PostgreSQL . PostgreSQLDBA podría escribir y recomendar diferentes soluciones a este tipo de situaciones. Este es también un ejemplo muy sencillo.

En primer lugar para asegurar que este proceso es de principio a fin:


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 


Así que ahora vamos a ver si el PostgreSQL base de datos configurado y listo.

# 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 de perl sencilla ( mysql2pgsql.perl ) ayuda a que el proceso de migración deMySQL a PostgreSQL .


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


Reúna los MySQL de datos y tenerlo listo.

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
AVISO: Las cascadas de caída a otros 2 objetos
DETALLE: caer en cascada a la restricción en la mesa countrylanguage_countrycode_fkey countrylanguage
caer en cascada a la restricción city_countrycode_fkey en la mesa de la ciudad
..
INSERT 0 1
INSERT 0 1
DROP TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
..
INSERT 0 1
CREATE INDEX
ALTER TABLE


Así que vamos a ver lo que tenemos.


$ 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) de la Ciudad;
contar
-------
4079
(1 row)

mundo => select * from límite de la ciudad de 10;
Identificación | nombre | código del país | barrio | población
---- + ------------------------------------- + ------- ------ + ---------------------- + ------------
1 | Kabul | AFG | Kabol | 1780000
2 | Qandahar | AFG | Qandahar | 237500
3 | Herat | AFG | Herat | 186800
4 | Mazar-e-Sharif | AFG | Balkh | 127800
5 | Amsterdam | NLD | Holanda del Norte | 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 filas)

mundo => \ dt + City
Lista de las relaciones
Esquema | Nombre | Tipo | Propietario | Tamaño | Descripción
-------- + ------ + ------- + ---------- + -------- + ------ -------
público | ciudad | Mesa | testuser | 432 kB |
(1 row)


Pues los recuentos coinciden y los datos están disponibles. Pero ahora quiero ver la versión MySQL de un "SHOW CREATE TABLE"; Tenga en cuenta que en MySQL CREATE DATABASE y CREATE SCHEMA son básicamente la misma cosa.


$ 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 se puede ver para ver la tabla es el mismo que un comando mysqldump
$ Mysqldump-u root-p - NO_DATA - mundo de base de datos - tablas City
Más trabajo que un típico MySQL está acostumbrado a tener que hacer sólo para ver la estructura de la tabla.

Sin embargo, nuestros datos y el esquema se mueve encima en PostgreSQL desde MySQL .

Otro post pronto por venir ... Si lo mueve hacia atrás.