您好,登錄后才能下訂單哦!
AppArmor導致datadir遷移無法啟動或初始化失敗該怎么辦,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
【問題描述】:
行為:通過apt-get在一臺ubuntu的機子上新裝一個mysql做本地日志存儲,
由于默認datadir在/var/lib/mysql下,所以準備重新初始化datadir:
mysql_install_db --user=mysql --datadir=/data/mysql_data --basedir=/usr
報錯如下:
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加了對應的權限,再一次執行,報同樣錯。
于是干脆直接將/var/lib/mysql整個文件夾遷移到/data/mysql_data下,再啟動服務:
cp過去之后,修改/etc/mysql/my.cnf中的datadir位置,然后mysqld_safe啟動,發現不能啟動:
mysqld_safe mysqld from pid file /data/mysql_data/mysqld.pid ended
查看錯誤日志發現報錯找不到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.
再次確認目錄及文件的權限,然后確認文件的存在之后,啟動依然失敗,報錯不變。
【解決方案】:
然后想到Ubuntu和CentOS文件安全策略可能有一些不一樣,然后查到了這樣的東西:(P.S. 公司DB server都是部署在CentOS上的,這次安在Ubuntu是特例)
Ubuntu下默認安裝了并存在一個AppArmor的服務,這個服務是用于訪問控制的。
在以apt-get安裝mysql時,個人猜測可能在AppArmor的配置中限制了訪問限制——
導致mysqld_safe與mysqld進程無法讀寫新移植的datadir目錄中的文件,也同樣導致了mysql_install_db無法在對應的mysql schema下創建文件。
解決方法很簡單,通過編輯器打開此文件,并重新讓AppArmor加載最新的配置即可:
vi /etc/apparmor.d/usr.sbin.mysqld
在該usr.sbin.mysqld配置文件中,注釋掉部分目錄(這些目錄是my.cnf中做了修改的):
因為我在my.cnf中修改了pid-file、socket、datadir、log_error,所以我對應注釋掉了這些目錄:
#/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,
當然,也可以簡單直接刪掉這些。
并緊接著在其下添加新的datadir目錄(注意以逗號做結束符)
/data/mysql_data rw,
最后讓AppArmor重新加載:
# /etc/init.d/apparmor reload
* Reloading AppArmor profiles
Skipping profile in /etc/apparmor.d/disable: usr.sbin.rsyslogd
...done.
再次啟動mysqld即可成功。(當然重新初始化mysql_install_db也是可以的了)
P.S. 當然也可以粗暴地直接停掉apparmor服務。
看完上述內容,你們掌握AppArmor導致datadir遷移無法啟動或初始化失敗該怎么辦的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。