Múltiplas instâncias do MySQL

De Wiki Hackstore

Existem 2 casos em que várias instâncias da mesma versão do mysql em um servidor são necessárias ou desejáveis:

  • Você realmente precisa de um monte de conexões simultâneas para somente leitura e apenas uma para gravação no mesmo banco de dados: neste caso, você deve saber muito bem o que você está fazendo, e ser capaz de desenvolver aplicações que ler a partir de uma instância somente leitura e escrever em uma instância somente para gravação. Pode haver variações, mas o princípio é o mesmo: em um determinado intervalo de tempo ou momento, só instância do mecanismo de um banco de dados pode ter permissão de gravação durante um determinado informação (banco de dados, tabela, campo, etc). É muito como um one-machine-cluster. Parece complexo e é! Assim, não pode ser descrita em apenas qualquer howto.
  • A segunda causa é muito trivial: você quer ou precisa ter múltiplas versões de desenvolvimento do mesmo banco de dados na mesma máquina e com o mesmo nome, e talvez (não recomendado, mas ainda possível) uma versão de produção também. Esse é o escopo deste artigo.

Requisitos

  • MySQL instalado
  • Acesso root no servidor

ATENÇÃO: Leia duas ou mais vezes, e apenas começe a fazer depois de compreender a sequência inteira, e depois de fazê-lo, verifique a cada passo.

Configuração

Localize o script de múltiplas instância do MySQL:

locate mysqld_multi

Geralmente encontra-se em "/usr/bin/mysqld_multi"

Faça um backup do init original por segurança:

mv /etc/init.d/mysql /etc/init.d/mysql_mono.server


Copie o novo script de init para múltiplas instâncias:

cp /usr/share/mysql/mysqld_multi.server /etc/init.d/mysql


Edite o novo arquivo /etc/init.d/mysql alterando os seguintes parâmetros:

De:

basedir=/usr/local/mysql

bindir=/usr/local/mysql/bin

Para:

basedir=/usr

bindir=/usr/bin


Se houver senha de root definida em seu mysql, altere o arquivo "/usr/bin/mysqld_multi" e localize a variável $opt_password = undef(), alterando para:

$opt_password = "password"


Crie o datadir para a nova instância e instale o DB default:

mkdir /var/lib/mysql2
chown mysql. /var/lib/mysql2/ -R
mysql_install_db --user=mysql --datadir=/var/lib/mysql2/


Faça um backup da conf original:

cp -p /etc/mysql/my.cnf /etc/mysql/my.cnf.mono


Edite o arquivo de configuração /etc/mysql/my.cnf. Duplique as linhas começando com [mysqld], adicionando quantas instâncias forem necessárias seguindo o padrão [mysqld#] (onde # é o número da instância) modificando as linhas que precisam ser alteradas, responsáveis por indicar os diretórios, arquivos, sockets e portas TCP a serem usada conforme exemplo abaixo:

[mysqld1]

user            = mysql
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
skip-external-locking
key_buffer              = 16M
max_allowed_packet      = 512M
thread_stack            = 192K
thread_cache_size       = 8
myisam-recover         = BACKUP
query_cache_limit       = 1M
query_cache_size        = 1600M
general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
log_error                = /var/log/mysql/error.log
server-id               = 1


[mysqld2]

user            = mysql
socket          = /var/run/mysqld/mysqld2.sock
port            = 3307
basedir         = /usr
datadir         = /var/lib/mysql2
tmpdir          = /tmp
skip-external-locking
key_buffer              = 16M
max_allowed_packet      = 512M
thread_stack            = 192K
thread_cache_size       = 8
myisam-recover         = BACKUP
query_cache_limit       = 1M
query_cache_size        = 1600M
general_log_file        = /var/log/mysql/mysql2.log
general_log             = 1
log_error                = /var/log/mysql/error-mysql2.log
server-id               = 2


OBS: server-id não é necessário, mas às vezes é bom saber em qual instância você está conectado, bastando digitar SELECT @@server_id;


Pronto! Agora você já tem multiplas instâncias configuradas, bastando iniciar via novo init script:

/etc/init.d/mysql start


Confira se estão rodando ambas as instâncias:

ps auxw | grep mysql | grep -v grep

Irão aparecer dos processos do mysql com porta e socket distintos conforme exemplo abaixo:

root@desenvolvimento-new:~# ps auxw|grep mysql
mysql     2508  0.0  1.8 156228 37260 ?        Sl   11:39   0:02 /usr/sbin/mysqld --defaults-file=/etc/my2.cnf --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/lib/mysql/desenvolvimento-new.err --pid-file=/var/lib/mysql/desenvolvimento-new.pid
root      2639  0.0  0.0   4120   644 ?        S    11:40   0:00 /bin/sh /usr/bin/mysqld_safe --defaults-file=/etc/mysql/my2.cnf
mysql     2779  0.0  1.8 1793208 38484 ?       Sl   11:40   0:03 /usr/sbin/mysqld --defaults-file=/etc/mysql/my2.cnf --basedir=/usr --datadir=/var/lib/mysql2 --user=mysql --log-error=/var/lib/mysql2/desenvolvimento-new.err --open-files-limit=8192 --pid-file=/var/lib/mysql2/desenvolvimento-new.pid --socket=/var/run/mysqld/mysqld2.sock --port=3307


Para se conectar à nova instância basta apontar para o novo socket:

mysql --socket=/var/run/mysqld/mysqld2.sock

ou basta apontar a nova porta:

mysql --port=3307 -p


KISS = Keep It Simple, Stupid! ;)