【MySQL】AppArmor導致datadir遷移無法啟動&初始化失敗

神諭丶發表於2016-09-02
【問題描述】:
行為:通過apt-get在一臺ubuntu的機子上新裝一個mysql做本地日誌儲存,
由於預設datadir在/var/lib/mysql下,所以準備重新初始化datadir:
  1. mysql_install_db --user=mysql --datadir=/data/mysql_data --basedir=/usr
報錯如下:
  1. 160902 15:25:41 [Note] /usr/sbin/mysqld (mysqld 5.5.50-0ubuntu0.14.04.1) starting as process 25512 ...
  2. 160902 15:25:41 [Warning] Can't create test file /data/mysql_data/10-8-20-62.lower-test
  3. 160902 15:25:41 [Warning] Can't create test file /data/mysql_data/10-8-20-62.lower-test
  4. ERROR: 1005 Can't create table 'db' (errno: 13)
  5. 160902 15:25:41 [ERROR] Aborting
  6. 160902 15:25:41 [Note] /usr/sbin/mysqld: Shutdown complete

  7. Installation of system tables failed! Examine the logs in
  8. /data/mysql_data for more information.
給/data/mysql_data加了對應的許可權,再一次執行,報同樣錯。


於是乾脆直接將/var/lib/mysql整個資料夾遷移到/data/mysql_data下,再啟動服務:

cp過去之後,修改/etc/mysql/my.cnf中的datadir位置,然後mysqld_safe啟動,發現不能啟動:
  1. mysqld_safe mysqld from pid file /data/mysql_data/mysqld.pid ended

檢視錯誤日誌發現報錯找不到mysql schema下的plugin.frm檔案:
  1. 160902 15:26:51 [Note] Plugin 'FEDERATED' is disabled.
  2. /usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
  3. 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載入最新的配置即可:

  1. vi /etc/apparmor.d/usr.sbin.mysqld

在該usr.sbin.mysqld配置檔案中,註釋掉部分目錄(這些目錄是my.cnf中做了修改的):
因為我在my.cnf中修改了pid-file、socket、datadir、log_error,所以我對應註釋掉了這些目錄:
  1. #/var/log/mysql.log rw,
  2. #/var/log/mysql.err rw,
  3. #/var/lib/mysql/ r,
  4. #/var/lib/mysql/** rwk,
  5. #/var/log/mysql/ r,
  6. #/var/log/mysql/* rw,
  7. #/var/run/mysqld/mysqld.pid rw,
  8. #/var/run/mysqld/mysqld.sock w,
  9. #/run/mysqld/mysqld.pid rw,
當然,也可以簡單直接刪掉這些。

並緊接著在其下新增新的datadir目錄(注意以逗號做結束符)
  1. /data/mysql_data rw,

最後讓AppArmor重新載入:
  1. # /etc/init.d/apparmor reload
  2. * Reloading AppArmor profiles
  3. Skipping profile in /etc/apparmor.d/disable: usr.sbin.rsyslogd
  4. ...done.

再次啟動mysqld即可成功。(當然重新初始化mysql_install_db也是可以的了)

P.S. 當然也可以粗暴地直接停掉apparmor服務


參考文件:
https://linux.cn/article-2476-1.html


作者微信公眾號(持續更新)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-2124411/,如需轉載,請註明出處,否則將追究法律責任。

相關文章