您好,登錄后才能下訂單哦!
AppArmor導(dǎo)致datadir遷移無法啟動(dòng)或初始化失敗該怎么辦,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
【問題描述】:
行為:通過apt-get在一臺(tái)ubuntu的機(jī)子上新裝一個(gè)mysql做本地日志存儲(chǔ),
由于默認(rèn)datadir在/var/lib/mysql下,所以準(zhǔn)備重新初始化datadir:
mysql_install_db --user=mysql --datadir=/data/mysql_data --basedir=/usr
報(bào)錯(cuò)如下:
160902 15:25:41 [Note] /usr/sbin/mysqld (mysqld 5.5.50-0ubuntu0.14.04.1) starting as process 25512 ...
160902 15:25:41 [Warning] Can't create test file /data/mysql_data/10-8-20-62.lower-test
160902 15:25:41 [Warning] Can't create test file /data/mysql_data/10-8-20-62.lower-test
ERROR: 1005 Can't create table 'db' (errno: 13)
160902 15:25:41 [ERROR] Aborting
160902 15:25:41 [Note] /usr/sbin/mysqld: Shutdown complete
Installation of system tables failed! Examine the logs in
/data/mysql_data for more information.
給/data/mysql_data加了對(duì)應(yīng)的權(quán)限,再一次執(zhí)行,報(bào)同樣錯(cuò)。
于是干脆直接將/var/lib/mysql整個(gè)文件夾遷移到/data/mysql_data下,再啟動(dòng)服務(wù):
cp過去之后,修改/etc/mysql/my.cnf中的datadir位置,然后mysqld_safe啟動(dòng),發(fā)現(xiàn)不能啟動(dòng):
mysqld_safe mysqld from pid file /data/mysql_data/mysqld.pid ended
查看錯(cuò)誤日志發(fā)現(xiàn)報(bào)錯(cuò)找不到mysql schema下的plugin.frm文件:
160902 15:26:51 [Note] Plugin 'FEDERATED' is disabled.
/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
160902 15:26:51 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
再次確認(rèn)目錄及文件的權(quán)限,然后確認(rèn)文件的存在之后,啟動(dòng)依然失敗,報(bào)錯(cuò)不變。
【解決方案】:
然后想到Ubuntu和CentOS文件安全策略可能有一些不一樣,然后查到了這樣的東西:(P.S. 公司DB server都是部署在CentOS上的,這次安在Ubuntu是特例)
Ubuntu下默認(rèn)安裝了并存在一個(gè)AppArmor的服務(wù),這個(gè)服務(wù)是用于訪問控制的。
在以apt-get安裝mysql時(shí),個(gè)人猜測可能在AppArmor的配置中限制了訪問限制——
導(dǎo)致mysqld_safe與mysqld進(jìn)程無法讀寫新移植的datadir目錄中的文件,也同樣導(dǎo)致了mysql_install_db無法在對(duì)應(yīng)的mysql schema下創(chuàng)建文件。
解決方法很簡單,通過編輯器打開此文件,并重新讓AppArmor加載最新的配置即可:
vi /etc/apparmor.d/usr.sbin.mysqld
在該usr.sbin.mysqld配置文件中,注釋掉部分目錄(這些目錄是my.cnf中做了修改的):
因?yàn)槲以趍y.cnf中修改了pid-file、socket、datadir、log_error,所以我對(duì)應(yīng)注釋掉了這些目錄:
#/var/log/mysql.log rw,
#/var/log/mysql.err rw,
#/var/lib/mysql/ r,
#/var/lib/mysql/** rwk,
#/var/log/mysql/ r,
#/var/log/mysql/* rw,
#/var/run/mysqld/mysqld.pid rw,
#/var/run/mysqld/mysqld.sock w,
#/run/mysqld/mysqld.pid rw,
當(dāng)然,也可以簡單直接刪掉這些。
并緊接著在其下添加新的datadir目錄(注意以逗號(hào)做結(jié)束符)
/data/mysql_data rw,
最后讓AppArmor重新加載:
# /etc/init.d/apparmor reload
* Reloading AppArmor profiles
Skipping profile in /etc/apparmor.d/disable: usr.sbin.rsyslogd
...done.
再次啟動(dòng)mysqld即可成功。(當(dāng)然重新初始化mysql_install_db也是可以的了)
P.S. 當(dāng)然也可以粗暴地直接停掉apparmor服務(wù)。
看完上述內(nèi)容,你們掌握AppArmor導(dǎo)致datadir遷移無法啟動(dòng)或初始化失敗該怎么辦的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。