Entradas

Mostrando las entradas etiquetadas como MySQL

Recuperar y migrar un WordPress comprometido

Hace unos días tuve que migrar un WordPress a un servidor nuevo después de que el anterior quedara comprometido. Cuando llegas a un punto en el que faltan binarios del sistema, hay procesos extraños o cron jobs que no reconoces, seguir intentando limpiar la máquina deja de tener sentido. En estos casos prefiero recuperar los datos necesarios y reconstruir el servidor desde cero. Este fue exactamente el proceso que seguí. 1. Recuperar el WordPress del servidor antiguo Lo primero fue sacar la carpeta completa del WordPress. En mi caso estaba en: /var/www/html/wordpress Desde mi máquina local ejecuté: scp -r root@<server_ip>:/var/www/html/wordpress . Con esto copié todo el código del sitio a mi máquina local. 2. Recuperar la base de datos Para identificar la base de datos revisé el  wp-config.php : grep DB_ wordpress/wp-config.php Una vez identificado el nombre de la base de datos y el usuario, generé el dump. mysqldump --no-tablespaces -u wordpress_user -p wordpress_db > /ro...

PHP en Google compute engine + cloud sql

Imagen
Hoy en día los servicios en la nube son una clara alternativa a la hora de alojar un sitio web, ya no es necesario un servidor dedicado con las prestaciones y herramientas que ofrecen Google, Amazon o Azure. En el caso de Google existen alternativas más sencillas para alojar un sitio web que las de utilizar compute engine (una maquina virtual), me refiero a app engine, pero a mi parecer se pierde mucho control sobre las prestaciones que queramos tener. En este post pienso hablar de como instalar nginx con soporte para http2 y php 7.2 en una maquina virtual con CentOS 7, además de enseñar a configurarlo para utilizar una base de datos MySQL 5.7 almacenada en el servicio cloud SQL de Google. A la hora de sar de alta estos servicios es muy recomendable que esten en la misma zona geográfica, tanto la maquina virtual como la instancia de MySQL. Una vez creada nuestra instancia de maquina virtual instalaremos nginx y comprobaremos su configuración con: nginx -V nginx -t A...

Una semana con Docker en Windows

Imagen
Docker para Windows ha mejorado muchísimo, recuerdo que no hace tanto intenté probarlo y no pude porque utilizaba Virtual Box y yo ya tenía Hyper-V corriendo en mi máquina lo cual me hizo imposible la prueba. Ahora, por suerte, utiliza nativamente Hyper-V y además soporta los contenedores de Windows. Pero empecemos de cero. ¿Qué es un contenedor? Hay mil definiciones online pero en resumidas cuentas un contenedor es una especie de máquina virtual con muchas limitaciones pero grandes ventajas. Los contenedores se basan en imágenes de software que parten de una imagen base y sobre la cual heredan sus características, al principio estas imágenes base solo estaban basadas en el núcleo de Linux pero con la llegada de los Server Core y Nano Core Microsoft también ha optado por crear sus imágenes base a partir de estas dos mini distribuciones de su sistema operativo. En resumen, son un entorno operativo aislado, con controlados recursos y portátil. ¿Qué es Docker? Docker no ...

Restaurando archivos ibd en tablas InnoDB

Imagen
Este post es una recopilación de la información más actual para para restaurar una base de datos MySQL a partir de los archivos de datos en entornos Windows. La versión de MySQL es la 5.7.11. ¿Por qué restaurar? En mi caso al cambiar de ordenador se me olvidó hacer una copia reciente de la base de datos con lo cual al instalarlo todo en el nuevo habría perdido un mes entero de trabajo, por fortuna disponía del disco duro anterior. ¿Qué necesitamos para restaurar la base de datos MySQL? Necesitamos un backup de la estructura de la base de datos (actualizada) o un backup completo en el que la estructura sea la correcta (si el backup es actual no necesitaríamos restaurar los datos desde los archivos, el problema es que la que tenía era un mes antigua). Lo siguiente son los archivos de datos, que en Windows se encuentran en la siguiente ruta: C:\ProgramData\MySQL\MySQL Server 5.7\Data\dbname. La carpeta ProgramData está oculta. En esta ubicación encontraremos va...

Instalar últimas versiones de nginx, php y mysql en CentOS 7

Imagen
Trabajar con las últimas versiones de software en sistemas como CentOS a veces suele ser difícil, sobre todo a la hora de encontrar repositorios que te permitan mantener el mismo nombre de paquetes y así poder actualizar los existentes. A día de hoy estas son las versiones que tengo instaladas, todas con los nombres de paquetes oficiales, nginx, php y mysql, (existen otros repositorios que te permiten instalar php 7 pero con un nombre diferente php70 o php70w según el repositorio que consultes): CentOS Linux release 7.2.1511 (Core) Server version: 5.7.10 MySQL Community Server (GPL) nginx version: nginx/1.9.9 PHP 7.0.1 (cli) (built: Dec 16 2015 15:23:56) ( NTS ) Repositorios necesarios Para instalar MySQL descargaremos el repositorio oficial de Oracle, desde que MySQL fue comprado por Oracle la comunidad de CentOS se ha decantado por MariaDB con lo cual no hay disponibles versiones para CentOS. rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el7-7...

Activar acceso remoto MySQL en CentOS 7

Luego de configurar MySQL 5.7 en CentOS 7 es posible que queramos acceder de manera remota para gestionar las bases de datos, no es recomendable permitir el acceso remoto a root pero si tal vez interese a un usuario específico dentro de IPs específicas. Lo primero que debemos habilitar es el puerto en el firewall, CentOS 7 ya no utiliza iptables sino firewall. Para habilitar el puerto debemos especificar para que zona lo queremos abrir. Consultamos las zonas con el siguiente comando: firewall-cmd --get-active-zones Esto nos debería devolver algo así: public   interfaces: eno16777984 Dónde interfaces lo podemos asociar a la ip con ifconfig. En este caso sólo tenemos una zona, public. firewall-cmd --zone=public --add-port=3306/tcp –permanent firewall-cmd –reload Una vez abierto el puerto ahora debemos configurar MySQL para que el usuario deseado acceda de manera remota: $ mysql -u root -p Enter password:    mysql> use mysql    my...

CentOS 7 reset root password MySQL 5.7

Si habéis llegado aquí estáis en el lugar correcto dónde podréis restaurar la contraseña de root en MySQL 5.7 . Internet está plagado de tutoriales dónde te indican cómo hacer esto pero ninguno está actualizado a las últimas versiones de CentOS y MySQL, además por todos es conocido que el soporte a MySQL por parte de la comunidad Open Source ha menguado desde su compra por Oracle. ¿Que cambia en CentOS 7 y MySQL 5.7? CentOS 7 incorpora systemd (Sistema y administrador de servicios para Linux, compatible con scripts de inicio SysV) y su herramienta de administración systemctl . ¿en que afecta esto? Pues que el script mysql_safe no está disponible (no se instala) en estos sistemas y hay que utilizar otras alternativas y gestionar mysql server community desde systemd . La tabla de usuarios en MySQL 5.7 ya no tiene campo password ahora es authentication_string. Restaurar contraseña root en MySQL 5.7 y CentOS 7 systemctl set-environment MYSQLD_OPTS="--skip-grant-...

MySQL server has gone away

Imagen
El error MySQL server has gone away es bastante común cuando intentamos restaurar nuestra base de datos en otra configuración o a veces cuando ejecutamos consultas que consumen demasiados recursos. Las dos razones más comunes (y sus posibles soluciones) para el error número 2006 son: El servidor agota el tiempo de espera y cierra la conexión EL tiempo de espera de MySQL se gestiona desde la la variable wait_timeout en el archivo de configuración my.cnf. Este valor admite un número entero que representa los segundos que el servidor esperará para terminar una operación. El servidor elimina paquetes incorrectos o demasiado grandes Si MySQL recibe un paquete que es demasiado grande o incorrecto, presupone que algo ha ido mal con el cliente y cierra la conexión. El tamaño de los paquetes que puede gestionar MySQL se puede aumentar gracias a la variable max_allowed_packet , también en el archivo my.cnf. El valor suele ser una cadena con el tamaño que es un número entero y la unidad d...

Convertir UTF8 a LATIN1 en MySQL

Imaginemos que tenemos una base de datos con una tabla codificada en UTF8 y otra base de datos codificada en LATIN1, ambas tablas las queremos unir en una consulta y la latin1 es la principal ¿cómo sacar los datos codificados en UTF8 en formato legible con LATIN1? CONVERT(CAST(CONVERT(campo_tabla USING latin1) AS binary) USING utf8) Espero que les valga.

Funciones actualizadas en PHP 5.5

Imagen
En un post anterior vimos las nuevas funcionalidades que PHP 5.5 introduce , en este vamos a ver cambios que se han hecho en funciones ya existentes como por ejemplo la combinación de foreach y list, las mejoras en la función empty, el comportamiento de unpack y la eliminaciones de funciones previamente deprecadas. Combinando foreach con list Como desarrollador, una de las tareas comunes que veo de forma regular es el uso de loops en un conjunto de resultados. Dependiendo de las circunstancias, es posible que tenga que asignar un grupo de variables a valores de propiedades o valores de una matriz. Hasta este momento ha sido un proceso manual, pero en PHP 5.5 es posible asignar estos valores directamente utilizando la función list. Esto me permite recorrer el vector y desempacar matrices anidadas en variables en un bucle. Solo hay una limitación, no puedo utilizar la lista como un elemento clave. Quedaría algo como este foreach($row as list($var1, $var2)). Comprobar cualquier cosa ...

Optimizando consultas en MySQL

Imagen
Hay un artículo muy bueno con 20 consejos para mejorar MySQL que recomiendo a todos leer antes de seguir con este post porque básicamente lo que haré será ampliar o rebatir alguno de los puntos del mismo. El primer punto que me gustaría modificar es el 5, indexar los campos para utilizarlos con consultas que utilicen JOIN. Básicamente lo que dice este punto es que los campos de unión entre tablas deben ser del mismo tipo y estar indexados, yo a eso añadiría que ambas tablas deben ser del tipo Innodb y ambos campos tener una relación entre ellos con una Foreign Key , así no solo garantizamos las premisas anteriores sino que se asegura la integridad de los datos en ambas tablas. Lo ideal para hacer uniones entre tablas es que uno de los campos sea una clave primaria y el otro una clave foránea que apunte a ella. En el punto 16, particionamiento vertical, no estoy del todo de acuerdo, partir una tabla por partirla y creer que esto mejorará el rendimiento porque tiene menos datos o men...

SQL Server vs MySQL

Imagen
Esto no es una comparativa a nivel profundo ni lo pretende ser, mi único objetivo es remarcar desde el punto de vista de un usuario básico las ventajas de uno u otro sistema a la hora de trabajar con ellos. No a la hora de instalarlos, configurarlos ni mantenerlos, solo a la hora de pedir datos almacenados en estos gestores de bases de datos. Por mi trabajo tengo que manejar ambos sistemas a partes iguales y muchas veces extraño cosas de uno en el otro y viceversa, aquí os dejo una pequeña comparativa desde mi punto de vista y basada en mi experiencia profesional, si alguien descubre algún error o una mejor forma de hacer las cosas estaría encantado de recibir un feedback. Cosas que agradezco de MySQL Me encantan las sintaxis ON DUPLICATE KEY e INSERT IGNORE, me parecen muy útiles a la hora de ejecutar consultas y gestionar errores. El uso de los índices de texto completo me parecen mucho más sencillo e intuitivo sobre todo con la integración de estos en tablas InnoDB desde las...

Obtener tags de videos con PHP

Imagen
Buscando alguna clase para PHP con la que pudiera obtener los tags de información de cualquier tipo de archivo multimedia (AVI, MP3) he descubierto una utilidad bastante interesante, no es una librería de PHP sino una herramienta externa con la cual podremos procesar cualquier archivo de video y obtener toda la información disponible del mismo. La herramienta se llama MediaInfo y es un programa ejecutable al que pasándole la ruta del archivo nos devuelve toda la información, la cual podemos analizar y utilizar solo los campos necesarios. Lo primero que debemos hacer es descargarnos la última versión de MediaInfo pero solo el cliente (esta explicación la haré para Windows pero utilizando el mismo procedimiento es totalmente compatible con Linux). Una vez descargado, descomprimimos el archivo ZIP y ubicamos los archivos en algún lugar de fácil acceso, en mi caso c:\Program Files\MediaInfoShell\. La sintaxis para obtener la información de un video es la siguiente: mediainfo.exe -...

Almacenar IPs en las bases de datos

Imagen
La mayoría de los usuarios cuando tienen que almacenar IPs en sus bases de datos los hacen con tipos de campos VARCHAR cuando es mucho más óptimo almacenarlos con un entero sin signo (en caso de MySQL) o BIG INT (en caso de SQL Server). Convertir IPs en MySQL Existen 2 funciones para ello inet_aton e inet_ntoa , la primera convierte la IP en un número y la segunda es el proceso contrario. Convertir IPs en SQL Server En SQL Server no hay funciones predefinidas para ello pero las podemos crear muy fácilmente, en el siguiente enlace hay un par de ejemplos muy buenos para convertir IPs a BIG INT en SQL Server y viceversa . Esta transformación también la podemos hacer al insertar los datos en el lenguaje de programación, en el caso de PHP sería ip2long y long2ip .

CPU does not support crc32 instructions

Imagen
Una de las cosas que me sorprendió al instalar MySQL 5.6.10 fue en el log de inicio ver la siguiente instrucción CPU does not support crc32 instructions ¿que son las instrucciones crc32 ? Es nueva instrucción que se utiliza para acelerar el cálculo de sumas de comprobación CRC32 . Esta instrucción es parte del conjunto SSE4.2, y al igual que la mayoría de las instrucciones SSE, es bastante inútil. ¿qué son las instrucciones SSE ? Son instrucciones que mejoras las posibilidades de nuestro procesador, dependiendo de la CPU de nuestro servidor tendrá unas u otras. Al parecer hasta MySQL 5.6.10 aparecía el texto CPU does not support crc32 instructions en algunos procesadores que si soportan esta instrucción, es un bug de MySQL que se ha corregido en MySQL 5.6.11. Cómo sabes si estamos utilizando estas instrucciones, muy sencillo, lo veremos en el log de mysql bajo el siguiente texto: Not using CPU crc32 instructions . ¿cómo saber si en efecto mi CPU no soporta las instrucciones SS...

Optimizando MySQL 5.6 innodb_flush_method

Imagen
El parámetro innodb_flush_method es el método que utilizará MySQL para vaciar los datos y logs que vaya recopilando durante su funcionamiento. Este post en realidad será una traducción del manual de MySQL y otras fuentes del inglés porque como se verá la configuración ideal es a base de prueba y error. Veamos un glosario de términos necesarios para entender este post fsync La función fsync () puede ser utilizada por una aplicación para indicar que todos los datos asociados  a archivos abiertos serán transferidos al dispositivo de almacenamiento asociado con el archivo descrito de una manera dependiente de la implementación del sitema. La función fsync no se detiene hasta que el sistema ha completado la acción o hasta que se detecta un error. La función fsync () obliga a todas las operaciones actuales en la cola de entrada / salida asociadas con un archivo a la sincronización. Todas las operaciones de E / S se realizan cuidando la integridad del archivo al finalizar el proces...

Optimizando MySQL 5.6 innodb_buffer_pool_size

Imagen
Uno de los parámetros de configuración que hablé en el artículo anterior era innodb_buffer_pool_size , como su nombre indica es el buffer de almacenamiento de innodb, mientras mayor sea este valor menores serán las lecturas y escrituras en el disco duro y por consiguiente mayor será la velocidad de las operaciones. Lo único malo es que este buffer va directamente a la memoria RAM con lo cual si es poca tenemos que ajustarnos. El valor por defecto en MySQL 5.6.10 son 100 MB y lo que se recomienda en un servidor dedicado es el 80 % de la memoria RAM, pero bueno siendo MySQL muy pocos utilizamos un servidor dedicado para ello casi siempre compartimos con apache y otros servicios con lo cual lo mejor es ir probando configuraciones hasta dar con la ideal, yo tengo 3 GB de RAM y por ahora he puesto un buffer de 700 MB y no he notado carga en el servidor pero si una mejoría increíble en el acceso a disco. Os dejo las gráficas. Veamos el comportamiento del buffer innodb, nótese el cambio dr...

Optimizando InnoDB en MySQL 5.6

Imagen
Realmente MySQL 5.6 no es la panacea, trae, según los desarrolladores, muchas mejoras en InnoDB, yo a simple vista no he podido observar ninguna salvo una ligera mejora en la velocidad, aún no he probado el FULL TEXT INDEX. Lo que si se nota nada más actualizar MySQL es el aumento exponencial de los ficheros asociados a innodb, fundamentalmente el fichero ibdata. Mysql guarda las tablas en un fichero denominado ibdata1, y aunque trunques las tablas y las vacíes, este fichero no decrece. Lo recomendable cuando instalas MySQL 5.6 (o actualizas a esta versión) es hacer un backup de cada tabla (así es más fácil la restauración en caso de error), borrar todas las tablas y las carpetas asociadas en /var/lib/mysql (salvo la de mysql), borrar los archivos de log de innodb (ib_logfile0 y ib_logfile1) y el archivo ibdata1. Una vez hemos hecho esto modificamos nuestro archivo my.cnf ubicado en /etc/ y ponemos las siguientes líneas: innodb_autoinc_lock_mode=0 innodb_file_per_table=1 innodb_fl...

MySQL 5.6.11 error 1146

Al parece hay algún tipo de error en la instalación de algunas versiones de MySQL o en la actualización de algunas (a mi me ha pasado actualizando de la 5.6.10 a la 5.6.11), en el cual te pueden dar los siguientes errores: ERROR 1146 (42S02) at line 36: Table 'mysql.innodb_table_stats' doesn't exist ERROR 1146 (42S02) at line 45: Table 'mysql.innodb_index_stats' doesn't exist ERROR 1146 (42S02) at line 73: Table 'mysql.slave_relay_log_info' doesn't exist ERROR 1146 (42S02) at line 102: Table 'mysql.slave_master_info' doesn't exist ERROR 1146 (42S02) at line 120: Table 'mysql.slave_worker_info' doesn't exist Sin embargo si entras en un administrador de MySQL como SQLYog puedes ver que las tablas existen pero luego al intentar abrirlas te sale el error Error CODE: 1146 TABLE ‘mysql.innodb_table_stats’ doesn’t exist Esto ocurre al tener activada en nuestro my.cnf la opción innodb_file_per_table. Al parecer al actualizar MySQ...

MySQL 5.6 en CentOS 6 con PowerStack

Imagen
Todos los que trabajan con versiones estables y profesionales de Linux saben que la llegada de las últimas versiones de un determinado software casi nunca llegan con los repositorios oficiales, siempre es necesario utilizar repositorios de terceros que complementan o actualizan nuestro servidor. El trio apache + PHP + MySQL no está exento de este problema y si bien es cierto que para CentOS contábamos con los repositorios Remi estos últimamente están algo desfasados, sobre todo con apache y MySQL, fundamentalmente este último. Buscando un poco de información por internet he encontrado en foros oficiales que es muy probable que Remi deje de dar soporte a MySQL, esto fundamentalmente tras la compra de esta última por Oracle. Remi comenzaría a utilizar MariaDB, una base de datos de los fundadores de MySQL que muchos dicen que es mejor pero pocos han probado. Entonces ¿que hacer si queremos seguir teniendo las ultimas versiones de MySQL utilizando Yum, esta brillante herramienta de Cent...