Portando para Outros Sistemas - MariaDB - Databases - Software - Computers

Portando para Outros Sistemas

Índice

Depurando um Servidor MySQL
Compilando o MYSQL para Depuração
Criando Arquivos Trace (Rastreamento)
Depurando o mysqld no gdb
Usando Stack Trace
Usando Arquivos de Log para Encontrar a Causa dos Erros no mysqld
Fazendo um Caso de Teste Se Ocorre um Corrompimento de Tabela
Depurando um cliente MySQL.
O Pacote DBUG
Métodos de Lock
Comentários Sobre Threads RTS
Diferença en Entre Alguns Pacotes de Threads

Este apêndice lhe ajudará a portar o MariaDB para outros sistemas operacionais. Primeiro verifique a lista de sistemas operacionais atualemente suportados. Leia 'Sistemas Operacionais suportados pelo MySQL'. Se você criou uma nova portabilidade do MariaDB, por favor, deixe nos conhecê-la para que possamos lista-la aqui e em nosso site web. (http://www.mysql.com/), recomendando-a a outros usuários.

Nota: se voce criou uma nova portabilidade para o MySQL, você está livre para distribuí-la sob a licença GPL, mas isto não te dá os direitos autorais do MariaDB.

Uma biblioteca thread Posix funcionando é necessária para o servidor. No Solaris 2.5 nós usamos Pthreads da Sun (o suporte da thread nativa na versão 2.4 e anterior não está boa o suficiente), no Linux usamos LinuxThreads criada por Xavier Leroy, <Xavier.Leroy@inria.fr>.

A parte difícil de portar para uma nova variante Unix sem um bom suporte a thread nativa é, provavelmente, portar par MIT-pthreads. Veja mit-pthreads/README e Programando em Thhredas POSIX (http://www.humanfactor.com/pthreads/).

Até o MariaDB 4.0.2, a distribuição do MariaDB incluiu uma versão remendada do Pthreads de Chris Provenzano do MIT (veja o site de MIT Pthreads em http://www.mit.edu/afs/sipb/project/pthreads/ e uma introdução a programação em http://www.mit.edu:8001/people/proven/IAP_2000/). Eles podem ser usadas por alguns sistemas operacionais que não têm threads POSIX. Leia 'Notas MIT-pthreads'.

Também é possível usar outro pacote de threads no nível do usuário chamado FSU Pthreads (veja http://moss.csc.ncsu.edu/~mueller/pthreads/). Esta implementação está usada para portar para o SCO.

Veja os programas thr_lock.c e thr_alarm.c no diretório mysys para alguns testes/exemplos destes problemas.

Tanto o servidor quanto o cliente precisam de um compilador C++ funcionanado. Nós usamos gcc em muitas plataormas. Outros compiladores que sabemos que funciona são o SPARCworksm Sun Forte, Irix cc, HP-UX aCC, IBM AIX xlC_r), Intel ecc e Compaq cxx).

Para compilar apenas o cliente use ./configure --without-server.

Atualmente não hé nenhum suporte para compilação só do servidor, nem está em pauta a sua adição a menos que alguém tenha uma boa razão para isto.

Se você quiser/precisar de alterar qualquer Makefile ou o script do configure você também precisará do GNU Automake e Autoconf. Leia 'Instalando pela árvore de fontes do desenvolvimento'.

Todos os passos necessários para refazer tudo desde os arquivos mais básicos.

/bin/rm */.deps/*.P
/bin/rm -f config.cache aclocal autoheader aclocal automake autoconf
./configure --with-debug=full --prefix='your installation directory'
# O makefile gerado acima precsa do GNU make 3.75 ou mais novo.
# (chamado gmake abaixo)
gmake clean all install init-db

Se você encontrar problemas com uma nova portabilidade, você ter que fazer alguma depuração do MariaDB! Leia Seção E.1, 'Depurando um Servidor MySQL'.

Nota: antes de iniciar a depuração do mysqld, obtenha primeiro os programas de teste mysys/thr_alarm e mysys/thr_lock para funcionar. Isto asegurará que sus instalação da thread tem pelo menos uma chance remota de funcionar.

Depurando um Servidor MariaDB

Compilando o MYSQL para Depuração
Criando Arquivos Trace (Rastreamento)
Depurando o mysqld no gdb
Usando Stack Trace
Usando Arquivos de Log para Encontrar a Causa dos Erros no mysqld
Fazendo um Caso de Teste Se Ocorre um Corrompimento de Tabela

Se você estiver usando uma funcionalidade que é muito nova no MySQL, você pode tentar executar o mysqld com --skip-new (que desabilitará todas novas funcionalidades com pontecialidade de ero) ou com --safe-mode que desabilita várias otimizações que podem criar problemas. Leia Seção A.4.1, 'O Que Fazer Se o MariaDB Continua Falhando'.

Se o mysqld não quiser iniciar, você deve verificar se você não tem qualquer arquivo my.cnf que interfere com sua configuração. Você pode verificar seus argumento do my.cnf com mysqld --print-defaults e evitar usá-los iniciando com mysqld --no-defaults ....

Se o mysqld começa a consumir CPU ou memória ou se ele ficar lento, você pode usar o mysqladmin processlist status para achar alguém que esteja executando uma consulta que demore algum tempo. POde ser uma boa idéia executar mysqladmin -i10 processlist status em alguma janela se você estiver tendo problemas de desempenho ou problemas com novos clientes que não podem conectar.

O comando mysqladmin debug irá trazer alguma informação sobre as em uso, memória usada e uso das consultas no arquivo de log do mysql. Isto pode ajudar a resolver problemas. Este comando também fornece informações úteis mesmo se você não tiver compilado MariaDB para depuração!

Se o problema é que algumas tabelas estão ficando maior e mais lentas você deve tentar otimizar a tabela com OPTIMIZE TABLE ou myisamchk. Leia Administração do Bancos de Dados MySQL. Você também deve tentar verificar as consultas lentas com EXPLAIN.

Você também deve ler a seção específica do SO neste manual para saber sobre problemas que podem ser únicos em seu ambiente. Leia 'Notas específicas para os Sistemas Operacionais'.

Compilando o MYSQL para Depuração

Se você tiver um problema específico, você sempre pode tentar depurar o MariaDB. Para fazer isto você deve configurar o MariaDB com a opção --with-debug ou --with-debug=full. Você pode verificar se o MariaDB foi compilado com depuração executando: mysqld --help. Se o parâmetro --debug estiver listado entre as opções então você têm a depuração habilitada. mysqladmin ver também lista a versão do mysqld como mysql ... --debug neste caso.

se você estiver usando gcc ou egcs, a configuração recomendada é:

CC=gcc CFLAGS='-O2' CXX=gcc CXXFLAGS='-O2 -felide-constructors \
 -fno-exceptions -fno-rtti' ./configure --prefix=/usr/local/mysql \
 --with-debug --with-extra-charsets=complex

Isto evitará problemas com a biblioteca libstdc++ e com exceções C++ (muitos compiladores têm problemas com exceções C++ no código da thread) e compila uma versão MariaDB com suporte para todos os conjuntos caracter.

Se você suspeita de um erro despejo de memória, você pode configurar o o MariaDB com --with-debug=full, que irá instalar verificar de alocação de memória (SAFEMALLOC). No entanto, a execução com SAFEMALLOC é um pouco lenta, assim se você tiver problemas de desempenho você deve iniciar o mysqld com a opção --skip-safemalloc. Isto disabilitará a verificação de despejo de momória para cada chamada a malloc() e free().

Se o mysqld parar de falhar quando você compilar com --with-debug, você provavelmente encontrou um erro de compilação ou erro de tempo dentro do MariaDB. Neste caso você pode tentar adicionar -g às variáveis CFLAGS e CXXFLAGS acima e não usar --with-debug. Se agora o mysqld morre, você pode pelo menos executá-lo com gdb ou usar o gdb no arquivo core para descobrir que aconteceu.

Quando você configura o MariaDB para depuração você habilita automaticamente diversas funções de vericação de segurança extra que monitora a saúde do mysqld. Se eles encontrarem algo inesperado, uma entrada será encrita no stderr, que mysqld_safe direciona para o log de erros! Isto também significa que se você estiver tendo alguns problemas inexperados com o MariaDB e estiver usando uma distribuição fonte, a primeira coisa que você deve fazer é configurar o MariaDB para depuração! (A segunda coisa é enviar uma mensagem para a lista de email do MariaDB e pedir ajuda. Leia 'As Listas de Discussão do MariaDB'. Por favor, use o script mysqlbug para todos os relatos de bug e questões referentes a versão do MariaDB que você está usando!

Na distribuição do MariaDB para Windows, mysqld.exe é, por padrão, compilado com suporte a arquivos trace.

Criando Arquivos Trace (Rastreamento)

Se o servidor mysqld não inicia ou se você pode fazer o servidor mysqld falhar rapidamente, você pode tentar criar um arquivo trace para encontrar o problema.

Para fazer isto você tem que ter um mysqld compilado para depuração. Você pode verificar isto executando mysqld -V. Se o número da versão finaliza com -debug, ele está compilado com suporte a arquivos trace.

Inicie o servidor mysqld com um log trace em /tmp/mysqld.trace (ou C:\mysqld.trace no Windows):

mysqld --debug

No Windows você também deve usar o parâmetro --standalone para não iniciar o mysqld como um serviço:

Em uma janela de console faça:

mysqld --debug --standalone

Depois disso você pode usar a ferramenta de linha de comando mysql.exe em uma segunda janela de console para reproduzir o problema. Você pode finalizar o servidor mysqld acima com mysqladmin shutdown.

Note que o arquivo trace será muito grande! Se você quiser ter um arquivo trace menor, você pode usar algo como:

mysqld --debug=d,info,error,query,general,where:O,/tmp/mysqld.trace

que apenas exibe informações com a maioria das tags interrassants em /tmp/mysqld.trace.

Se você fizer um relatório de bug sobre isto, por favor só envie as linhas do trace para a lista de email apropriada quando algo parecee estar errado! Se você não puder localizar o local errado, você pode fazer um ftp do arquivo trace, junto com um relatório de bug completo, para ftp://support.mysql.com/pub/mysql/secret/ para que assim um desenvolvedor do MariaDB possa dar uma olhada nele.

O arquivo trace é feito com o pacote DBUG de Fred Fish. Leia Seção E.3, 'O Pacote DBUG'.

Depurando o mysqld no gdb

Na maioria dos sistemas você também pode iniciar o mysqld a partir do gdb para obter mais informações se o mysqld falhar.

Com uma versão antiga do gdb no Linux você deve usar run --one-thread se você quiser estar apto a depurar a thread mysqld. Neste caso você só pode ter uma thread ativa por vez. Nós recomendamos que você atualize para gdb 5.1 ASAP já que a depuração da thread funciona muito melhor com esta versão!

Ao executar o mysqld com gdb, você deve disabilitar a pilha de rastreamento com --skip-stack-trace para estar apto a conseguir segmentation fault com gdb.

É muito difícil depurar o MariaDB no gdb se você fizer muitas conexões o tempo todo já que gdb não libera a memória para threads antigas. Você pode evitar este problema iniciando mysqld com -O thread_cache_size= 'max_connections +1'. Na maioria dos casos só o uso de -O thread_cache_size=5' já ajuda muito!

Se você quiser um tiver um core dump no Linux quando o mysqld morre com um sinal SIGSEGV, você pode iniciar o mysqld com a opção --core-file. Este arquivo core pode ser usado para fazer um rastreamento que pode lhe ajudar a descobrir porque o mysqld morreu:

shell> gdb mysqld core
gdb> backtrace full gdb> exit

See Seção A.4.1, 'O Que Fazer Se o MariaDB Continua Falhando'.

Se você estiver usando gdb 4.17.x ou acima no Linux, você deve instalar um arquivo .gdb, com a seguinte informação, em seu diretório atual:

set print sevenbit off handle SIGUSR1 nostop noprint handle SIGUSR2 nostop noprint handle SIGWAITING nostop noprint handle SIGLWP nostop noprint handle SIGPIPE nostop handle SIGALRM nostop handle SIGHUP nostop handle SIGTERM nostop noprint

Se você tiver problemas depurando threads com gdb, você deve fazer o download do gdb 5.x e experimentá-lo. A nova versão do gdb tem um tratamento de threads bem melhorado.

Aqui está um exemplo de como depurar o mysqld:

shell> gdb /usr/local/libexec/mysqld
gdb> run
...
backtrace full # Faça isto quando o mysqld falhar

Inclua a saída acima e uma email gerado com mysqlbug e envie-o para lista de email do MariaDB. Leia 'As Listas de Discussão do MariaDB'.

Se o mysqld travar você pode usar algumas ferramentas de sistema como strace ou /usr/proc/bin/pstack para exeminar onde mysqld travou.

strace /tmp/log libexec/mysqld

Se você estiver usando a interface Perl DBI, você pode habilitar a informação de depuação usando o método trace ou definindo a variável de ambiente DBI_TRACE. See Seção 12.5.2, 'A interface DBI'.

Usando Stack Trace

Em alguns sistemas operacionais, o log de erro irá conter um stack trace se mysqld finalizar inesperadmente. Você pode usá-lo para descobrir onde (e talvez por que) o mysqld finalizou. See 'O Log de Erros'. Para obter um stack trace, você não deve compilar o mysqld com a opção -fomit-frame-pointer para gcc. Leia Seção E.1.1, 'Compilando o MYSQL para Depuração'.

Se o arquivo de erro conter algo como o seguinte:

mysqld got signal 11;
The manual section 'Debugging a MariaDB server' tells you how to use a stack trace and/or the core file to produce a readable backtrace that may help in finding out why mysqld died Attemping backtrace. You can use the following information to find out where mysqld died. If you see no messages after this, something went terribly wrong stack range sanity check, ok, backtrace follows
0x40077552
0x81281a0
0x8128f47
0x8127be0
0x8127995
0x8104947
0x80ff28f
0x810131b
0x80ee4bc
0x80c3c91
0x80c6b43
0x80c1fd9
0x80c1686

você pode descobrir onde o mysqld finalizou fazendo o seguinte:

  1. Copie os números acima em um arquivo, por exemplo mysqld.stack.
  2. Faça um arquivo de símbolos para o servidor mysqld:

    nm -n libexec/mysqld > /tmp/mysqld.sym
    

    Note que a maioria das distribuições binárias do MariaDB (exceto para o pacotes de 'depuração' onde as informações são incluídas dentro dos binários) já possuem o arquivo acima, chamado mysqld.sym.gz. Neste caso você pode simplesmente desempacotá-lo fazendo:

    gunzip < bin/mysqld.sym.gz > /tmp/mysqld.sym
    
  3. Execute resolve_stack_dump -s /tmp/mysqld.sym -n mysqld.stack.

    Isto exibirá a onde o mysqld finalizou. Se isto não lhe ajuda a descobrir o porque o mysqld morreu, você deve fazer um relato de erro e incluir a saída do comando acima no relatório.

    Note no entanto que na maioria dos casos, termos apenas um stack trace, não nos ajudará a encontrar a razão do problema. Para estarmos apto a localizar o erro ou fornecer um modo de contorná-lo, precisariamos, na maioria dos casos, conhecer a consulta que matou o mysqld e de preferência um caso de teste para que possamos repetir o problema! Leia 'Como relatar erros ou problemas'.

Usando Arquivos de Log para Encontrar a Causa dos Erros no mysqld

Note que antes de iniciarmos o mysqld com --log você deve verificar todas as suas tabelas com myisamchk. Leia Administração do Bancos de Dados MySQL.

Se o mysqld morre ou trava, você deve iniciar o mysqld com --log. Quando o mysqld morre de novo, você pode examinar o fim do arquivo de log para a consulta que matou o mysqld.

Se você estiver usando --log sem um nome de arquivo, o log é armazenado no diretório do banco de dados como 'nomemaquina'.log. Na maioria dos casos é a última consulta no arquivo de log que matou mysqld, mas se possível você deve verificar isto reiniciando o mysqld e executando a consulta encontrada por meio da ferramenta de linha de comando MariaDB. Se isto funcionar, você também deve testar todas as consultas complicadas que não completaram.

Você também pode tentar o comando EXPLAIN em todas as instruções SELECT que levam muito tempo para assegurar que o mysqld está usando índices apropriados. See 'Sintaxe de EXPLAIN (Obter informações sobre uma SELECT)'.

Você pode encontrar as consultas que levam muito twempo para executar iniciando o mysqld com --log-slow-queries. Leia 'O Log para Consultas Lentas'.

Se você encontrar o texto mysqld restarted no arquivo de registro de erro (normalmente chamado hostname.err) você provavelmente encontrou uma consulta que provocou a falha no mysqld. Se isto acontecer você deve verificar todas as suas tabelas com myisamchk (see Administração do Bancos de Dados MySQL) e testar a consulta no arquivo de log do MariaDB para ver se ela não funcionou. Se você encontrar tal consulta, tente primeiro atualizar para uma versão mais nova do MariaDB. Se isto não ajudar e você não puder encontrar nada no arquivo de mensagem MariaDB, você deve relatar o erro para uma lista de email do MariaDB. As listas de email estão descritas em http://lists.mysql.com/, que também possui os links para as listas de arquivos online.

Se você iniciou o mysqld com myisam-recover, o MariaDB verificará automaticamente e tentará reparar as tabelas MyISAM se elas estiverem marcadas como 'não fechadas apropriadamente' ou 'com falha'. Se isto acontecer, o MariaDB irá escrever uma entrada 'Warning: Checking table ...' no arquivo nomemaquina.err, a qual é seguida por Warning: Repairing table se a tabela precisar ser reparada. Se você obter vários desses erros, sem que o mysqld finalize inesperadamente um pouco antes, então algo está errado e precisa ser investigado melhor. Leia 'Opções de Linha de Comando do mysqld'.

É claro que não é um bom sinal se o mysqld morreu inesperadamente, mas neste caso não se deve invwestigar as mensagens Checking table... e sim tentar descobrir por que o mysqld morreu.

Fazendo um Caso de Teste Se Ocorre um Corrompimento de Tabela

Se você têm tabelas corrompidas ou se o mysqld sempre falha depois de alguns comendos de atualização, você pode testar se este erro é reproduzível fazendo o seguinte:

Você também pode usar o script mysql_find_rows para executar algumas das instruções de atualização se você quiser estreitar o problema.

Depurando um cliente MySQL.

Para estar apto a depurar um cliente MariaDB com o pacote de depuração integradom você deve configurar o MariaDB com --with-debug ou --with-debug=full. Leia 'Opções típicas do configure'.

Antes de executar um cliente, você deve configurar a variável de ambiente MYSQL_DEBUG:

shell> MYSQL_DEBUG=d:t:O,/tmp/client.trace
shell> export MYSQL_DEBUG

Isto faz com que os clientes gerem um arquivo trace em /tmp/client.trace.

Se você tiver problemas com seu próprio código cliente, você deve tentar se conectar ao servidor e executar a sua consulta usando um cliente que esteja funcionando. Faça isto executando o MariaDB no modo de depuração (assumindo que você tenha compilado o MariaDB com esta opção).

shell> mysql --debug=d:t:O,/tmp/client.trace

Isto irá fornecer informação útil no caso de você enviar um relatório de erro. Leia 'Como relatar erros ou problemas'.

Se o seu cliente falhar em algum código aparentemente 'legal', você deve verificar se o seu arquivo mysql.h incluído corresponde com o seu arquivo da biblioteca mysql. Um erro muito comum é usar um arquivo mysql.h antigo de uma instalação MariaDB antiga com uma nova biblioteca MySQL.

O Pacote DBUG

O servidor MariaDB e a maioria dos clientes MariaDB são compilados com o pacote DBUG originalmente criado por Fred Fish. Quando se configura o MariaDB para depuração, este pacote torna possível obter um arquivo trace sobre o que o programa está depurando. See Seção E.1.2, 'Criando Arquivos Trace (Rastreamento)'.

Utiliza-se o pacote de depuração chamando o programa com a opção --debug='...' ou -#....

A maioria dos programas MariaDB tem uma string de depuração padrão que será usada se você não especificar uma opção para --debug. O arquivo trace padrão é normalmente /tmp/programname.trace no Unix e \programname.trace no Windows.

A string de controle de depuração é uma sequência de campos separados por dois pontos como a seguir:

<field_1>:<field_2>:...:<field_N>

Cada campo consiste de um carcater de parâmetro obrigatório seguido por uma ',' e lista de modificadores separdas por vírgula opcionais:

flag[,modifier,modifier,...,modifier]

Os carcteres de parâmetros atualmente reconhecidos são:

Parâmetro Descrição
d Habilita a saída de macros DBUG_<N> para o estado atual. Pode ser seguido por uma lista de palavras chaves que selecionam a saída apenas para as macros DBUG com aquela palavra chave. Uma lista de palavras chaves vazia indica a saída para todas as macros.
D Atraso depois de cada linha de saída do depurados. O argumento é o número de décimos de segundo do atraso, sujeito às capacidades da máquina. Por exemplo, -#D,20 atrasa em dois segundos
f Limita a depuração e/ou rastreamento, e perfilemento da lista de funções listadas. Note que uma lista nula disabilitará todas as funções. O parâmetro 'd' ou 't' apropriado ainda deve ser dado, este parâmetro só limita as suas açõesse eles estiverem habilitados.
F Identifica o nome do arquivo fonte para cada linha de saída da depuração ou rastreamento.
i Identifica o processo com o PID ou a ID da thread para cada linha de saída da depuração ou rastreamento.
g Habilita a modelagem. Cria um arquivo chamado 'dbugmon.out' contendo informações que poder ser usadas para moldar o programa. Pode ser seguida por uma lista de palavras chaves que selecionam a modelagem apenas para as funções naquela lista. Uma lista nula indica que todas as funções serão consideradas.
L Identifica o número da linha do arquivo fonte para cada linha de saída da depuração ou rastreamento.
n Exibe a profundidade de aninhamento da função atual para cada linha de saída da depuração ou rastreamento.
N Número de cada linha de saída do dbug.
o Redireciona o fluxo de saída do depurador para um arquivo específico. A saída padrão é stderr.
O Igual a o, mas o arquivo é realmente descarregado entre cada escrita. Quando necessário o arquivo é fechado e reaberto entre cada escrita.
p Limita as ações do depurador para um processo específico. Um processo deve ser indentificado com a macro DBUG_PROCESS e corresponder a um dos itens especificados na lista de ações do depurador que devem ocorrer.
P Exibe o nome do processo atual para cada linha de saída da depuração ou rastreamento.
r Quando recebe um novo estado, não herda o nível de aninhamento da função do estado anterior. Útil quando a saída é iniciada na margem esquerda.
S Executa a função _sanity(_file_,_line_) a cada função depurada até que _sanity() retorne algo diferente de 0. (Geralmente usada com safemalloc para encontrar falhas de memória).
t Habilita a linhas do trace de chamada/saída de funções. Pode ser seguido por uma lista (contendo apenas um modificador) dando um o nível numérico máximo de rastreamento, além do que nenhuma saída será exibida, tanto para a depuração quanto para macros trace. O padrão é uma opção de tempo de compilação.

Alguns exemplos de strings de controle do depurador que podem aparecer em uma linha de comando do shell (o '-#' é normalmente usado para introduzir uma string de controle a um aplicativo) são:

-#d:t
-#d:f,main,subr1:F:L:t,20
-#d,input,output,files:n
-#d:t:i:O,\\mysqld.trace

No MySQL, tags comuns de serem usadas (com a opção d) são: enter,exit,error,warning,info e loop.

Métodos de Lock

Atualmente o MariaDB só suporta bloqueios de tabela para tipos ISAM/MyISAM e HEAP, bloqueios a nível de página para tabelas BDB e bloqueio a nivel de registros para tabelas InnoDB. Leia 'Como o MariaDB Trava as Tabelas'. Com tabelas MyISAM pode se misturar livremente INSERT e SELECT sem travas, se as instruções INSERTs não são confiltantes. (ex.: se eles são inseridos no fim da tabela em vez de preencherem espaços liberados por dados/linhas deletados).

A partir da versão 3.23.33, você pode analisar a contenção do bloqueio de tabela no seu sistema verificando as variáveis de ambiente Table_locks_waited e Table_locks_immediate.

Para decidir se você quer usar um tipo de tabela com bloqueio a nível de registro, você deverá olhar o que o aplicativo faz e o qual é o padrão de seleção/atualização dos dados.

Pontos a favor do bloqueios de registros:

Contras:

Bloqueios de tabela são superiores a bloqueios a nível de página / registro nos seguintes casos:

Outra opções além de bloqueios a nível de página / registro:

Versioning (como usamos no MariaDB para inserções concorrentes) onde você pode ter um escrita e várias leituras ao mesmo tempo. Isto significa que o banco de dados/tabelas suporta diferentes viiews para os dados dependendo de quando se começa a acessá-lo. Outros nomes deste recurso são time travel, cóia na escrita ou cópia por demanda.

Cópia por demanda é em muitos casos muito melhor que bloqueio a nível de registro ou página; o piro caso, no entanto, usa muito mais memória que a usada em travamentos normais.

Em vez de se usar bloqueio de registro pode-se usar bloqueios no aplicativo (como get_lock/release_lock no MySQL). Isto só funciona em aplicaticos bem comportados.

Em muitos casos pode se fazer um palpite sobre qual tipo de bloqueio é melhor para a aplicação. mas geralmente é muito difícil dizer que um dado tipo de bloqueio é melhor que outro; tudo depende da aplicação e diferentes partes da aplicação podem exigir diferentes tipos de bloqueios.

Aqui estão algumas dicas sobre travamento no MySQL:

A maioria das aplicações web fazem diversos selects, muito poucas deleções, atualizaoes principalmente nas chaves e inserções em tabelas específicas. A configuração base do MariaDB é bem sitonizada para esta finalidade.

Usuários concorrentes não são um problema se eles não misturam atualizações com seleções que precisam examinar muitas linhas na mesma tabela.

Se é misturado inserções e exclusões na mesma tabela então INSERT DELAYED pode ser de grande ajuda.

Pode se também usar LOCK TABLES para aumentar a velocidade (muitas atualizações com um travamento simples é muito mais rápida que atualizações sem travamento). Separar as coisas em tabelas diferentes também ajudará.

Se você tiver problemas de velocidade com travamento de tabelas no MySQL, você pode estar apto a resolver isto convertendo alguma de suas tabelas para tipos InnoDB ou BDB. Leia 'Tabelas InnoDB'. Leia 'Tabelas BDB ou BerkeleyDB'.

A seção de otimização no manual cobre diversos aspectos de como sintonizar a sua aplicação. Leia 'Mais Dicas sobre Otimizações'.

Comentários Sobre Threads RTS

Tentamos usar os pacotes RTS thread com o MariaDB mas nos deparamos com o seguinte problema:

Eles usam um versão antiga de diversas chamadas POSIX e é muito tedioso fazer wrappers para todas as funções. Estamos inclinados a pensar que seria mais fácil alterar a biblioteca de threads para a especificação POSIX mais nova.

Alguns wrappers já estão escritos. Veja mysys/my_pthread.c para maiores informações.

Pelo menos o seguinte deve ser mudado:

pthread_get_specific deve usar um argumento. sigwait deve usar dois argumentos. Diversas funções (pelo menos pthread_cond_wait, pthread_cond_timedwait) deve retornar o código do erro. Agora eles retornam -1 e configuram errno.

Outro problema é que threads a nivel do usuario usam o sinal ALRM e isto aborta diversas das funções (read, write, open...). O MariaDB deve fazer uma nova tentativa de interrupção em todos mas não é facil de se verifica isto.

O maior problema não solucionado é o seguinte:

Para conseguir alarmes de threads alteramos mysys/thr_alarm.c para esperar entre alarmes com pthread_cond_timedwait(), mas isto aborta com o erro EINTR. Tentamos depurar a biblioteca thread para descobrirmos porque isto acontece, mas não podemos encontrar nenhuma solução fácil.

Se alguém quiser experimentar o MariaDB com RTS threads sugerimos o seguinte:

Diferença en Entre Alguns Pacotes de Threads

MySQL é muito dependente do pacote de threads usado. Assim ao escolher uma boa plataforma para o MySQL, o pacote de threads é muito importante.

Existem pelo menos três tipos de pacotes de threads:

Em alguns sistemas, threads do kernel são gerenciadas threads de usuário integrads em bibkliotecas de sistemas. Nestes casos a troca de thread pode ser feita pela biblioteca de threads e o kernel não têm real conhecimento da thread.



Anterior Próximo
Histórico de Alterações do MariaDB Início Variáveis de Ambientes do MariaDB