jueves, 24 de mayo de 2018

Proxy MySQL :: HAproxy || ProxySQL y KeepAlived

Entonces, cuando se trata de enrutar su tráfico MySQL, existen varias opciones. 

Ahora que he visto que HAproxy se usa con más frecuencia con los clientes, es bastante fácil de configurar. Percona tiene un ejemplo para los interesados:

Personalmente, me gusta ProxySQL. Percona también tiene pocos blogs sobre esto también
Percona también tiene disponible la versión ProxySQL

Estaba pensando en escribir algunos ejemplos, pero en general Percona lo ha explicado muy bien. No quiero quitar nada de esas publicaciones, en cambio, señalo que hay mucha buena información disponible a través de esas urls. Entonces, en lugar de volver a escribir lo que ya se ha escrito, crearé una colección de información para los interesados.

Primero compare y decida por usted mismo lo que necesita y desea. El siguiente enlace por supuesto va a estar sesgado hacia ProxySQL, pero le da un alcance general para que usted considere.
Si tiene un clúster o maestro para dominar y no le importa a qué servidor van las escrituras vs lecturas, siempre que tenga una conexión; entonces es probable que HAproxy sea una configuración simple y rápida para usted.

La ventaja con ProxySQL es la capacidad de ordenar el tráfico de una manera ponderada, FÁCIL. Por lo tanto, puede hacer que las escrituras vayan al nodo 1 y seleccione la extracción del nodo 2 y del nodo 3. La documentación sobre esto se puede encontrar aquí:
Sí, se puede hacer con HAproxy, pero debe instruir a la aplicación en consecuencia.
Esto se maneja en ProxySQL en base a sus reglas de consulta.

Ahora la pregunta obvia aquí: OK, ¿cómo evitar que ProxySQL se convierta en el único punto de falla?

Puede invertir es un equilibrador de carga robusto y etc etc etc ... Mezcle hardware en él .... O hágalo fácil para usted y soporte de código abierto y use KeepAlive d. Esto es MUY fácil de configurar y todo está documentado nuevamente aquí:
Si alguna vez se ocupó de lua y mysql-proxy , ProxySQL y Keepalived deberían ser muy simples para usted. Si aún lo desea, por alguna razón: https://launchpad.net/mysql-proxy

Independientemente de si elige HAproxy, ProxySQL u otra solución, debe asegurarse de no reemplazar un único punto de falla con otro y keepalived es ideal para eso. Muy pocas razones para no hacer esto si está usando un proxy.

Así que algunas cosas más en ProxySQL.
http://anothermysqldba.blogspot.com/2018/05/proxy-mysql-haproxy-proxysql-keepalived.html

martes, 20 de marzo de 2018

MySQL 8.0.4rc

MySQL 8.0.4rc acaba de lanzarse como " Anteproyecto de disponibilidad general: 2018-03-19 ". 

Decidí echar un vistazo rápido y anotar mis impresiones aquí. Algunas de estas son viejas noticias para muchos ya que se ha hablado de este lanzamiento por un tiempo, pero agregué mis pensamientos de todos modos.

Lo primero que noté fue un simple problema de usar el cliente mysql actualizado. Mi versión anterior todavía estaba en mi camino que resultó en

ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded
Por lo tanto, corrija fácilmente y asegúrese de estar utilizando el cliente mysql actualizado válido. Por supuesto, existían otras opciones, como cambiar el complemento de autenticación a mysql_native_password, pero ¿para qué molestarse? Utilice el método seguro. Esta es una muy buena mejora para la seguridad, así que no se sorprenda si tiene problemas de conexión mientras obtiene sus conexiones usando este método más 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.

Entonces, la primera mejora genial ...

mysql> show create table user\G
*************************** 1. row ***************************
Tabla: usuario
Crear tabla: 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') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Insert_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Update_priv` enum ('N', 'Y') CHARACTER SET utf8 NO NULO PREDETERMINADO 'N',
`Delete_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Create_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Drop_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Reload_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Shutdown_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Process_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`File_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Grant_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`References_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Index_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Alter_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Show_db_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Super_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Create_tmp_table_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Lock_tables_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Execute_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Repl_slave_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Repl_client_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Create_view_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Show_view_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Create_routine_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Alter_routine_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Create_user_priv` enum ('N', 'Y') CHARACTER SET utf8 NO NULO PREDETERMINADO 'N',
`Event_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Trigger_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Create_tablespace_priv` enum ('N', 'Y') CHARACTER SET utf8 NOT NULL PREDETERMINADO 'N',
`ssl_type` enum ('', 'ANY', 'X509', 'SPECIFIED') JUEGO DE CARACTERES utf8 NOT NULL DEFAULT '',
`ssl_cipher` blob NOT NULL,
`x509_issuer` blob NOT NULL,
`x509_subject` blob NOT NULL,
`max_questions` int (11) unsigned NOT NULL DEFAULT '0',
`max_updates` int (11) unsigned NOT NULL DEFAULT '0',
`max_connections` int (11) unsigned NOT NULL DEFAULT '0',
`max_user_connections` int (11) unsigned NOT NULL DEFAULT '0',
`plugin` char (64) COLLATE utf8_bin NOT NULL DEFAULT 'caching_sha2_password',
`authentication_string` text COLLATE utf8_bin,
`password_expired` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`password_last_changed` timestamp NULL DEFAULT NULL,
`password_lifetime` smallint (5) unsigned DEFAULT NULL,
`account_locked` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL DEFAULT 'N',
`Create_role_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Drop_role_priv` enum ('N', 'Y') JUEGO DE CARACTERES utf8 NOT NULL PREDETERMINADO 'N',
`Password_reuse_history` smallint (5) sin signo DEFAULT NULL,
`Password_reuse_time` smallint (5) sin signo DEFAULT NULL,
PRIMARY KEY (`Host`,` User`)
) / *! 50100 TABLESPACE `mysql` * / ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin STATS_PERSISTENT = 0 COMMENT = 'Usuarios y privilegios globales'
1 fila en el set (0.00 seg)

Sí, la tabla de usuarios es InnoDB y tiene TableSpace propio.

Con la adición del nuevo diccionario de datos, ahora notará cambios en Information_schema.
Por lo tanto, como un ejemplo simple, la tabla Columnas históricamente no ha sido vista, pero ahora ha cambiado, junto con muchas otras, como puede ver a través de la url proporcionada.


mysql> show create table COLUMNS \G
*************************** 1. row ***************************
Vista: COLUMNAS
Crear vista: CREAR ALGORITMO = DEFINER INDEFINIDO = `mysql.infoschema` @` localhost`

Esto parece estar hecho para ayudar al rendimiento con el esquema de información pero eliminando las creaciones de tablas temporales por consultas en el esquema de información.

El Capítulo 14 de la documentación profundiza en esto, la url proporcionada a continuación le ayudará a encontrar más información y las futuras publicaciones de blog podrían tocar más sobre esto.
El diccionario de datos mencionado anteriormente también conduce a la capacidad de tener sentencias atómicas del lenguaje de definición de datos (DDL) o DDL atómico.


Es probable que se pierdan algunas transacciones si no revisa sus consultas antes de configurar la replicación en una nueva instancia de MySQL 8.0. Lo digo por la forma en que el manejo del mantenimiento de la mesa podría verse afectado. Si escribe consultas claras con "Si existe", no será un gran problema. En general, es una función más basada en transacciones que protege sus datos y las opciones de reversión.


La administración de recursos se ve muy interesante y tendré que dedicar más tiempo para enfocarme en esto, ya que es una característica nueva con MySQL 8.0. En general, puede asignar grupos y ya no tiene que establecer la prioridad de la consulta, pero deje que su agrupación defina cómo se debe comportar una consulta y qué recursos se le asignan.

mysql> select @@version;
+------------+
| @@ versión |
+ ------------ +
| 5.7.16-log |
+ ------------ +
1 fila en el set (0.00 seg)

mysql> desc INFORMATION_SCHEMA.RESOURCE_GROUPS;
ERROR 1109 (42S02): tabla desconocida 'RESOURCE_GROUPS' en information_schema

mysql> seleccionar @@ versión;
+ -------------- +
| @@ versión |
+ -------------- +
| 8.0.4-rc-log |
+ -------------- +
1 fila en el set (0.00 seg)

mysql> desc INFORMATION_SCHEMA.RESOURCE_GROUPS;
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
| Campo | Tipo | Nulo | Clave | Predeterminado | Extra |
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
| RESOURCE_GROUP_NAME | varchar (64) | NO | | NULL | |
| RESOURCE_GROUP_TYPE | enum ('SISTEMA', 'USUARIO') | NO | | NULL | |
| RESOURCE_GROUP_ENABLED | tinyint (1) | NO | | NULL | |
| VCPU_IDS | blob | SÍ | | NULL | |
| THREAD_PRIORITY | int (11) | NO | | NULL | |
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
5 filas en el set (0.00 seg)


Más información sobre su caché de grupo de búfer InnoDB en lo que respecta a los índices que están en él ahora está disponible.

mysql> desc INFORMATION_SCHEMA.INNODB_CACHED_INDEXES ;
+----------------+---------------------+------+-----+---------+-------+
| Campo | Tipo | Nulo | Clave | Predeterminado | Extra |
+ ---------------- + --------------------- + ------ + --- - + --------- + ------- +
| SPACE_ID | int (11) sin firmar | NO | | | |
| INDEX_ID | bigint (21) sin firmar | NO | | | |
| N_CACHED_PAGES | bigint (21) sin firmar | NO | | | |
+ ---------------- + --------------------- + ------ + --- - + --------- + ------- +
3 filas en el set (0.01 seg)


Si no está seguro de qué configurar InnoDB Buffer pool, log_sizes o flush method, MySQL los configurará ahora basándose en la memoria disponible.

innodb_dedicated_server

[mysqld]
innodb-dedicated-server=1

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

Esta simple prueba establece mi innodb_buffer_pool_size a 6GB por ejemplo cuando el valor predeterminado es 128MB.

Numerosas adiciones JSON se han realizado, así como los cambios de expresiones regulares. Ambos parecen prometedores.

La única mejora de replicación según esta versión es que ahora es compatible con el registro binario de actualizaciones parciales en documentos JSON utilizando un formato binario compacto.

Sin embargo, en general, hay muchas funciones disponibles (puede leerlas todas aquí ), una de las cuales (desearía que mi cliente la tuviera mañana) es la de los usuarios que realizan la replicación por canal.
Mi instancia de prueba ya tenía habilitados los registros binarios, pero ahora están activados por defecto junto con TABLE y la información de maestro y esclavo basada en archivos (gran fan de tener esa transacción basada de manera predeterminada)

En general, tenga en cuenta que esto es solo una primera ojeada a este lanzamiento y pensamientos de muy alto nivel, existen muchos otros cambios. Revisar otras publicaciones de blog sobre este lanzamiento, así como el manual y las notas de la versióntambién lo ayudará. Ciertamente descargue y revise, ya que parece ser muy prometedor para los puntos de vista de administración, seguridad y replicación.

miércoles, 14 de marzo de 2018

Hoja de trucos de MySQL

Así que primero publiqué en algún momento como sentía que debería estar. He estado muy ocupado trabajando con MySQL y todos los relacionados y no he podido publicar blogs como creía que debería. Entonces voy a trabajar en eso.

Ahora dicho esto, recordé el otro día un sitio web que solía amar porque era una lista común de hojas de referencia VI. La sintaxis que conoces, sabes que la necesitas, pero escríbela 3 veces hasta que esté bien. Cuando se ingresa bien lo miras atónito, pensé que ya lo había escrito.

Así que pensé por qué no una simple lista de comandos comunes de MySQL que todos escribimos 50 veces al mes o deberíamos saber como la palma de nuestra mano, pero olvidamos cuando el cliente está mirando por encima del hombro.
Para principiantes..
Configuramos un nuevo servidor MySQL 5.7.6+ e iniciamos sesión.
Necesitamos cambiar la contraseña antes de que podamos hacer algo. Pero es Alter usuario no Set pase.
Queremos saber cómo leer la contraseña como está en texto claro.

ALTERAR AL USUARIO
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass'; 
Establecer contraseña es
SET PASSWORD FOR 'bob''@'localhost' = PASSWORD('cleartext password'); 

Purgar registros binarios
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 

Desactiva las teclas foráneas por un momento
SET GLOBAL foreign_key_checks=0; 



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


Opiniones de BinLog
--base64-output = DECODE-ROWS & --verbose
mysqlbinlog --defaults-file=/home/anothermysqldba/.my.cnf --base64-output=DECODE-ROWS --verbose binlog.005862 > 005862.sql

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

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

SI EL ESQUEMA DE LA INFORMACIÓN ES LENTO
set global innodb_stats_on_metadata=0; 

Variables de AWS
CALL mysql.rds_show_configuration;
> call mysql.rds_set_configuration('binlog retention hours', 24);
> call mysql.rds_set_configuration('slow_launch_time', 2);

Encuentra en qué tabla se encuentra el nombre de una columna
SELECT TABLE_SCHEMA , TABLE_NAME , COLUMN_NAME FROM information_schema.COLUMNS WHERE COLUMN_NAME = 'fieldname' ; 
El cliente dice que está en TableA pero tienen 50 bases de datos ... ¿Qué esquema tiene TableA?
SELECT TABLE_SCHEMA , TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = 'TableA' ; 

Ajustar los trabajadores esclavos
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 
Solo tablas del sistema de actualización de MySQL
mysql_upgrade --defaults-file=/home/ anothermysqldba /.my.cnf --upgrade-system-tables 

OMITIR ERROR DE REPLICACIÓN
STOP SLAVE; SET GLOBAL sql_slave_skip_counter =1; START SLAVE; SELECT SLEEP(1); SHOW SLAVE STATUS\G 

sábado, 14 de octubre de 2017

MySQL InnoDB Tablespace Encryption

MySQL Tablespace Encryption es relativamente simple de configurar. Tienes que estar usando MySQL 5.7, innodb_file_per_table 


La documentación de MySQL cubre todo lo que necesita para configurarlo: 


Pero mi publicación en el blog sería muy breve si solo compartiera un enlace. Asi que.... 

Una vez actualizado y en MySQL 5.7, debe tener una ubicación válida para su archivo de claves. Tengo un datadir de MySQL como / var / lib / mysql / data, esto permite ubicaciones predeterminadas para que la gente lo encuentre si es necesario, pero también permite una ubicación montada simple para más discos si es necesario también. Esto también evita tener que hacer ediciones adicionales para selinux y etc, ya que permite / var / lib / mysql. 

toque / var / lib / mysql / keyring 
chmod 750 / var / lib / mysql / keyring * 
Chown mysql: mysql / var / lib / mysql / keyring 

Edite el archivo mysql .cnf: 

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

[mysqld] 
# Instalación del complemento de Keyring 
early-plugin-load = keyring_file.so 
keyring_file_data = / var / lib / mysql / keyring 

Después del inicio de MySQL, verifique los complementos: 

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS 
-> FROM INFORMATION_SCHEMA.PLUGINS 
-> DONDE PLUGIN_NAME ME GUSTA 'keyring%'; 
+ -------------- + --------------- + 
| PLUGIN_NAME | PLUGIN_STATUS | 
+ -------------- + --------------- + 
| keyring_file | ACTIVO | 
| keyring_udf | ACTIVO | 
+ -------------- + --------------- + 


INSTALE PLUGIN keyring_udf SONAME 'keyring_udf.so'; 
CREATE FUNCTION keyring_key_generate DEVOLUCIONES INTEGER SONAME 'keyring_udf.so'; 
CREATE FUNCTION keyring_key_fetch DEVOLUCIONES STRING SONAME 'keyring_udf.so'; 
CREAR FUNCTION keyring_key_length_fetch DEVOLUCIONES INTEGER SONAME 'keyring_udf.so'; 
CREATE FUNCTION keyring_key_type_fetch DEVOLUCIONES STRING SONAME 'keyring_udf.so'; 
CREAR FUNCTION keyring_key_store DEVOLUCIONES INTEGER SONAME 'keyring_udf.so'; 
CREAR FUNCTION keyring_key_remove DEVOLUCIONES INTEGER SONAME 'keyring_udf.so'; 


mysql> usar prueba; 
mysql> SELECT keyring_key_generate ('MyKey1', 'AES', 32); 

mysql> CREATE TABLE `enc_test` ( 
`enc_test_id` varchar (255) NOT NULL, 
LLAVE PRIMARIA (`enc_test_id`) 
) ENGINE = InnoDB; 

mysql> alter table test.enc_test encryption = 'Y'; 

mysql> mostrar crear tabla enc_test \ G 
*************************** 1. fila ******************** ******* 
Tabla: enc_test 
Crear tabla: CREATE TABLE `enc_test` ( 
`enc_test_id` varchar (255) NOT NULL, 
LLAVE PRIMARIA (`enc_test_id`) 
) ENGINE = InnoDB CHARSET POR DEFECTO = latin1 ENCRYPTION = 'Y' 
1 fila en el set (0.00 seg)