Opções de Inicialização da Replicação
Você deve utilizar a opção server-id no master e no slave para estabelecer uma ID de conexão única em cada servidor. Você deve escolher um valor único no intervalo de 1 a 2^32-1 para cada master e slave. Example: server-id=3
As opções que você pode utilizar no servidor master para controle do log binário estão todas descritas em "O Log Binário".
A seguinte tabela descreve as opções que você pode utilizar nos servidores slaves. Você pode especificá-las na lina de comando ou no arquivo de opção.
NOTA: A replicação trata das seguintes opções de um modo especial:
--master-host--master-user--master-password--master-port--master-connect-retry
Se não existir nenhum arquivo master.info quando o servidor slave inicia, ele usa valores específicados no arquivo de opções ou na linha de comando. Isto irá ocorrer quando você iniciar o servidor como um slave de replicação pela primeira vez, ou você executar RESET SLAVE e desliga e reiniciar o servidor slave.
No entanto, se o arquivo master.info existe quando o servidor slave iniciar, ele usa o valor no arquivo e IGNORA qualquer valor especificado para aquelas opções no arquivo de opção ou na linha de comando.
Suponha que você especifique esta opção em seu arquivo my.cnf:
[mysqld] master-host=this_host
A primeira vez que você iniciar o servidor como um slave de replicação, ele irá ler e usar a opção do arquivo my.cnf. O servidor gravará então aquele valor no arquivo master.info. A próxima vez que você iniciar o servidor, ele irá ler o valor da máquina master a partir do arquivo master.info. Se você modificar o arquivo my.cnf para especificar uma máquina master diferente, ele não terá efeito. Você deve usar CHANGE MASTER TO.
A partir do MariaDB, as seguintes opções também é tratada de forma especial:
--master-ssl--master-ssl-ca--master-ssl-capath--master-ssl-cert--master-ssl-cipher--master-ssl-key
O arquivo master.info inclui os valores correspondentes a essas opções. Adicionalmente, o formato do arquivo na versão 4.1.1 inclui na sua primeira linha o número de linhas no arquivo. Se você atualizar um servidor mais antigo para a versão 4.1.1, o master.info será atualizado para o novo formato automaticamente quando o novo servidor iniciar. (Se você substituir um MariaDB ou mais novo por uma versão mais antiga que a 4.1.1, você deve remover a primeira linha manualmente antes de iniciar o servidor mais antigo pela primeira vez.)
Como o servidor da precedência a uma arquivo master.info existente sobre as opções de inicialização acima descrito, você pode preferir usar as opções de inicialização para estes valores, e especifique-os usando a instrução CHANGE MASTER TO. Leia "CHANGE MASTER TO".
Este exemplo mostra um uso mais extensivo das opções de inicialização para configurar um servidor slave:
[mysqld] server-id=2 master-host=db-master.mycompany.com master-port=3306 master-user=pertinax master-password=freitag master-connect-retry=60 report-host=db-slave.mycompany.com
The following list describes startup options for controlling replication:
--log-slave-updatesDiz ao slave para registrar as atualizações feitas pela thread da SQL do slave no log binário do slave. É desligado por padrão. É claro que ele exige que ele exige que o slave seja iniciado com o log binário habilitado (opção
--log-bin).--log-slave-updatesé usado quando você deseja colocar diversos servidores em cadeia. Por exemplo, você pode querer uma configuração como esta:A -> B -> C
Isto é, A é o servidor master do slave B, e B é o servidor master do slave C. Para isto funcionar, onde B é tanto uma master quanto um slave, você deve iniciar B com a opção
--log-slave-updates. A e B devem ser iniciados com o log binário habilitado.--log-warningsFazer slave exibir mais mensagens sobre o que está sendo feito. Por exemplo, ele avisará que ele obteve sucesso em reconectar depois de uma falha de conexão/rede, o avisrá sobre cada thread slave iniciada.
Esta opção não está limitada apenas ao uso da replicação. Ela produz avisos através de um espectro de servidores ativos.
--master-host=hostEspecifica o nome de máquina ou endereço de IP do master para replicação. Se esta opção não for dada, a thread slave não será iniciada. O valor em
master.infotem precedência se ele puder ser lido. Provavelmemte um nome nelhor para está opção seria algo do tipo--bootstrap-master-host, mas é muito tarde para alterá-la agora.--master-user=nome_usuárioO usuário da conta que a thread slave usará para autenticar ao conectar ao master. A conrta deve ter o privilégio
REPLICATION SLAVE(Em versões anteriores a 4.0.2 ele devia ter o privilégioFILE). Se o usuário do master não for configurado, assume-se o usuárioteste. O valor emmaster.infotoma precedência se puder ser lida.--master-password=passwordA senha da conta com a qual a thread slave autenticará quando conectar ao master. Se não definida, um senha vazia é considerada. O valor em
master.infotoma precedência se puder ser lido.--master-port=portnumberA porta que o master está escutando. Se não definifa, a configuração de compilação do
MYSQL_PORTé consierada. Se você não alterou as opções doconfigure, ela deve ser 3306. O valor emmaster.infotoma precedência se ele puder ser lido.--master-connect-retry=secondsO número de segundos que a thread slave espera antes de tentar se conectar ao master no caso do master ter caído ou a conexão for perdida. O padrão é 60. O valor em
master.infotoma precedência se puder ser lido.--master-info-file=filenameEspecifica o nome a ser usado no arquivo que o slave grava a informação sobre o master. O nome padrão é
master.infono diretório de dados.--master-ssl,--master-ssl-ca=file_name,--master-ssl-capath=directory_name,--master-ssl-cert=file_name,--master-ssl-cipher=cipher_list,--master-ssl-key=filenameEstas opções são usadas para configurar um conexão de replicação segura para o servidor master usando SSL. Os seus significados são os mesmos das opções correspondentes
--ssl,--ssl-ca,--ssl-capath,--ssl-cert,--ssl-cipher,--ssl-keydescritas em "Opções SSL de Linha de Comando".Estas opções estão operacionais a partir do MariaDB.
--max-relay-log-size=#Para rotacionar o relay log automaticamente. Leia "
SHOW VARIABLES".--relay-log=filenamePara especificar a localização e nome que deve ser usado os relay logs. Você pode usá-lo para ter nomes de relay logs independentes do nome de máquina, ou se o seu relay log tend a ser grande (e você não que diminuir
max_relay_log_size) e você precisa colocá-los em alguma área diferente do diretório de dados, ou se você quiser aumentar a velocidade balanceando as cargas entre os discos.--relay-log-index=filenamePara especificar a localização e nome que deve ser usado para arquivo de índice dos relay logs.
--relay-log-info-file=filenamePara dar outro nome a
relay-log.infoe/ou colocá-lo em outro diretório, diferente do diretório de dados.--relay-log-purge=0|1Disabilita/habilita a remoção automática dos relay logs assim que ele não são mais necessários. Esta é uma variável global que ode ser alterada dinâmicamente com
SET GLOBAL RELAY_LOG_PURGE=0|1. o valor padrão é 1.Esta opção está disponível a partir do MariaDB.
--relay-log-space-limit=#Para colocar um limite superior no tamanho total de todos os relay logs no slave (Um valor 0 significa
ilimitado
). Isto é útil se você tiver um disco rígido pequeno em. sua máquina slave. Quando o limite é alcançado, a thread de E/S fica em pausa (não lê o log binário do master) até que a thread de SQL tenha buscado e deletado alguns dos relay logs não utilizados. Note que este limite não é absoluto: existem casos onde a thread SQL precisa de mais eventos para poder deletar, neste caso a thread de E/S irá superar o limite até que a deleção seja possível. Se isto não for feito ela entra em deadlock (o que acontecia antes do MariaDB 4.0.13). Os usuários não devem configurar--relay-log-space-limitpara menos que duas vezes o valor de--max-binlog-size(ou--max-binlog-sizese--max-relay-log-sizefor 0) porque neste caso há a chance de que quando a thread de E/S espera por espaço livre porque--relay-log-space-limité excedido, a thread de SQL não tem relay log para apagar e assim não pode satisfazer a thread de E/S, forçando-a a ignorar temporariamente--relay-log-space-limit.--replicate-do-table=db_name.nome_tabelaDiz para thread slave restrigir a replicação a uma tabela específica. Para especificar mais de uma tabela, use a diretiva múltiplas vezes, uma para cada tabela. Isto funcionará para atualizações através de bancos de dados, em contraste com
--replicate-do-db. Por favor, leia as notas que seguem esta lista de opções--replicate-ignore-table=db_name.nome_tabelaDiz a thread slave para não replicar qualquer comando que atualiza a tabela especificada (mesmo se qualquer outra tabela puder ser atualizada pelo mesmo comando). Para especificar mais de uma tabela a ser ignorada, use a diretiva várias vezes, para cada tabela. Isto funcionará para atualizações através de bancos de dados, em contraste com
--replicate-ignore-db. Por favor, leia as notas que seguem esta lista de opções--replicate-wild-do-table=db_name.nome_tabelaDiz a thread slave para restringir a replicação a consultas onde qualquer das tabelas atualizadas correspondam a padrão de meta caracteres especificado. Para especificar mais de uma tabela, use a diretiva vária vezes, uma para cada tabela, Isto funciona para atualizações através de banco de dados. Por favor, leia as notas que seguem esta lista de opções
Exemplo:
--replicate-wild-do-table=foo%.bar%replicará apenas atualizações que usam uma tabela em qualquer banco de dadis que comece comfooe cujos nomes de tabelas comecem combar.Note que se você fizer
--replicate-wild-do-table=foo%.%então a regra será propagada paraCREATE DATABASEeDROP DATABASE, ex.: estas duas instruções serão replicadas se o nome de banco de dados corresponder ao padrão do banco de dados ('foo%'aqui) (testa mágica é possível por'%'ser o padrão da tabela).Caracteres curingas
_e%escapados: se você quiser replicar, por exemplo, todas as tableas do banco de dadosmy_own%db(este é o nome exato do banco de dados), e não replicar tabelas do banco de dadosmy1ownAABCdb, você deve escapar o_e%: você deve usar algo como isto:replicate-wild-do-table=my\_own\%db. E se você estiver especificando esta opção para a linha de comando, dependendo do seu sistema, você precisará escapar o\(por exemplo, com uma shellbash, você precisaria digitar--replicate-wild-do-table=my\\_own\\%db).--replicate-wild-ignore-table=db_name.nome_tabelaDiz a thread slave pra não replicar um consulta onde qualquer tabela corresponda ao padrão de meta caracteres dado. Para especificar mais de uma tabela, use a diretiva várias vezes, uma vez para cada tabela. Isto funcionará para atualizações através de banco de dados. Por favor, leia as notas que seguem esta lista de opções
Exemplo:
--replicate-wild-ignore-table=foo%.bar%não atualizará tabelas no banco de dados que iniciar comfooe cujo os nomes de tabela iniciem combar.Note que se você fizer
--replicate-wild-ignore-table=foo%.%então a regra será propagada paraCREATE DATABASEeDROP DATABASE, ex. estas duas instruções não serão replciadas se o nome do banco de dados não corresponder ao padrão ('foo%'aqui) (esta mágica ocorre devido ao'%'como padrão da tabela).Caracteres curingas
_e%escapados: veja as anotações na descrição dereplicate-wild-do-tablelogo acima.--replicate-do-db=nome_bdDiz ao slave para restringir a replicação a comandos onde o banco de dados atual (p.ex., aquele selecionado por
USE) énome_bd. Para especificar mais de uym banco de dadosm use a diretiva várias vezes, uma vez por tabela. Note que isto não replicará consultas entre bancos de dados tais comoUPDATE algum_bd.alguma_tabela SET foo='bar'se for selecionado outro banco de dados ou nenhum banco de dados. Se você precisa que atualizações entre bancos de dados funcionem, certifique-se de que você tem o MariaDB 3.23.28 ou posterior, e use--replicate-wild-do-table=db_name.%. Por favor, leia as notas que seguem esta lista de opçõesExemplo do que não funciona como você espera: se o slave é iniciado com
--replicate-do-db=sales, e você fazUSE prices; UPDATE sales.january SET amount=amount+1000;, esta consulta não será replicada.Se você precisar que atualizações entre bancos de dados funcionem, use
--replicate-wild-do-table=db_name.%.A principal razão para este comportamento de apenas verificar o banco de dados atual é que é difícil para um comando sozinho saber se deve ser replicado ou não; por exemplo se você está usando comandos delete ou update multi-tabelas que continuam entre múltiplos bancos de dados. Também é muito mais rápido verificar apenas o banco de dados atual.
--replicate-ignore-db=nome_bdDiz ao slave para não replicar qualquer comando onde o banco de dados atual (p.ex. o selecionado por
USE) énome_bd. Para especificar mais bancos de daods use a diretiva diversas vezes, uma para cada banco de dados. Você não deve utilizar esta diretiva se você está usando atualização através de tabelas e você não quer que estas atualizações sejam replicadas. Por favor, leia as notas que seguem esta lista de opçõesExemplo do que não funcionaria como esperado: se o slave é iniciado com
--replicate-ignore-db=sales, e você fazUSE prices; UPDATE sales.january SET amount=amount+1000;, esta consulta será replicada.Se você precisar de atualizações entre banco de dados funcione, use
--replicate-wild-ignore-table=db_name.%.--replicate-rewrite-db=de_nome->para_nomeDiz ao slave para traduzir o banco de dados atual (p.ex. aquele selecionado por
USE) parapara_nomese ele erade_nomeno master. Apenas instruções envolvendo a tabela podem ser afetadas (CREATE DATABASE,DROP DATABASEnão poderão), e apenas sede_nomeera o banco de dados atual no master. Isto não funcionará para atualizações entre banco de dados. Note que a translação é feita antes das regras de--replicate-*serem testadas.Exemplo:
replicate-rewrite-db=master_db_name->slave_db_name--report-host=hostO Nome de máquina ou número IP do slave a ser relatado ao master durante o registro do slave. Aparecerá na saída de
SHOW SLAVE HOSTS. Deixe indefinido se você não quiser que o slave se registre no master. Note que ele não é suficiente para o master simplesmente ler o número IP do slave fora dos sockets uma vez que o slave se conecte. Devido aoNATe outros assuntos de roteamento,a quele IP pode não ser válido para se conectar ao slave a partir do master ou outras máquinas.Esta opção está disponível a partir do MariaDB 4.0.0.
--report-port=portnumberPorta para conexão do slave relatado ao master durante o registro do slave. Defina-o apenas se o slave está escutando por uma porta diferente da padrão ou se você tiver um tunel especial do master ou outros clientes para o slave. Se não tiver certeza, deixe esta opção indefinida.
Esta opção está disponível a partir do MariaDB 4.0.0.
--skip-slave-startDiz ao servidor slave para não iniciar a thread slave na iicialização do servidor. O usuário pode iniciá-las mais tarde com
START SLAVE.--slave_compressed_protocol=#Se 1, usa compactação no protocolo cliente/servidor se tanto o slave quanto o mester suportá-la.
--slave-load-tmpdir=filenameEsta opção é igual ao valor da variável
tmpdirpor padrão. Quando a thread SQL do slave replica um comandoLOAD DATA INFILE, ele extrai os arquivos a serem carregados do relay logs em arquivos temporários, e então os carrega dentro da tabela. Se o arquivo carregado no master era enorme, os arquivos temporários no slave também serão enormes; embora você possa desejar que o slave coloque o arquivo temporário em algum disco grande diferente detmpdir, usando esta opção. Nestes caso, você também pode usar a opção--relay-log, já que os relay logs serão grandes também.--slave-load-tmpdirdeve apontar para o sistema de arquivo baseado em disco; não em um baseado em memória. Como o slave precisa de arquivos temporários usados para replicarLOAD DATA INFILE) para sobreviver a uma reinicialização da máquina.--slave-net-timeout=#Número de segundos a esperer por mais dados do master antes de abortar a leitura, considerando o quebra de conexão e as tentativas de reconectar. A primeira vez ocorre imediatamente depois do tempo limite. O intervalo entre tentativas é controlado pela opção
--master-connect-retry.--slave-skip-errors= [err_code1,err_code2,... | all]Diz ao a thread SQL do slave para continuar a replicação quando uma consulta retornar um erro de uma lista fornecida. Normalmente, a replicação irá parar ao encontrar um erro, dando ao usuário a chance de resolver a inconsistêncian nos dados manualmente. Não use esta opção a menos que você saiba exetamente o motivo dos erros. Se não houver erros em sua configuração da replicação e programas clientes, e não houver erros no MySQL, você nunca deve ter uma replicação abortada com erro. O uso indiscriminado desta opção resultará em slaves fora de sincronia com o master e você não terá idéia de como o problema aconteceu.
Para códigos de erros, você deve usar o número fornecido pela mensagem de erron no seu log de erros do slave e na saída de
SHOW SLAVE STATUS. Uma lista completa de mensagens de erro podem ser encontradas na distribuição fonte emDocs/mysqld_error.txt. Os códigos de erros do servidor também são listados em "Erros Retornados".Você também pode (mas não deve) usar um valor não recomendado de
allo que irá ignorar todas as mensagens de erro e continua em frente indiferentemente. Não é preciso dizer, que se você usar isto, não podemos garantir a integridade dos seus dados. Por favor, não reclame se seus dados no slave não estiver nem próximo daqueles em seu master neste caso --- você foi avisado.Exemplos:
--slave-skip-errors=1062,1053 --slave-skip-errors=all
Algumas destas opções, como todas as opções --replicate-*, só podem ser definidas na inicialização do servidor slave, e não com ele ligado. Planejamos corrigir isto.
Aqui está a ordem de avaliação das regras --replicate-*, para decidir se a consulta será executada pelo slave ou ignorada por ele:
- Existe alguma regra
--replicate-do-dbou--replicate-ignore-db?- Sim: teste-as como para
--binlog-do-dbe--binlog-ignore-db(see "O Log Binário"). Qual é o resultado do teste?- ignore a consulta: ignore-a e saia.
- execute a consulta: não execute-a imediatamente, adie a decisão, vá para o passo abaixo.
- Não: vá para o passo abaixo.
- Sim: teste-as como para
- Existe alguma regra
--replicate-*-table?- Não: execute a consulta e saia.
- Sim: vá para o passo abaixo. Apenas tabela que serão atualizadas serão comparadas às regras (
INSERT INTO sales SELECT * from prices: apenassalesserá comparada às regras). Se várias tabelas forem ser atualizadas (instruções multi-tabelas) a primeira a corresponder a regra (comdo
ouignore
) vence (isto é, a primeira tabela é comparada a regra. se nenhuma decisão pode ser tomada a segunda tabela é compara às regras, etc).
- Existe alguma regra
--replicate-do-table?- Sim: o tabela encaixa em alguma delas?
- Sim: execute a consulta e saia.
- Não: vá para o passo abaixo.
- Não: vá para o passo abaixo.
- Sim: o tabela encaixa em alguma delas?
- Existe alguma regra
--replicate-ignore-table?- Sim: a tabela encaixa em alguma delas?
- Sim: ignore a consulta e saia.
- Não: vá para o passo abaixo.
- Não: vá para o passo abaixo.
- Sim: a tabela encaixa em alguma delas?
- Existe alguma regra
--replicate-wild-do-table?- Sim: a tabela se encaixa em qualquer uma delas?
- Sim: execute a consulta e saia.
- Não: vá para o passo abaixo.
- Não: vá para o passo abaixo.
- Sim: a tabela se encaixa em qualquer uma delas?
- Existe alguma regra
--replicate-wild-ignore-table?- Sim: a tabela se encaixa em qualquer uma delas?
- Sim: ignore a consulta e saia.
- Não: vá para o passo abaixo.
- Não: vá para o passo abaixo.
- Sim: a tabela se encaixa em qualquer uma delas?
- Nenhuma regra
--replicate-*-tablefoi correspondida. Existe outra tabela para se testar com estas regras?- Sim: loop.
- Não: testamos todas as tabelas a serem atualizadas, nenhuma regra foi obedecida. Existem regras
--replicate-do-tableou--replicate-wild-do-table?- Sim: ignore a consulta e saia.
- Não: execute a consulta e saia.
Retornar