Três threads estão envolvidas na replicação: uma no master e
duas no slave. Quando START SLAVE
é
executado, a thread de E/S é criada no slave. Ela se conecta ao
master e pede pelo envio de seus logs binários. Então uma
thread (chamada Binlog dump
no SHOW
PROCESSLIST
no master) é criada no master para enviar
estes logs binários. A thread de E/S lê o que o
Binlog dump
envia e simplesmente a copia para
algum arquivo local no diretorio de dados do slave chamado relay
logs. A última thread, a thread de SQL, é criada no slave; ela
lê o relay logs e executa as consultas contidas nele.
Note que o master tem uma thread para cada servidor slave atualmente conectado.
Com SHOW PROCESSLIST
você pode saber o que
está acontecendo no master e no slave em relação a
replicação.
O exemplo seguinte ilustra como as três threads aparecem em
SHOW PROCESSLIST
. O formato da saída é
aquele usado por SHOW PROCESSLIST
a partir do
MySQL versão 4.0.15, quando o conteúdo da coluna
State
foi alterado para ser mais
significativo comparado com versões alterações.
No servidor master a saída se parece com isto:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 2
User: root
Host: localhost:32931
db: NULL
Command: Binlog Dump
Time: 94
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
No servidor slave, a saída se parece com isto:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 10
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 11
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
Aqui a thread 2 está no master. A thread 10 é a thread de E/S
no slave. A thread 11 é a thread de SQL no slave; note que o
valor na coluna Time
pode dizer quando o
slave é comparado com o master (see
Secção 4.11.9, “FAQ da Replicação”).
A lista a seguir mostra os estados mais comuns que você verá
na coluna State
para a thread Binlog
Dump
do master. Se você não ver estas threads em um
servidor master, a replicação não está sendo executada.
Sending binlog event to slave
Logs binários consistem de eventos, onde um evento é normamente uma consulta mais alguma informação. A thread lê um evento do log binário e ele é enviado para o slave.
Finished reading one binlog; switching to next
binlog
A thread finalizou a leitura de um log binário e está abrindo o seguinte a ser enviado para o slave.
Has sent all binlog to slave; waiting for binlog to
be updated
A thread leu todos os log binários e está inativa. Ela está esperando por conexões no master para gravar mais dados no log binário, se ele quiser.
Waiting to finalize termination
Estado muito breve que ocorre quando a thread para.
Aqui estão os estados mais comuns que você verá na coluna
State
para a thread de E/S de um servidor
slave. A partir do MySQL 4.1.1, este estado também aparece na
coluna Slave_IO_State
da saída de
SHOW SLAVE STATUS
. Isso significa que você
pode ter uma boa visão do que está acontecendo apenas com
SHOW STATUS SLAVE
.
Connecting to master.
Conectando ao master.
Checking master version.
Estado muito breve que ocorre um pouco depois da conexão ser estabelecida.
Registering slave on master.
Estado muito breve que ocorre um pouco depois da conexão ser estabelecida.
Requesting binlog dump.
Estado muito breve que ocorre um pouco depois da conexão com o master ser estabelecida. A thread envia ao master um pedido para envio do conteúdo de seu log binário, iniciando a partir do log binário requisitado e sua posição.
Waiting to reconnect after a failed binlog dump
request.
Se o pedido de dump do log binário falhar (devido a
desconexão), a thread fica neste estado enquanto está
inativa. A thread fica inativa por
master-connect-retry
segundos antes de
uma nova tentativa.
Reconnecting after a failed binlog dump
request.
Então a thread tenta se conectar com o master.
Waiting for master to send event.
A thread conectou e está esperando que os eventos do log
binário cheguem. Isto pode demorar se o master estiver
inativo. Se a espera for maior que
slave_read_timeout
segundos, o tempo se
esgotará. Neste ponto, a thread irá considerar a conexão
quebrada e fará uma nova tentativa de conexão.
Queueing master event to the relay log.
A thread leu o evento e o está copiando para o ser relay log para que a thread SQL possa processá-lo
Waiting to reconnect after a failed master event
read.
Um erro ocorreu durante a leitura (devido a desconexão);
inativo por master-connect-retry
segundos
antes de tentar se reconectar.
Reconnecting after a failed master event
read.
Então a thread tenta se reconectar. Quando a conexão é
estabelecida novamente, o estado se tornará
Waiting for master to send event
.
Waiting for the slave SQL thread to free enough
relay log space
Você está usando um valor
relay_log_space_limit
diferente de zero e
os relay logs tem crescido tanto que o seu tamanho combinado
excedem este valor. A thread E/S então espera até que a
thread SQL libere espaço suficiente deletando o conteúdo
dos relay logs e assim poder deletar alguns arquivos de
relay logs.
Waiting for slave mutex on exit.
Estado muito breve que ocorre quando a thread esta parando.
Aqui estão os estado mais comuns que você verá na coluna
State
para a thread de SQL de um servidor
slave:
Reading event from the relay log
A thread leu um evento do relay log para poder processá-lo.
Has read all relay log; waiting for the slave I/O
thread to update it
A thread processou todos os eventos nos arquivos de relay logs e está esperando a thread de E/S gravar novos eventos no relay log.
Waiting for slave mutex on exit.
Estado muito breve que ocorre quando a thread é parada.
A coluna State
para a thread de E/S também
podem mostrar um string de consulta. Isto indica que a thread
leu um evento do relay log, extraiu a conulta dele e está a
está executando.
Antes do MySQL 4.0.2, as threads de E/S e SQL eram combinadas em uma só e nenhum relay log era usado. A vantagem do uso de duas threads é que elas separam a leitura e a execução da consulta em duas tarefas independentes, e assim o trabalho de leitura da consulta não se torna lento se a execução da consulta for lento. Por exemplo, se o servidor slave não estiver em execução por um instante, a sua thread de E/S pode rapidamente buscar todos o conteúdo dos logs binários do master quando o slave iniciar, mesmo se a thread de SQL demorar e levar horas para pegar os logs. Se o slave parar antes da thread SQL executar todas as consultas buscadas, a thread de E/S terá finalmente buscado tudo e assim um cópia segura das consultas estará armazenada localmente nos relay logs do slave para execução na próxima execução do slave. Isto permite que os log binários sejam apagados no master, já que não há mais necessidade de esperar que o slave busque o conteúdo deles.
Por padrão, relay logs são nomeados usando nome de arquivos da
forma host_name-relay-bin.nnn
, onde
host_name
é o nome da máquina servidora
slave e nnn
é uma sequência numérica.
Arquivos de relay logs sucvessivos são criados usando uma
sequência de números sucessiva, começando com
001
. O slave mantém registro dos relay logs
em uso atualmente em um arquivo de índice. O nome de arquivo
padrão dos relay logs é
host_name-relay-bin.index
. Por padrão
estes arquivos são criados no diretório de dados do slave. O
nome de arquivo padrão pode ser sobrescrito com as opções
--relay-log
e
--relay-log-index
do servidor.
Relay logs têm o mesmo formato dos logs binários, assim ele
podem ser lidos com mysqlbinlog
. Um relay log
é automaticamente deletado pela thread de SQL tão logo não
seja mais necessária (ex.: assim que tiver sido executado todos
os seus eventos). Não existem comandos para deletar relay logs
já que a thread SQL cuida de fazê-lo. No entanto, a partir do
MySQL 4.0.14, FLUSH LOGS
rotaciona os relay
logs), o que irá influenciar quando a thread de SQL
deletá-los.
Um novo relay log é criado sob as seguintes condições:
A primeira vez que a thread de E/S inicia depois que o servidor slave inicia (No MySQL 5.0, um novo relay log será criado a cada vez que a thread de E/S inicia, não apenas pela primeira vez.)
Uma instrução FLUSH LOGS
é executada
(a partir da versão 4.0.14).
O tamanho do relay log atual se torna muito grande. O significado de ``muito grande'' é determinado da seguinte forma:
max_relay_log_size
, se
max_relay_log_size
> 0
max_binlog_size
, se
max_relay_log_size
= 0 ou o MySQL é
mais velho que 4.0.14
Um servidor de replicação slave cria dois arquivos pequenos no
diretório de dados. Estes arquivos são chamados
master.info
e
relay-log.info
por padrão. Eles possuem
informação como aquela mostrada na saída da instrução
SHOW SLAVE STATUS
(see
Secção 4.11.8, “Instruções SQL para Controle do Servidor Slave” para uma descrição
deste comando). Como imagem de discos, eles sobrevivem ao
desligamento do slave. A próxima vez que o slave é reiniciado,
ele pode ler estes arquivos para saber o quanto ele processou do
log binário do master e do seus próprios relay logs.
O arquivo master.info
é atualizado pela
thread de E/S.
A correspondência entre as linhas do arquivo e as colunas
mostradas por SHOW SLAVE STATUS
aparece a
seguir:
Linha | Descrição |
1 | Master_Log_File |
2 | Read_Master_Log_Pos |
3 | Master_Host |
4 | Master_User |
5 | Senha (não mostrado por SHOW SLAVE STATUS ) |
6 | Master_Port |
7 | Connect_Retry |
O arquivo relay-log.info
é atualizada pela
thread de SQL. A correspondência entre as linhas do arquivo e
as colunas mostradas por SHOW SLAVE STATUS
apaerece a seguir:
Linha | Descrição |
1 | Relay_Log_File |
2 | Relay_Log_Pos |
3 | Relay_Master_Log_File |
4 | Exec_Master_Log_Pos |
Quando você faz backup dos dados de seu slave, você deve fazer
backup destes 2 pequenos arquivos, junto com seus relay logs
pois eles são necessários para continuar a replicação depois
que você restaurar os dados do slave. Se você perder os seus
relay logs mas ainda tiver o arquivo
relay-log.info
, você pode verifclos para
determinar por quanto tempo a thread de SQL executou no log
binário do master. Então você pode usar CHANGE
MASTER TO
com as opções
MASTER_RELAY_LOG
e
MASTER_RELAY_POS
para dizer ao slave para
reler os log binários a partir deste ponto. Isto exige que o
log binário ainda exista no servidor master. é claro.
Se seu slave está sujeito a replicação de instruções
LOAD DATA INFILE
, você também deve fazer
backup dos arquivos SQL_L0AD-*
que podem
existir no diretório que o slave utiliza para este propósito.
O slave precisará destes arquivos para continuar a replicação
de qualquer instrução LOAD DATA INFILE
interrompido.
A localização do diretório é especificada usando a opção
--slave-load-tmpdir
. Seu valor padrão, se
não especificado, é o valor da variável
tmpdir
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.