Lamentablemente, no todo es color de rosa con XFS y por lo tanto, habrá que defragmentarlo. Si bien no es como defragmentar NTFS en Windows, es algo que tenemos que tener en cuenta para evitar que el sistema “se pete o casque el disco duro.” A no desilusionarse, no es nada complicado.
Quiero decir, antes que nada, que ésto es meramente una tarea de mantenimiento simple en cualquier sistema o servidor web y no es una contra importante como para no utilizar el sistema XFS. De cualquier manera, sepan que es una tarea simple y fácil de hacer.
Ahora vamos a ver cuantas de nuestras particiones deben ser defragmentadas:
xfs_db -r /dev/PARTICION
se abrirá un prompt, ahí debemos escribir:
frag
Nos indicara el porcentaje de framgentación del sistema de archivosXFS. Por la red se dice que cuando alcance el 10% debe ser defragmentado. Yo he defragmentado sistemas con un 6% y tardó un poco, supongo que debe depender de las caracterísiticas del equipo.
No es algo complicado, pero recomiendo hacerlo todo modo mono-usuario (runlevel 1) (recovery mode, se selecciona al arranque.)
Ahora sí, pasamos a defragmentar (suponiendo que lo necesitamos):
xfs_fsr -v /dev/PARTICION
Recordad que en PARTICION irá nuestra partición en cuestión: hda1, sda2, etc. Eso es todo, nada complicado. A no preocuparse, no tarda lo mismo que Windows y depende de nuestro equipo y porcentaje de fragmentación.
Aqui os dejo 15 usos prácticos del comando de MySQL tan usado por los syadmins, mysqladmin
MySQL
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
En algunas ocasiones necesitamos acceder a algún servicio o aplicación que usa un puerto diferente al que por defecto tenemos permitido.
Imaginemos que estamos usando en nuestro trabajo nuestro portatil con Ubuntu y queremos actualizar repositorios o usar facebook, messenguer, etc … Estos servicios usan un puerto determinado que en principio si no podemos usar directamente se debe a la existencia en la red de un firewall que esta capando un puerto determiando.
Pues bien utilizando SSH , nos enseñana como podremos crear un tunel sobre dicho servidor externo y evitar el firewall, usando nuestra máquina como servidor local y redireccionando todas las salidas sobre el puerto especificado, es bastante sencillo y nos saltaremos el cortafuegos gustosamente:
El ejemplo que vamos a utilizar es el saltarnos un firewall, en nuestra red que capa el puerto que utiliza ubuntu para actualizar unos repositorios en un host concreeto.
Imaginemos que deseaba agregar el repositorio UbuntuGis para instalar algunos paquetes del mismo (Grass y Quantum GIS entre otros), pero al añadirlo:
sudo add-apt-repository ppa:ubuntugis/ppa
Si hay un firewal en la red que capa dicho puerto obtendriamos el siguiente error:: Executing: gpg –ignore-time-conflict –no-options –no-default-keyring –secret-keyring /etc/apt/secring.gpg –trustdb-name /etc/apt/trustdb.gpg –keyring /etc/apt/trusted.gpg –primary-keyring /etc/apt/trusted.gpg –keyserver keyserver.ubuntu.com –recv 6B827C12C2D425E227EDCA75089EBE08314DF160 gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.com gpgkeys: HTTP fetch error 7: couldn’t connect to host gpg: no valid OpenPGP data found. gpg: Total number processed: 0
Executing: gpg –ignore-time-conflict –no-options –no-default-keyring –secret-keyring /etc/apt/secring.gpg –trustdb-name /etc/apt/trustdb.gpg –keyring /etc/apt/trusted.gpg –primary-keyring /etc/apt/trusted.gpg –keyserver keyserver.ubuntu.com –recv 6B827C12C2D425E227EDCA75089EBE08314DF160gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.comgpgkeys: HTTP fetch error 7: couldn’t connect to hostgpg: no valid OpenPGP data found.gpg: Total number processed: 0
* Está capando el puerto 11371, el que usa el servidor de claves en la dirección: keyserver.ubuntu.com
Ahora bien para solucionar esto mediante un tunel con SSH hariamos lo siguiente:
1. Editamos el fichero /etc/hosts (como superusuario), en concreto la siguiente línea: 127.0.0.1 localhost keyserver.ubuntu.com
2. Guardamos y teniendo en cuenta que disponemos un servidor externo con un servidor SSH y sin restricciones en cuanto a firewall se refiere, lanzamos SSH con un tunel sobre el puerto 11371 local y redireccionando la salida sobre la dirección especificada (keyserver.ubuntu.com) y el mismo puerto. Tan sencillo como la siguiente línea (en este caso estoy usando el servidor de mi universidad, y nombre_usuario el nombre de mi usuario en el servidor ts.uco.es):
Para muchos de nosotros Gedit no es más que un editor de textos, reemplazo del clásico bloc de notas de Windows, en el que podemos modificar pequeños y simples (al carecer de formato) ficheros de texto como ficheros de configuración y/o propiedades.
Aunque mi entorno de desarrollo (IDE) suele ser Eclipse, de un tiempo a esta parte vengo utilizándolo muy a menudo para la creación y edición de scripts tanto en Bash como en Groovy (lenguaje que, por necesidades del cliente, me he visto “obligado” a aprender).
Cansado de la rutina de editar el fichero con GEdit (o vim si se terciaba), y tener abierta una terminal para probar lo que iba modificando me dio por investigar qué otras alternativas existen para ello descubriendo la potencia y flexibilidad del complemento Herramientas externas.
Activando el complemento
Tan sencillo como buscarlo en las preferencias de GEdit
y marcar la casilla correspondiente
para finalizar no queda más que configurarlo
Definiendo el primer script
Como introducción y, a modo de ejemplo, nos limitaremos a mostrar en consola el resultado de listar el contenido del directorio temporal del sistema (/tmp) para lo cual añadiremos un nuevo comando pulsando el botón existente para ello
y escribiremos el siguiente código en la zona de edición habilitada
ls -l /tmp
A modo de referencia podéis ver cómo he definido el resto de parámetros del script en la siguiente captura
destacando entre ellos
Tecla rápida para lanzar el script cuando estemos editando en GEdit sin tener que buscar el script en los menús de la aplicación
Guardar: Documento actual para evitarnos tener que preocuparnos de guardar el documento antes de lanzar el script. Con el valor Documento actual se guardará el fichero que estemos editando de modo que lo que se ejecute sea exactamente lo último que hemos escrito evitando de este modo falsos resultados (imagina que haces algunos cambios y ejecutas el script: se ejecutaría sobre lo último que tienes en disco que no coincide en absoluto con lo que estás viendo en pantalla)
Ejecutando scripts
Tan sencillo como pulsar la combinación de teclas definida en el paso anterior (CTRL+SHIFT+E en la configuración de referencia) y observar el resultado en el panel inferior del editor
NOTA: Curiosamente, si estás editando un documento nuevo que no ha sido guardado nunca en disco, el complemento se limita a pedirte dónde guardarlo y no ejecuta el script . En dicho caso dale un nombre y vuelve a lanzarlo pulsando nuevamente la combinación de teclas asociada.
El script definitivo
Una vez que hemos aprendido cómo funciona el complemento con un ejemplo sencillo (listar el contenido del directorio /tmp) pasemos a la finalidad de este artículo: ejecutar el contenido del script que estamos editando.
No tenemos más que cambiar el código del script anterior por éste:
GEdit es, en apariencia, un sencillo editor de textos que consume muy pocos recursos y que está llamado a convertirse en el equivalente a editores de textos como el UltraEdit de Windows (que al escribir este artículo acabo de descubrir que ya existe versión para Linux :O aunque, como era de esperar, no es Software libre )
Bonus tip
Para aquellos que les haya llamada la posibilidad de ejecutar scripts desde Gedit les recomiendo que le echen un vistazo a la colección de ejemplos de scripts que existe pues es mucho lo que se puede aprender de ellos.
Bueno otro buen script a la huchaca… esta escrito en bash aparte de ser utilisisimo porque chequea las tablas fragmentadas y tambien chequea todas las bbdds en busca de tablas MyISAM o INNODB y las optimiza.
#!/bin/bash
VERSION="0.7.2" log="$PWD/mysql_error_log.txt"
echo "MySQL fragmentation finder (and fixer) v$VERSION, written by Phil Dufault ( http://www.dufault.info/ )"
showHelp() { echo -e "\tThis script only repairs MyISAM and InnoDB tables" echo -e "\t--help or -h\t\tthis menu" echo -e "\t--user username\tspecify mysql username to use\n\t\t\tusing this flag means the script will ask for a password during runtime, unless you supply..." echo -e "\t--password \"yourpassword\"" echo -e "\t--host hostname\tspecify mysql hostname to use, be it local (default) or remote" }
#s parse arguments while [[ $1 == -* ]]; do case "$1" in --help|-h) showHelp; exit 0;; --user) mysqlUser="$2"; shift 2;; --password) mysqlPass="$2"; shift 2;; --host) mysqlHost="$2"; shift 2;; --) shift; break;; esac done
# prevent overwriting the commandline args with the ones in .my.cnf, and check that .my.cnf exists if [[ ! $mysqlUser && -f "$HOME/.my.cnf" ]]; then if grep "user=" "$HOME/.my.cnf" >/dev/null 2>&1; then if grep "pass=" "$HOME/.my.cnf" >/dev/null 2>&1; then mysqlUser=$(grep user= < "$HOME/.my.cnf" | awk -F\" '{print $2}');
mysqlPass=$(grep pass= < "$HOME/.my.cnf" | awk -F\" '{print $2}');
if grep "host=" "$HOME/.my.cnf" >/dev/null 2>&1; then mysqlHost=$(grep host= < "$HOME/.my.cnf" | awk -F\" '{print $2}');
fi
else
echo "Found no pass line in your .my.cnf,, fix this or specify with --password"
fi
else
echo "Found no user line in your .my.cnf, fix this or specify with --user"
exit 1;
fi
fi # set localhost if no host is set anywhere else
if [[ ! $mysqlHost ]]; then
mysqlHost="127.0.0.1"
fi # error out
if [[ ! $mysqlUser ]]; then
echo "Authentication information not found as arguments, nor in $HOME/.my.cnf"
echo
showHelp
exit 1
fi if [[ ! $mysqlPass ]]; then
echo -n "Enter your MySQL password: "
read -s mysqlPass
fi # Test connecting to the database:
mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" --skip-column-names --batch -e "show status" >/dev/null 2>&1 if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information."; exit 1; fi
# Retrieve the listing of databases: databases=( $(mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" --skip-column-names --batch -e "show databases;" 2>"$log") ); if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information." exit 1; fi
echo -e "Found ${#databases[@]} databases"; for i in ${databases[@]}; do # get a list of all of the tables, grep for MyISAM or InnoDB, and then sort out the fragmented tables with awk fragmented=( $(mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" --skip-column-names --batch -e "SHOW TABLE STATUS FROM $i;" 2>"$log" | awk '{print $1,$2,$10}' | egrep "MyISAM|InnoDB" | awk '$3 > 0' | awk '{print $1}') ); if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information." exit 1; fi tput sc echo -n "Checking $i ... "; if [[ ${#fragmented[@]} -gt 0 ]]; then if [[ ${#fragmented[@]} -gt 0 ]]; then if [[ ${#fragmented[@]} -gt 1 ]]; then echo "found ${#fragmented[@]} fragmented tables." else echo "found ${#fragmented[@]} fragmented table." fi fi for table in ${fragmented[@]}; do let fraggedTables=$fraggedTables+1; echo -ne "\tOptimizing $table ... "; mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" -D "$i" --skip-column-names --batch -e "optimize table $table" 2>"$log" >/dev/null if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information." exit 1; fi echo done done else tput rc tput el fi unset fragmented done
# footer message if [[ ! $fraggedTables -gt 0 ]]; then echo "No tables were fragmented, so no optimizing was done."; else if [[ $fraggedTables -gt 1 ]]; then echo "$fraggedTables tables were fragmented, and were optimized."; else echo "$fraggedTables table was fragmented, and was optimized."; fi fi
if [[ ! -s $log ]]; then rm -f "$log" fi
unset fraggedTables
Link | http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/