MySQL移動數據目錄出現權限問題


MySQL移動數據目錄出現權限問題

環境: ubuntu 14.04.4 LTS

現象

今天把/var/lib/mysql下的數據文件移動到其他目錄下,之后發現啟動mysql報錯,並且mysql無法運行。具體的操作如下

# service mysql stop
# mv /var/lib/mysql /data
# serivce mysql start

報出的錯誤信息為:

170425  9:55:36 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
170425  9:55:36 [Note] Plugin 'FEDERATED' is disabled.
/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
170425  9:55:36 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
170425  9:55:36 InnoDB: The InnoDB memory heap is disabled
170425  9:55:36 InnoDB: Mutexes and rw_locks use GCC atomic builtins
170425  9:55:36 InnoDB: Compressed tables use zlib 1.2.8
170425  9:55:36 InnoDB: Using Linux native AIO
170425  9:55:36 InnoDB: Initializing buffer pool, size = 128.0M
170425  9:55:36 InnoDB: Completed initialization of buffer pool
170425  9:55:36  InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Cannot continue operation.

原因

最初以為是簡單的權限問題,就把/data/mysql目錄賦權給mysql用戶

# chown -R mysql:mysql /data/mysql

但是再次啟動mysql后,還是遇到同樣的錯誤。上網查了一下,原因是由於現今的Linux系統都采用AppArmor來限制文件和目錄的執行權限。

解決辦法

所以需要配置AppArmor讓mysqld可以訪問/data/mysql目錄。具體操作如下:

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

在此文件末尾增加你的目錄(可以按照/var/lib/mysql的目錄改)

/usr/sbin/mysqld {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/user-tmp>
  #include <abstractions/mysql>
  #include <abstractions/winbind>

  capability dac_override,
  capability sys_resource,
  capability setgid,
  capability setuid,

  network tcp,

  /etc/hosts.allow r,
  /etc/hosts.deny r,

  /etc/mysql/*.pem r,
  /etc/mysql/conf.d/ r,
  /etc/mysql/conf.d/* r,
  /etc/mysql/*.cnf r,
  /usr/lib/mysql/plugin/ r,
  /usr/lib/mysql/plugin/*.so* mr,
  /usr/sbin/mysqld mr,
  /usr/share/mysql/** r,
  /var/log/mysql.log rw,
  /var/log/mysql.err rw,
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
  /var/lib/mysql-files/ r,
  /var/lib/mysql-files/** 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,
  /run/mysqld/mysqld.sock w,

  /sys/devices/system/cpu/ r,
  # Site-specific additions and overrides. See local/README for details.
  #include <local/usr.sbin.mysqld>
  /data/mysql/ r,
  /data/mysql/** rwk,
}

如果不寫第一句的/data/mysql/ r,則mysql能啟動,但是進入mysql后輸入命令會提示下面錯誤:

ERROR 1018 (HY000): Can't read dir of '.' (errno: 13

@完


參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM