由於服務器空間告緊,需要將Ubuntu 10.04下mysql的datadir從默認的/var/lib/mysql移到/usr/local/mysql下,操作如下:
1.修改了/etc/mysql/my.cnf,改為:datadir = /usr/local/mysql
2.cp -a /var/lib/mysql /usr/local/
3./etc/init.d/mysql start
問題出現了,系統報錯了,無法啟動mysql,日志顯示為:Can't find file: "./mysql/plugin.frm'(errno:13)
[ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
但是執行mysql_upgrade時,同樣報錯。
在網上google一圈後,沒有找到解決辦法。
忽然想起,之前在調試mail server時,修改系統默認存儲目錄,需要修改系統的chroot參數,於是決定試下,後面事實證明就是這個原因。這裡把相關步驟記錄下,以備需要的朋友共享之。
修改系統的chroot,需要修改/etc/apparmor.d下的相關文件,這裡以mysql為例,需要修改:usr.sbin.mysqld和abstractions/mysql兩個文件。
1.修改usr.sbin.mysqld裡面的兩行內容:/var/lib/mysql/ r,改為:/usr/local/mysql/ r,/var/lib/mysql/** rwk,改為:/usr/local/mysql/** rwk,
2.修改abstractions/mysql中一行:/var/lib/mysql/mysql.sock rw,改為:/usr/local/mysql/mysql.sock rw,
3.重新加載apparmor服務:/etc/init.d/apparmor reload
這時再啟動mysql就成功了!
啟示:不只是mysql,如果需要修改其他一些系統自帶軟件的存儲目錄,改了配置之後,仍然報錯的話,則可能需要修改相應chroot才行!請參照上面的方法!
關鍵就下面幾點:
1. 找到 mysql 啟動時加載的 Option File(如果有多個,那麼一定是起作用的那一個)。在我的機器上只有一個,是 "/etc/mysql/my.cnf",進去把 datadir 一項的值改成自己指定的目錄。這個不難。
2. 最關鍵的,把原先的數據目錄(默認是 "/var/lib/mysql")裡面的東西都轉移到新的目錄下,而且 !一定! 要保證相關的內容在新的目錄下仍然保持跟原來一樣的用戶和權限設置。用 chown 和 chmod 就能搞定,很簡單。但是如果這步出了差錯,找起來就麻煩了,重新啟動 mysql 的時候只會說連不上,很難發現真正的原因。我是通過 Ubuntu 下的 Package Manager 安裝的 MySQL,安裝之後相關文件和目錄的 user name 和 group name 都是 “mysql”,所以新的 datadir 也要將 owner 設成 mysql,並確保它有合適的權限。
3. 不僅要保證 datadir 的用戶/權限設置正確,如果 datadir 目錄比較深的話,好像跟上面幾級目錄的權限也有關系。總之,要保證用戶 “mysql” 能順利地訪問新的 datadir 的內容,而且要保證所有必要的內容都已被復制到新的 datadir 下面。在 MySQL 裡面,像用戶記錄這種啟動時必需的信息也是以數據庫形式保存的,mysql 在啟動時會加載這些必需的 database,如果相關目錄的權限有問題,或者文件根本不存在,都會啟動失敗。
4. 關於 AppArmor,網上資料說需要把所做的改動通過 profile 文件告訴它,否則 AppArmor 會阻止 mysql 訪問新的文件路徑而導致 mysql 不能運行。以我的經驗來看,好像沒感覺到 AppArmor 的影響。不過保險起見,還是按照網上說的,修改一下它的 profile 文件,在我的機器上是: "/etc/apparmor.d/usr.sbin.mysqld",照著原先 datadir 有關內容的格式,新加幾行:
/my/new/datadir/ r,
/my/new/datadir/** rwk,
5. AppArmor 和 mysql 都需要重啟。重啟的命令是:
sudo /etc/init.d/{apparmor|mysql} stop
sudo /etc/init.d/{apparmor|mysql} start
或者用 service 命令也可以:
sudo service {apparmor|mysql} stop
sudo service {apparmor|mysql} start
---- TroubleShooting:
mysql 的 Error log 文件,在我的機器上是: "/var/log/mysql/error.log",如果出了問題,這裡記錄的是真正的原因。對於終端裡的幾行輸出不用太在意,基本上無論出什麼事都只會說連不上Server,沒什麼用。
作者“無聊pp”