|
我写这片文章的目的不是想告诉朋友们如何解决这个问题,而是想提示新手们如何分析一个陌生的问题,并主动解决问题。
问题发现:
我装的是fedora core 3,平时只是写点C代码,从来没玩过mysql服务器。可毕业设计要用到mysql,于是不得不在linux配置一个,运行的很好。但是当我给mysql的root用户(刚知道他和系统root用户是两回事)添加的密码后,却发现了问题如下:
1.service mysqld start 非常慢,十秒后提示
------------------------------------------------------------------------------------
Timeout error occurred trying to start MySQL Daemon.
Starting MySQL: [FAILED]
------------------------------------------------------------------------------------
2.但是mysql服务器程序却起动正常,因为客户端可以连接到服务器并对数据进行操作。
3.service mysqld stop正常
问题分析:
从上述三个现象来看,我认为问题出在系统的/etc/rc.d/init.d/mysqld脚本(mysql启动脚本)中的start()函数部分,且问题不严重。于是我把解决问题的突破口定在/etc/rc.d/init.d/mysqld这个文件上。
现在,到google狂搜固然有帮助,但不如先看看/etc/rc.d/init.d/mysqld再说,start()函数部分列在下面:
-------------------------------------------------------------------------------------------------------
start(){
touch /var/log/mysqld.log
chown mysql:mysql /var/log/mysqld.log
chmod 0640 /var/log/mysqld.log
###上面三行不至于让我等10秒
if [ ! -d $datadir/mysql ] ; then
action $"Initializing MySQL database: " /usr/bin/mysql_install_db
ret=$?
chown -R mysql:mysql $datadir
if [ $ret -ne 0 ] ; then
return $ret;
fi
fi
###那"Initializing MySQL database: "只在第一次运行mysql服务器时见过,固排除
chown -R mysql:mysql $datadir
chmod 0755 $datadir
/usr/bin/safe_mysqld --defaults-file=/etc/my.cnf >/dev/null 2>&1 &
ret=$?
###哦!上面两行起动了服务器,难道是这里有问题?于是我在确保服务器关闭的前提下运
###行
### #/usr/bin/safe_mysqld --defaults-file=/etc/my.cnf
###结果发现服务器正常启动,并可登陆,固排除
# 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"
###我感觉,给root加上密码与上文可能有联系,问题似乎找到了
# 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;###呵呵,就是在这里睡了10秒的,好,上面就是问题所在
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
}
----------------------------------------------------------------------------------------------
通过分析,可以肯定这个命令
/usr/bin/mysqladmin -uUNKNOWN_MYSQL_USER ping
有问题。脚本里对它的说明指出要把UNKNOWN_MYSQL_USER改成一个有mysql ping权利的用户。可我还不会建立mysql用户,现在到了求救的时候了。
问题解决:
打开google搜索相关内容,我在国外一个网站得知此问题还与selinux有关,但我已经关闭了selinux,固然与我无关。最后,我在网上查到了有关建立mysql帐户和权限的配置相关内容,为我的mysql服务器创建了一个据有ping权利的mysql用户"usr_ping",过程如下:
(已经启动服务器)
#mysql --user=root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.58
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>grant process on *.* to 'usr_ping'@'localhost';###注意
Query OK, 0 rows affected (0.04 sec)
mysql>quit
Bye
这一部是建立用户usr_ping,我允许他在我的机器上拥有process权利,即允许之查询服务器状态,除此之外用户usr_ping什么都不能做(为了安全)。
然后就是编辑/etc/rc.d/init.d/mysqld文件的
ping="/usr/bin/mysqladmin -uUNKNOWN_MYSQL_USER ping"
改为
ping="/usr/bin/mysqladmin -u usr_ping ping"
(我没有给usr_ping创建密码,如果创建了,则应改成
ping="/usr/bin/mysqladmin -u usr_ping ping -p"
但这样,每次启动mysql时似乎就要输入密码了
)
保存后,重启mysql:
# service mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]
呵呵,问题解决了。 |
|