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.