segunda-feira, 31 de março de 2014

MySQLUserclone ou apenas Copie usuários do MySQL

Original post: http://anothermysqldba.blogspot.com/2014/04/mysqluserclone-or-just-copy-mysql-users.html


Recentemente, deparei com um pós MySQL Fórum que estava procurando como migrar os usuários para um novo sistema.

Enquanto isso poderia ser feito de várias maneiras, eu percebi que ele me deu a chance de jogar e demonstrar o mysqluserclone ferramenta.

Então, eu tenho dois bancos de dados e apenas um utilizador wiki:


root@localhost [(none)]> select VERSION();
+------------+
| VERSION() |
+------------+
| 5.6.10-log |
+------------+
root@localhost [(none)]> show grants for wikiuser@localhost;
+-------------------------------------------------------------------------------------------------------------------+
| Grants for wikiuser@localhost |
+-------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wikiuser'@'localhost' IDENTIFIED BY PASSWORD '1e09502e61120480' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, LOCK TABLES ON `wikidb`.* TO 'wikiuser'@'localhost' |
+-------------------------------------------------------------------------------------------------------------------+

select VERSION();
+------------+
| VERSION() |
+------------+
| 5.5.30-log |
+------------+
show grants for wikiuser@localhost;
ERROR 1141 (42000): There is no such grant defined for user 'wikiuser' on host 'localhost'



Então agora usar a ferramenta mysqluserclone


Usage: mysqluserclone --source=user:pass@host:port:socket --destination=user:pass@host:port:socket joe@localhost sam:secret1@localhost

# mysqluserclone --source=root:<PASSWORD>@localhost:3306 --destination=root:@localhost:3307 wikiuser@localhost wikiuser@localhost
# Source on localhost: ... connected.
# Destination on localhost: ... connected.
# Cloning 1 users...
# Cloning wikiuser@localhost to user wikiuser@localhost
# ...done.

root@localhost [(none)]> select VERSION();
+------------+
| VERSION() |
+------------+
| 5.5.30-log |
+------------+
1 row in set (0.00 sec)

root@localhost [(none)]> show grants for wikiuser@localhost;
+-------------------------------------------------------------------------------------------------------------------+
| Grants for wikiuser@localhost |
+-------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wikiuser'@'localhost' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, LOCK TABLES ON `wikidb`.* TO 'wikiuser'@'localhost' |
+-------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
Note que ele está faltando uma senha porque eu não definir uma senha para o usuário. Opps que não é bom o suficiente.

Concedido ele funciona muito bem se você quiser criar novas contas de usuário com as novas senhas. Eu poderia ter passado a nova senha como parte do comando clone

mysqluserclone --source=root:<PASSWORD>@localhost:3306 --destination=root:@localhost:3307 wikiuser@localhost wikiuser:<PASSWORD>@localhost


Mas e se eu não sei as senhas? Quero garantir que todos os clientes têm todos os seus mesmas senhas.

Eu também poderia fazer o processo abaixo.
  • Reunir subsídios do DB 1
  • Edite o arquivo de subvenções eu quero passar
  • Edite o arquivo de usuário adicionar comentários a fazer sql seguro
  • Carregar o arquivo no DB 2
select CONCAT('SHOW GRANTS FOR `',USER,'`@',HOST,';') as showgrants FROM mysql.user INTO OUTFILE '/tmp/showgrants.sql';

vi /tmp/showgrants.sql

mysql < /tmp/showgrants.sql > /tmp/user_grants.sql

vi /tmp/user_grants.sql
:%s/Grants for/#Grants for/g
:%s/\n/;\r/g
mysql --port=3307 -u root -p < /tmp/user_grants.sql
> show grants for wikiuser@localhost;
+----------------------------------------------------------------------------------------------------------+
| Grants for wikiuser@localhost |
+----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wikiuser'@'localhost' IDENTIFIED BY PASSWORD '1e09502e61120480' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, LOCK TABLES ON `wikidb`.* TO 'wikiuser'@'localhost' |
+----------------------------------------------------------------------------------------------------------+



Agora eu tenho o mesmo usuário, host e senha.

quinta-feira, 27 de março de 2014

Instalação WebScaleSQL tentou ... parte 1

Original post: http://anothermysqldba.blogspot.com/2014/03/webscalesql-installation-attempted-part.html

Bem, se você não ver a notícia, no entanto, em seguida, por todos os meios, siga este link e leia sobre WebScaleSQL . Muito obrigado para a equipe de engenheiros do Facebook, Twitter e Google para o seu trabalho duro para isso. Estou curioso para ver como isso se desenvolve mais no futuro, uma vez que fazê-lo funcionar.

Aqui está o que eu encontrei até agora. Eu queria que este é um blog de sucesso, em vez disso, fará parte um, até eu começar a correr.

Eu percebi que eu iria colocar um pouco de como instalar WebScaleSQL para aqueles de vocês de novo para Github nada disso. É preciso feedback da comunidade, afinal, para que a comunidade precisa ser capaz de instalar e experimentá-lo.

Para este exemplo eu tirei a imagem Virtual Box pré-construídas da Oracle Linux. Eu já tinha um, mas ele está disponível aqui: http://www.oracle.com/technetwork/server-storage/linux/downloads/vm-for-hol-1896500.html.

Deveria ser óbvio que WebScaleSQL não se destina para uso em um VirtualBox na produção, mas esta é apenas uma demonstração. Eu supus que isso significava que as pessoas não têm uma desculpa para experimentá-lo desde que qualquer um pode baixar e usar isso com o VirtualBox . Eu tinha que permitir que o disco adicional que vem com a imagem que você tem espaço suficiente. Para formatar, a partição e montar os discos de todos pode ser feito através do utilitário de disco. O produto final para o meu exemplo está abaixo.

[root@oraclelinux6 oracle]# ls -al /media/
drwx------ 3 oracle oracle 4096 Mar 27 16:19 webscaledisk
drwx------ 3 oracle oracle 4096 Mar 27 16:21 workspace
[root@oraclelinux6 oracle]# chmod 777 /media/workspace/
[root@oraclelinux6 oracle]# chmod 777 /media/webscaledisk/

O código para WebScaleSQL está disponível no Github . O arquivo zip pode ser baixado aqui . Eu escolho para verificar o código através dos métodos de repositório de código github. Se os outros precisam de ajuda com as chaves SSH ver a referência Gitbhub página .

O pacote git não está disponível no Oracle Linux, mas que é rapidamente resolvido, se você pretende usar a versão Github.

[oracle@oraclelinux6 ~]$ sudo bash
[root@oraclelinux6 oracle]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
[root@oraclelinux6 oracle]# wget http://git-core.googlecode.com/files/git-1.7.10.1.tar.gz
[root@oraclelinux6 oracle]# tar -xvzf git-1.7.10.1.tar.gz
[root@oraclelinux6 oracle]# cd git-1.7.10.1
[root@oraclelinux6 git-1.7.10.1]# make prefix=/usr/local all
[root@oraclelinux6 git-1.7.10.1]# make prefix=/usr/local install
[root@oraclelinux6 git-1.7.10.1]# exit
$ git --version
git version 1.7.10.1

Uma vez git e as teclas ssh está pronto você pode baixar:

[oracle@oraclelinux6 ~]$ cd /media/workspace/
[oracle@oraclelinux6 workspace]$ git clone https://github.com/webscalesql/webscalesql-5.6.git
Cloning into 'webscalesql-5.6'...
remote: Counting objects: 28637, done.
remote: Compressing objects: 100% (10926/10926), done.
remote: Total 28637 (delta 17074), reused 28419 (delta 16936)
Receiving objects: 100% (28637/28637), 48.01 MiB | 796 KiB/s, done.
Resolving deltas: 100% (17074/17074), done.



OK então, contudo, você decidiu começar o código ... Deixa-nos agora tentar obtê-lo instalado. Para ser claro isso é deve nada de novo, esta é uma fonte MySQL instalação básica, mas é apenas o uso do pacote WebScaleSQL. Ele segue basicamente o mesmo procedimento que eu fiz aqui antes.

Eu precisava de algumas dependências sobre este sistema limpo primeiro. Você pode achar que você precisa de algum bem, tudo depende do seu sistema e do resultado do comando cmake abaixo.


[root@oraclelinux6 workspace]# yum -y install ncurses-devel readline-devel cmake gcc gcc-c++ bison-devel bison
[root@oraclelinux6 workspace]# wget http://googlemock.googlecode.com/files/gmock-1.6.0.zip
[root@oraclelinux6 workspace]# unzip gmock-1.6.0.zip
[root@oraclelinux6 workspace]# cd gmock-1.6.0
[root@oraclelinux6 gmock-1.6.0]# ./configure
[root@oraclelinux6 gmock-1.6.0]# make
[root@oraclelinux6 gmock-1.6.0]# make check
....
=====================================================
1 of 4 tests failed
Please report to googletestframework@googlegroups.com
=====================================================
make[2]: Leaving directory `/media/workspace/gmock-1.6.0/gtest'
make[1]: Leaving directory `/media/workspace/gmock-1.6.0/gtest'
OK para que a próxima fase (part 2) deve ser o seguinte uma vez que recebo o código do Google para o trabalho ...

Btw os denable_downloads deve baixar e instalar o gmock tão bem, mas ele também não.

[root@oraclelinux6 workspace]# groupadd mysql
[root@oraclelinux6 workspace]# useradd -r -g mysql mysql
[root@oraclelinux6 workspace]# ln -s /media/workspace/webscalesql-5.6/ /usr/local/mysql
[root@oraclelinux6 workspace]# chown -R mysql:mysql webscalesql-5.6/
[root@oraclelinux6 workspace]# cd webscalesql-5.6/
[root@oraclelinux6 webscalesql-5.6]# cmake -DENABLE_DOWNLOADS=1 .
make
make install
./scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data

Portanto, não apenas pronto ainda .. mas vou voltar com você toda vez que eu fazê-lo funcionar. Tenho fé que vou.

Instalação WebScaleSQL resolvido ... parte 2

quarta-feira, 26 de março de 2014

Percona NUVEM TOOLS

Original post: http://anothermysqldba.blogspot.com/2014/03/percona-cloud-tools.html

Então, eu realmente gosto do fato de que Percona está chegando e oferecendo soluções para ajudar a analisar as preocupações do MySQL ou problemas com cloud.percona.com .

É muito fácil de instalar. O caminho mais rápido é ter o repo Percona YUM instalado, eu tenho um outro blog sobre isso, se necessário, assim você terá o pt-agente instalado.

Isso foi feito facilmente, porque eu tinha um arquivo. My.cnf configurado para o usuário root, caso contrário, você tem que configurar o nome de usuário e senha.

Entrar em cloud.percona.com primeiro e depois ir e instalar o agente:

# pt-agent --install
Step 1 of 12: Verify the user is root: OK
Step 2 of 12: Check Perl module dependencies: OK
Step 3 of 12: Check for crontab: OK
Step 4 of 12: Verify pt-agent is not installed: OK
Step 5 of 12: Verify the API key:
Enter your API key: <API KEY HERE provided on the percona website>
Step 5 of 12: Verify the API key: OK
Step 6 of 12: Connect to MySQL: OK
Step 7 of 12: Check if MySQL is a slave: NO
Step 8 of 12: Create a MySQL user for the agent: OK
Step 9 of 12: Initialize /etc/percona/agent/my.cnf: OK
Step 10 of 12: Initialize /root/.pt-agent.conf: OK
Step 11 of 12: Create the agent: OK
Step 12 of 12: Run the agent: pt-agent has daemonized and is running as PID 16333:

--lib /var/lib/pt-agent
--log /var/log/pt-agent.log
--pid /var/run/pt-agent.pid

These values can change if a different configuration is received.
OK
INSTALLATION COMPLETE
Simples assim .. Então você só entrar novamente no site da Percona https://cloud.percona.com para ativar e ajustar qualquer uma das configurações do agente por sistema.

Dê-lhe cerca de 15 minutos para recolher a primeira quantidade de dados e, em seguida, você está pronto para ter os dados em suas pontas do dedo. Você só clicar no botão "Consultar Analytics" fornecido no site.

Dependendo do seu ramo de MySQL você terá diferentes análises, obviamente Percona prefere que você use Percona Servidor 5.5.34 ou superior, com suas ferramentas, mas funciona com todos os MySQL.

Uma vez que seu agente como dados enviados de volta para Percona, você será capaz de exibir gráficos no Resumo do Servidor por contagem de consulta, tempo de consulta, tempo de bloqueio, linhas enviadas, linhas examinados, comprimento de consulta, bem como informações fornecidas através do perfil de consulta.

"Filesort, filesort no disco, junte-se completa, Verificação completa, visitas cache de consultas, tabelas temporárias, tabelas temporárias no disco estão disponíveis apenas para Percona Server. " - cloud.percona.com

MySQL e OS X instalar e remover

Original post: http://anothermysqldba.blogspot.com/2014/03/mysql-and-os-x-install-and-remove.html

Portanto, esta é uma referência a este bug:
Acontece que eu deparar-lo assim que eu percebi que o Parreira testá-lo com 5.7 também.
Eu também era capaz de reproduzir este erro com a versão mais recente DMR. (No momento do teste mysql-5.7.3-m13) Eu estava usando o fornecido DMG eo arquivo tar.gz.

dyld: Symbol not found: _strnlen
Referenced from: /usr/local/mysql/bin/my_print_defaults
Expected in: /usr/lib/libSystem.B.dylib

A DMG tem um pouco agradável instalador e etc, mas como você pode ver que não funcionou.

Então, para testar a versão 5.5 você tem que remover o MySQL a partir OS X

rm -rf /usr/local/mysql*
rm -rf /Library/StartupItems/MySQLCOM
rm -Rf /private/var/db/receipts/*mysql*

Eu só precisava de quem, mas este site tem uma lista de outras referências, se você precisar dele.

Eu era capaz de confirmar que 5.5.36 não instalar e executar. Então, você está apenas fora de sorte para o momento, se você quiser uma versão superior do MySQL.

Uma nota .. Leia a tela de informação ou o arquivo readme.txt. Ele contém informações úteis.

mysql> select @@hostname;
+----------------------+
| @@hostname |
+----------------------+
| MacBook-Pro-15.local |
+----------------------+
1 row in set (0.01 sec)

mysql> select VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.5.36 |
+-----------+
1 row in set (0.00 sec)

terça-feira, 11 de março de 2014

Planejando o tempo de inatividade MySQL e outras variáveis ​​de estado para revisão

Original post: http://anothermysqldba.blogspot.com/2014/03/planning-mysql-downtime-and-other.html

Todos nós sabemos que, enquanto o MySQL é estável e pode funcionar por um tempo muito longo sem reiniciar. De vez em quando nós precisamos reiniciar a ele ajustar algumas variáveis ​​ou para atualizar embora. Alguns poderiam supor que durante a noite é o melhor momento para fazer isso, porque os seus usuários estão dormindo. No entanto, muitas vezes durante a noite também inclui backups e outros scripts crontab relatou que poderia estar fazendo diferente mineração de dados e etc

Então, como você pode obter uma orientação sobre quando você tem a menor atividade no servidor? Agora cada aplicação e banco de dados são diferentes, por isso você precisa levado em conta que a atividade relacionada está em execução, durante os prazos diferentes. Se você começar a registrar a variável de status "threads_connected" a cada minuto para 5 a 10 minutos, mais uma vez isso depende de como o sistema é carregado uma vez por hora pode ser bom, você vai em breve reunir a quantidade de diferentes conexões MySQL através de seu login de tempo quadro.

Isto pode ser feito de uma de numerosas maneiras. Ele já está previsto em muitas ferramentas de nível corporativo e você pode escrever scripts e etc, mas apenas para mantê-lo no MySQL. Vou usar um evento e de rotina para este exemplo simples.

Criar uma tabela simples:

CREATE TABLE `threads_count` (
`threads_count_id` int(11) NOT NULL AUTO_INCREMENT,
`variable_value` varchar(255) DEFAULT NULL,
`time_recorded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`threads_count_id`)
) ENGINE=InnoDB;

Criar uma rotina simples:

delimiter //
CREATE PROCEDURE threads_tally()
BEGIN
INSERT INTO threads_count SELECT NULL , VARIABLE_VALUE , NOW() FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME IN ('Threads_connected');
END//
delimiter ;

Criar um evento simples:

SET GLOBAL event_scheduler = ON;
CREATE EVENT `threads_tally`
ON SCHEDULE EVERY 5 MINUTE
DISABLE ON SLAVE
COMMENT 'keeps a count of Threads_connected'
DO
CALL threads_tally();
DELIMITER ;

Agora, mas a implementação do exemplo acima, você terá uma tabela que você pode selecionar os valores de (provavelmente colocado em um gráfico ou apenas para revisão), assim você pode ver quando o menor número de conexões existia em seu servidor. Dependendo da aplicação e do tráfego que você pode manter esta funcionando o tempo suficiente para ganhar uma perspectiva válida e, em seguida, desativar o evento.

select variable_value , time_recorded FROM threads_count;

Agora você pode naturalmente levar isso um passo adiante, se você não tem ferramentas da empresa, e manter um registro de todas as suas variáveis ​​de estado para a revisão:

Tabela para valores:

CREATE TABLE `status_review` (
`status_review_id` int(11) NOT NULL AUTO_INCREMENT,
`variable_name` varchar(255) DEFAULT NULL,
`variable_value` varchar(255) DEFAULT NULL,
`time_recorded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`status_review_id`)
) ENGINE=InnoDB;

Rotina para recolher os valores:

delimiter //
CREATE PROCEDURE status_reviews()
BEGIN
INSERT INTO status_review SELECT NULL , VARIABLE_NAME, VARIABLE_VALUE , NOW() FROM information_schema.GLOBAL_STATUS;
END//
delimiter ;

Evento para executar rotina:

SET GLOBAL event_scheduler = ON;
CREATE EVENT `status_reviews`
ON SCHEDULE EVERY 1 HOUR
DISABLE ON SLAVE
COMMENT 'keeps a eye on status values'
DO
CALL status_reviews();
DELIMITER ;

Você pode apenas querer certos nomes de variáveis ​​e valores para a revisão e você pode ajustar a consulta na rotina de acordo. O tempo de execução é dependente de suas necessidades, eu usei uma hora neste exemplo.

Isto, obviamente, que vai gerar uma grande quantidade de informações ao longo do tempo para que se relevante uma limpeza fora destas tabelas ao longo do tempo pode ser necessário. Tudo depende de quantas vezes você registrar e analisar as informações fornecidas.

Enquanto você vai ver um aumento constante de muitos dos valores por causa de seu crescimento de dados e sistema de usar, você também será capaz de identificar pontos de dados nos dados como e correlacionar isso com a sua aplicação e uso do sistema.

Empresa MySQL por exemplo, já cria um gráfico todo este tipo de informação para você, mas esta é uma maneira que você também pode fazê-lo com um pouco de tempo e revisão dos dados.

segunda-feira, 27 de janeiro de 2014

Use seu índice, mesmo com um varchar | | serviço doméstico

Original post: http://anothermysqldba.blogspot.com/2014/01/use-your-index-even-with-varchar-char.html

Eu observei recentemente um post sobre o forums.mysql.com site: Como a jejuar em 3 milhões registro de pesquisa? 
O exemplo dado utilizado um LIKE '% eed' 

Isso não será aproveitado de um índice e vai fazer uma varredura completa da tabela. 
Abaixo está um exemplo usando o banco de dados do mundo, então não 3 milhões de discos, mas apenas tentando mostrar como ele funciona. 

> explain select * from City where Name LIKE '%dam' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4188
Extra: Using where
1 row in set (0.01 sec)

[world]> select count(*) FROM City;
+----------+
| count(*) |
+----------+
| 4079 |
+----------+

> select * from City where Name LIKE '%dam';
+------+------------------------+-------------+----------------+------------+
| ID | Name | CountryCode | District | Population
+------+------------------------+-------------+----------------+------------+
| 5 | Amsterdam | NLD | Noord-Holland | 731200 |
| 6 | Rotterdam | NLD | Zuid-Holland | 593321 |
| 1146 | Ramagundam | IND | Andhra Pradesh | 214384 |
| 1318 | Haldwani-cum-Kathgodam | IND | Uttaranchal | 104195 |
| 2867 | Tando Adam | PAK | Sind | 103400 |
| 3122 | Potsdam | DEU | Brandenburg | 128983 |
+------+------------------------+-------------+----------------+------------+
Para mostrar o ponto mais 

> explain select * from City where Name LIKE '%dam%' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4188
Extra: Using where
1 row in set (0.00 sec)

> select * from City where Name LIKE '%dam%';
+------+------------------------+-------------+----------------+------------+
| ID | Name | CountryCode | District | Population |
+------+------------------------+-------------+----------------+------------+<
| 5 | Amsterdam | NLD | Noord-Holland | 731200 |
| 6 | Rotterdam | NLD | Zuid-Holland | 593321 |
| 380 | Pindamonhangaba | BRA | São Paulo | 121904 |<
| 625 | Damanhur | EGY | al-Buhayra | 212203 |
| 1146 | Ramagundam | IND | Andhra Pradesh | 214384 |
| 1318 | Haldwani-cum-Kathgodam | IND | Uttaranchal | 104195 |
| 1347 | Damoh | IND | Madhya Pradesh | 95661 |
| 2867 | Tando Adam | PAK | Sind | 103400 |
| 2912 | Adamstown | PCN | – | 42 |
| 3122 | Potsdam | DEU | Brandenburg | 128983 |
| 3177 | al-Dammam | SAU | al-Sharqiya | 482300 |
| 3250 | Damascus | SYR | Damascus | 1347000 |
+------+------------------------+-------------+----------------+------------+<
12 rows in set (0.00 sec) 

A saída de explicar acima mostra que há índices estão sendo usados. 

CREATE TABLE `City` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `Country` (`Code`)
) ENGINE=InnoDB
<

Assim, por sorrisos vamos colocar uma chave no campo varchar. Repare que eu não colocar uma chave em toda a faixa de apenas os primeiros caracteres. Este é, naturalmente, dependente de seus dados. 

> ALTER TABLE City ADD KEY name_key(`Name`(5));
Query OK, 0 rows affected (0.54 sec)

CREATE TABLE `City` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`),
KEY `name_key` (`Name`(5)),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `Country` (`Code`)
) ENGINE=InnoDB

SO vai este mesmo assunto? 

> explain select * from City where Name LIKE '%dam' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4188
Extra: Using where
1 row in set (0.00 sec) 

Não, não vai importar, por causa do LIKE '% barragem "vai forçar uma varredura completa de qualquer maneira. 

> EXPLAIN select * from City where Name LIKE '%dam' AND CountryCode = 'IND' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ref
possible_keys: CountryCode
key: CountryCode
key_len: 3
ref: const
rows: 341
Extra: Using index condition; Using where
1 row in set (0.00 sec) 

Notar a diferença na saída explicado acima. Esta consulta está usando um índice. Ele não está usando o nome do índice, mas ele está usando um índice. Então, como você pode tirar vantagem do índice varchar? 

> EXPLAIN select * from City where Name LIKE 'Ra%' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: range
possible_keys: name_key
key: name_key
key_len: 5
ref: NULL
rows: 35
Extra: Using where
1 row in set (0.00 sec) 

A consulta acima irá utilizar o índice name_key. 

O ponto é que você tem que ter cuidado como você escreve sua consulta SQL e garantir que você executar explica para encontrar o melhor índice de escolha para sua consulta.

domingo, 19 de janeiro de 2014

MySQL Replication pode pegar

Original post: http://anothermysqldba.blogspot.com/2014/01/can-mysql-replication-catch-up.html

Assim, a replicação foi recentemente melhorado no MySQL 5.6. No entanto, as pessoas ainda estão usando 5.1 e 5.5 para algumas dessas melhorias vão ter que esperar para atingir o mundo real.

Recentemente, ajudou a mover nessa direção com uma solução de replicação localizado geo-. Uma parte do país tinha um servidor MySQL 5.1 ea outra parte do país, teve um novo servidor MySQL 5.6 instalado.

Depois de lidar com as questões de conseguir o apoio de dados inicial do primário para o servidor secundário (levou várias horas para dizer o mínimo), eu tinha que decidir poderia replicação apanhar e manter-se. O servidor primário teve algumas grandes consultas e otimização é sempre um bom lugar para começar. Eu tinha que se o servidor secundário puxar e aplicar o mais rápido que pude em primeiro lugar.

Então, aqui estão algumas coisas para verificar e manter em mente quando se trata de replicação. Eu adicionei alguns links abaixo que ajudam a apoiar os meus pensamentos como eu trabalhei nisto.

A replicação pode ser muito I / O pesado. Dependendo da sua aplicação. Um blog não tem que várias escritas de modo a replicação I / O é leve, mas um servidor primário fortemente escrito e atualizado vai levar a um servidor de replicação escrevendo um monte de relay_logs e binary_logs se eles estão habilitados. Logs binários podem ser habilitados no secundário para permitir que você executar backups ou você pode querer esse servidor seja um primário para os outros.

Eu dividir os logs em uma partição de dados diferente do diretório de dados.
Isso é definido no arquivo my.cnf - relay-log

O buffer pool do InnoDB já foi definido para um valor mais de 10GB. Isso foi muito para este servidor.
O servidor foi mais de 90.000 segundos atrás ainda.

Então eu comecei a fazer alguns ajustes para o servidor e acabou com essas configurações no final. Concedido a cada servidor é diferente.

mysql> select @ @ sync_relay_log_info \ G
*************************** 1. linha ***************************
@ @ Sync_relay_log_info: 0
1 row in set (0.08 sec)

mysql> select @ @ innodb_flush_log_at_trx_commit \ G
*************************** 1. linha ***************************
@ @ Innodb_flush_log_at_trx_commit: 2
1 row in set (0.00 sec)

mysql> select @ @ log_slave_updates \ G
*************************** 1. linha ***************************
@ @ Log_slave_updates: 0

mysql> select @ @ sync_binlog \ G
*************************** 1. linha ***************************
@ @ Sync_binlog: 0
1 row in set (0.00 sec)

mysql> select @ @ max_relay_log_size \ G
*************************** 1. linha ***************************
@ @ Max_relay_log_size: 268435456

Virei o log binário fora como eu monitorados diferentes configurações e opções para ajudar a replicação catch up. Demorou um pouco. Algumas das configurações que você vê acima pode ou não ter sido aplicada como eu trabalhei dentro deste prazo. No entanto, se pegar para 0 segundos atrás. Agora você pode notar que muitas dessas configurações acima referem e em torno do log binário. Então eu corri um pequeno teste. Então, eu reiniciado e permitiu que os registros de lixo. Eu verifiquei com o servidor mais tarde e descobriu que mais de 10.000 segundos atrás. Então eu, mais uma vez reiniciado e desativados os logs de lixo. Ele pego (0 segundos atrás) com o servidor principal em menos de 15 minutos. Eu costumava Aurimas ' ferramenta como eu assisti-lo apanhar também. Se você não usá-lo antes, é uma ferramenta muito agradável e acessível.

O que tudo isto significa é o servidor primário deve ser compatível com ACID. Com esta configuração você também está dependendo do sistema operacional para o cache e limpar. Este é o servidor vai ser utilizado como um servidor de ler principalmente para alimentar informação aos outros. Isso também significa que, sim, a replicação localizado geo-pode manter-se atualizado com um servidor primário.

E se você precisa parar o escravo, isso ainda será pegar rapidamente?

Como e por que você parar o escravo é a minha primeira resposta. Você deve adquirir o hábito de usar STOP SLAVE SQL_THREAD , em vez de STOP SLAVE ; Isso permite que os relay logs para continuar a recolher dados e simplesmente não aplicá-lo ao seu servidor primário. Então, se você pode tirar vantagem de que ele vai ajudar a reduzir o tempo que leva para que você possa preencher os relay logs mais tarde.

Algumas leituras adicionais para você: