Cuando utilizamos MySQL es común optimizar tablas con muchos registros con cierta periodicidad, esto para solventar problemas de fragmentación, entre otros. La verdad esta es una de las cosas del modelo de PostgreSQL que echo en falta, quizás no es tan «amigable» pero todo queda claro desde el inicio.
En PostgreSQL hay un proceso de aspiradora (vacuum) que va eliminando periódicamente registros inutilizados en tablas, su configuración, pan nuestro de cada día para un admin de BBDD que debe ajustarlo con frecuencia.
Bueno…. Volviendo a MySQL, si necesita optimizar tablas InnoDB, lo mejor que puede utilizar son ALTER nulos, estas son instrucciones DDL de tipo ALTER sin parámetros que permiten seguir trabajando con las BBDD, porque realiza copias temporales en disco. La cuestión es que esta herramienta «reconstruye» la tabla y elimina, entre otros, los problemas de fragmentación.
Aquí les dejo un script para optimizar de «un sólo golpe» varias tablas InnoDB:
#!/bin/bash
if [ $# -lt 2 ]; then
echo "You must specify database host"
echo "Eg. script.sh MY_DATABSE 192.168.10.1"
exit
fi
db="$1"
host="$2"
user="root"
declare -a tables=(Table1 Table2 Table3)
stty -echo
read -p "Enter MySQL's Admin password: " password
stty echo
for table in ${tables[@]}; do
echo $table &&
time mysql -u $user --password=$password -h $host $db -e "ALTER TABLE $table ENGINE=INNODB"
done
Básicamente optimizamos las tablas especificadas (en un arreglo) e imprimimos el tiempo que toma cada instrucción (time).
Si tiene la certeza de que todas las tablas de una BD son InnoDB y quiere optimizarlas todas aún más rápido, puede hacerlo valiéndose del comando «show tables»…
#!/bin/bash
if [ $# -lt 2 ]; then
echo "You must specify database host"
echo "Eg. script.sh MY_DATABSE 192.168.10.1"
exit
fi
db="$1"
host="$2"
user="root"
stty -echo
read -p "Enter MySQL's Admin password: " password
stty echo
mysql -u $user --password=$password -h $host --batch --skip-column-names $db -e "SHOW TABLES" |
while read table; do
echo $table &&
time mysql -u $user --password=$password -h $host $db -e "ALTER TABLE $table ENGINE=INNODB"
done
La única diferencia es que las tablas ya no son especificadas a través de un arreglo (que recomiendo para BBDD grandes, donde optimizar todas las tablas podría demorar toda la vida), sino que se toman directamente del comando «SHOW TABLES» para una BD especificada.
Hola amigos de blogofsysadmins aqui les dejo otro script en bash que uso para hacer backup de mis bases de datos Mysql en un servidor FreeNas via SMB (Samba), son bastante útiles si se ponen en un cron job y automaticamente hacer los respaldos por las noches o cuando querais¡¡
Cada uno ya que personalice el script base a sus necesidades
#!/bin/bash
Backup_dir_temp="/shellscripts/temp"
Work_dir="/shellscripts/workdir"
Mount_dir="//192.168.0.xxx/Backups/Web_Databases"
Backup_files="*.sql"
Days=7
Day=$(date +%F)
#Respaldamos nuestrass bases de datos(cabia los datos tus datos)
cd $Backup_dir_temp
mysqldump -uroot -pPassword Database_1 > Database_1_$Day.sql
mysqldump -uroot -pPassword Database_2 > Database_2_$Day.sql
mysqldump -uroot -pPassword Database_3 > Database_3_$Day.sql
mysqldump -uroot -pPassword Database_4 > Database_4_$Day.sql
mysqldump -uroot -pPassword Database_5 > Database_5_$Day.sql
Archive_file="Databases_Backup_$Day.zip"
#montamos Mount_dir via samba en Backup_dir
mount -t cifs //192.168.0.xx1/Backups/Web_Databases $Work_dir -o username=myUserName,password=myPassword
#Eliminanos el archivo mas viejo si ya se cumplieron "$Days" dias
# Contamos el numero de archivos que hay en el directorio de respaldo
file_count=`ls $Work_dir | wc -l`
# Comparamos si hay mas de $days archivos para borrar el mas viejo
if [ $file_count = $Days ]
then
cd "$Work_dir" && ls -tr | head -n 1 | xargs rm -f
echo "Removiendo el archivo mas viejo..."
else
echo ""
fi
#Creamos el archivo comprimido con todos los archivos sql
zip -r "$Work_dir"/$Archive_file $Backup_files
#Borramos el directorio temporal
rm -rf $Backup_dir_temp/*.*
#Desmontamos el directorio SMB
umount $Work_dir
PhpMyAdmin incluye opciones para relacionar tablas (de tipo InnoDB), pero muchas veces vienen desactivadas y al darle al boton operaciones en la base de datos, aparece el error: Las opciones adicionales para trabajar con tablas vinculadas fueron desactivadas. Para saber porqué, dé clic aquí.
Para activarlas debemos añadir algunas opciones a los ficheros de configuración del PMA.
En algunos paquetes que integran Apache, MySQL y PHP no es necesario configurar nada porque ya traen activadas por defecto estas opciones, comoXAMPP. En otros paquetes, aunque configures estas opciones, es posible que sigan sin funcionar las relaciones, como en el WAMP.
Para lograr que funcionen las relaciones debemos seguir estos pasos:
Comprobar si tenemos una tabla llamada phpmyadmin. Si no es así, ejecutar el script create_tables.sql, que está en la carpeta de scripts de phpmyadmin. Esta es una tabla que usa PMA internamente para ofrecer características adicionales, como las relaciones entre tablas.
Acceder al fichero de configuración de PMA config.inc.php (en las versiones nuevas viene como config.default.php) y dejar estas opciones tal y como se indica a continuación:
Crear un usuario MySQL para utilizar la relación entre tablas (que será el que indicamos anteriormente como controluser con la contraseña indicada en controlpass) y asignarle los correspondientes permisos:
GRANT USAGE ON mysql.* TO 'pma'@'localhost' IDENTIFIED BY 'pmapass';
GRANT SELECT (Host, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv) ON mysql.user TO 'pma'@'localhost';
GRANT SELECT ON mysql.db TO 'pma'@'localhost';
GRANT SELECT ON mysql.host TO 'pma'@'localhost';
GRANT SELECT (Host, Db, User, Table_name, Table_priv, Column_priv) ON mysql.tables_priv TO 'pma'@'localhost';
Reiniciar apache y acceder al PMA. Si todo ha salido bien, ya no tendremos el mensaje de error y aparecerá en el menú de arriba el botón diseñador, desde donde podremos establecer las relaciones entre tablas.
CentOS + DRBD + HeartBeat + MYSQL DRBD (Distributed Replicated Block Device), es un sistema para almacenamiento distribuido usado en Linux para realizar replicaciones de sistemas de archivos por bloques. Este paquete consiste en un modulo del Kernel drbd-kmod, y scripts que permiten que se puedan realizar replicaciones muy similares a un RAID 1, en red. DRBD se suele usa acompañado de herramientas de High Availability (HA), como Heartbeat, para lograr servidores de alta disponibilidad.
Paquetes Necesarios
En el siguiente ejemplo utilizaremos como base un sistema 32 bits, para lo cual necesitaremos instalar por Yum, o por RPM los siguientes paquetes. • drbd.i386 • kmod-drbd.i686 • MySQL-server <– Aplica a nuestro caso se puede usar cualquier otro servicio. • Heartbeat* • Gnutls* • Ipvsadm*
Para ejecutar el modulo de drbd en el kernel debemos ejecutar lo siguiente:
• modprobe drbd
Instalación del Sistema Operativo CentOS. El sistema operativo lo instalaremos como una instalación normal, con las particiones que deseemos para el, con la única diferencia que dejaremos un espacio sin particionar para ser usado por DRBD, en esta partición almacenaremos en el futuro las aplicaciones que deseemos administrar con DRBD, por ejemplo, si deseamos como es nuestro caso que DRBD mantenga actualizado nuestro MySQL, debemos asegurarnos que TODA la data del MySQL se este almacenando en el volumen lógico del DRBD.
Preparación de la partición de DRBD
Para particionar el volumen que hemos dedicado a nuestro DRBD, será necesario crear un volumen físico, luego agruparlo y por último crear el volumen lógico, de la siguiente forma. • Pvcreate /dev/sda5 <–/dev/sda5 dependerá de la partición que nos de fdisk –l • Vgcreate drbd /dev/sda5 <– drbd es el nombre que le daremos al grupo de volúmenes. • Lvcreate -L1024M -n mysql-drbd drbd <– mysql-drbd es el nombre que le daremos a nuestro volumen lógico.
Configurar DRBD
Una vez hayamos preparado las particiones de DRBD en ambos servidores, es momento de proceder a realizar la configuración de DRBD, esto consiste en editar un fichero ubicado en la ruta /etc/drbd.conf, este archivo tiene características muy peculiares dependiendo de lo que deseamos realizar. En nuestro caso esta adaptado a las necesidades de MySQL, y quedaría de la siguiente forma.
# Our MySQL share
resource db {
protocol C;
handlers {pri-on-incon-degr “echo ‘!DRBD! pri on incon-degr’ | wall ; sleep 60 ; halt -f”; }
startup { wfc-timeout 0; degr-wfc-timeout 120; }
disk { on-io-error detach; } # or panic, …
syncer { rate 6M; }
on srv-nodo01-drbd {
device /dev/drbd1; #Este es el device que se crea para DRBD
disk /dev/mysql_drbd/mysql-drbd; #Este es el volumen lógico que creamos
address 10.134.16.210:7789; #ip servidor nodo01
meta-disk internal;
}
on srv-nodo02-drbd {
device /dev/drbd1;
disk /dev/mysql_drbd/mysql-drbd;
address 10.134.16.209:7789;
meta-disk internal;
}
}
Este es el contenido del archivo /etc/drbd.conf, y debe ser igual en ambos equipos por ende podemos hacer simplemente un scp o un rsync entre ambos para copiarlo.
Una vez configurado nuestros DRBD, debemos iniciar el servicio pero antes debemos crear los recursos que hemos configurado, en nuestro caso como se puede observar en el archivo el recurso se llama “db”, por tal motivo ejecutaremos el siguiente comando e iniciamos el servicio.
drbdadm create-md db
La ejecución de este comando dará las siguientes respuestas:
[root@node1 etc]# drbdadm create-md db
v08 Magic number not found
v07 Magic number not found
About to create a new drbd meta data block on /dev/sda5.
. ==> This might destroy existing data! <== Do you want to proceed? [need to type 'yes' to confirm] yes Creating meta data… initialising activity log NOT initialized bitmap (256 KB) New drbd meta data block sucessfully created.</blockquote>
service drbd start
Podemos ver que el servicio esta funcionando correctamente si ejecutamos lo siguiente en ambos equipos.
En este punto si nos fijamos en los resultados del comando anterior podremos observar que ambos nodos están configurados como secundarios, y como es de suponerse necesitamos que uno de ellos al menos, sea primario. Para realizar esta tarea es necesario hacer lo siguiente.
[root@node1 etc]# drbdadm — –overwrite-data-of-peer primary db
En este punto está listo configurado y operativo el DRBD, por lo que podemos formatear nuestro volumen lógico para dejarlo preparado para recibir información, de la siguiente forma.
mkfs.ext3 /dev/drbd1 ; mkdir /db ; mount /dev/drbd1 /db
Para probar ahora que todo este funcionando como esperamos podemos crear archivos falsos en nuestra partición, e intercambiar los roles de primario y secundario para verificar que se estén sincronizando nuestros archivos, para esto podemos seguir los siguientes pasos.
[root@node1 etc]# for i in {1..5};do dd if=/dev/zero of=/db/file$i bs=1M count=100;done
Este comando creará 5 ficheros de 100 megabytes, con el nombre file 1,file 2,file 3, file 4, file 5. Después de hacer el cambio de nodos manualmente como se describe a continuación, podremos verificar que nuestros ficheros se han replicado.
[root@node1 /]# umount /db ; drbdadm secondary db
[root@node2 /]# mkdir /db ; drbdadm primary db ; mount /dev/drbd1 /db
[root@node2 /]# ls /db/ file1 file2 file3 file4 file5 lost+found
Ahora podemos realizar el proceso contrario para verificar qque si por algún motivo nuestro nodo01 falla, la información del nodo02 podrá ser replicada al nodo01 sin problemas.
[root@node2 /]# rm /db/file2 ; dd if=/dev/zero of=/db/file6 bs=100M count=2
[root@node2 /]# umount /db/ ; drbdadm secondary db
[root@node1 /]# drbdadm primary db ; mount /dev/drbd1 /db
[root@node1 /]# ls /db/ file1 file3 file4 file5 file6 lost+found
En este punto ya hemos comprobado que nuestro DRBD funciona correctamente, y por ende solo nos queda configurar la última herramienta de HA, Heartbeat, que lo haremos después de configurar MySQL con las particiones de DRBD
Configuración de MYSQL
Para configurar MySQL con las particiones de DRBD es simple en nuestro archivo /etc/my.cfg, tenemos una directiva que nos dice donde se almacena la data de MySQL, esta directiva es datadir=/var/lib/mysql en este caso el datadir apunta al directorio /var/lib/MySQL, lo que haremos ahora es simplemente mover el directorio /var/lib/MySQL, a /db y luego crearemos un enlace simbólico lo que será suficiente para que la data almacenada por MySQL se escriba en nuestro volumen lógico. Para esto debemos detener el servicio de MySQL previamente.
Nodo 02
[root@node2 /]# service mysql stop
[root@node2 /]# mv /home/mysql/data /tmp
[root@node2 /]# ln -s /db/mysql/data /home/mysql/data
Una vez realizado esto ya estan preparados nuestros dos nodos, por lo que procederemos a iniciar Mysql en el Nodo01.
Configuración de Heartbeat
La configuración de Heartbeat consiste básicamente en 5 pasos que en su mayoría deberán ser ejecutados y realizados de forma idéntica en cada equipo.
• Editar el fichero vi /etc/sysctl.conf de la siguiente forma:
net.ipv4.ip_forward = 1
• Verificar que los servicios necesarios estén ejecutándose
chkconfig –level 2345 heartbeat on
chkconfig –del ldirectord
• Editar el fichero de heartbeat /etc/ha.d/ha.cf de la siguiente forma en AMBOS nodos:
#/etc/ha.d/ha.cf content
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694 #si hay varios heartbeat es necesario editar el Puerto
bcast eth0 # Linux
auto_failback on #(This will failback to machine1 after it comes back)
ping 10.10.150.100 #(Your gateway IP)
apiauth ipfail gid=haclient uid=hacluster
node machine1.myhost.com
node machine2.myhost.com
• Editar el fichero /etc/ha.d/haresources al igual que el ha.cf idénticos en ambos nodos.
• Ahora debemos editar el fichero de seguridad que nos permitirá que el heartbeat se autentifique entre el nodo01 y nodo02 únicamente, también deben ser idénticos en ambos nodos.
Aqui os dejo 15 usos prácticos del comando de MySQL tan usado por los syadmins, mysqladmin
1. ¿Cómo cambiar la contraseña del usuario root en MySQL
# mysqladmin -u root -pxxx password ‘yyy’ # mysql -u root -pyyy Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 2 Server version: 5.0.67 MySQL Community Server (GPL) Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.
2. ¿Cómo chequear si el servidor MySQL está corriendo?
# mysqladmin -u root -p ping Enter password: mysqld is alive
# mysqladmin -u root -pxxx version mysqladmin Ver 8.42 Distrib 5.0.67 on i686 Copyright (C) 2000-2006 MySQL AB This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license Server version 5.0.67 Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/lib/mysql/mysql.sock Uptime: 100 days 0 hours 0 min 0 sec Threads: 1 Questions: 241986 Slow queries: 0 Opens: 11097 Flush tables: 2 Open tables: 32 Queries per second avg: 1.23
# mysqladmin -u root -pxxx drop basedeprueba Dropping the database is potentially a very bad thing to do. Any data stored in the database will be destroyed.Do you really want to drop the ‘basedeprueba’ database [y/N] y Database “basedeprueba” dropped
10. ¿Cómo recargar/refrescar los privilegios de la tabla de permisos?
# mysqladmin -u root -pxxx reload;
El comando refresh hará un flush de todas las tablas y cerrará/abrirá los archivos de log.
# mysqladmin -u root -pxxx refresh;
11. ¿Cuál es el método seguro de detener el servidor MySQL?
13. ¿Cómo matar un proceso pendiente de un cliente MySQL? Previo a este comando es necesario identificar el thread a eliminar ejecutando el comando processlist de mysqladmin.
# mysqladmin -u root -pxxx kill 20
14. ¿Cómo iniciar y parar la replicación en un servidor esclavo en MySQL ?
15. ¿Cómo combinar múltiples comandos de mysqladmin juntos?
# mysqladmin -u root -pxxx process status version +—-+——+———–+—-+———+——+——-+——————+ | Id | User | Host | db | Command | Time | State | Info | +—-+——+———–+—-+———+——+——-+——————+ | 43 | root | localhost | | Query | 0 | | show processlist | +—-+——+———–+—-+———+——+——-+——————+Uptime: 3135 Threads: 1 Questions: 50 Slow queries: 1 Opens: 10 Flush tables: 2 Open tables: 0 Queries per second avg: 0.5 mysqladmin Ver 8.42 Distrib 5.0.67 on i686 Copyright (C) 2000-2006 MySQL AB This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license
Server version 5.0.67 Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/lib/mysql/mysql.sock Uptime: 52 min 15 sec