今天早上我9点来到公司,想起了昨天的流量监控日报还没有写,打算补上。刚打开服务器21.24.29.60http://21.24.29.60/warning1.php页面。此时的报警信息都还存在。但是昨天值班一夜的顾告诉我cacti登陆不了了。

spacer.gif

故障主要表现在:Login点击不动了。

我登陆服务器检查故障

#df –h   结果显示磁盘已经用了100%了。

然后我检查apache的配置文件

#vi /etc/httpd/conf/httpd.conf

搜索apacheerror_log放在哪里。

#du –sh /etc/httpd/logs发现该文件占用磁盘290G。磁盘一共是378G

然后我清空了所有/etc/httpd/logs下面的文件内容。

之后登陆故障解决。可以成功登陆了。

此时姜在我不知情的情况下reboot了该服务器。接下来问题来了。

Cacti打不开了。连login界面都不见了。

(我已经说过很多遍了,重启linux服务器从来都不能解决问题,只会制造问题,尤其是reboot这种暴力的方式)

接下来解决办法:

#netstat –lntp 发现mysql不在了。

#service mysqld restart 报错如下

spacer.gif

然后。

spacer.gif

发现此时的mysql已经在运行了。

然后检查mysql错误日志:

spacer.gif

130719 10:31:08 [ERROR] /usr/libexec/mysqld:Table './cacti/user_log' is marked as crashed and should be repaired

此时/usr/local/www/cacti/log/cacti.log文件内的错误信息如下:

07/19/2013 10:31:08AM - CMDPHP: Poller[0] ERROR: A DB Exec Failed!, Error:'145', SQL:"INSERTINTO user_log (username,user_id,result,ip,time) VALUES('admin',1,1,'114.240.152.138',NOW())'

该错的意思是/var/lib/mysql/cacti/user_log损坏了。

解决办法:

#myisamchk -c -r /var/lib/mysql/cacti/user_log.MYI 修复该表

此时该错解决了。

但是:

#service mysqld restart 仍然报错如下


spacer.gif

spacer.gif

Cacti的监控也已经失去了。

首先解决mysql的问题。

解决办法:

[root@CCC mysql]# cd /var/lib/mysql/

[root@CCC mysql]# ll

total 20540

drwx------ 2 mysql mysql   12288 Jul 19 10:43 cacti

-rw-rw---- 1 mysql mysql 10485760 Jul 6 10:39 ibdata1

-rw-rw---- 1 mysql mysql  5242880 Jul19 09:42 ib_logfile0

-rw-rw---- 1 mysql mysql  5242880 Jun 8  2012 ib_logfile1

drwx------ 2 mysql mysql    4096 Jun  8  2012 mysql

drwx------ 2 mysql mysql    4096 Jun  8  2012 test

[root@CCC mysql]# tail -f/var/log/mysqld.log

InnoDB: zeros, but did not yet use them inany way. But be careful: do not

InnoDB: remove old data files whichcontain your precious data!

130719 11:06:28 [ERROR] Can't startserver: Bind on TCP/IP port: Address already in use

130719 11:06:28 [ERROR] Do you alreadyhave another mysqld server running on port: 3306 ?

130719 11:06:28 [ERROR] Aborting

130719 11:06:28 [Note]/usr/libexec/mysqld: Shutdown complete

130719 11:06:28  mysqld ended

130719 11:11:22  mysqld ended


注意这一句: Can't startserver: Bind on TCP/IP port: Address already in use


[root@CCC ~]# ps -ef | grep mysqld

root      2202    1  0 11:11 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe--datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock--log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid--user=mysql

mysql     2252  2202 3 11:11 pts/0    00:00:10 /usr/libexec/mysqld --basedir=/usr--datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid--skip-external-locking --socket=/var/lib/mysql/mysql.sock

root      6165   695 0 11:16 pts/4    00:00:00 grep mysqld

我杀掉了占用3306端口的MySQL进程。
#kill -9 2252
然后再
#service mysqld restart
MySQL
恢复正常。。。


下面列出一些网上解决该问题的办法。。

方法1

#/etc/init.d/MySQLd restart

stopping mysql [ok]

Timeout error occurredtrying to start MySQL Daemon.[failure]

  但是这个时候mysql实际上已经起动了,因为用netstat -ln命令去看3306端口已经起动.使用mysql -u root -p password也能连接到数据库.

  解决方法:

  修改/etc/init.d/mysqld.

  在mysql里创建dameon用户,然后再修改/etc/init.d/mysqld.

  具体操作如下:

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

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

# use a user that isallowed to ping mysqld.

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

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

if [ $ret -eq 0 ]; then

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

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

break;

else

sleep 1;

fi

done

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

echo "Timeout erroroccurred trying to start MySQLDaemon."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.现在一些默认帐号已经删除,而且其它帐号已经设置了密码(默认没有设置密码).于是它没有办法连接到mysql. >

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

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

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

下面我给出具体操作

#mysql -u root -p passwd

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

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

vi打开/etc/init.d/mysqld

把下面这行

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

修改为

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

保存,退出.

重新起动mysql

#/etc/init.d/mysqld restart

Stopping MySQL:[OK]

Starting MySQL:[OK]

这样就可以了


方法2

数据库报错Errcode:28,我先是重启了mysqld服务,但等好长一段时间提示:Timeout error occurredtrying to start MySQL Daemon,通过网上查了后,说是空间不足,df -lh 果不其然,删除了一些没用的文件,然后重启mysqld,好了,哈哈


方法3

由于删除了/var/lib/mysql下的mysql-bin.0000xxxxx这些文件,service mysqld start 就报这个错,在网上搜,大多数都是说用netstat查看一下,说是mysql已经启动了,但我这根本就没有启动,有的说是权限问题,我把/etc/init.d/mysqld的权限改成777了,还是启不动,后来搜到了好几页,才找到真正的解决办法,在这里我记录一下,以便大家少走弯路。

解决办法执行这个命令:#/usr/bin/mysql_install_db

(今天又碰到了这个问题,以为还是这个原因,就执行了命令,发现还是没好,最后找到是没有给var/lib/mysql 定义为mysqlmysql的属组!原因是要恢复上次的备份,替换文件的时候没有看属组。看来还是不细心!)

方法3我使用了,但是没有解决问题。。


此时cacti已经不能监控啊。

Google了一些网上说是/usr/local/www/cacti/log/cacti.log文件过大引起的。

#du –sh /usr/local/www/cacti/log/cacti.log

结果是1.5G。然后我保留最后1000行清空该文件。

结果服务器又被姜reboot之后/usr/local/www/cacti/log/cacti.log开始报错啦。

07/19/2013 11:27:25 AM - CMDPHP: Poller[0] ERROR: SQL Assoc Failed!, Error:'145', SQL:"select poller_output.output, poller_output.time, UNIX_TIMESTAMP(poller_output.time) as unix_time, poller_output.local_data_id, poller_item.rrd_path, poller_item.rrd_name, poller_item.rrd_num from (poller_output,poller_item) where (poller_output.local_data_id=poller_item.local_data_id and poller_output.rrd_name=poller_item.rrd_name) LIMIT 10000"

阅读改错发现是poller_output表损坏了。

修复该表

#myisamchk -c -r /var/lib/mysql/cacti/poller_output.MYI

好了。服务器正常运行。。


此次故障总结:

1,要常查看磁盘的占用情况。没事常敲#df –h命令。

2,不要重启服务器,我认为linux从来都不可能靠重启服务器来解决问题。

3,服务器的root密码不要随便透露。

4,遇到问题绝不逃避,而是查看所有有关的错误日志,查看报错信息。基本上只有认真研究错误信息问题就能迎刃而解了。

5,学好英文是决定IT道路的关键啊。要不怕英文,工作中要把英文当母语来看待。

6,此次的故障无非就是错误日志过大造成的。但解决途中却出现了这么多问题还是由于不懂Linux的人喜欢重启服务器引起的。这也是对我的一种锻炼吧。

7,每当服务器出了问题我第一反应是兴奋。太喜欢自己的工作啦!!!