quarta-feira, 23 de maio de 2018

Proxy MySQL :: HAproxy || ProxySQL e KeepAlived

Então, quando se trata de rotear seu tráfego MySQL, existem várias opções. 

Agora eu tenho visto HAproxy usado com mais freqüência com os clientes, é bastante simples de configurar. Percona tem um exemplo para os interessados:

Pessoalmente eu gosto de ProxySQL. Percona também tem alguns blogs sobre isso também
Percona também tem versão ProxySQL disponível

Eu estava pensando em escrever alguns exemplos, mas no geral Percona explicou tudo muito bem. Eu não quero tirar nada desses posts, em vez disso, salientar que muita informação boa está disponível através desses URLs. Então, em vez de reescrever o que já foi escrito, vou criar uma coleção de informações para os interessados.

Primeiro compare e decida por si mesmo o que você precisa e quer. O link a seguir, claro, vai ser inclinado para o ProxySQL, mas dá-lhe um escopo geral para você considerar.
Se você tem um cluster ou mestre para dominar e não se importa com qual servidor as leituras versus leituras serão feitas, contanto que você tenha uma conexão; então o HAproxy é provavelmente um simples e rápido setup para você.

O bônus com o ProxySQL é a capacidade de classificar o tráfego de maneira ponderada, FÁCIL. Assim, você pode escrever no nó 1 e selecionar pull do nó 2 e do nó 3. A documentação pode ser encontrada aqui:
Sim, isso pode ser feito com o HAproxy, mas você deve instruir o aplicativo de acordo.
Isso é tratado no ProxySQL com base em suas regras de consulta.

Agora a pergunta óbvia aqui: OK, então como você mantém ProxySQL de se tornar o único ponto de falha?

Você pode investir é um balanceador de carga robusto e etc etc etc ... Lançar hardware nele ... Ou tornar mais fácil em si mesmo e apoiar open source e usar KeepAlive d. Isso é muito fácil de configurar e tudo está documentado novamente aqui:
Se você já lidou com lua e mysql-proxy , ProxySQL e Keepalived devem ser muito simples para você. Se você ainda quiser, por algum motivo: https://launchpad.net/mysql-proxy

Independentemente de você escolher HAproxy, ProxySQL ou outra solução, você precisa garantir que não substitua um único ponto de falha por outro e que keepalived seja ótimo para isso. Tão pouco motivo para não fazer isso se você estiver usando um proxy.

Então, mais algumas coisas no ProxySQL.
http://anothermysqldba.blogspot.com/2018/05/proxy-mysql-haproxy-proxysql-keepalived.html

terça-feira, 20 de março de 2018

MySQL 8.0.4rc

O MySQL 8.0.4rc foi lançado como " Antecipação de Disponibilidade Geral: 2018-03-19 ". 

Eu decidi dar uma olhada rápida e anotar minhas impressões aqui. Algumas dessas notícias são novidades para muitos, pois esse lançamento foi falado por algum tempo, mas adicionei meus pensamentos de qualquer maneira ...

A primeira coisa que notei foi uma simples questão de usar o cliente mysql atualizado. Minha versão mais antiga ainda estava no meu caminho, que resultou em

ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded
Tão simples de corrigir e certifique-se de que está usando o cliente mysql atualizado válido. É claro que existiram outras opções, como alterar o plugin de autenticação de volta para mysql_native_password, mas por que incomodar, use o método seguro. Este é um aprimoramento muito bom para a segurança, então não fique chocado se você tiver alguns problemas de conexão enquanto você obtém suas conexões usando este método mais seguro.


Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 8.0.4-rc-log

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Então, o primeiro aprimoramento muito legal ...

mysql> show create table user\G
*************************** 1. row ***************************
Tabela: usuário
Criar tabela: CREATE TABLE `user` (
`Host` char (60) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char (32) COLLATE utf8_bin NOT NULL DEFAULT '',
`Select_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Insert_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Update_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Delete_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Drop_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Reload_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Shutdown_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Process_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`File_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Grant_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`References_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Index_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Alter_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Show_db_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Super_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_tmp_table_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Lock_tables_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Execute_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Repl_slave_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Repl_client_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_view_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Show_view_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_routine_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Alter_routine_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Create_user_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Event_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Trigger_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_tablespace_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`ssl_type` enum ('', 'ANY', 'X509', 'ESPECIFICADO') CHARACTER SET utf8 NOT NULL DEFAULT '',
`ssl_cipher` blob NÃO NULL,
`x509_issuer` blob NOT NULL,
`x509_subject` blob NOT NULL,
`max_questions` int (11) não assinado NOT NULL DEFAULT '0',
`max_updates` int (11) não assinado NOT NULL DEFAULT '0',
`max_connections` int (11) não assinado NOT NULL DEFAULT '0',
`max_user_connections` int (11) não assinado NOT NULL DEFAULT '0',
`plugin` char (64) COLLATE utf8_bin NOT NULL DEFAULT 'caching_sha2_password',
texto `authentication_string` COLLATE utf8_bin,
`password_expired` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`password_last_changed` timestamp NULL DEFAULT NULL,
`password_lifetime` smallint (5) não assinado DEFAULT NULL,
`account_locked` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_role_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Drop_role_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Password_reuse_history` smallint (5) não assinado DEFAULT NULL,
`Password_reuse_time` smallint (5) não assinado DEFAULT NULL,
CHAVE PRIMÁRIA (`Host`,` Usuário ')
) / *! 50100 TABLESPACE `mysql` * / ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin STATS_PERSISTENT = 0 COMMENT = 'Usuários e privilégios globais'
1 linha no set (0,00 seg)

A tabela de usuários do Yep é InnoDB e possui TableSpace próprio.

Com a adição do novo Dicionário de dados, você notará as alterações de Information_schema.
Então, como um exemplo simples, a tabela de colunas historicamente não foi uma visão, mas agora mudou, juntamente com muitos outros como você pode ver através da URL fornecida.


mysql> show create table COLUMNS \G
*************************** 1. row ***************************
Vista: COLUMNAS
Criar vista: CREATE ALGORITHM = DEFINER DESFASTADO = `mysql.infoschema` @` localhost`

Isso parece ser feito para ajudar o desempenho com o information_schema, mas removendo as criações da tabela temporária por consultas no information_schema.

O capítulo 14 da documentação entra em profundidade sobre isso, a URL fornecida abaixo irá ajudá-lo a encontrar mais informações e as futuras postagens de blog podem afetar mais isso.
O Dicionário de Dados mencionado anteriormente também conduz à capacidade de ter declarações atômicas de linguagem de definição de dados (DDL) ou DDL atômica.


Isso provavelmente tropeçará algumas transações se você não analisar suas consultas antes de configurar a replicação para uma nova instância do MySQL 8.0. Eu digo isso por causa de como o manuseio da manutenção da tabela pode ser afetado. Se você escrever consultas limpas com "If Exists", não será um grande problema. No geral, é um recurso mais baseado em transações que protege suas opções de dados e reversão.


O gerenciamento de recursos parece muito interessante e vou ter que levar mais tempo para se concentrar nisso, pois é um novo recurso com o MySQL 8.0. Em geral, você pode atribuir grupos e não precisa mais definir a prioridade da consulta, mas deixar seu agrupamento definir como uma consulta deve se comportar e os recursos atribuídos a ela.

mysql> select @@version;
+------------+
| @@ version |
+ ------------ +
| 5.7.16-log |
+ ------------ +
1 linha no set (0,00 seg)

mysql> desc INFORMATION_SCHEMA.RESOURCE_GROUPS;
ERRO 1109 (42S02): tabela desconhecida 'RESOURCE_GROUPS' em information_schema

mysql> selecione @@ versão;
+ -------------- +
| @@ version |
+ -------------- +
| 8.0.4-rc-log |
+ -------------- +
1 linha no set (0,00 seg)

mysql> desc INFORMATION_SCHEMA.RESOURCE_GROUPS;
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
| Campo | Digite | Nulo | Chave | Padrão | Extra |
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
| RESOURCE_GROUP_NAME | varchar (64) | NO | | NULL | |
| RESOURCE_GROUP_TYPE | enum ('SYSTEM', 'USUÁRIO') | NO | | NULL | |
| RESOURCE_GROUP_ENABLED | tinyint (1) | NO | | NULL | |
| VCPU_IDS | blob | SIM | | NULL | |
| THREAD_PRIORITY | int (11) | NO | | NULL | |
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
5 linhas no conjunto (0,00 seg)


Mais informações sobre o cache do pool de buffer InnoDB em relação aos índices que estão nele estão agora disponíveis.

mysql> desc INFORMATION_SCHEMA.INNODB_CACHED_INDEXES ;
+----------------+---------------------+------+-----+---------+-------+
| Campo | Digite | Nulo | Chave | Padrão | Extra |
+ ---------------- + --------------------- + ------ + --- - + --------- + ------- +
| SPACE_ID | int (11) não assinado | NO | | | |
| INDEX_ID | bigint (21) não assinado | NO | | | |
| N_CACHED_PAGES | bigint (21) não assinado | NO | | | |
+ ---------------- + --------------------- + ------ + --- - + --------- + ------- +
3 linhas no conjunto (0,01 seg)


Se você não tiver certeza do que configurar o pool de buffer InnoDB, log_sizes ou método de descarga, o MySQL irá configurá-los agora com base na memória disponível.

innodb_dedicated_server

[mysqld]
innodb-dedicated-server=1

mysql> selecione @@ innodb_dedicated_server;
+ --------------------------- +
| @@ innodb_dedicated_server |
+ --------------------------- +
| 1 |
+ --------------------------- +

Este teste simples define meu innodb_buffer_pool_size para 6GB, por exemplo, quando o padrão é 128MB.

Numerosas adições JSON foram feitas, bem como mudanças regulares de expressão. Ambos os quais parecem promissores.

O único aprimoramento de replicação por esta versão em si é que agora é compatível com registro binário de atualizações parciais para documentos JSON usando um formato binário compacto.

No entanto, em geral, muitos recursos estão disponíveis (você pode ler tudo sobre eles aqui ), um dos quais (eu queria que meu cliente tivesse amanhã) é um filtro de replicação por canal.
Minha instância de teste já tinha logs binários ativados, mas eles estão ativados por padrão agora, juntamente com a base de tabela baseada em arquivos baseados em arquivos e informações de escravos (grande fã de ter essa transação por padrão)

No geral, tenha em mente que esta é apenas uma primeira olhada neste lançamento e pensamentos de muito alto nível, muitas outras mudanças existem. Olhar para outras postagens de blog sobre este lançamento, bem como o manual e as notas de versãotambém ajudarão. Certamente, baixe e revele como parece ser muito promissor para os pontos de vista de administração, segurança e replicação.

terça-feira, 13 de março de 2018

MySQL Cheat Sheet

Então, primeiro postei em algum momento como senti que deveria ser. Fiquei muito ocupado ainda trabalhando com o MySQL e todos os garfos relacionados e não consegui colocar blogs como eu senti que deveria. Então vou trabalhar com isso. 

Agora, sendo dito, recordei no outro dia um site que eu adorava porque era uma lista comum de tabelas de truques VI. A sintaxe que você conhece, você sabe que precisa, mas digite 3 vezes até que esteja certo. Quando é que entra logo, olha-o estupefato, pensei que já escrevi isso. 

Então eu percebi por que não uma simples lista de comandos comuns do MySQL que todos nós fazemos 50 vezes por mês ou devemos saber como a parte de trás da nossa mão, mas esquecemos quando o cliente está olhando por cima do ombro. 
Para iniciantes.. 
Criamos um novo servidor MySQL 5.7.6+ e entre. 
Precisa mudar a senha antes que possamos fazer qualquer coisa. Mas é Alter User não Set pass. 
Queremos saber como ler a senha ainda como está em texto limpo. 

ALTER USER 
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass'; 
Definir senha é 
SET PASSWORD FOR 'bob''@'localhost' = PASSWORD('cleartext password'); 

Purgar logs binários 
PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2008-04-02 00:00:00
PURGE BINARY LOGS BEFORE NOW() - interval 3 DAY;

MySQL Dump 
# COMPACT WILL REMOVE DROP STATEMENTS
mysqldump --events --master-data=2 --routines --triggers --compact --all-databases > db.sql
mysqldump --events --master-data=2 --routines --triggers --all-databases > NAME.sql
mysqldump --opt --routines --triggers dbname > dbname.sql
mysqldump --opt --routines --triggers --no-create-info joomla jforms > dataonly.sql 

Desligue as Chaves Estrangeiras por um momento 
SET GLOBAL foreign_key_checks=0; 



Skip Grants 
/usr/bin/mysqld_safe --defaults-file=/etc/mysql/my.cnf --skip-grant-tables
vi /etc/mysql/my.cnf
[mysqld]
skip-grant-tables


BinLog avaliações 
--base64-output = DECODE-ROWS & --verbose 
mysqlbinlog --defaults-file=/home/anothermysqldba/.my.cnf --base64-output=DECODE-ROWS --verbose binlog.005862 > 005862.sql

CLIENTE SEGUINTE DE MYSQL 
mysql_config_editor print --all
mysql_config_editor set --user=mysql --password --login-path=localhost --host=localhost
mysql --login-path=localhost -e 'SELECT NOW()';

Troca 
sudo swapoff -a
To set the new value to 10: echo 10 | sudo tee /proc/sys/vm/swappiness
sudo swapon -a 

ESQUEMA INFORMATIVO 
set global innodb_stats_on_metadata=0; 

Variáveis ​​AWS 
CALL mysql.rds_show_configuration;
> call mysql.rds_set_configuration('binlog retention hours', 24);
> call mysql.rds_set_configuration('slow_launch_time', 2);

Encontre em que tabela um nome de coluna está em 
SELECT TABLE_SCHEMA , TABLE_NAME , COLUMN_NAME FROM information_schema.COLUMNS WHERE COLUMN_NAME = 'fieldname' ; 
O cliente diz que está em TableA, mas eles têm 50 bases de dados. Qual esquema tem TableA 
SELECT TABLE_SCHEMA , TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = 'TableA' ; 

Ajude os trabalhadores escravos 
Select @@slave_parallel_workers;
Stop Slave; Set GLOBAL slave_parallel_workers=5; Start Slave;

MySQL Multi 
5.6>
To start both : mysqld_multi start 1,2
To check on status of both: mysqld_multi report 1,2
To check on status or other options you can use just one

5.7<
[mysqld1] BECOMES [mysqld@mysqld1]
systemctl start mysqld@mysqld1
systemctl start mysqld@mysqld2
systemctl start mysqld@mysqld3
systemctl start mysqld@mysqld4 
Apenas tabelas do sistema de atualização do MySQL 
mysql_upgrade --defaults-file=/home/ anothermysqldba /.my.cnf --upgrade-system-tables 

ERROR DE REPLICAÇÃO DE PASSAGEM 
STOP SLAVE; SET GLOBAL sql_slave_skip_counter =1; START SLAVE; SELECT SLEEP(1); SHOW SLAVE STATUS\G 

sexta-feira, 13 de outubro de 2017

MySQL InnoDB Tablespace Encryption

MySQL Tablespace Encryption is relatively simple to set up. You have to be using MySQL 5.7, innodb_file_per_table


The MySQL documentation covers everything you need to set this up:


But my blog post would be very short if I just shared a link. So....

Once upgraded and on MySQL 5.7 you need to have a valid location for your key file.  I have a MySQL datadir as /var/lib/mysql/data  this allows default locations for people to find it if needed but also allows a simple mounted location for more disks if needed as well. This also avoids having to do additional edits to selinux and etc since it already allows /var/lib/mysql.

touch /var/lib/mysql/keyring
chmod 750  /var/lib/mysql/keyring*
chown mysql:mysql  /var/lib/mysql/keyring

Edit the mysql .cnf file :

 ls  /usr/lib64/mysql/plugin/keyring_file.so
/usr/lib64/mysql/plugin/keyring_file.so

[mysqld]
# Keyring Plugin Installation
early-plugin-load=keyring_file.so
keyring_file_data=/var/lib/mysql/keyring

After MySQL startup check your plugins:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
    ->        FROM INFORMATION_SCHEMA.PLUGINS
    ->        WHERE PLUGIN_NAME LIKE 'keyring%';
+--------------+---------------+
| PLUGIN_NAME  | PLUGIN_STATUS |
+--------------+---------------+
| keyring_file | ACTIVE        |  
| keyring_udf  | ACTIVE        |
+--------------+---------------+


INSTALL PLUGIN keyring_udf SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_generate RETURNS INTEGER SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_fetch RETURNS STRING SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_length_fetch RETURNS INTEGER SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_type_fetch RETURNS STRING SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_store RETURNS INTEGER SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_remove RETURNS INTEGER SONAME 'keyring_udf.so';


mysql>  use test;
mysql>  SELECT keyring_key_generate('MyKey1', 'AES', 32);

mysql>  CREATE TABLE `enc_test` (
  `enc_test_id` varchar(255) NOT NULL,
  PRIMARY KEY (`enc_test_id`)
) ENGINE=InnoDB ;
 
mysql>  alter table test.enc_test encryption='Y';

mysql>  show create table enc_test \G
*************************** 1. row ***************************
       Table: enc_test
Create Table: CREATE TABLE `enc_test` (
  `enc_test_id` varchar(255) NOT NULL,
  PRIMARY KEY (`enc_test_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ENCRYPTION='Y'
1 row in set (0.00 sec)