Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas

jueves, 10 de enero de 2019

Instalación y Modificación de password para usuario root en MySQL 5.7 en Linux Centos 7

El día de ayer 09 d enero de 2019 me tope con un servidor Centos 7, al cual deseaba instalar mysql en su versión 5.7, que es lo que estaba trabajando localmente, para ello realicé los siguientes pasos.

Instalar MySQL 5.7 en linux Centos 7

1) Tener acceso como root
2) Actualizar tu sistema operativo con el comando:

sudo yum update
3) Descarga los repositorios de MySQL 5.7 (se descarga el archivo rpm)


wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
4) Ahora debemos preparar el repositorio para luego poder instalar paquetes MySQL ya que Centos 7 trabaja normalmente con mariadb.


sudo rpm -Uvh mysql57-community-release-el7-9.noarch.rpm
Deberías ver una respuesta de la consola de comandos de la siguiente forma:



5) Ahora instalaremos el paquete rpm instalado

sudo yum install mysql-server
5.1) Recibirás una lista de paquetes y se te pedirá confirmación para descargarlos. Escribe y presiona ENTER.




6) Ahora debemos iniciar MySQL, para ello escribimos la sentencia


sudo systemctl start mysqld
7) Verificar que MySQL está corriendo en nuestro Centos


sudo systemctl status mysqld


password para usuario root de MySQL

Lo primero que debemos preguntarnos es, que es lo nuevo que trae Linux Centos 7 y MySQL 5.7 

1) Centos en su versión 7 incorpora systemd (Sistema y administrador de servicios para linux), esto afecta directamente a lo que conocíamos normalmente como script mysql_safe, pues este script ya no viene para poder cambiar el password, por lo que tendremos que gestionar mysql desde systemd.

2) También la versión 5.7 ya no cuenta con el campo password en su tablas usuarios, ahora se llama authentication_string

Cambiando el password del usuario root

3) Ahora debemos seguir esta serie de pasos uno a uno
  1. systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
  2. systemctl restart mysqld
  3. mysql -u root mysql
  4. update user set authentication_string=PASSWORD('NUEVO_PASSWORD') where user='root';
  5. flush privileges;
  6. exit;
  7. systemctl unset-environment MYSQLD_OPTS
  8. systemctl restart mysqld

Listo!, con esto hemos concluido de cambiar el password del usuario root de MySQL v5.7

Espero les haya ayudado.


Fuentes de información

Instalación MySQL 5.7 en Centos 7 
https://www.hostinger.es/tutoriales/instalar-mysql-centos-7/#gref

Modificación del password de root
http://scriptinside.blogspot.com/2015/11/centos-7-reset-root-password-mysql-57.html

martes, 18 de octubre de 2016

Ubuntu 16.4 - No se pudo bloquear /var/lib/apt/lists/lock – open (11 Recurso temporalmente no disponible)

Hola amigos,

Justo tuve otro problema al intentar instalar apache, php, mysql entre otros programas, siempre me salía el mismo error:

No se pudo bloquear /var/lib/apt/lists/lock – open (11 Recurso temporalmente no disponible)

Bueno les traigo la solución la cual es muy sencilla, lo único que deben hacer es: 

sudo apt-get update
sudo rm /var/lib/apt/lists/lock

Y listo, con esto sería suficiente para que puedan seguir instalando sin problemas.

Hasta la proxima, su amigo Carlos Zacarías

martes, 26 de enero de 2016

Aceleramiento de consultas en bases de datos MySQL

Hoy les traigo un pequeño aporte de aceleramiento de consultas en bases de datos MySQL. En realidad recién estoy entrando en este campo de optimización, porque nunca había tenido la necesidad de realizar este tipo de procesos pero siempre hay una primera vez.

Bueno les voy a dar como ejemplo mi caso en un proyecto que he estado trabajando con el lenguaje de programación PHP, tenía los siguientes bucles anidados:

$listaEmpresaPartida = $this->gEmpresaPartida->listarEmpresaPartidaSinDetalle();
for($i = 0; $i < sizeOf($listaEmpresaPartida); $i++) {
        $idEmpresaPartida = $listaEmpresaPartida[$i][0];
        $partida = $listaEmpresaPartida[$i][1];
        $empresa = $listaEmpresaPartida[$i][2];
        $fechaInicio = $listaEmpresaPartida[$i][3];
        $fechaFin = $listaEmpresaPartida[$i][4];
        
        $detalleSinRelacion = $this->gDetalle->listarDetalleSinRelacionPorPartidaEmpresaFechaInicioFechaFin($partida, $empresa, $fechaInicio, $fechaFin);
        for($j = 0; $j < sizeOf($detalleSinRelacion); $j++) {
          $fob = $detalleSinRelacion->getFob();
          $cantidad = $detalleSinRelacion->getCantidad();
          $fecha = $detalleSinRelacion->getFecha();
          $tipo = $detalleSinRelacion->getTipo();
          
          //Esto lo hago para no repetir registros en la base de datos
          if(!$this->gDetalle->existePorIdEmpresaPartidaFechaTipo($idEmpresaPartida, $fob, $cantidad, $fecha, $tipo)) { 

...
...
...

Si se fijan trabajo con clases y siempre obtengo arrays de objetos los cuales recorro con bucles for. Bueno vamos contándoles que había detrás.

Contaba con una base de datos de apenas 10 tablas pero 4 tablas contaban con más de medio millón de registros los cuales tenía que consultar y sacar un reporte que me había solicitado mi cliente en excel.

La configuración de mis 10 tablas al comienzo eran InnoDB y mi motor de BD estaba configurado de forma básica.

El pedazo de código que ven arriba para sacar un reporte en excel demoraba en sacar los datos cerca de 40 a 45 minutos, claro como les recuerdo estaba consultando cerca de 2 millones de datos.

Pasos que he seguido para optimizar

1) Configurar mi motor de base de datos, aumentando cache, utilización de memoria entre otros, busquen en Google y te dan varios ejemplos de como configurar tu servidor MySQL.

2) Las 4 tablas (las que cuentan con una gran cantidad de registros) las he pasado de InnoDB a MyISAM, y las relaciones las trabajo por código.

3) Crear índices de los campos que consulto frecuentemente en las consultas (este paso redujo notablemente el tiempo).

Estimados he logrado que mi algoritmo de 45 minutos aproximadamente se reduzca a 6 minutos aproximadamente.

Espero les sirva estos pequeños consejos, su amigo Carlos Zacarías.

martes, 22 de octubre de 2013

Transacciones y Niveles de Aislamiento en MySQL

Hola a todos, está vez he decidido postear algo respecto a transacciones en MySQL, para muchos un tema conocido pero para otros no. Este post intentará despejar algunas dudas.

¿Qué es una transacción?
Son un conjunto de órdenes que se ejecutan en un sistema de gestión de base de datos (MySQL, SQL Server, Oracle, PostgreSQL) formando una unidad de trabajo (a esto se le llama atomicidad)

MySQL (SGDB) es transaccional, porque es capaz de mantener la integridad de los datos, haciendo que las transacciones no finalicen en un estado intermedio. Es por ello que se le atribuye el acrónimo ACID.

Si por alguna causa el sistema debe cancelar la transacción, empieza a deshacer las órdenes ejecutadas hasta dejar la base de datos en su estado inicial (llamado punto de integridad).

ACID:
  • Atomicidad: se entiende que una transacción no es divisible, o sea, que deben ejecutarse todas las instrucciones de una transacción como una unidad lógica de trabajo e indivisible, en caso de que alguna falle no se ejecuta ninguna. 
  • Coherencia: significa que sólo datos válidos pueden ser grabados en la base de datos. Si se ejecuta una transacción que compromete la coherencia interna de la base de datos, toda la transacción debe cancelarse. 
  • Aislamiento: las transacciones que tengan lugar simultáneamente deben ejecutarse aisladas unas de otras hasta que finalizan. 
  • Durabilidad: la garantía de que una transacción una vez confirmada no podrá ser desecha.

Causas posibles para que una transacción falle.
  • Falla del hardware o software.
  • Alta concurrencia a una base de datos.
  • Algunas ejecuciones paralelas pueden intercalarse de manera que pueden dejar a la base de datos en un estado inconsistente.
  • Falla del sistemas operativo.
  • Falla de energía eléctrica.
  • Falla en el software de base de datos.
  • Etc.

NOTA: Para sacarle mayor provecho a este post debemos ver algunos conceptos importantes como son: serialización y atomicidad.


Serialización 
Antes pondré un ejemplo que nos va a ayudar a clarificar este concepto.

Ejemplo: Supongamos que en un sistema de inscripción de cursos, el curso Matemática le queda una sola vacante y dos alumnos desean llevar ese curso. Cuando los dos alumnos entran al sistema, se pueden ver los siguientes procesos:
  • El sistema buscará aquellos cursos que si puede llevar el alumno y tenga vacante disponible.
  • El alumno elige el curso Matemática.
  • El sistema asigna el curso Matemática al alumno que lo ha elegido.
Es posible que ambos alumnos hayan elegido el mismo curso y el sistema se los haya podido asignar dejando a la base de datos en un estado indeseable.

Entonces la serialización consiste en:
  1. El estado de la base de datos debe quedar como si una operación fue realizada primero y otra después (a esto se le llama ejecución serializable).
  2. Si una ejecución es serializable, nunca se le asignará a los dos alumnos el curso cuya limitante es la vacante.
  3. Se debe tener en cuenta que no se desea que un proceso se lleve uno detrás de otro, pero si se necesita que el resultado sea serializable.
Atomicidad
Colocaré un ejemplo clásico que nos ayudará a ver con mayor claridad este concepto.

Ejemplo: En una aplicación un proceso de transferir fondos entre dos cuentas A1 y A2: 
  • Verificar que A1 tenga suficiente dinero. 
  • Aumenta el saldo de A2. 
  • Disminuye el saldo de A1. 
Supongamos que el sistema falla antes de ejecutar la tercera tarea, lo que genera que la base de datos se encuentre en un estado indeseable.

Entonces la atomicidad consiste en que que todas las operaciones se ejecuten o que ninguna lo haga.

Pregunta: --> ¿El uso de transacciones resuelve los problemas de atomicidad y serialización?

Rpta: "SI", porque una transacción está compuesta por un grupo de instrucciones SQL que se ejecutan atómicamente (se ejecutan todas o ninguna de ellas) y además se les exige ejecuciones serializables.

Partes de una transacción
  1. Toda transacción comienza con la sentencia begin. Esta sentencia indica a la base de datos que se prepare porque vienen un conjuntos de instrucciones SQL que la modificaran.
  2. Ejecución y validación del conjunto de sentencias SQL que modificarán la base de datos.
  3. Aquí existen dos posibilidades
    • Si todo estuvo OK, entonces se debe ejecutar la instrucción commit la cual hace que la transacción termine de forma exitosa y hace permanente cualquier cambio realizado sobre la base de datos.
    • Si hubo algún problema, entonces se debe ejecutar la instrucción rollback la cual aborta la transacción y la hace terminar en forma no exitosa, cualquier cambio que la transacción pudo hacer a la BD se deshace.
Del ejemplo de transferencia de fondos entre cuenta entonces debería quedar algo así:
  1. begin
  2. La cuenta A1 no tiene suficientes fondos --> rollback
  3. Se aumenta el saldo de A2 al monto especificado.
  4. Se disminuye el saldo de A1 en el monto especificado.
  5. commit

Niveles de aislamiento en transacciones
SQL permite definir diferentes ciertos niveles de aislamiento para el tratamiento de las transacciones.
  • Serializable.
  • Read Commited.
  • Repeatable Read
  • Read Uncommited.
Para explicarlo mejor, nos basaremos de un ejemplo:

Ejemplo: 

  • El bar de Pepe vende dos tipos de cerveza Cristal y Pilsen a S/3.5 y S/4.0 respectivamente. 
  • Juan hace una consulta sobre la cerveza más barata y sobre la cerveza más cara.
  • Pepe al mismo tiempo que Juan hace la consulta modifica la base de datos, eliminando ambas marcas de cerveza pero ingresando una nueva marca Kunstman a S/5.0
  • Juan ejecuta las siguientes consultas

  • A estas consultas les llamaremos (max) y (min) respectivamente.
  • Por su parte Pepe ejecuta

  • A estas consultas les llamaremos (del) e (ins) respectivamente.
  • Supongamos que ambas consultas se ejecutan simultáneamente en la base de datos.
  • Lo único que podemos asegurar es que (max) se ejecutó antes que (min) y que (del) se ejecuto antes que (ins)
  • Muestro una imagen de una posible ejecución


  • Juan lee que el precio máximo es de la cerveza Pilsen a S/ 4.0 y lee como mínimo el precio de Kunstman a S/ 5.0


Nivel Serializable
Si Juan ejecuta sus instrucciones con una base de datos MySQL con un nivel de aislamiento serializable, entonces la base de datos responderá con datos antes o después de la ejecución de las instrucciones de Pepe pero nunca en el medio. Por lo tanto con esto nos aseguramos que un grupo de instrucciones se ejecuten antes y otro después.






Se le consideran como el nivel máximo de aislamiento y también genera el máximo nivel de bloqueos.




Nivel Read Commited (lecturas confirmadas)
Este nivel de aislamiento evita la lectura sucia de datos. Este nivel hace que SGBD lea y devuelva información que ha sido confirmada. 

Por ejemplo, Pepe ejecuta (del) e (ins) pero luego lo piensa, se arrepiente y hace rollback para deshacer los cambios.

Si Juan ejecuta su consulta después del (ins) y antes del rollback.



Juan lee el precio S/5.0 como máximo y mínimo, sin embargo S/5.0 es un dato que nunca existirá (lectura sucia). Este nivel evita este tipo de lecturas ya que nunca fue confirmada
Los problemas de este nivel son:
  • Lecturas no repetibles: dos sentencias SELECT iguales y consecutivas podrían devolver datos diferentes.
  • Datos fantasma: dos sentencias SELECT iguales y consecutivas podrían aparecer y desaparecer filas.
Otra posibilidad de lectura sucia es que si Pepe hace commit, Juan lea como máximo S/4.5 y como mínimo S/5.0 si las consultas se realizan de la siguiente forma.







Nivel Repeatable Read (lectura repetible)
Este nivel de aislamiento garantiza que dos consultas consecutivas diferentes dentro de una transacción devolverán información consistente.

Supongamos que Juan ejecuta sus consultas sobre una base de datos MySQL con nivel de aislamiento Repeatable Read y el orden de sus consultas es:



Durante las lecturas (max), Juan leyó S/3.5 y S/4.0, el SGBD debe asegurar que durante (min) se vean adicionalmente a S/5.0, los valores de S/3.5 y S/4.0 ya que estos fueron vistos en la lectura anterior, por lo que Juan verá datos consistentes: máximo precio es S/4.0 y el mínimo es S/3.5 aunque esto no refleje el estado actual de la base de datos.

El problema de este nivel son los datos fantasma: dos sentencias SELECT iguales y consecutivas podrían aparecer datos diferentes. 

Por ejemplo Juan intenta leer dos veces el precio máximo (max).



Si la consulta es ejecutada cuando la base de datos se encuentra con el nivel de aislamiento repeatable read se asegura que todo lo que lee en el primer (max) lo lee también en el segundo (max), sin embargo en un caso obtiene que el máximo es S/4.0 y luego S/5.0.



Nivel Read Uncommited (lectura no confirmada)
Este nivel es el menos aconsejable para muchas casuísticas, pero ojo no quiera decir que para otra sirva.

Los problemas de este nivel es que permite: lecturas sucias, lecturas no repetibles y lecturas fantasmas.



Espero les haya servido mucho esta entrada.


(Fuente principal: Sr. Jorge Pérez Rojas - Universidad de Talca año 2006)

Seguidores