jueves, 20 de agosto de 2015

Crear usuario con minimos privilegios para realizar respaldo de MySQL

Este post es complemento del script para realizar respaldos mediante archivos crontab. Pero se puede utilizar de forma manual para realizar los respaldos.

1. Iniciar mysql y crear usuario

$ sudo mysql -u usuario -p 
mysql> CREATE USER usuario_respaldo@localhost IDENTIFIED BY "MiClave";


2. Asignamos los privilegios

mysql> GRANT SELECT, SHOW VIEW, RELOAD, REPLICATION CLIENT, EVENT, TRIGGER ON *.* TO usuario_respaldo@localhost;

Algunos privilegios no estan disponibles en versiones anteriores de MySQL:
  • EVENT, este privilegio es requerido para crear, modificar, eliminar o ver eventos del EVENT SHEDULER. Este privilegio fue agregado en MySQL 5.1.6
  • TRIGGER, este privilegio habilita las operaciones de los disparadores. Este privilegio fue agregado en MySQL 5.1.6
  • REPLICATION_CLIENT, este privilegio habilita el uso de SHOW_MASTER_STATUS y SHOW_SLAVE_STATUS. En MySQL 5.1.6 y versiones superiores habilita ademas el uso de la sentencia SHOW_BINARY_LOGS

3. Agregamos el privilegio para bloquear las tablas

mysql> GRANT LOCK TABLES ON *.* TO usuario_respaldo@localhost;

4. Probamos el respaldo de una base de datos
 
Nos salimos de mysql y probamos el comando mysqldump

$ mysqldump -u usuario_respaldo -p --databases dbmibase > dbmibase.sql

Si todo fue correcto en nuestro directorio debe existir nuestro respaldo dbmibase.sql.

Script para generar respaldos MySQL mediante el CRON

Cuando tenemos varias bases de datos en nuestros servidor y ya por algun tiempo, es necesario contar con alguna herramienta que permita generar respaldos de forma automatica, con la finalidad de prevenir inconvenientes con la información que manejamos y poder recuperarnos de la eventualidad lo mas antes posible.

A continuación describiremos los pasos para poder generar nuestro script y asignarlos a las tareas automaticas de nuestro servidor.

1. Preparando todo

Generalmente el servicio de crond viene instalado por defecto en nuestro servidor y es el que se encarga de ejecutar programas, comandos o script en un horario determinado. Para saber el estado en el que se encuentra el servicio escriba la siguiente sentencia:

$ sudo service crond status

En caso de no contar con este servicio, sera necesario su instalación. Seguido sera necesario contar con una carpeta donde ingresaremos nuestros script, en mi caso dentro de la carpeta home

$ mkdir /home/miusuario/ejecutar

Creamos nuestra carpeta donde iremos guardando nuestros respaldos (lo ideal es contar con otro servidor donde tengamos estos respaldos)

$ mkdir /home/miusuario/respaldos

Para nuestro caso sera necesario contar con un usuario en MySQL que tenga los permisos suficientes para poder ejecutar los comando mysql y mysqldump, así como el permiso para generar los respaldos correspondientes a todas las bases de datos.

Verificamos que la fecha y hora de nuestro servidor sea la correcta para no tener algunos resultados no deseados,

$ date
mié ago 10 15:00:01 CDT 2015


y en caso de ser necesario definimos el horario correcto:

$ sudo date --set "2015-08-19 15:12:10"

Por ultimo, cuando ejecutemos el crond se ejecutara el editor por defecto, en la mayoría de los casos el editor vi es el que viene configurado, aquí dependerá de con cual se sienta uno más cómodo. En mi caso habilite el nano, he aquí la instrucción para habilitarlo momentáneamente:

$ sudo export EDITOR="nano"

Si deseamos que sea permanente habrá que agregarlo en el .bashrc o en el .bash_profile del usuario deseado.


2. Generamos nuestro script

Una vez que tenemos todo listo generamos nuestro script en la carpeta deseada (/home/miusuario/ejecutar):

$ nano /home/miusuario/ejecutar/respaldarMySQL.sh


#!/bin/bash

# Configurar variables de entorno
FECHA=`date +%d%m%Y-%H%M%S`
DIRECTORIO="/home/miusuario/respaldos"

# Obtener los nombres de las bases de datos
misbases=`mysql -uusuariomysql -pmiclave --skip-column-names -e'SHOW DATABASES'`

# Crear el respaldo de las bases de datos
for db in $misbases; do
    # Nombre del archivo de respaldo
    archivo="$db-$FECHA.sql.gz"
    if [ $db != "mysql" ] && [ $db != "information_schema" ]; then
        # Crear respaldo, comprimirlo
        # y si fue exitoso guardar una bitacora
        mysqldump -uusuariomysql -pmiclave --databases $db | gzip -9 > \
        $DIRECTORIO/$archivo && echo "Respaldo realizado con exito: \
        $archivo" >> $DIRECTORIO/bitacora.log
    fi

done

Nota: El caracter \ indica que la cadena continua con la linea inferior

Describiremos algunas lineas para que quede mas claro este script:

  • La variable FECHA guardara la fecha y hora actual, que se concatenara para formar el nombre del archivo. (%d%m%Y-%H%M%S => 19082015-100001)
  • DIRECTORIO sera la ruta donde guardaremos los respaldos
  • misbases obtendra todas las bases de datos de nuestro servidor
  • archivo tendra la concatenacion de la base de datos y la fecha y hora para formar el nombre de nuestro respaldo
  • el if verificara que no sean las bases mysql e information_schema, las cuales no respaldaremos
  • Ahora viene lo interesante:
    • mysqldump generara el respaldo de cada una de las bases de datos
    • el caracter | indica que una vez que se tenga el resultado de mysqldump sera como parametro del siguiente comando (gzip)
    • gzip realiza la compresion del respaldo de la bd y con el caracter > se indica que se guardara en el archivo $DIRECTORIO/$archivo, si no existe el archivo se crea uno nuevo y si existe reemplazara al anterior.
    • con el caracter && se indica que el siguiente comando se ejecutara solo si el anterior se ejecuto satisfactoriamente
    • Si se ejecuto correctamente el respaldo y la compresion, se guarda el registro de que todo fue un exito en el archivo bitacora.log, con el caracter >> se indica que si el archivo bitacora.log no existe se creara uno nuevo y si existe se agregara una nueva linea al final del archivo
    • Este proceso se realiza por cada una de las bases de datos
Para probar que funciona este script, simplemente lo ejecutamos y verificamos el resultado, no se olvide cambiar los permisos necesarios para que el archivo sea ejecutable.

3. Creamos el cron

Bueno hasta este momento ya tenemos listo el script  probado, procederemos a definir cuando se ejecutara para que se realicen los respaldos correspondientes, primero aqui una explicación de como se compone un archivo crontab:

.---------------------- Minuto (0 - 59)
| .-------------------- Hora (0 - 23)
| |  .----------------- Día del mes (1 - 31)
| |  | .--------------- Mes (1 - 12)
| |  | | .------------- Día de la semana (0 - 6) (0 = domingo)
| |  | | | .----------- Usuario
| |  | | | |    .------ Script o programa a ejecutar
↓ ↓  ↓ ↓ ↓ ↓    ↓
5 15 * * * user /home/user/ejecutar/miscript.sh

En este ejemplo se ejecutara miscript.sh a las 15:05 todos los días, todos los meses, cada dia de la semana como usuario user. Aqui se listan algunos caracteres especiales que se pueden usar:

  • utilice un espacio para separar cada campo
  • para varios valores separelos por comas
  • para un rango de valores separelos por un guión
  • el * se utiliza como comodin para incluir todos los valores
  • el # al inicio de la linea se utiliza como comentario
Todos los comandos del archivo crontab deben ir en una sola linea por muy larga que sea esta, ya que no se reconocen los retorno de carros adicionales.

Ahora si creamos nuestro archivo crontab, el cual se ejectuara todos los dias de la semana de todos los meses a la 1:00am para realizar nuestro respaldo:

$ sudo crontab -e -u miusuario
00 1 * * * miusuario /home/miusuario/ejectuar/respaldarMySQL.sh

Guardamos nuestro archivo y listo, tenemos un archivo crontab preparado.

4. Algunos comentarios

Para consultar nuestros archivos crontab, utilicemos la siguiente instruccion

$ sudo crontab -l

Para editar el archivo crontab de algun usuario

$ sudo crontab -e -u miusuario

Los archivos crontab se guardan en la siguiente ruta /var/spool/cron, debe tener privilegios de root para consultar el listado.

5. Actualización (10/01/2019)

Para evitar que en nuestro script queden expuestas las credenciales de nuestro usuario que realizara el respaldo, podemos agregar las lineas de acceso al archivo my.cnf (generalmente esta en /etc/my.cnf) de la configuración del mysql, asi nuestro script solo tendra las lineas sin el usuario:

respaldarMySQL.sh
# Obtener los nombres de las bases de datos
misbases=`mysql --skip-column-names -e'SHOW DATABASES'`
.
.
.
# y si fue exitoso guardar una bitacora
        mysqldump --databases $db | gzip -9 > \
.
.
.

En nuestro archivo my.cnf agregamos las siguientes lineas:
[mysqldump]
# Usuario para el respaldo
user=usuariomysql
password=miclave

[mysql]
# Usuario para la consulta de las bases
user=usuariomysql
password=miclave

Reiniciamos nuestro servicio para que podamos ejecutar nuestro script, y listo.

martes, 28 de julio de 2015

Actualizar diferentes filas con una sola consulta en MySQL

Hace poco tiempo tuve la necesidad de actualizar varios registros a la vez, lo mas sencillo es crear una consulta y repetirla n veces de acuerdo a la cantidad de registros que deseo actualizar, he aquí la solución sencilla:

UPDATE Directorio SET Orden = 1 WHERE DirectorioId = 1021;
// Ejecutarla
UPDATE Directorio SET Orden = 0 WHERE DirectorioId = 1022;
// Ejecutarla
UPDATE Directorio SET Orden = 2 WHERE DirectorioId = 1023;
// Ejecutarla

Esto funcionaria sin problemas, sin embargo al tener mas registros esto consumiría demasiados recursos de nuestro servidor porque se ejecutarían n sentencias, la opción es simplificar todo a una sola consulta usando CASE, WHEN y THEN. A continuación como quedaría nuestra consulta:

UPDATE Directorio
   SET Orden = CASE DirectorioId
      WHEN 1021 THEN 1
      WHEN 1022 THEN 0
      WHEN 1023 THEN 2
   END
WHERE DirectorioId IN (1021, 1022, 1023) 

De esta forma nuestro servidor ejecutara una sola consulta. En este caso que vimos solo actualizamos un campo pero también es posible actualizar varios campos a la vez, he aquí el ejemplo:

UPDATE Directorio
    SET Orden = CASE DirectorioId
        WHEN 1021 THEN 1
        WHEN 1022 THEN 0
        WHEN 1023 THEN 3
    END,
    SET DepartamentoId = CASE DirectorioId
        WHEN 10 THEN 11
        WHEN 12 THEN 21
        WHEN 13 THEN 11
    END
WHERE DirectorioId IN (1021, 1022, 1023)

Ahora solo un poco de ingenio para incluirlo en nuestro código PHP ya sea con sentencias de control FOR, DO o While. Espero haya sido de utilidad este post.

jueves, 28 de mayo de 2015

Cambiar resolución de exportacion en PowerPoint

Hace poco tiempo tuve la necesidad de exportar una diapositiva a una imagen jpg, como saben con Guardar como... se puede guardar toda o parte de la diapositiva en PowerPoint, sin embargo la resolución, en mi caso, por defecto era de 150 ppp. Aquí describo los pasos de como cambiar esta resolución.

Paso 1. Ejecutar regedit (Editor de Registro) y modificar el registro.

Es necesario buscar y escribir correctamente la ruta, ya que estará afectando el registro de Windows y pudiésemos afectar el funcionamiento del mismo. Aquí la lista de acuerdo a la versión de PowerPoint que tengan:

PowerPoint 2013
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\PowerPoint\Options

PowerPoint 2010
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\PowerPoint\Options

PowerPoint 2007
HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\PowerPoint\Options

Damos click en Options y agregamos una nuevo valor de DWORD(32 bits), el nombre que tendrá será: ExportBitMapResolution, lo escribimos y presionamos Enter. Una vez creado lo seleccionamos y escribimos la resolución deseada. Aquí se describe una lista de las opciones disponibles:

 Valor Decimal    Píxeles de pantalla completa  
(horizontal x vertical)
  Pantalla panorámica píxeles  
(horizontal x vertical)
96 960x720 1280x720
150 1500x1125 2000x1125
200 2000x1500 2667x1500
300 3000x2250 4000x2250

Una vez que escribimos el valor deseado presionamos Enter y salimos del Editor de registro.

Paso 2. Probamos exportando a una imagen
En el menú Archivo seleccionamos Guardar como... y escogemos el tipo deseado (PNG, JPG, etc), en ese momento nos aparecerá un mensaje si deseamos exportar solo la diapositiva actual o todas.



Guardamos nuestra imagen y probamos que nuestra imagen tiene la resolución deseada, para comprobarlo, veamos las propiedades de la imagen, en donde se mostrará la nueva resolución:




miércoles, 20 de mayo de 2015

Saber distribución y versión de linux

1. El siguiente comando sirve para saber la distribución del linux y su versión:

$ sudo cat /etc/issue
// ejemplo 1
CentOs release 5.10 (Final)
Kernel \r on an \m

// ejemplo 2
Ubuntu 14.10 \n \l

2. El siguiente comando sirve para saber la arquitectura del servidor:

$ sudo uname -m
// para 64 bits
x86_64 

// para 32 bits
i386
i686

También puede usar el siguiente comando:
$ arch

jueves, 12 de febrero de 2015

Crear, eliminar o modificar usuarios en Linux

Aquí dejo algunos comandos básicos que serán útiles para crear, eliminar y/o modificar usuarios en nuestro sistema Linux.

Crear usuarios
Para crear un usuario usaremos el comando useradd:

$ sudo useradd -g migrupo -G ftp -s /bin/shell -d /home/micarpeta -m usuario_demo

he aquí una pequeña descripción de los parámetros
-d directorio home del usuario
-m crear carpeta home sino existe
-s shell del usuario
-g grupo primario al que pertenece el usuario
-G grupos a los que pertenece también el usuario

Se recomienda que el nombre del usuario lo  manejemos en minúsculas, podemos incluir también números y guiones. Una vez creado el usuario hay que utilizar el comando passwd para agregarle un password al usuario:

$ sudo passwd usuario_demo
Changing password for usuario_demo.
(current) UNIX password: 


Eliminar usuarios
Para eliminar usuarios usaremos el comando userdel:

$ sudo userdel usuario_demo

Este comando es mas sencillo, si queremos que además se borre el contenido de la carpeta home del usuario, hay que agregar el parámetro -r antes del nombre de usuario.


Modificar usuarios
Para modificar usuarios se utiliza el comando usermod:

$ sudo usermod -d /home/nuevacarpeta usuario_demo

los parámetros son parecidos a los de crear un usuario:
-d modificar home del usuario
-s modificar shell del usuario
-g modificar grupo primario al que pertenece el usuario
-G modificar grupos a los que pertenece también el usuario

miércoles, 14 de enero de 2015

Conectar a MySQL de forma remota

En la mayoría de los casos podemos acceder a MySQL a través de la consola o por medio de phpMyAdmin, pero sabemos que algunas funciones están limitadas por este medio, para ello necesitamos acceder a MySQL de forma remota.

Primero tendremos que comprobar que nuestro firewall (cortafuegos) del servidor no este impidiendo la comunicación con el puerto 3306 (normalmente el puerto de MySQL) en caso de ser así tendremos que desactivarlo o en su caso configurarlo adecuadamente para que permita el acceso al puerto.

Bueno una vez dicho esto describiremos los pasos para configurar el MySQL para acceder de forma remota.

1. Primero probaremos el puerto 3306 (normalmente el puerto de MySQL) a través de nuestro cliente:

telnet miip_o_eldominio.xxx.xxx 3306
conectandose a miip_o_eldominio.xxx.xxx...
No se pudo abrir la conexión al host, en puerto 3306: Error en la conexión

Como vemos en el ejemplo no tenemos acceso al puerto, aunque este desactivado el firewall o configurado adecuadamente, si no se permiten conexiones remotas en el MySQL no se podrá acceder.

2. Revisamos nuestro archivo my.cnf, que generalmente se encuentra en /etc/mysql/my.cnf

$ sudo nano /etc/mysql/my.cnf

Verificamos las variables bind-address y skip-networking. Si se encuentra skip-networking y no está comentada, la comentamos para que no tenga efecto y se permitan conexiones externas.

# comentamos esta linea
# skip-networking

Si encontramos bind-address = 127.0.0.1 o bind-address = localhost también hay que editarlo y cambiar el valor por el de la ip externa desde la que se quiera conectar (sólo se permite una), o por 0.0.0.0 para que cualquier dirección se conecte, en este ultimo caso habrá después que filtrarlas por otros medios (firewall o seguridad a nivel de control de acceso).

bind-address=0.0.0.0

3. Guardamos nuestro archivo y reiniciamos el MySQL.

Para Ubuntu, Debian
$ sudo service mysql restart

Para CentOS, Fedora
$ sudo service mysqld restart

4. Realizamos nuestra prueba de Telnet y nos tiene que permitir el acceso al puerto

telnet miip_o_dominio.xxx.xxx 3306
Conectando miip_o_dominio.xxx.xxx
5.5.9.riocp$%=+_:t0mysql_native_password

5. Una vez hecho esto realizamos una prueba de conexión para conectarnos de forma remota a nuestro servidor MySQL (puede realizarse con algún programa cliente), si aun así no es posible conectarse necesita verificar que el usuario ha sido creado correctamente.

Para ello verificamos en la base de datos mysql la tabla users, en el campo host el valor deberá sera la ip desde la cual deseamos conectarnos o en su defecto el % para que permita conectarse desde cualquier ip. Esto lo podemos realizar con la consola del MySQL.

mysql>GRANT ALL PRIVILEGES ON mibase.* to usuario@'%' IDENTIFIED BY 'elpassword';

Para ver mas sobre como crear usuarios checa el siguiente post:
http://mgermano.blogspot.mx/2014/04/crear-y-borrar-usuarios-de-mysql-por.html

viernes, 9 de enero de 2015

Actualizar PHP 5.1 a PHP 5.4 en CentOS 5.9

En este artículo, veremos como actualizar de PHP 5.1 o 5.2 a PHP 5.4, así mismo actualizaremos el MySQL a la versión 5.5.

1. Primero tenemos que instalar los repositorios epel y remi, con la siguiente instrucción:

$ wget http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
$ wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
$ sudo rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm

2. Después tenemos que habilitar el repositorio remi en el siguiente archivo:

$ sudo nano /etc/yum.repos.d/remi.repo

dentro de este archivo tenemos que habilitar en la sección [remi] el repositorio.

enabled = 1

3. Ahora tenemos que actualizar el php

$ sudo yum install php

4. Después de esto tenemos que reiniciar nuestros servicios de Apache y MySQL

$ sudo service httpd restart
$ sudo service mysqld restart

5. En caso de que no tengamos configurado para que nuestros servicios arranquen de inicio, tendremos que habilitarlo, probamos reiniciando nuestro servidor:

# chkconfig --levels 235 httpd on
# chkconfig --levels 235 mysqld on

Por ultimo probamos en nuestro navegador que este actualizada nuestra versión.

Entradas Populares