domingo, 27 de mayo de 2012

Problemas con MySQL en CentOS después de la actualización con yum

Este fue el error:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Este fue mi caso: cuando se estaba actualizando CentOS con yum, se encontraron los siguientes errores con los paquetes de mysql:

Updating: mysql-server                                                                                19/47
Stopping mysqld:  [  OK  ]
/usr/bin/mysqlcheck: Got error: 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) when trying to connect
FATAL ERROR: Upgrade failed
Stopping mysqld:  [  OK  ]

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
Stopping mysqld:  [  OK  ]
MySQL Daemon failed to start.
Starting mysqld:  [FAILED]
Non-fatal POSTIN scriptlet failure in rpm package mysql-server-5.5.24-6.el5.art.x86_64
error: %post(mysql-server-5.5.24-6.el5.art.x86_64) scriptlet failed, exit status 1
Updating: php-gd

Esto generó un problema con Plesk Panel (10.x) y obviamente, el servicio de mysqld no arrancaba mostrando el error:

/etc/init.d/mysqld start

MySQL Daemon failed to start.
Starting mysqld:                                           [FAILED]

Obviamente sucedía lo mismo con el alias:

service mysqld start

De igual manera, cualquier conexión que quiera establecer con mysql el error era:

mysql

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Por supuesto, el mismo error se desplegaba en el browser si intentaba acceder al Plesk Panel.

Así que después de ardua investigación, encontré la siguiente solución:

  1. Desde una sesión de ssh console, editar el archivo:
    vi /etc/my.cnf
          
  2. Comentar con # las líneas en este orden, conforme las vayas encontrando:
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    skip-bdb
    pid-file=/var/run/mysqld/mysqld.pid
    skip-bdb
          

  3. Para que el archivo quede así (copiarlo y pegarlo si lo deseas):
    [mysqld]
    local-infile=0
    #datadir=/var/lib/mysql
    #socket=/var/lib/mysql/mysql.sock
    user=mysql
    # Default to using old password format for compatibility with mysql 3.x
    # clients (those using the mysqlclient10 compatibility package).
    old_passwords=1
    # Comentar esta directiva (skip-networking) nos permite conectarnos a la DB de manera remota, 
    # por ejemplo, desde un cliente como Navicat
    # skip-networking
    
    # Disabling symbolic-links is recommended to prevent assorted security risks;
    # to do so, uncomment this line:
    # symbolic-links=0
    
    #skip-bdb
    
    innodb_buffer_pool_size=2M
    innodb_additional_mem_pool_size=500K
    innodb_log_buffer_size=500K
    innodb_thread_concurrency=2
    [mysqld_safe]
    log-error=/var/log/mysqld.log
    #pid-file=/var/run/mysqld/mysqld.pid
    #skip-bdb
    
    innodb_buffer_pool_size=2M
    innodb_additional_mem_pool_size=500K
    innodb_log_buffer_size=500K
    innodb_thread_concurrency=2
          

La razón del porqué esto funciona la encontré en este post:

http://forums.cpanel.net/f354/cant-connect-local-mysql-server-through-socket-var-lib-mysql-mysql-sock-111-a-78444.html#post384445

Uno de los ponentes (http://forums.cpanel.net/members/cpanelkenneth/) dice lo siguiente:

"The basedir directive instructs MySQL where to find everything it needs to function: binaries, libraries, data, etc. Hence by stipulating basedir=/var/lib, MySQL will search /var/lib for everything needed to perform its functions.

For typical installs via RPM, this directive is not needed and should not be used. For a more exhaustive description of this directive, please consult the MySQL manual."

Que en español quiere decir:

"La directiva basedir, le dice a MySQL donde encontrar cada cosa que necesita para funcionar: binarios, librerías, datos, etc. Por lo tanto, estipulando o estableciendo la directiva basedir=/var/lib, MySQL buscará en la ruta /var/lib para cada cosa que necesite para ejecutar sus funciones. Para instalaciones típicas vía RPM, esta directiva no es necesaria y no debería ser usada . Para una más exhaustiva descripción de esta directiva, consultar el manual MySQL."

Qué simple ¿no? Pero para encontrar la solución, me hizo sudar frío…

5 comentarios:

  1. No me ha funcionado... sigo con el problema.. :(

    ResponderEliminar
  2. pues realice lo indicado y me sigue dando fallo al reiniciar mysql, las lineas que comente fueron:
    #pid-file=/var/run/mysqld/mysqld.pid
    #datadir=/var/lib/mysql
    #socket=/var/lib/mysql/mysql.sock

    tienes alguna idea que puede estar pasando.?
    siempre me dice que es el sockey que no lo encuentra

    ResponderEliminar
  3. Funciono!!! Muchas gracias!

    ResponderEliminar
  4. Muchas Gracias, x tu aporte. Funciona!

    ResponderEliminar
  5. Gracias , me salvaste.

    ResponderEliminar

Datos personales

Mi foto
Podrás encontrar códigos recursos y artículos sobre PHP, JavaScript, jQuery, MooTools, Ajax, CSS, HTML, UML, RUP, AUP, XP (eXtreme Programming), Six-Sigma, CMMI, FrameWorks, Zend Framework, Magento, CodeIgniter, CakePHP, Joomla 1.5, Doctrine, Active Record, ORM, POO, MVC, MySql, PostgreSql. Este espacio está destinado a ayudar y compartir un poco de lo mucho que he recibido de la comunidad en la Red.