Archive for Mayo, 2010

Backup de MySQL mediante consola/comandos

Mayo 24th, 2010

¿Por qué mysqldump?

Yo siempre he hecho las copias de mis bases de datos mediante la opción que da PHPMyAdmin para exportar los datos. Pero cuando una base de datos alcanza un tamaño considerable el exportador de PHPMyAdmin se queda corto ya que PHP no puede procesar toda la información.

En ese momento, hay que pasar a hacer las copias de seguridad mediante los comandos que MySQL nos proporciona. Este método es un poco más tedioso ya que no hay interfaz gráfica como en PHPMyAdmin pero realmente hay 4 opciones y son bastante facilitas.

El programa que nos propociona MySQL se llama mysqldump. Éste comando se encarga de acceder a las base de datos que le indiques y sacarte por la salida estándar el código SQL del backup.

Uso de mysqldump

Tiene muchas opciones (para verlas todas escribe man mysqldump en la consola) pero las que más nos interesan son:

  • opt: Esta opción es un popurrí de otras opciones. Lo que hace es añadir al código SQL del backup las ordenes de borrar las tablas si existen con anterioridad, bloquea las tablas para que el backup sea más rápido, escribe en los CREATE TABLE las opciones específicas de cada tabla, hace las inserciones en pocas líneas para que el archivo ocupe menos y se haga más rápido el backup y utiliza las opciones de backup rápido. En definitiva esta opción es muy recomendable ya que te ahorra poner muchas otras opciones y consigue que el backup se haga de la manera más rápida posible.
  • user: Esta opción indica a mysqldump el usuario con el que accederá a la base de datos para hacer el backup.
  • password: Indica el password a mysqldump.
  • host: Indica la dirección donde está la base de datos.

Imaginemos que tengo una base de datos en mi servidor (servidorficticio.com) que se llama base_de_datos_de_prueba. En ella tienen privilegios para leerla y modificarla el usuario jorge con la contraseña mi_nombre_es_jorge. Ahora existen dos opciones: que me pueda conectar al servidor por SSH o que no me dejen.

En el caso de poder conectarme por SSH debería de identificarme en servidorficticio.com y escribir en la línea de comandos:

mysqldump --opt --user=jorge --password=mi_nombre_es_jorge base_de_datos_de_prueba >  backup_base_de_datos_de_prueba.sql

En cambio, si no te dan la opción de conectarte por SSH tendrás que utilizar la opción host y ejecutar la orden desde tu ordenador. El comando que tendrías que escribir sería muy parecido:

mysqldump --opt --host=dominioficticio.com --user=jorge --password=mi_nombre_es_jorge base_de_datos_de_prueba >  backup_base_de_datos_de_prueba.sql

En ambos casos se creará un archivo backup_base_de_datos_de_prueba.sql que contendrá el backup completo de la base de datos.

Backup de más de una base de datos

Ahora tenemos las bases de datos: base_de_datos_de_prueba1 y base_de_datos_de_prueba2. Utilizaremos la opción databases:

mysqldump --opt --user=jorge --password=mi_nombre_es_jorge --databases base_de_datos_de_prueba1 base_de_datos_de_prueba2 >  backup_multiple.sql

Backup de todas las bases de datos

Para hacer un backup completo de toda la base de datos utilizaremos la opción all-databases:

mysqldump --opt --user=jorge --password=mi_nombre_es_jorge --all-databases > backup_total.sql

Problemas típicos

Alguna vez me ha pasado cuando hacía un backup que mysqldump me mostraba que una tabla había producido el error cuando se intentaba bloquear. Concrétamente el error decía algo así:

mysqldump: Got error: 1105: File './xxxx/tabla_problematica.MYD' not found (Errcode: 24) when using LOCK TABLES

Este problema se puede arreglar facilmente añadiendo a la opción lock-tables e igualándola false para que no intente bloquear las tablas y puedea terminar el backup. Esta modificación lo único que cambia es la velocidad en la que se hará el backup. De forma que el comando quedaría:

mysqldump --opt --lock-tables=false --user=jorge --password=mi_nombre_es_jorge base_de_datos_de_prueba >  backup_base_de_datos_de_prueba.sql

Por último, cuando el backup es muy grande (alrededor del GB) es posible que mysqldump avise de que no puede hacerlo porque supera el tamaño permitido. Para arreglar ésto solo hay que cambiar un valor de la configuración de MySQL: max_allowed_packet.

Ésta variable se encuentra en el archivo de configuración de MySQL my.cnf que normalmente se encuentra en el directorio /etc/mysql. Editamos ese archivo y cambiamos la variable max_allowed_packet a lo que queramos, por ejemplo 200MB (el valor defecto es 16MB)

Nota: Si no sabes dónde está tu archivo de configuración my.cnf puedes ejecutar este comando

find / -name 'my.cnf' 2> /dev/null

Un saludo, espero que os sea útil!

Quota: Limitar el disco duro a un usuario

Mayo 21st, 2010

Descripción

Disco duro SATA

Cualquier usuario en un sistema compartido se ha visto alguna vez en la situación de tener que borrar archivos de otro para que no ocupen parte de tu disco duro. Quien comparta el ordenador con hermanos lo comprenderá rápidamente :P

Para solucionar este problema existe un programa llamado quota para Linux que permite limitar el tamaño máximo que podrá ocupar un usuario en un sistema. Esta limitación se puede hacer de dos formas:

  • Limitando el número de KBytes que podrá utilizar este usuario en el disco duro
  • Limitar el número de archivos que tendrá

Preparando el terreno

Veamos como se utiliza. Lo primero, obviamente, es instalarlo. Para esto valdría con escribir en una consola (en el caso de Ubuntu o Debian):

sudo apt-get install quota

Ahora lo que hace falta es indicar qué particiones de tu disco duro van a ser controladas por quota. Para esto vamos a editar el archivo donde están todas las particiones declaradas con sus opciones, este archivo es el /etc/fstab. Para editarlo puedes escribir en la consola:

sudo gedit /etc/fstab

Cuando lo ejecutes se abrirá una ventana con un editor de texto (si no tienes el gedit utiliza tu editor de textos preferido) con un archivo un poco extraño. Por ejemplo, mi archivo fstab es el siguiente:

captura fstab

Formato fstab: clic para agrandar

Cada línea que empieza con almuadilla (#) es un comentario que se puede ignorar. El resto de líneas son unidades de disco o particiones que contienen la siguiente información: identificador en el sistema, punto de montaje, formato de la partición, opciones (el círculo rojo), dump y pass. Estos campos están separados por uno o más espacios (las flechas verdes).

Para que quota pueda obrar su magia necesitamos añadir la opción usrquota dentro del campo de opciones de la partición donde quieras que funcione (puede ser más de una). En este caso nos interesa la partición donde está montado todo el sistema y cambiamos sus opciones (el del círculo rojo, el 4º de la línea). Para esto simplemente añadimos una coma al final de las opciones que ya existían y escribimos usrquota. De manera que quede como en mi archivo fstab.

Para hacer las pruebas de quota crearemos un usuario de prueba en el sistema que además tenga un directorio home que pueda manipular. Esto se hace facilmente utilizando los menús de Ubuntu: Sistema -> Administración -> Usuarios y grupos.

Acceso a la opción de usuarios y grupos

Acceso a usuarios y grupos: clic para agrandar

Una vez dentro del menú de Usuarios y grupos lo único que hay que hacer es hacer clic en Añadir un usuario y rellenar los datos que se necesitan. En nuestro ejemplo vamos a suponer que hemos creado el usuario pedro.

Nota: Otra manera más sencilla de crear un usuario sería escribir en la consola

sudo useradd -s /bin/bash -m pedro; sudo passwd pedro

Ahora reiniciamos para que se vuelva a montar la partición y ya está! Ya tenemos el terreno preparado para que funcione quota.

Uso

Quota tiene dos parámetros que puede limitar: el número de archivos y el número de KB que tiene un usuario. Puedes configurarlo para que funcione de forma diferente para cada usuario. Por ejemplo:

Restricciones al usuario Juan: Puede tener un máximo de 10GB
Restricciones al usuario Pedro: Puede tener un máximo de 512KB y 16 archivos.

Cada usuario tiene una configuración diferente y ésta se aplica individualmente (aunque existen maneras de automatizarlo).

Primero comprobamos que el usuario pedro no tenga ninguna cuota habilitada ya. Para ver las cuotas existentes en un usuario basta con escribir en la consola:

sudo quota -u pedro

Este comando nos devolverá una frase del tipo:

Cuotas de disco para user pedro (uid 1001): ninguno

Esto se debe a que aún no hemos aplicado ninguna cuota. Vamos a aplicarle al usuario pedro una restricción de tamaño total de archivos, por ejemplo 10GB. Para ésto, utilizaremos un programa que viene con quota que se llama edquota. Forma parte del paquete y es el programa específico para modificar las cuotas a los usuarios.

Para abrir el editor de cuotas escribimos en la consola:

sudo edquota pedro

Este comando abrirá nuestro editor de texto por defecto y nos mostrará una pantalla parecida a la del fstab donde cada espacio (o grupo de espacios) separa unas opciones de otras.

Formato edquota

Formato edquota: clic para agrandar

En este caso he pintado las flechas de colores de forma que cada opción tiene una flecha del mismo color que su valor. En este ejemplo tendríamos las opciones configuradas de esta manera:

  • Sistema de archivos: /dev/sda1
  • bloques: 44
  • límiteflexible: 0
  • tope: 0
  • inodes: 15
  • límiteflexible: 0
  • tope: 0

Sistema de archivos indica en qué partición de tu disco duro se encuentra el usuario pedro. Esta opción no hay que tocarla (si nos fijamos es la misma partición a la que le dimos la opción usrquota antes).

Bloques indica el número actual de bloques (un bloque es igual a 1 KB). Por lo tanto, la ocupación de pedro en el sistema actualmente es de 44KB.

Límiteflexible es un parámetro que indica el número máximo de KB que puede ocupar pedro en el sistema sin que se le borren. Es una barrera que se puede pasar pero cuando pasa un tiempo si se sigue pasando esa barrera de KB se borran los archivos. En un  otro post enseñaré a usarlo.

Tope es lo que buscábamos. En esta opción está se indica el número de KB máximo que podrá ocupar pedro en el sistema. Pedro no podrá pasar de ese espacio.

Inodes es el número de archivos actual de pedro. En este caso tiene 15 archivos.

Límiteflexible indica otra vez lo mismo pero para los archivos. El máximo de archivos que podrá tener pedro sin que se le borren en un tiempo.

Tope indica lo mismo que el tope de los bloques pero para los archivos. El número máximo de archivos que tendrá pedro.

Con estas opciones puedes tener un completo control sobre el espacio que pedro ocupará en tu sistema. Ahora si que vamos a aplicarle a pedro la restricción de 10GB como máximo. Primero calculamos cuántos KB son 10GB:

10GB = 10*1024*1024 = 10485760 KB

Y ahora editamos las cuotas de pedro con el comando de antes:

sudo edquota pedro

Y cambiamos el primer tope (el que está relacionado con los bloques) a 10485760. Tiene que quedar algo así:

Archivo de cuotas modificado

Archivo de edquota modificado para 10GB: clic para agrandar

Para cambiar el límite de archivos en el disco solo tendrías que cambiar el valor del segundo tope al máximo que quieras. Si dejas algún valor a 0 significa que no se aplicará ninguna restricción.

Por último comentar que puedes combinar las dos restricciones o aplicarlas individualmente. Y el límite flexible lo explicaré otro día :)

Conclusiones

Hemos conseguido instalando un programa ligerísimo llevar un control total sobre el uso de disco de los usuarios de tu sistema.

Un saludo a todos, espero que os sea útil.