Como evitar que a instância padrão do MySQL inicie quando o mysqld_multi é usado?

2

A versão curta do problema é que, na inicialização, o script de inicialização mysql padrão inicia uma instância geral desnecessária do servidor com as configurações padrão, seguido pelo mysqld_multi iniciando as instâncias necessárias corretamente, resultando em muitas instâncias do servidor .

Estou no Ubuntu 14.04. Apenas atualizei o servidor MySQL para a versão 5.7. Estou visando executar duas instâncias do servidor MySQL, uma master e uma slave, usando os mesmos binários, mas outras configurações sendo diferentes.

O ponto de tal configuração é filtrar as tabelas para fora do processo de replicação. Antes de replicar para uma terceira instância externa, controlada por terceiros, quero ter certeza de que apenas determinadas tabelas apareçam nos logs binários. Eu tenho usado este método com sucesso há anos.

Após a atualização para o MySQL 5.7, minha configuração é assim:

[mysqld_multi]
mysqld                  = /usr/bin/mysqld_safe
mysqladmin              = /usr/bin/mysqladmin
user                    = multi_admin
password                = multipass

[mysqld1]
server-id               = 1
port                    = 3306
user                    = mysql
pid-file                = /var/run/mysqld/mysqld.pid
socket                  = /var/run/mysqld/mysqld.sock
datadir                 = /var/lib/mysql
log-error               = /var/log/mysql/error.log
...

[mysqld2]
basedir = /usr
server-id               = 2
port                    = 3307
user                    = mysql
pid-file                = /var/run/mysqld/mysqld_blackhole_slave.pid
socket                  = /var/run/mysqld/mysqld_blackhole_slave.sock
datadir                 = /var/lib/mysql_blackhole_slave
log-error               = /var/log/mysql_blackhole_slave/error.log
...

É interessante notar que o MySQL cria o diretório / var / run / mysqld quando o servidor é iniciado e o exclui quando o servidor é desligado (e nenhum outro processo o está usando).

No meu /etc/init.d eu tenho dois scripts de inicialização relacionados: mysql e mysqld_multi .

Quando o script mysql é executado, ele verifica o arquivo my.cnf, descobre que não há um grupo [mysqld] e, portanto, inicia uma instância do servidor com as configurações padrão. Cria o diretório / var / run / mysqld, como mencionado acima, e faz tudo funcionar. Neste ponto, tenho uma instância do servidor em execução com valores padrão que não especifiquei.

Depois vem o script mysqld_multi. Ele procura por grupos de [mysqld N ] em my.cnf e inicia as instâncias do servidor de acordo. Isso iniciará duas instâncias adicionais de acordo com minhas especificações. Neste ponto, tenho três instâncias do servidor em execução, em vez das duas que solicitei no arquivo de configuração.

Se eu remover o script mysql de /etc/init.d, a instância padrão não será iniciada, mas os outros dois não serão porque:

mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists. (sic)

Por favor, note que não diz que não foi possível criar o diretório. Parece supor que o diretório deve existir neste ponto, mas devido à remoção do script de inicialização do mysql, ele nunca é criado. Eu acredito que este processo não tenta criar o diretório. Se tentasse, alguém assumiria um problema de permissão. Desativei o apparmor e tentei executar esses processos como root para descartar problemas relacionados à permissão.

Eu posso fazer:

sudo mkdir /var/run/mysqld
sudo chown mysql:mysql /var/run/mysqld

e, em seguida, inicie o mysqld_multi. Isso funciona bem, mas é uma maneira muito pouco ortodoxa de iniciar seu sistema.

Então eu estou querendo saber, não existe uma maneira correta de iniciar o mysqld_multi neste sistema atual sem hackear o processo?

    
por Istvan Dupai 22.04.2018 / 10:19

0 respostas