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