XOOPS Brasil

 

4.2. Executando Múltiplos MySQL Servers na Mesma Máquina

Em alguns casos você pode precisar de executar múltiplos servidores mysqld executando na mesma máquina. Você pode desejar testar uma nova versão do MySQL enquanto a deixa a sua instalação da versão de produção existente sem perturbação. Ou você pode desejar dar acesso a diferentes utilizadores em diferentes servidores mysqld gerenciados por eles mesmos. (Por exemplo, você pode seu um provedor de serviços de internet que quer fornecer instalações independentes do MySQL para clientes diferentes).

Para executar múltiplos servidores em uma única máquina, cada servidor deve ter valores únicos para diversos parâmetros operacionais. Isto deve ser configurado na linha de comando ou em arquivos de opções. Veja Seção 4.1.1, “Opções de Linha de Comando do mysqld e Seção 4.1.2, “Arquivo de Opções my.cnf.

Pelo menos as seguintes opções devem ser diferente para cada servidor:

  • --port=port_num

  • --socket=path

  • --shared-memory-base-name (apenas Windows; novo no MySQL 4.1)

  • --pid-file=path (apenas Unix)

--port controla o número da porta para conexões TCP/IP. --socket controla o caminho do arquivo de socket no Unix e o nome do named pipe no Windows. (É necessário nomes de pipes distintos no Windows apenas para aqueles servidores que suportam conexão named pipes.)

--shared-memory-base-name designa o nome da memória compartilhada por um servidor Windows para permitir que o cliente se conecte via memória compartilhada. --pid-file indice o nome do arquivo no qual o Unix gravar a ID do seu processo.

Se você usar as seguintes opções, elas deve ser diferentes para cada servidor:

  • --log=path

  • --log-bin=path

  • --log-update=path

  • --log-error=path

  • --log-isam=path

  • --bdb-logdir=path

Se você quiser mais desempenho, você também pode especificar as seguinte opções diferentemente para cada servidor para distribuir a carga entre vários discos físicos:

  • --tmpdir=path

  • --bdb-tmpdir=path

Normalmente, cada servidor também deve usar um diretório de dados diferentes, que é especificado usando a opção --datadir=path.

AVISO: Normalmente você nunca deve ter dois servidores que atualizam dados no mesmo banco de dados! Isto pode levar a supresas inesperadas se seu o seu sistema operacionalnão suporta lock de sistema a prova de falhas, isto pode provocar surpresas indesejáveis! Se (apesar deste aviso) você executar diversos servidores usando o mesmo diretório de dados e eles tiverem com o log habilitado, você usar as opções apropriadas para especificar os nomes dos arquivos de log que são únicos em cada servidor. Senão, o servidores podem tentar gravar no mesmo arquivo de log.

Este aviso contra o compartilhamento de arquivos de dados entre servidores também se aplica em um ambeinte NFS. Permitir vários servidores MySQL acessarem um diretório de dados comum sobre NFS, é normalmente uma MÁ IDÉIA!

  • O primeiro problema é que o NFS se tornará um gargalo, tornando o sistema lento. Ele não se destina para este tipo de uso.

  • Outro risco com NFS é que você terá que conseguir um modo de se certificar que dois ou mais servidores não estão interferindo uns com os outros. Normalmente o lock de arquivo é tratado pelo daemon lockd, mas no momento não existe nenhuma plataforma que fara o locck 100% de segurança, em todas as situações.

Facilite a sua vida: esqueça sobre compartilhar um diretório de dados entre servidores sobre NFS. A solução melhor é ter um computador com um sistema operacional que manipule threads de forma eficiente threads e tenha diversas CPUs nele.

Se você tiver múltiplas instalações do MySQL em diferentes locais, normalemente você pode especificar o diretório de instalação base de cada servidor com a opção --basedir=caminho para fazer que cada servidor use diferentes diretórios de dados, arquivos de log e arquivos PID. (O padrão para todos estes valores são determinados em relação ao diretório base.) Neste caso, as únicas outras opções que você precisa especificar são as opções --socket e --port. Por exempo, suponha que você instalou a versão binária do MySQL (arquivos .tar) em diferentes locais, assim você pode iniciar o servidor usando o comando ./bin/mysqld_safe sob o diretório base correspondente de cada instalação. mysqld_safe determinará a opção --basedir apropriada para passar para mysqld, e você precisa especificar apenas as opções --socket e --port para o mysqld_safe.

Como discutido nas seções a seguir, é possível iniciar servidores adicionais configurando variáveis de ambiente ou especificando as opções de linha de comando apropriada. No entanto, se você precisa executar múltiplos servidores em uma base mais permanente, será mais coonveniente usar os arquivos de opções para especificar, para cada servidor, aquelas opções que devem ser únicas para ele. Veja mais informações sobre isto na Seção 4.1.2, “Arquivo de Opções my.cnf.

4.2.1. Executando Múltiplos Servidores no Windows

Você pode executar múltiplos servidor no Windows iniciando-os manualmente a partir da linha de comando, cada um com o parâmetro operacional apropriado. Em sistemas baseados no Windows NT, você também tem a opção de instalar vários servidores como serviços Windows e executá-los deste modo. Instruções gerais sobre a execucão de servidores MySQL a partir da linha de comando ou como serviços são dados em Seção 2.6.1, “Notas Windows”. Esta seção descreve como se certificar de que você inicioou cada servidor com valores diferentes para aquelas opções de inicialização que devem ser unicas por servidor, como o diretório de dados. (Estas opções são descritas em Seção 4.2, “Executando Múltiplos MySQL Servers na Mesma Máquina”.)

4.2.1.1. Iniciando Múltiplos Servidores na Linha de Comando

Para iniciar vários servidores manualmente na linha de comando, você pode especificar a opção apropriada na linha de comando ou no arquivo de opções. É mais conveniente colocar as opções em um arquivo de opção. Para fazer isto, crie uma arquivo de opção para cada servidor e mostre ao servidor o nome do arquivo com a opção --defaults-file quando você executá-lo.

Suponha que você queira executar o mysqld na porta 3307 com um diretório de dados de C:\mydata1, e mysqld-max na porta 3308 com um diretório de dados de C:\mydata2. Para conseguir isto, crie dois arquivos de opções. Por exemplo, crie um arquivo chamado C:\my-opts1.cnf que se pareça com isto:

[mysqld]
datadir = C:/mydata1
port = 3307

Crie um segundo arquivo chamado C:\my-opts2.cnf que se pareça com isto:

[mysqld]
datadir = C:/mydata2
port = 3308

Então inicie cada servidor com seus próprios arquivos de opção:

shell> mysqld --defaults-file=C:\my-opts1.cnf
shell> mysqld-max --defaults-file=C:\my-opts2.cnf

(No NT, o servidor iniciará em segundo plano, assim você precisará enviar estes dois comandos em janelas de console separadas.)

Para desligar o servidor, você deve conectar a porta apropriada:

shell> mysqladmin --port=3307 shutdown
shell> mysqladmin --port=3308 shutdown

Servidores configurados como descrito permitirá que clientes se conectem por TCP/IP. Se você também quiser permitir conexões named pipe, use os servidores mysqld-nt ou mysqld-max-nt e especifique as opção que habilitem o named pipe e especifique os seus nomes. (Cada servidor que suporta conexões named pipes deve ter um nome único). Por exemplo, o arquivo C:\my-opts1.cnf pode ser escrito da seguinte maneira:

[mysqld]
datadir = C:/mydata1
port = 3307
enable-named-pipe
socket = mypipe1

Estão inicie o servidor desta forma:

shell> mysqld-nt --defaults-file=C:\my-opts1.cnf

C:\my-opts2.cnf seria modificado de forma parecida para uso com o segundo servidor.

4.2.1.2. Iniciando Múltiplos Servidores Como Serviços

Em sistemas baseados no NT, um servidor MySQL pode ser executado como um serviço Windows. O procedimento para instalação, controle e remoção de um único serviço MySQL está descrito em Seção 2.1.1.7, “Iniciando o MySQL no Windows NT, 2000, ou XP”.

A partir do MySQL 4.0.2, você pode instalar vários servidores como serviços. Neste caso, você deve ter certeza de que cada servidor usa um nome de serviço diferente junto com todos os outros parâmetros que devem ser único por servidor.

Para as seguintes instruções, assuma que você queira executar o servidor mysqld-nt a partir de duas versões diferentes do MySQL que está instalado em C:\mysql-4.0.8 e C:\mysql-4.0.17, respectivamente. (Este pode ser o caso se você estiver executando a versão 4.0.8 como seu servidor de produção, mas queira testar o 4.0.17 antes de atualizá-lo.)

Os seguintes princípios são relevantes ao instalr um serviço MySQL com a opção --install:

  • Se você não especificar o nome do serviço, o servidor usa o nome padrão do serviço (MySQL) e o servidor lê as opções do grupo [mysqld] no arquivo de opções padrão.

  • Se você especificar um nome de serviço depois da opção --install, o servidor ignora o grupo de opção [mysqld] e lê as opções do grupo que tem o mesmo nome que o serviço. O servidor lê as opções do arquivo de opção padrão.

  • Se você especificar uma opção --defaults-file depois do nome do serviço, o servidor ignora o arquivo de opções padrão e lê as opções apenas do grupo [mysqld] do arquivo chamado.

Este princípios também se aplicam se você intalar um servidor usando a opção --install-manual.

Baseado na informação anterior, você tem diversos de configurar vários serviços. As seguintes instruções descrevem alguns exemplos. Antes de tentar qualquer uma delas esteja certo de que você desligou e removeu qualquer serviço MySQL existente primeiro.

  • Especifique as opções para todos os serviços em um dos arquivos de opções padrão. Para fazer isto, use um nome de serviço diferente para cada servidor. Suponha que você queira executar o mysqld-nt 4.0.8 usando o nome de serviço [mysqld1] e o mysqld-nt 4.0.17 usando o nome de serviço mysqld2. Neste caso você pode usar o grupo [mysqld1] para o 4.0.8 e o grupo [mysqld2] para o MySQL 4.0.14. Por exemplo, você pode configurar o C:\my.cnf desta forma:

    # opções para o serviço mysqld1
    [mysqld1]
    basedir = C:/mysql-4.0.8
    port = 3307
    enable-named-pipe
    socket = mypipe1
    # opções para o serviço mysql2
    [mysqld2]
    basedir = C:/mysql-4.0.17
    port = 3308
    enable-named-pipe
    socket = mypipe2
    

    Instale os serviços como a seguir, usando o caminho completo para o servidor para assegurar que o Windows registra o programa executável correto para cada serviço:

    shell> C:\mysql-4.0.8\bin\mysqld-nt --install mysqld1
    shell> C:\mysql-4.0.17\bin\mysqld-nt --install mysqld2
    

    Para iniciar os serviços, use o gerenciador de serviços, ou use NET START com o nome de serviço apropriado:

    shell> NET START mysqld1
    shell> NET START mysqld2
    

    Para parar os serviços, use o gerenciador de serviços, ou use NET STOP com o mesmo nome de serviço.

    shell> NET STOP mysqld1
    shell> NET STOP mysqld2
    

    Nota: Antes do MySQL 4.0.17, apenas um servidor instalado usando o nome de serviço padrão (MySQL) ou instalado com um nome de serviço de mysqld irá ler o grupo [mysqld] no arquivo de opções padrão. A partir da versão 4.0.17, todos os servidores lêem o grupo [mysqld] se eles lêem o arquivo de opções padrão, mesmo de esles estão instalados usando outro nome de serviço. Isto permite que você use o grupo [mysqld] para opções que devam ser usadas por todos os serviços MySQL, e um grupo de opção com o nome de cada serviço para o uso do servidor com aquele nome de serviço.

  • Especifique as opções para cada servidor em arquivos separados e use --defaults-file quando instalar os serviços para dizer para cada servidor que arquivo usar. Neste caso, cada arquivo deve listar as opções usando um grupo [mysqld].

    Com esta abordagem, para especificar as opções para o mysqld-nt 4.0.8, crie um arquivo C:\my-opts1.cnf que se pareça com:

    [mysqld]
    basedir = C:/mysql-4.0.8
    port = 3307
    enable-named-pipe
    socket = mypipe1
    

    Para o mysqld-nt 4.0.17, crie um arquivo C:\my-opts2.cnf que se pareça com:

    [mysqld]
    basedir = C:/mysql-4.0.17
    port = 3308
    enable-named-pipe
    socket = mypipe2
    

    Instale o serviço como indicado a seguir (digite cada comando em uma única linha):

    shell> C:\mysql-4.0.8\bin\mysqld-nt --install mysqld1
    --defaults-file=C:\my-opts1.cnf
    shell> C:\mysql-4.0.17\bin\mysqld-nt --install mysqld2
    --defaults-file=C:\my-opts2.cnf
    

    Para usar uma opção --defaults-file quando instalar um servidor MySQL como um serviço, você deve anteceder a opção com o nome do serviço.

    Depois de instalarm, inicie e para os serviços do mesmo modo que no exemplo anterior.

Para remover vários serviços, use mysqld --remove para cada um, especificando um nome de serviço depois da opção --remove se o serviço a ser removido tiver um nome difertente do padrão.

4.2.2. Executando Múltiplos Servidores no Unix

O modo mais fácil de executar diversos servidores no Unix é compilá-los com diferentes portas TCP/IP e arquivos socket, assim cada um está escutando em diferentes interfaces de rede. Também, compilando em diferentes diretórios bases para instalação, que automaticamente resulta em diferentes localizações de diretórios de dados, arquivos log e arquivos PID para cada um dos seus servidores.

Considere que um servidor existente está configurado para a porta e arquivo socket padrões. Para configurar um novo servidor para ter parâmetros operacionais diferentes, use um comando configure assim:

shell> ./configure --with-tcp-port=port_number \
--with-unix-socket-path=nome_arquivo \
--prefix=/usr/local/mysql-4.0.17

Aqui número_porta e nome_arquivo deve ser diferente que o número da porta e o caminho do arquivo socket padrões e o valor --prefix deve especificar um diretório de instalação diferente daquele usado pelo servidor existente.

Você pode conferir o socket usado por qualquer servidor MySQL em execução com este comando:

Se você tem um servidor MySQL escutando em uma porta dada, você pode usar o seguinte comando para descobrir quaie parâmetros operacionais ele está usando para diversas variáveis importantes configuráveis, incluíndo o diretório base e o nome do socket:

shell> mysqladmin --host=host_name --port=port_number variables

Com a informação exibida por aquele comando, você pode dizer quais valores de opção não usar ao configurar um servidor adicional.

Note que se você especificar ``localhost'' como o nome da máquina, mysqladmin irá por padrão usar uma conexão sockets Unix em vez de TCP/IP. No MySQL 4.1 você também pode especificar o protocolo a ser usado com a opção --protocol={TCP | SOCKET | PIPE | MEMORY}.

Não é necessário compilar um novo servidor MySQL apenas para iniciar com uma arquivo socket ou número de porta TCP/IP diferentes. Também é possível especificar estes valores em tempo de execução. Um modo de fazê-lo é usando as opções de linha de comando:

shell> /path/to/mysqld_safe --socket=file_name --port=port_number

Para usar outro diretório de banco de dados para o segundo servidor, passe uma opção --datadir=caminho para o mysqld_safe.

Um outro modo de conseguir este efeito é usar as variáveis de ambiente para configurar o nome do socket e o número da porta:

shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> scripts/mysql_install_db
shell> bin/mysqld_safe &

Este é um modo rápido para iniciar um segundo servidor para teste. O bom deste método é que a configuração das variáveis de ambiente se aplicarão a qualquer programa cliente que você chame da shell acima. Assim, as conexões para estes clientes serão automaticamente direcionadas para o segundo servidor!

Apêndice F, Variáveis de Ambientes do MySQL inclue uma lista de outras variáveis de ambiente que você pode usar e que afetam o mysqld.

Para a execução automatica do servidor, seu script de inicialização que é executado no tempo de boot deve executar o seguinte comando uma vez para cada servidor com um caminmho apropriado do arquivo de opção para cada comando:

mysqld_safe --defaults-file=path-to-option-file

Cada arquivo de opção deve conter valores específicos para um dados servidor.

No Unix, o script mysqld_multi é outro modo de de iniciar vários servidores. Veja mais informações sobre isto na Seção 4.8.3, “mysqld_multi, programa para gerenciar múltiplos servidores MySQL”.

4.2.3. Usando Programas Clientes em um Ambiente Multi-Servidor

Quando você quiser conectar com um programa cliente a um servidor MySQL que está escutando diferentes interfaces de rede em vez daquelas compiladas em seu programa cliente, você pode conectar usando um dos seguintes métodos:

  • Inicie o cliente com --host=nome_máquina --port=número_porta para conectar com TCP/IP a uma máquina remota, ou com --host=localhost --socket=nome_arquivo para conectar a máquina local via um socket Unix ou um named pipe do Windowes.

  • No MySQL 4.1, inicie o cliente com --protocol=tcp para conectar via TCP/IP, --protocol=socket para conectar via socket Unix ou --protocol=pipe para conectar via named pipe, ou --protocol=memory para conectar via memória compartilhada. Para conexões TCP/IP, você também pode precisar especificar as opções --host e --port. Para outros tipos de conexões, você pode precisar especificar uma opção --socket para definir um nome de socket ou named pipe name, ou uma opção --shared-memory-base-name para especificar o nome da memória compartilhada.

    No Unix, configure as variáveis de ambiente MYSQL_UNIX_PORT e MYSQL_TCP_PORT para apontar para o socket Unix e porta TCP/IP antes de iniciar seus clientes. Se você normalmente utiliza uma porta ou socket específico, você pode colocar os comandos para configurar as variáveis de ambiente no arquivo .login, assim eles serão aplicados sempre quer você logar no sistema. Veja mais informações sobre isto na Apêndice F, Variáveis de Ambientes do MySQL.

  • Especifique o socket e porta TCP/IP padrões no grupo [clients] de um arquivo de opções. Por exemplo, você pode usar C:\my.cnf no WIndows ou o arquivo .my.cnf em seu diretório home no Unix. Veja mais informações sobre isto na Seção 4.1.2, “Arquivo de Opções my.cnf.

  • Em um programa C, você pode especificar os argumentos de porta ou socket na chamada de mysql_real_connect(). Você também pode ter o programa lendo de um arquivo de opções chamando mysql_options(). Veja mais informações sobre isto na Seção 12.1.3, “Descrição das Funções da API C”.

  • Se você estiver usando o módulo Perl DBD::mysql você pode ler as opções dos arquivos de opções do MySQL. Por exemplo:

    $dsn = "DBI:mysql:test;mysql_read_default_group=client;"
    . "mysql_read_default_file=/usr/local/mysql/data/my.cnf";
    $dbh = DBI->connect($dsn, $user, $password);
    

    Veja mais informações sobre isto na Seção 12.5.2, “A interface DBI.