Friday, October 19, 2012

Bash Scripts no corren en crontab pero si manualmente desde el Command Line.

Pues llevo desde las 8 de la mañana tratando de decifrar porque unos scripts corren bien desde el command line pero dan error desde el crontab.

Primero verifica que el script tenga permisos de ejecución. Si los tiene puede que sea lo siguiente.

Los scripts que se ejecutan desde el crontab corren en un subshell que NO hereda los valores de tus environmental variables. Lo que significa que la variable $PATH de ese subshell solamente mira a "/usr/bin:/bin:" por lo que si estas corriendo una aplicación que depende del path de java (como en mi caso) nunca va a ejecutarse.

Esto se corrige de la siguiente manera.

1. Desde el command line buscamos el valor de la variable $PATH
# echo $PATH
PATH=/usr/lib64/qt-3.3/bin:/usr/NX/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/java
2. Ahora editamos el crontab, copiamos el valor de la variable PATH y lo pegamos en la primera linea.

[root@server test]# crontab -e
PATH=/usr/lib64/qt-3.3/bin:/usr/NX/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/java

#Automatic Jobs
34 10 * * * /opt/Test.sh > /opt/Job.log
01 4 * * * /opt/Test2.sh > /opt/Test.log
De esta manera nos estamos asegurando que todos los cronjobs que se corran tengan el $PATH definido.

Ya terminamos, guarda el archivo y ya está! Haz una prueba!

Thursday, October 18, 2012

Como hacer una reinstalación fresca de MySQL en RedHat6.

Tan reciente como hoy por razones ajenas a mi voluntad tuve que volver a reinstalar MySQL en uno de mis servidores. Y luego de 3 horas de buscar aquí y allá finalmente tengo MySQL corriendo nuevamente. 

**PRECAUCION**
En mi caso yo estaba en un ambiente de pruebas y no me importaba la data en las bases de datos. Si tiene data importante y esta en un ambiente de producción le recomiendo NO seguir esta guía y y que busque otra manera de reestrablecer su MySQL. Queda advertido.


1. Nos logueamos como root, bajamos el servicio de MySQL y desinstalamos todo lo que tenga q ver con el.


# service mysqld stop
# yum remove mysql*         

2. Borramos el archivo /var/lib/mysql (directorio default de la instalación) y /etc/my.cnf. 


# rm -rf /var/lib/mysql  
# rm /etc/my.cnf

Vamos al home folder de root y con el comando ls -a buscamos entre los hidden files alguno que se llame .my.conf o .mysql_history y lo borramos. 


# ls -a
.                .bash_profile  install.log         .tcshrc
..               .bashrc        install.log.syslog  .viminfo
anaconda-ks.cfg  .cshrc         .mysql_history      .Xauthority
.bash_history    .dbus          .pki                xorg.conf.new
.bash_logout     .gconf         .ssh
# rm .mysql_history
3. Ya hemos desinstalado MySQL efectivamente, ahora tenemos que instalarlo denuevo. 

# yum groupinstall mysql  
Ya MySQL debe haberse instalado en su default folder '/var/lib/mysql'. 

4. Para  asegurarnos que el folder de MySQL tenga los permisos correctos ejecutamos este comando.

# chown -R mysql:mysql /var/lib/mysql/*  
5. Tenemos que crear el archivo de configuracion My.cnf de MySQL en /etc/. Puede utilizar su editor favorito.

# vim /etc/my.cnf 

[client]
port=3306
socket=/var/lib/mysql/mysql.sock

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
port=3306
Guarde el archivo.

6. Comienze el servicio con el comando service mysqld start.


Posibles Situaciones

Basado en lo que me paso a mi el servicio de MySQL no me subio por varios errores. Puede encontrar descripción detallada de cualquier error con que se tope en un archivo llamado  $HOSTNAME.err dentro de /var/lib/mysql/

1.El servicio de MySQL subió pero no me pertmitía logearme como root.

2.En $HOSTNAME.err me salía - Error: Can't find file: './mysql/users.frm' (errno: 13)

Esto es un error de permisología. Asegurese que haya corrido este comando.
# chown -R mysql:mysql /var/lib/mysql/*  

3. El archivo de /var/lib/mysql esta vacío luego de reinstalarlo.

A mi entender esto es causado a algún archivo de MySQL que no se borró antes de reinstalar. En mi caso no sabía de la existencia del archivo .mysql_history en el home folder del usuario, en cuanto lo borre y reinstalé todo salió bien.

Ya saben, si en algo me necesitan arreglenselas como puedan!

Como cambiar el password de root de MySQL en RHEL6 si lo olvidó.

El password de root a nadie le importa hasta el dia que todo el mundo lo necesita. Aqui te voy a enseñar como cambiar el password de root de MySQL.

1. Primero paramos el servicio de MySQL.

# service mysqld stop

2. Luego ejecutamos este comando para que MySQL entre en un modo que nos permita acceso como root sin  la necesidad de un password.


# mysqld_safe --skip-grant-tables &

Este comando automáticamente subirá el servicio de MySQL.

3. Nos logeamos a MySQL

# mysqld -u root

Verás que te permitirá la entrada a la base de datos sin necesidad de un password.

4. Cambiamos el password de root con los siquientes comandos.

mysql> use mysql;
mysql> update user set password=PASSWORD("NUEVOPASSWORDAQUI") where User='root';
mysql> flush privileges;
mysql> quit;

5. Paramos el servicio de MySQL para salir de este modo inseguro.

# service mysqld stop


6. Iniciamos el servicio de MySQL e intentamos logearnos con el nuevo password.


# service mysqld start
# mysql -u root -p
# Enter password: XXXXX
# Welcome to the MySQL monitor.  Commands end with ; or \g.
# Your MySQL connection id is 10
# Server version: 5.1.61 Source distribution
#
# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
#
# Oracle is a registered trademark of Oracle Corporation and/or its
# affiliates. Other names may be trademarks of their respective
# owners.
#
# Type 'help;' or '\h' for help. Type '\c' to clear the current input  
# statement.
#
# mysql>

Ya estamos dentro!

Wednesday, October 17, 2012

Como mover la instalación de MySQL a otro path que no sea el default en Linux.


Por X o Y razón quieren mover las bases de datos de MySQL del lugar default donde se instala, usualmente /var/lib/mysql. En mi caso fue para distribuir la carga de procesamiento del OS y la base de datos en discos diferentes. Lleve a cabo este proceso en RedHat 6.0 (RHEL6).

Recomendación: a menos que sea un prerequisito específico para un software trata de instalar la versión de MySQL que provee 'yum'. Te vas a evitar un montón de problemas de dependencies. 

A este momento ya debes haber instalado MySQL.

1. En el terminal escribe mysqlshow -u root -p aprieta enter y pon el password de root de mysql. Eso desplegara las bases de datos que MySQL instala por default y confirmarás que la instalación fue exitosa y que el servicio esta arriba.

# mysqlshow -u root -p
Enter password: *******
+--------------------+
|     Databases      |
+--------------------+
| information_schema |
| mysql              |
| test               |
| wikidb             |
+--------------------+

2.  Ahora necesitamos parar el servicio de MySQL para poderlo mover. Utiliza el comando service mysqld stop . 
# service mysqld stop
Stopping MySQL:                                            [  OK  ]

 3. Vamos a crear el directorio donde queremos mover la instalación. (El argumento -p crea los directorios "padres" si no existen")
# mkdir -p /opt/mysql

 4. Ahora copiamos el contenido del folder actual de MySQL al directorio nuevo.
# cp -R /var/lib/mysql/* /opt/mysql/

 5. Le cambiamos el dueño al archivo nuevo y a todo su contenido
# chown -R mysql:mysql /opt/mysql

6. Ya tenemos la instalación en otro lugar. Pero ahora necesitamos decirle MySQL que su ubicación ha cambiado. Hay que modificar nuestro archivo my.cnf. Este archivo le hace overwrite a los valores por default de MySQL y se encuentra en /etc/my.cnf. Si lo buscas y no esta puedes crearlo con tu editor favorito (vi, vim ect...). El contenido de este archivo (minimo) debe ser el siguiente:

[client]
port=3306
socket=/opt/mysql/mysql.sock

[mysqld]
datadir=/opt/mysql
socket=/opt/mysql/mysql.sock
port=3306

#Esto de innodb es opcional y lo voy a explicar mas abajo
innodb_file_per_table

Aqui estamos diciendole al MySQL que le puerto por el cual el cliente se va a estar conectando sera 3306, el path donde esta el socket para la comunicación y donde se encuentra el directorio nuevo. Graba el archivo.

*innodb_file_per_table: Mientras vas creando y borrando bases de datos y tablas MySQL va llenando un archivo que se llama ibdata1 (dentro del archivo de mysql). Este archivo puede llegar a tener GBs de data guardada y no hay manera de limpiarlo (ni aunque dropees la base de datos).  Esta opción lo que hace es que en vez almacenar toda la data de las tablas/DBs creadas en un solo archivo, hace un archivo por cada una de las tablas que creas y a la hora de que borres la tabla el archivo tambien se va. Esto es opcional pero vale la pena mencionarselos porque si ese archivo crece demasiado para limpiarlo vas a tener q hacer un dump de todas las bases de datos, borrar ese archivo y restaurar del dump que hicistes. 

7. Ahora tenemos que correr un comando para cambiar los permisos del archivo nuevo de MySQL y que SELinux nos permita correrlo.
semanage fcontext -a -t mysqld_db_t "/opt/mysql(/.*)?"
*Si no tienes semanage instalado 'yum whatprovides /usr/sbin/semanage' te dira que paquete debes instalar.

8. Ahora hay que reestablecer el mapping de SELinux con este comando.
restorecon -R -v /opt/mysql
9. Ya con esto estamos ready, asi que subimos el servicio de MySQL con el comando service mysqld start
# service mysqld start
Starting MySQL:                                            [  OK  ]


Si no sube verifica que en /opt/mysql/ exista el mysql.sock. Si no existe corre los siguientes comandos estando en el directorio de mysql e intenta subir el servicio denuevo.
# touch mysql.sock
# chown mysql:mysql mysql.sock
    


Si tienen problemas pueden preguntarme, puede que no sepa la respuesta pero si estoy disponible le ayudaré a buscar la contestación