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網絡課程服務器,能正常登錄課程,沒有任何問題,至此,問題得到解決。

圖3 編輯“/etc/fstab”示例
因為安裝Moodle時是默認安裝,造成Linux系統文件與數據庫管理系統和用戶目錄文件moodledata在同一磁盤分區,隨著用戶數據的增加,該磁盤剩余空間逐漸減小,最終耗盡,造成MySQL數據庫不能啟動,從而影響網絡課程的使用。
安裝Moodle時不能用默認安裝,最好對磁盤進行分區處理,可以劃分為BOOT分區,/根分區,/var分區,/tmp分區,將剩余空間全部劃分為/usr或/home分區,而且特別要注意將Moodle用戶目錄moodledata放在最大磁盤分區中,以避免本案例中可能出現的數據庫不能啟動問題的出現。
要設置Moodle課程的計劃任務cron及時備份課程,或者是手動定時備份課程,以防止出現意外,造成數據丟失且不能恢復數據的重大損失。
(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。