miércoles, 1 de enero de 2014

Un DBA MySQL mira PostgreSQL PostgreSQL part3 Para MySQL

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

Así que recientemente he publicado: Un DBA MySQL mira PostgreSQL y parte 2: MySQL a PostgreSQL .

Este post va a explorar la migración de PostgreSQL a MySQL . Una vez más, el objetivo a largo plazo con estos mensajes han de ser capaces de 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 surgieran ejemplos.

MySQL empuja el MySQL Workbench la herramienta de migración de base de datos. Tengo que admitir que tengo curiosidad por qué la Utilidades MySQL no proporciona una opción de línea de comandos. La entrada en el blog anterior ( parte 2 ) mostró lo fácil la migración a través de línea de comandos para MySQL a PostgreSQL . Tenga en mente que cuando armonización de datos a MySQL Data Engine tiene que ser considerado.

En pocas palabras, si usted va a llevar los datos de nuevo en MySQL desde PostgreSQL una opción rápida es probable que el MySQL Workbench . Pero eso no es una solución global ya que a menudo preferimos quedarnos en nuestras ventanas de terminal. Así que va a hacer lo siguiente:
  • Volcar el esquema de PostgreSQL en un archivo
    • Revisar y editar el archivo de MySQL.
  • Per esquema y las tablas que desee exportar como un archivo csv.
  • Importar de nuevo en MySQL

De todos modos, primero tenemos todavía los datos en PostgreSQL desde la base de datos Mundial ejemplo.

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


Vacíe el esquema:

$ pg_dump -s world > world_schema.pgsql 


Usando pg_dump tomar el - de sólo los datos y - inserta simplemente crear archivos estándar SQL de datos.

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

Usted verá más adelante que hacer un volcado por mesa sería mejor, pero esto funciona.

Creación de una base de datos en MySQL para colocar los datos de nuevo, así como poner a prueba su nuevo esquema.

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


Edite su archivo de esquema: vi world_schema.pgsql
Usted tiene la nueva base de datos MySQL creada para que pueda probarlos a medida que avanza.


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


Usted tendrá que revisar el archivo para todas las claves relacionadas para que pueda crear afirmaciones válidas.
Usted tendrá que entender MySQL para que pueda crear afirmaciones válidas 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`)
); 

Es, por supuesto, depende de usted. pero una vez que se resuelve la PRIMARY KEY por tabla, me gustaría crear declaraciones alter para actualizar los nuevos esquemas para que pueda asegurarse de que captura todo. Si bien todos ellos pueden ser añadidos directamente a la primera sentencia CREATE para la mayor parte como se procesa el archivo haciendo Postgresql altera puede mantener a raya volcado.

Algunos ejemplos de las sentencias ALTER necesarios:

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


Una vez que todo el esquema es actualizada y válida. usted puede poner los datos guardados.

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; 

Copie los archivos a cabo por mesa en este caso debido a las restricciones. Editar en consecuencia para cada archivo sólo contiene los datos por mesa. Debería haber tirado así o simplemente volcar de nuevo por tabla.

$ 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 


Así que en pocas palabras, no es tan fácil, debo decir automatizado, para migrar a MySQL a través de la línea de comandos debido a los cambios de esquema que requerirán su atención, pero se puede hacer. 

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

MySQL Workbench de migración de base de datos, por supuesto, puede hacer el mismo proceso y se puede aprender más sobre esta herramienta aquí -http://www.mysql.com/products/workbench/migrate/