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-updates
Diz 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-warnings
Fazer 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=host
Especifica 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.info
tem 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ário
O 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.info
toma precedência se puder ser lida.--master-password=password
A 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.info
toma precedência se puder ser lido.--master-port=portnumber
A 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.info
toma precedência se ele puder ser lido.--master-connect-retry=seconds
O 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.info
toma precedência se puder ser lido.--master-info-file=filename
Especifica o nome a ser usado no arquivo que o slave grava a informação sobre o master. O nome padrão é
master.info
no 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=filename
Estas 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-key
descritas 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=filename
Para 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=filename
Para especificar a localização e nome que deve ser usado para arquivo de índice dos relay logs.
--relay-log-info-file=filename
Para dar outro nome a
relay-log.info
e/ou colocá-lo em outro diretório, diferente do diretório de dados.--relay-log-purge=0|1
Disabilita/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-limit
para menos que duas vezes o valor de--max-binlog-size
(ou--max-binlog-size
se--max-relay-log-size
for 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_tabela
Diz 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_tabela
Diz 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_tabela
Diz 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 comfoo
e cujos nomes de tabelas comecem combar
.Note que se você fizer
--replicate-wild-do-table=foo%.%
então a regra será propagada paraCREATE DATABASE
eDROP 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_tabela
Diz 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 comfoo
e cujo os nomes de tabela iniciem combar
.Note que se você fizer
--replicate-wild-ignore-table=foo%.%
então a regra será propagada paraCREATE DATABASE
eDROP 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-table
logo acima.--replicate-do-db=nome_bd
Diz 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_bd
Diz 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_nome
Diz ao slave para traduzir o banco de dados atual (p.ex. aquele selecionado por
USE
) parapara_nome
se ele erade_nome
no master. Apenas instruções envolvendo a tabela podem ser afetadas (CREATE DATABASE
,DROP DATABASE
não poderão), e apenas sede_nome
era 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=host
O 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 aoNAT
e 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=portnumber
Porta 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-start
Diz 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=filename
Esta opção é igual ao valor da variável
tmpdir
por 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-tmpdir
deve 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
all
o 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-db
ou--replicate-ignore-db
?- Sim: teste-as como para
--binlog-do-db
e--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
: apenassales
será 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-*-table
foi 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-table
ou--replicate-wild-do-table
?- Sim: ignore a consulta e saia.
- Não: execute a consulta e saia.
Retornar