1up4developers logo

1up4developers

Nadando contra o Waterfall. tail -f /mind/realworld >> /blog

[QuickTips] Migrando Sua App Rails Do MySQL Para PostgreSQL Sem Dor

| | Comments


Motivação

Meu primeiro contato com banco de dados relacionais foi o PostgreSQL, ou Postgres, nos tempos da faculdade. Achei muito complicado na época, difícil de instalar, administrar, etc. Quando comecei a programar profissionalmente, por volta de 2004, conheci o MySQL e gostei muito da sua simplicidade de configuração e ótima performance. Passou a ser o banco de dados padrão para a maioria dos projetos pessoais ou onde havia possibilidade de escolha.

Tudo andava bem, até que a Oracle comprou a Sun Microsystems em 2009. Não é segredo que nunca fui fã da Oracle, e considerando os acontecimentos recentes com o Java e o OpenOffice, não demoraria muito para o MySQL também receber seu toque de Midas da escrotização.

Dentre várias alternativas, optei pelo PostgreSQL pela sua performance, muitas vezes comparável com o Oracle DB, suporte da comunidade, e por ser Open Source.

Instalando o Postgres

Se você estiver no Ubuntu, basta rodar:

$ sudo apt-get install postgresql-9.1 libpq-dev

Finalizada a instalação, inicie o serviço e abra o client do Postgres:

$ sudo service postgresql start
$ sudo -u postgres psql

Aproveite o terminal e mude a senha do usuário postgres:

# \password

Para sair, digite:

# \q

Migrando o banco

Estou usando a gem mysql2psql, que embora esteja deprecated, funciona muito bem e não tem dependência do stack do Rails, como o activerecord. Assim é possível rodar a migração fora do contexto da aplicação e descartar o MySQL quando terminar.

O funcionamento é simples: conecta no banco MySQL de origem e copia a estrutura e os dados para um banco Postgres destino configurado. Para instalar:

$ sudo gem install mysql2psql

Em seguida, execute:

$ mysql2psql

Isto criará o arquivo mysql2psql.yml com a estrutura de configuração necessária. Edite este arquivo para ficar assim:

mysql:
 hostname: localhost
 port: 3306
 socket: /var/run/mysqld/mysqld.sock
 username: root
 password: root
 database: app_development
destination:
 postgres:
  hostname: localhost
  port: 5432
  username: postgres
  password: postgres
  database: app_development

Agora crie o banco de destino no Postgres:

$ sudo psql -h localhost -U postgres -W
# CREATE DATABASE app_development;

Saia do client com \q e então rode novamente:

$ mysql2psql

Se as configurações estiverem corretas, a estrutura do banco e os dados serão migrados. O output será parecido com:

Creating table comments...
Created table comments
Creating table schema_migrations...
Created table schema_migrations
Creating table users...
Created table users

Counting rows of comments... 
Rows counted
Loading comments...
5 rows loaded in 0min 0s

Counting rows of schema_migrations... 
Rows counted
Loading schema_migrations...
20 rows loaded in 0min 0s

Counting rows of users... 
Rows counted
Loading users...
418 rows loaded in 0min 0s

Indexing table comments...
Indexed table comments
Indexing table schema_migrations...
Indexed table schema_migrations
Indexing table users...
Indexed table users

Table creation 0 min, loading 1 min, indexing 0 min, total 1 min

Configurando a app

Para finalizar, remova a gem do mysql, adicione a do Postgres no Gemfile e configure o database.yml com as informações do Postgres:

# Gemfile
gem 'pg'




# database.yml
development:
  adapter: postgresql
  host: localhost
  database: app_development
  username: postgres
  password: postgres

Basta rodar bundle install e iniciar sua aplicação usando PostgreSQL!

Se precisar ou preferir rodar uma migração no contexto da sua app, dê uma olhada na gem mysql-to-postgres, do mesmo autor.

Caso tenha alguma dúvida ou sugestão, deixe seu comentário.

Comments