Usuários reclamam que o sistema fica lento quando o mysqldump está em andamento

9

O banco de dados MYSQL (ibdata1) tem tamanho de 73 GB e está configurado para ser executado como um servidor de banco de dados dedicado no Windows 2008 O / S para tabelas INNODB. Estamos executando o backup usando o mysqldump mysqldump --skip-opt --quick - única transação --create-options --extended-insert --disable-keys --add-drop-table --complete-insert - set-charset - compactar --log-error = Proddb0635.err -u raiz -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

O arquivo de backup Proddb0635.sql é armazenado em um servidor separado do servidor de banco de dados. RAM é de 12 GB. O tamanho do buffer pool do INNODB é 6 GB. Mem.pool adicional é de 32 MB. O tamanho do cache de consulta é 2 GB. O comprimento do buffer líquido é 16 M máx. tamanho do pacote 1 GB.

A versão do mysql é 5.0.67.

Quando o backup não está sendo executado, os usuários ficam satisfeitos com o desempenho.

Quando o backup está sendo executado, a taxa de acertos do buffer pool do INNODB é alta perto de 100%. Não há leituras ou gravações pendentes. innodb wait free é 0. O uso da CPU não é alto min 9% a max 15% A taxa de acertos do cache de consultas é baixa em cerca de 40% com ou sem o mysqlbackup em execução. Atualmente, o Windows Task Manager está exibindo que 10 GB de RAM estão sendo usados. Devo aumentar o cache de consulta com apenas 2 GB de RAM disponível? O mysqlld-nt está usando 9.2 GB de RAM e o mysqldump está usando 5 MB de RAM. Alos, observou que o tamanho do arquivo de despejo é o mesmo na presença ou ausência da opção --compress.

DEVO diminuir o tamanho do buffer pool do iNNODB?

obrigado

dbachacha
fonte

Respostas:

8

Há um problema conhecido no Windows: quando você envia um arquivo grande para outro servidor, toda a memória acaba sendo alocada no cache do sistema, em vez dos processos do usuário. Você pode procurar na seção Memória física (MB) do gerenciador de tarefas para ver quanta memória está alocada no cache do sistema.

Isso pode ser resolvido fazendo backup em um disco local e solicitando à máquina remota que puxe esse arquivo.

Mrdenny
fonte
Obrigado, Mrdenny. Temos nossos discos armazenados no SAN.Do também faz diferença?
precisa saber é o seguinte
11
É um problema, não importa como o armazenamento seja apresentado. Como o armazenamento é SAN, não é necessário copiar os arquivos pela rede para outra máquina. Apresente um novo LUN ao servidor MySQL e faça backup nessa máquina. Se você precisar enviar os arquivos para outra máquina para backup em fita, use a SAN. Encaixe o LUN, apresente o instantâneo ao servidor de backup, faça backup dos arquivos e exclua o instantâneo. Repita o dia seguinte. Provavelmente tudo isso pode ser roteirizado.
precisa saber é o seguinte
Sua primeira sugestão: os # não foram alterados no cache do sistema. Em relação ao LUN, eu o transmitirei aos meus colegas que trabalham na Equipe de Sistema e Rede.
dbachacha
Mudei o script de backup para executar em outro servidor e há uma melhoria considerável. Além disso, descobrimos que o código do aplicativo não estava reutilizando uma conexão única, mas aberto / fechado em várias funções agrupadas em uma solicitação ao servidor de banco de dados. Além disso, descobri que um cartão NIC é compartilhado pelos dados de backup e pelos dados transacionais online. Portanto, planejamos ter uma NIC dedicada apenas para backup. Muito obrigado.
precisa saber é o seguinte
7

Aqui estão alguns pensamentos que tenho sobre como melhorar o desempenho do mysqldump, dadas as suas circunstâncias. Aqui está o seu comando:

mysqldump - skip-opt --quick - única transação - criar opções - extensão extendida - chaves descartáveis ​​- adicionar tabela suspensa - inserção completa de inserção - inserção completa - conjunto de caracteres - compactação - -log-error = Proddb0635.err -u raiz -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

A primeira coisa que noto é que você está redirecionando a saída para um sistema de arquivos. Ele diz 'devNas', então vou assumir que esse é o armazenamento anexado à rede . Sou fã do NAS para backups, mas ele deve estar conectado em uma NIC física separada do tráfego de produção . Você pode não estar saturando a largura de banda, mas eles ainda competem. Isso será mais um problema por causa do sinalizador --quick, pois ele libera todas as linhas em vez de mantê-lo na memória.

A próxima coisa que vejo é que você invocou --compress. Parece que você está executando o mysql localmente, pois não usou a opção -h. Isso pode usar a CPU local desnecessária nesse contexto. --Compress é necessário? Ele comprime apenas os dados entre o cliente mysqldump e o servidor mysql, não o conteúdo do arquivo.

Em seguida, vejo que você está usando o sinalizador - única transação. Isso causará CPU extra, uma vez que é testado em cada seleção como parte do mysqldump.

Isso não tem nada a ver com desempenho, mas você está usando --disable-keys, que só funciona no MyISAM ( manual ).

Você pode experimentar executar o mysqldump remotamente a partir de um host offline e mover o arquivo de despejo para o NAS após a conclusão, para tirar o máximo dessa operação fora de banda possível.

randomx
fonte
Sim, verifiquei com o administrador de rede e sistema. É armazenamento conectado à rede. Eu posso tentar mover o mysqldump para um servidor diferente. Além disso, agora fazia sentido para mim sobre o uso de --compress. O manual dizia que --compress trabalha com cliente e servidor, mas eu o coloco para ver se isso faz alguma diferença. Que tipo de dados flui entre o cliente que executa o mysqldump e o servidor de banco de dados mysql. Os dados estão fluindo entre o servidor de banco de dados mysql e o devNas. A documentação do MySQl e o livro Database Design and Tuning preferem o uso de transação única para tabelas INNODB.
Dbachacha
Mudei o script de backup para executar em outro servidor e há uma melhoria considerável. Além disso, descobrimos que o código do aplicativo não estava reutilizando uma conexão única, mas aberto / fechado em várias funções agrupadas em uma solicitação ao servidor de banco de dados. Além disso, descobri que um cartão NIC é compartilhado pelos dados de backup e pelos dados transacionais online. Portanto, planejamos ter uma NIC dedicada apenas para backup. Muito obrigado.
precisa saber é o seguinte
Estou feliz que isso esteja ajudando. Muitas felicidades.
randomx 23/08
Aqui, preciso de ajuda para entender o seguinte cenário: O banco de dados mysql está no servidor A. O mysqldump é executado no servidor B que despeja dados no servidor C. Temos uma NIC dedicada do servidor A para o servidor C. Isso está correto? Eu não tinha certeza. Na noite passada, o mysqldump estava sendo executado no servidor A. Gostaria de executá-lo em um servidor diferente para reduzir a contenção da CPU.
precisa saber é o seguinte
mysqldump é um 'utilitário de cliente', o que significa que você pode executá-lo em qualquer host que tenha privilégios para acessar as tabelas no banco de dados. A estratégia para você seria executar o mysqldump a partir do shell do Servidor C, visando as tabelas do Servidor A. Obviamente, você precisará conceder acesso do Servidor C ao esquema que deseja despejar.
randomx
2

OBSERVAÇÃO Nº 1

Aqui está algo a ter em mente ao executar um mysqldump no InnoDB.

Quaisquer páginas sujas que existam no InnoDB Buffer Pool devem ser lavadas primeiro no disco. Um mysqldump irá disparar a liberação de uma tabela do InnoDB que ainda possui páginas sujas.

Há uma opção de servidor chamada innodb_max_dirty_pages_pct . O valor padrão é 75 é MySQL 5.5 e 90 nas versões do MySQL anteriores à 5.5. Em um ambiente de produção, não há problema em deixar esse número no valor padrão.

Para ver se você tem muitas páginas sujas no InnoDB Buffer Pool, execute o seguinte:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';

Entre uma página é 16K como mostra isto:

SHOW GLOBAL STATUS LIKE 'Innodb_page_size';

Quando se trata do InnoDB e do mysqldump, você pode diminuir esse número em duas circunstâncias.

CIRCUNSTÂNCIA 1: defina-a permanentemente para 0

Basta adicionar isso ao my.ini:

[mysqld]
innodb_max_dirty_pages_pct=0

Isso manterá o InnoDB Buffer Pool baixo e médio. A etapa de liberar a tabela do InnoDB que está sendo descartada será rápida, porque poucas páginas sujas quanto possível (talvez 0) precisarão ser liberadas antes que o mysqldump opere.

A única desvantagem é que se você mysqldump de um banco de dados altamente trafegado, pode haver um aumento menor na E / S de gravação por causa da descarga da página suja com mais freqüência. Você pode determinar se é assim sem reiniciar o mysql executando este:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Deixe a configuração por 12 a 24 horas, se o desempenho de gravação for aceitável, você estará pronto. Caso contrário, configure-o novamente com:

SET GLOBAL innodb_max_dirty_pages_pct = 90;

CIRCUNSTÂNCIA 2: Defina como 0 cerca de 1 hora antes do mysqldump

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Execute o mysqldump

SET GLOBAL innodb_max_dirty_pages_pct = 90;

OBSERVAÇÃO Nº 2

Você tem --complete-insert como uma opção mysqldump. Isso incorporará nomes de colunas a todos os estatutos INSERT antes da cláusula VALUES. Mesmo com --extended-insert, em cada lote de linhas sendo inseridas, os nomes das colunas são enviados para o mysqldump. Você pode reduzir a quantidade de bytes enviados para o mysqldump removendo --complete-insert.

RECOMENDAÇÃO

Se você possui outro Windows Server que pode ser configurado como escravo, execute o mysqldumps desse escravo, e não da máquina de produção.

RolandoMySQLDBA
fonte
Obrigado. Esqueci de mencionar que os usuários reclamam que "salvar" leva tempo ao invés de ler. Implementarei sua observação nº 2 imediatamente. Eu definitivamente gosto da sua recomendação de ter um escravo e depois tirar o mysqldump do escravo.
precisa saber é o seguinte
innodb_buffer_pool_dirty_pages não estava muito alto pouco antes do início do backup. É cerca de 9 a max. 196. Master-Slave também é uma boa recomendação.
precisa saber é o seguinte
11
Mudei o script de backup para executar em outro servidor e há uma melhoria considerável. Além disso, descobrimos que o código do aplicativo não estava reutilizando uma conexão única, mas aberto / fechado em várias funções agrupadas em uma solicitação ao servidor de banco de dados. Além disso, descobri que um cartão NIC é compartilhado pelos dados de backup e pelos dados transacionais online. Portanto, planejamos ter uma NIC dedicada apenas para backup. Muito obrigado. Se nada disso funcionar, tenho certeza de que o escravo mestre também será bom.
precisa saber é o seguinte