查找数据库无法启动原因
2018-11-06
Moodle是一个开源网络课程平台,我们的网络课程在这个平台上运行多年一直比较稳定。平台环境是Ubuntu14.04+Apache+ Mysql+PHP。但最近网络课堂却不能启动。
登录网络课程时,有时平台提示“读取数据库时发生错误”,有时提示“表‘context’”不存在,有时出 现“Error: Database connection failed, It is possible that the database is overloaded or otherwise not running properly. The site administrator should also check that the database details have been correctly specified in config.php”。不同故障的提示均说明Moodle课程数据库连接出错。
故障排查
1.根据系统提示,可能是数据表损坏或删除或数据库系统连接出错。用数据库管理工具phpmyadmin连接数据库,输入用户名和密码,密码框出现重置现象,就是密码变为空,没有任何提示,也没有密码错误的提示。
根据经验,重启网络课程的服务器可能有用,但重启网络课程服务器后故障依旧。这样,应该重点检查数据库。
2.检查数据库连接情况
(1)检查数据库MySQL是否正常启动。
远程登录网络课程服务器,输入命令mysql登录 数 据 库,出 现“ERROR 2001(HY000):Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’(2)”提示。
输入 mysql-u root -p,输入数据密码后,仍然出现一样的提示,不能连接到本地MySQL数据库服务器。
输入命令/etc/init.d/mysql status查看数据库状态,提示“ * MySQL is stopped.”。
既然数据库服务已经停止,输入/etc/init.d/mysql start启动数据库,提示:“ERROR: The partition with /var/lib/mysql is too full!”,显示 /var/lib/mysql所在分区太满了。
用显示磁盘相关信息的命令“df -h”查询,显示/dev/sda1已用100%,其挂载点为“/”根目录。用命令“ls/”查看根目录“/”下有哪些内容,发现有一个“home”目录,这是Linux中存放用户数据的目录。用“du -h /home”查看home目录下的文件大小,home/moodledata目录为21GB,而moodledata是moodle课程中用户保存课程数据的地方,这说明moodledata数据量过大从而造成磁盘空间不足。
(2)Moodle 服务器安装了四块300GB高速硬盘,RAID类型为 10,磁盘容量约600GB。但 命 令“df -h”显示只有“/dev/sda1”一个磁盘设备,约28GB磁盘容量,说明还有硬盘未被使用。目前要查清楚当前磁盘使用状况。
用“sudo vgdisplay”命令来查看磁盘使用情况,VG Size为473GB,说明还有硬盘空间。
用命令“df -ahT”查看目前文件系统的使用情况及文件系统类型(如图1),/dev/sda1是ext4,不见其他设备名。
用磁盘分区命令“Fdisk/dev/sda”查看磁盘情况(如图2),显示存在一个设备名为“/dev/sda6”的磁盘分区,据此判断磁盘“/dev/sda6”目前处于闲置状态。
图1 用命令“df -ahT”来查看目前文件系统的使用情况及文件系统类型
图2 用磁盘分区命令“Fdisk /dev/sda”来查看磁盘情况
3.问题原因
通过以上操作可分析得出结论:整个磁盘系统划分了四个磁盘分区,/dev/sda1为Linux系统分区,/dev/sda2为扩展磁盘,其中“/dev/sda5”为Linux swap分区,“dev/sda6”为逻辑磁盘分区LVM,但这个磁盘分区未挂载任何目录,以至于该磁盘处于空闲状态。如果Moodle是默认安装,用户目录moodledata也将安装在Linux系统分区中,随着使用时间的延长,用户数据逐渐占满Linux磁盘分区,最终造成Moodle课堂不能连接数据库。
故障解决
将/home下的所有内容移动到/dev/sda6中,空出/dev/sda1的空间,使数据库不会因为磁盘空间太满而造成无法启动故障。
1.将/home及其下的所有内容移动到/dev/sda6分区中的方法如下:
首先在/mnt下面新建一个home文件夹 :sudo mkdir home。
将新建的/mnt/home挂载 到 /dev/sda6:mount /dev/sda6 /mnt/home。
将/home下的所有文件复制到/mnt/home下:cp-a/home/* /mnt/home/。
将/home下的所有东西删除 :rm -rf /home/*。
将/dev/sda6卸载:sudo umount /dev/sda6。
手动将/dev/sda6挂载到 /home下 : Mount /dev/sda6 /home。
用命令“df -lh”来检查磁盘挂载情况,显示文件系统/dev/sda6容量为467GB,已 用 23GB,可用 421GB,已用5%,挂载点为/home。
从提示中可以看出,磁盘/dev/sda6已经挂载到/home。
试运行Moodle看是否正常http://www.exuekt.com,登录课堂后,一切正常。
2.设置开机挂载
一般情况下,如果再次开机,就会发现之前已经挂载的磁盘必须手动再次挂载一次,为了开机自动挂载磁盘/dev/sda6,需要手动配置一下 /etc/fstab文件。
用 命 令“sudo blkid”查看磁盘分区/dev/sda6的 UUID。 用 命 令“Vim /etc/fstab”在fstab中 增加/dev/sda6磁盘的挂载信息,将/dev/sda6的UUID和类型参如图3格式写入fstab。
重启Moodle网络课程服务器,能正常登录课程,没有任何问题,至此,问题得到解决。
经验总结
1.问题成因
图3 编辑“/etc/fstab”示例
因为安装Moodle时是默认安装,造成Linux系统文件与数据库管理系统和用户目录文件moodledata在同一磁盘分区,随着用户数据的增加,该磁盘剩余空间逐渐减小,最终耗尽,造成MySQL数据库不能启动,从而影响网络课程的使用。
2.经验教训
安装Moodle时不能用默认安装,最好对磁盘进行分区处理,可以划分为BOOT分区,/根分区,/var分区,/tmp分区,将剩余空间全部划分为/usr或/home分区,而且特别要注意将Moodle用户目录moodledata放在最大磁盘分区中,以避免本案例中可能出现的数据库不能启动问题的出现。
要设置Moodle课程的计划任务cron及时备份课程,或者是手动定时备份课程,以防止出现意外,造成数据丢失且不能恢复数据的重大损失。
3.本案例中所涉及的知识点
(1) 如 何在Linux下操作数据库:
MySQL数据库的启动:
service mysql start或/etc/init.d/mysql start
MySQL数据库的停止:service mysql stop或 /etc/init.d/mysql stop
MySQL数据库的重启:
service mysql restart或 /etc/init.d/mysql restart
MySQL数据库的状态:service mysql status 或/etc/init.d/mysql status
(2)Linux下有关磁盘的操作
显示文件及目录:ls
显示磁盘分区上的可使用的磁盘空间:df
查看文件和目录磁盘使用的空间:du
显示磁盘分区表:输入fdisk命令后,输入p,以显示磁盘分区情况。
加载文件系统到指定的加载点 :mount。
注意,如果重启后挂载仍然要生效,必须修改fstab。