Crear una Base de Datos MySQL remota para optimizar el rendimiento del sitio WordPress.

Cuando el sitio comienza a tener más tráfico tenemos que comenzar a pensar en como poder manejarlo. Lo más sencillo y lo que recomiendo es sacar la base de datos del servidor, en especial debido a que Mysql al no tener recursos suficientes simplemente deja de funcionar. Esto logra que cada servidor maneje su propia carga, además de ser el primer paso para tener un sitio con balanceador de carga.

En mi caso particular lancé un nuevo eCommerce con Woocommerce / WordPress en el cual no separé desde un inicio la BdD de datos debido a que pensé que el sitio tendría menos tráfico y carga asociada, me equivoqué, lo que es realmente bueno.

Sin embargo no puedo dejar que el eCommerce se caiga cada vez que tenga mucho tráfico, no sería muy agradable perder ventas por esto.

Este minitutorial está alojado en digital ocean, la verdad lo he probado hace un tiempo y funciona bastante bien. Sin embargo  se puede extrapolar para cualquier servidor linux, en mi caso Ububtu 14.04.

Entonces, lo que haremos :

  1. Crear un nuevo servidor ( Droplet ) al cual le instalaremos una base de datos Mysql.
  2. Instalar la base de datos Mysql.
  3. Configurar la BdD en modo seguro/ Producción.
  4. Crear un usuario / password para el acceso del sitio wordpress.
  5. ( Opcional ) – Configurar el firewall del servidor.

Creando el nuevo droplet

Esto ya es bastante sencillo, simplemente vamos a el panel de administración de Digital Ocean y hacemos click en crear un nuevo droplet. Asegurate que el servidor quede en el mismo datacenter donde se encuentra tu máquiba virtual que aloja tu servidor wordpress, de no ser así funcionará pero no a la velocidad esperada para nuestro sitio.

Digital Ocean Create Droplet
Digital Ocean Create Droplet

Por ahora el servidor MySQL no necesita ser más potente que la versión más sencilla, de ser necesario en un futuro simplemente hacemos el upgrade, pero recomiendo usar un caché en el servidor de wordpress.

Instalando Mysql

Ya teniendo nuestra máquina recién horneada, accedemos a ella para instalar el servidor mysql.

sudo apt-get install mysql-server

Debido a que estaremos en un servidor de producción, recomiendo poner una contraseña segura para el usuario root y solo acceder a él desde la máquina local y ninguna remota. Si es paranoia, aún no me ha pasado nada pero no esperaré a que me pase.

Ya teniendo el servicio de mysql andando, ahora simplemente ejecutemos un script que simplemente elimina las posibles vulnerabilidades de seguridad que tiene mysql en servidores de desarrollo.

sudo mysql_secure_installation

Ya que estamos acá, para probar que todo funciona accederemos a La bdD por consola y crearemos la base de datos para wordpress.

# mysql -u root -pMICLAVESINESPACIODESPUESDELAP

Ya habiendo ingresado la creamos.

mysql> create database wordpress;
 Query OK, 1 row affected (0.00 sec)

Configurando el acceso remoto.

Antes que todo, le debemos decir a Mysql cual es su IP, así que procedemos a editar el archivo:

sudo vim /etc/mysql/my.cnf

Y buscamos donde dice bind-address y lo cambiamos por nuestro IP :

bind-address        = TUIP

Si tu IP es pública, va esa. Si tienes una red interna, usas el IP de la red interna.

Ahora reiniciamos el servicio para ver que todo funcione bien.

sudo service mysql restart

Generando las credendiales para WordPress

Ya tenemos el servidor virtual, mysql instalado, y la capacidad de ser accedido de manera remota, lo que nos falta es un usuario que pueda acceder de manera  por este medio.  Recordar que ya creamos la BdD llamada wordpress en un punto anterior.

Creemos el usuario y le damos los accesos necesarios a nuestra base de datos para que wordpress pueda funcionar de manera correcta :

CREATE USER 'MIUSUARIO'@'localhost' IDENTIFIED BY 'MICLAVE';
CREATE USER 'MIUSUARIO'@'%' IDENTIFIED BY 'MICLAVE';
GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'MIUSUARIO'@'localhost';
GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'MIUSUARIO'@'%';

Con lo anterior creamos tanto el usuario remoto como el local. No olvides modificar la nueva información en el archivo de configuración de wordpress para que los cambios funcionen.

Asegurando el servidor

Si notaron, en este momento cualquier IP puede acceder a nuestro servidor. Dependiendo de la configuración esto puedo ser bueno o malo, si bien esto se puede bloquear directamente desde la configruación de acceso a mysql, lo que haremos es configurar el firewall para solo aceptar el tráfico de los IPs que nosotros permitamos.

Asumiendo que tenemos UFW ( Uncomplicated Firewall ) ya instalado, simplemente agregamos la siguiente regla :

# sudo ufw allow from MYIP to any port 3306

Lo que hace es que le permite acceder al puerto 3306 a la IP dada. Si no lo tienes instalado revisa este blog bost : Firewall usando UFW en un servidor Ubuntu / Debian.

Además recomiendo bloquear todas las conexiones que no estén permitidas. ( No hagas esto si no haz agregado ssh a la lista de permitidos ).

# sudo ufw default deny incoming

Y eso sería todo :D.

 

Origen: How To Set Up a Remote Database to Optimize Site Performance with MySQL | DigitalOcean

Encontrar filas repetidas en Mysql

Mysql es una base de datos relacional, por lo que en general usamos relaciones (Dah !) que tienen que ser únicas a través de llaves primarias y foráneas. A veces nos pasan información que incluir en una tabla de manera directa que no necesariamente viene bien filtrada.

Cómo uno de nuestros fuertes en la empresa son los regalos corporativos, y dentro de ellos están los regalos de fin de año, muchas veces dependemos que las empresas con las cuales trabajamos nos manden la lista de empleados. En general esta información es entregada en un Excel o un CSV que puede tener datos repetidos que debemos filtrar.

Antiguamente para este objeto de encontrar filas repetidas realizaba un join de la tabla consigo misma, pero descubrí un método mucho más sencillo y menos tedioso.

SELECT * FROM `Empleados` group by `RUT` having count(*) >= 2 

De esta manera también podemos eliminar de la lista automáticamente los que estén repetidos.

Como no podemos actualizar una tabla en base a la misma, creamos una tabla temporal con estos datos.

CREATE TABLE temporal AS
SELECT `RUT` FROM `Empleados` group by `RUT` having count(*) >= 2

Ahora simplemente eliminamos los datos repetidos que aparecen en nuestra nueva tabla.

DELETE FROM `Empleados` 
WHERE `RUT` in (
    SELECT `RUT` from temporal
)
limit 1

Si bien el código anterior simplemente borra un solo registro, se entiende la idea. Ojo, si ejecutas nuevamente la sentencia existe la posibilidad que borres nuevamente el mismo registro que ya no estará repetido.

MysqlPasswordReset – Cambiar la clave root de Mysql

Acabo de crear un servidor WordPress con on click deployment de Google y tuve el problema que la clave que me dieron de mysql para root no correspondía a la real.

El error que obtenía era el siguiente :

ERROR 1045: Access denied for user: 'root@localhost' (Using 
password: YES)

Estos son simples pasos para cambiar la clave root de Mysql bajo un servidor linux si es que posees el error anteriormente mencionado.

¿ Que es lo que haremos ? :

  1. Detendremos el Servidor MySql.
  2. Lo iniciaremos sin que cargue los privilegios de los usuarios.
  3. Cambiamos la clave

Si tienes algún error un poco más complejo, o tu error corresponde a que necesitas agregar permisos para acceder fuera de localhost te recomiendo que veas el artículo que aparece al final.

Detenemos el servidor MySql

sudo /etc/init.d/mysql stop

Iniciamos el Servidor MySql sin los privilegios de usuarios. En este caso además por seguridad se impide las conexiones por red.

sudo /usr/sbin/mysqld --skip-grant-tables --skip-networking &

Ingresamos al servidor con el usuario root.

 mysql -u root

Con el siguiente comando seremos capaces de cambiar cualquier clave.

FLUSH PRIVILEGES;

Cambiamos la clave para el usuario root. Por si no lo habías notado puedes cambiar «password» por la clave que quieras… sin las comillas!

SET PASSWORD FOR root@'localhost' = PASSWORD('password');

Una vez que recibimos el mensaje de éxito, nuevamente limpiamos los privilegios.

FLUSH PRIVILEGES;

Detenemos el servidor MySql y lo iniciamos de manera normal nuevamente

sudo /etc/init.d/mysql stop
sudo /etc/init.d/mysql start

En este punto ya deberíamos ser capaces de ingresar a neustro servidor mysql sin problemas.

Origen: MysqlPasswordReset – Community Help Wiki

Obtener los email de los comentarios de un post en wordpress

A veces es necesario obtener los email de la gente que ha comentado en un post para mandarle alguna información que podría ser importante. Si bien no existe una forma directa de hacerlo, mysql viene a salvarnos el día. SELECT comment_author_email FROM gr_comments WHERE comment_post_ID = 825 GROUP BY comment_author_email; En mi caso gr_comments corresponde … Leer más