【MySQL】AppArmor導致datadir遷移無法啟動&初始化失敗
【問題描述】:
行為:通過apt-get在一臺ubuntu的機子上新裝一個mysql做本地日誌儲存,
由於預設datadir在/var/lib/mysql下,所以準備重新初始化datadir:
報錯如下:
給/data/mysql_data加了對應的許可權,再一次執行,報同樣錯。
於是乾脆直接將/var/lib/mysql整個資料夾遷移到/data/mysql_data下,再啟動服務:
cp過去之後,修改/etc/mysql/my.cnf中的datadir位置,然後mysqld_safe啟動,發現不能啟動:
檢視錯誤日誌發現報錯找不到mysql schema下的plugin.frm檔案:
……………………
再次確認目錄及檔案的許可權,然後確認檔案的存在之後,啟動依然失敗,報錯不變。
……………………
【解決方案】:
然後想到Ubuntu和CentOS檔案安全策略可能有一些不一樣,然後查到了這樣的東西:(P.S. 公司DB server都是部署在CentOS上的,這次安在Ubuntu是特例)
Ubuntu下預設安裝了並存在一個AppArmor的服務,這個服務是用於訪問控制的。
在以apt-get安裝mysql時,個人猜測可能在AppArmor的配置中限制了訪問限制——
導致mysqld_safe與mysqld程式無法讀寫新移植的datadir目錄中的檔案,也同樣導致了mysql_install_db無法在對應的mysql schema下建立檔案。
解決方法很簡單,通過編輯器開啟此檔案,並重新讓AppArmor載入最新的配置即可:
在該usr.sbin.mysqld配置檔案中,註釋掉部分目錄(這些目錄是my.cnf中做了修改的):
因為我在my.cnf中修改了pid-file、socket、datadir、log_error,所以我對應註釋掉了這些目錄:
當然,也可以簡單直接刪掉這些。
並緊接著在其下新增新的datadir目錄(注意以逗號做結束符)
最後讓AppArmor重新載入:
再次啟動mysqld即可成功。(當然重新初始化mysql_install_db也是可以的了)
P.S. 當然也可以粗暴地直接停掉apparmor服務。
參考文件:
https://linux.cn/article-2476-1.html
作者微信公眾號(持續更新)
行為:通過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.
於是乾脆直接將/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服務。
參考文件:
https://linux.cn/article-2476-1.html
作者微信公眾號(持續更新)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-2124411/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sock鎖檔案導致的MySQL啟動失敗MySql
- 由adoacorectl.sh啟動失敗導致網頁無法顯示網頁
- mysql 目錄遷移導致無法找到relay log 解決辦法。MySql
- MySQL啟動失敗MySql
- 錯誤初始化引數導致無法啟動的解決辦法
- Linux主機名修改後導致mysql重啟失敗LinuxMySql
- /tmp檔案系統無許可權導致監聽listener啟動失敗
- RAC oracle 許可權更改導致 實力啟動失敗Oracle
- RAC節點啟動失敗--ASM無法連線ASM
- Electron安裝過程深入解析(讀完此文解決Electron安裝失敗導致的無法啟動,無法打包的問題)
- /etc/fstab的錯誤設定導致系統啟動失敗
- 關於MYSQL 5.6 super_read_only和Event Scheduler衝突導致啟動失敗MySql
- ghost win10無法啟動修復失敗怎麼修復_ghost win10無法啟動修復失敗如何解決Win10
- /dev/bpf裝置缺失導致RAC安裝時HAIP啟動失敗devAI
- 解決hyper v導致docker無法啟動問題Docker
- HA異常導致oracle資料庫無法啟動Oracle資料庫
- LightDB/Postgresql 記錄客戶端啟動版本問題導致啟動失敗問題SQL客戶端
- MongoDB例項重啟失敗探究(大事務Redo導致)MongoDB
- Java ibatis配置問題導致Myeclipse啟動web專案失敗JavaBATEclipseWeb
- Workstation服務無法啟動導致無法訪問檔案伺服器伺服器
- 【GC】無法找到jar命令導致Download方式安裝Agent失敗的處理GCJAR
- MySQL Study之–Mysql啟動失敗“mysql.host”薦MySql
- 歸檔問題導致的資料庫無法啟動資料庫
- 修改SQLNET.ORA導致資料庫無法啟動SQL資料庫
- 解決一次gitlab因異常關機導致啟動失敗Gitlab
- mysql(mariadb)啟動失敗解決方法MySql
- docker啟動失敗Docker
- pl/sql 過程中變數未初始化導致update語句失敗SQL變數
- oracle SGA設定過大導致資料庫無法啟動Oracle資料庫
- jdk版本導致tomcat,eclipse無法啟動的問題JDKTomcatEclipse
- MySQL服務名無效或者MySQL正在啟動 MySQL無法啟動MySql
- Filestream/Windows Share導致Alwayson Failover失敗WindowsAI
- 神奇的DEBUG:因為異常導致MongoDB容器無法啟動MongoDB
- 開啟 Keep-Alive 可能會導致http 請求偶發失敗Keep-AliveHTTP
- mysql臨時表空間不夠導致主從複製失敗MySql
- FAQ系列|列型別被自動修改導致複製失敗型別
- mongoDB因root啟動關閉資料庫導致mongo普通使用者無法啟動MongoDB資料庫
- Windows10系統更新失敗無法啟動出現黑屏如何解決Windows