重启mysql出现了Timeout error occurred trying to start MySQL Daemon的解决办法


转载时请务必以超链接形式标明文章 原始出处和作者信息及本版权声明
链接:http://www.dbasky.net/archives/2009/01/mysqltimeout-error-occurred-trying-to-start-mysql-daemon.html
今天因为对MYSQL数据库就行一些优化操作(删除了一些不用的用户,加强了mysql的安全性),为了使得更好发挥数据库的性能,准备重启下MYSQL服务,这时就出现错误信息:
service mysqld start
Timeout error occurred trying to start MySQL Daemon.  [failure].
可是通过netstat -ntl查看mysql的端口是启动的啊,使用mysql -u root -p password也能连接到数据库。
我查看了mysql的bugzilla和redhat的bugz,发现这是mysql-3.x的一个bug.

是什么原因导致连接超时呢?


我们不妨先看看/etc/init.d/mysqld起动脚本是如何工作的,注意下面的一段

# If you've removed anonymous users, this line must be changed to

        # use a user that is allowed to ping mysqld.

        ping="/usr/bin/mysqladmin -uUNKNOWN_MYSQL_USER ping"

        # Spin for a maximum of ten seconds waiting for the server to come up

        if [ $ret -eq 0 ]; then

            for x in 1 2 3 4 5 6 7 8 9 10; do

            if [ -n "`$ping 2> /dev/null`" ]; then

                    break;

            else

                    sleep 1;

            fi

            done

            if !([ -n "`$ping 2> /dev/null`" ]); then

                    echo "Timeout error occurred trying to start MySQL
Daemon."                    action $"Starting $prog: " /bin/false

            else

                    action $"Starting $prog: " /bin/true

            fi

        else

            action $"Starting $prog: " /bin/false

        fi

        [ $ret -eq 0 ] && touch /var/lock/subsys/mysqld

        return $ret  

 

我们看到,脚本判断mysql是否起动,使用的是mysqladmin ping命令.而这个命令想要正确执行是需要能够登录mysql的.

不妨使用下面的命令测试一下

#mysqladmin -u root -ppassword ping

mysql alive 

 

当你提供了帐号和密码时,它的ping命令就可以正确执行了.

但是RH9到FC3一直使用的是mysql3.x(不过mysql官方好象才推出mysql4.1,FC需要考虑问题性).

于是我用了下面的办法临时解决.

a)建立一个帐号,不设置密码,不给任何权限.

b)修改/etc/init.d/mysqld

下面我给出具体操作

#mysql -u root -p passwd

mysql>GRANT select ON test.* TO soleil@localhost

mysql>revoke select on test.* from soleil@localhost 

 

打开/etc/init.d/mysqld

把下面这行

ping="/usr/bin/mysqladmin -uUNKNOWN_MYSQL_USER ping" 


修改为

ping="/usr/bin/mysqladmin -usoleil ping" 


保存,退出.

重新起动mysql

#/server mysqld restart

Stopping MySQL:                                            [  OK  ]

Starting MySQL:                                            [  OK  ]
 

如果你的第二行仍然是failure的话.再执行下面的命令

#/server mysqld start

这时应该式ok了.

如果这样可以ok的话.

那么你需要修改/etc/init.d/mysqld,

在restart函数的start后面再加一个start就可了.

2.即使刚安装的mysql再起动后,去看日志,给给出下面的这些信息

Cannot initialize InnoDB as 'innodb_data_file_path' is not set.

If you do not want to use transactional InnoDB tables, add a line

skip-innodb

to the [mysqld] section of init parameters in your my.cnf

or my.ini. If you want to use InnoDB tables, add to the [mysqld]

section, for example,

innodb_data_file_path = ibdata1:10M:autoextend

But to get good performance you should adjust for your hardware

the InnoDB startup options listed in section 2 at

http://www.innodb.com/ibman.html 


这是因为默认的数据库起动脚本需要加载innodb数据库,但是mysql在做初始话时并没有初始化时,并没有加载这样的数据库.

因此这里有两种解决办法:使用和不使用innodb.

我们先看不使用innodb的办法.

其实这个方法就是跳过innodb的方法.

在/etc/my.cnf文件的mysqld区域增加一行

skip-innodb就可以了.

如果我们需要使用innodb呢?

那么可在/etc/my.cnf文件的mysqld区域增加下面几行

innodb_data_home_dir = /var/lib/mysql/

innodb_data_file_path = ibdata1:10M:autoextend

innodb_log_group_home_dir = /var/lib/mysql/

innodb_log_arch_dir = /var/lib/mysql/

set-variable = innodb_buffer_pool_size=16M

set-variable = innodb_additional_mem_pool_size=2M

set-variable = innodb_log_file_size=5M

set-variable = innodb_log_buffer_size=8M

innodb_flush_log_at_trx_commit=1

set-variable = innodb_lock_wait_timeout=50
 

保存,退出.重启起动mysql,再去看日志.

应该不会再提示有关innodb的问题了.

发表评论

个人介绍

Xu
Evangelist
Oracle DBA / Blogger
Life@Beijing
Work@睿朗阳光
详细介绍...

按月归档

Close