无法在Ubuntu 16.04中更改MySQL 5.7的错误日志位置

每当我更改日志位置

form: / var / log / mysql to: / var / www

为了将每个日志文件保存在mysqld.cnf mysql服务器的同一个地方(就在公共文件夹下),无法重启。

/etc/mysql/mysql.conf.d/mysqld.cnf

log_error = /var/log/mysql/mysql_errors.log

我检查了一些解决方案,并补充说:

character-set-server = utf8

collat​​ion-server = utf8_general_ci

但仍然没有奏效。 / var / www具有770权限,属于www-data组。

我将mysql添加到www-data组:

sudo usermod -aG www-data mysql

但仍然没有奏效。

MySQL:5.7.19

Ubuntu:16.04.1

这是错误日志:

mysql.service的作业失败,因为控制进程退出并显示错误代码。 有关详细信息,请参阅“systemctl status mysql.service”和“journalctl -xe”。

mysql.service:退出主进程,代码=退出,状态= 1 / FAILURE

每当我撤消日志位置更改时,它都会开始工作。


编辑31.07.2017

我在日志位置更改后运行此命令:

sudo touch /var/www/mysql_errors.log sudo chown mysql:mysql /var/www/mysql_errors.log sudo chmod 770 /var/www/mysql_errors.log sudo systemctl restart mysql sudo journalctl -xe > ~/journal.txt 

以下是相关的日志实体:

 -- Unit mysql.service has begun starting up. Jul 31 00:33:55 mydomain.com audit[1738]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/proc/1738/status" pid=1738 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=112 ouid=112 Jul 31 00:33:55 mydomain.com audit[1738]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/var/www/mysql_errors.log" pid=1738 comm="mysqld" requested_mask="ac" denied_mask="ac" fsuid=112 ouid=112 Jul 31 00:33:55 mydomain.com audit[1738]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" Jul 31 00:33:55 mydomain.com systemd[1]: mysql.service: Main process exited, code=exited, status=1/FAILURE 

现在基于您提供的链接以及有关AppArmorMysql之间关系的另一个资源,我能够使其工作。 管理mysql的策略是从这个位置/usr/sbin/mysqld加载的,你可以在运行时看到: sudo aa-status 。 这可以改为:

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

 /etc/apparmor.d/local/usr.sbin.mysqld 

我会改变后者。

脚步:

  1. 我创建了一个文件夹/var/www/html/mysql并在其中放置了一个文件( error.log )。 我相信mysql会寻找这样的文件。 现在这是我的自定义日志位置。

  2. 打开/etc/appparmor.d/local/usr.sbin.mysqld并添加以下行:

     /var/www/html/mysql/ r, /var/www/html/mysql/** rwk, 
    • 解释:
      • /var/www/html/mysql/ r, – >给予mysql对该文件夹的读访问权限。
      • /var/www/html/mysql/** rwk, – >给mysql读取,写入和锁定对那里内容的访问。
  3. 打开/etc/mysql/mysql.conf.d/mysqld.cnf并将日志位置更改为:

     #log_error = /var/log/mysql/error.log log_error = /var/www/html/mysql/error.log 
  4. 现在重启apparmorsudo systemctl restart apparmor

  5. 现在重启mysqlsudo systemctl restart mysql

注意:

  1. 我将用户: /var/www/html组设置为$USER:www-data以及权限:
    • 用户:rwx,
    • 组:rwx,和
    • 其他人:rx
  2. mysql用户添加到www-data组:

     sudo usermod -a -G www-data mysql 

理论:

Apparmor是Ubuntu确保对谁访问文件系统及其完成方式进行细粒度控制的方法。 它有两种模式,强制和抱怨模式。 强制模式是mysql所处的位置(看看这些运行sudo aa-status )。

您可以将mysql更改为complain mode ,其中apparmor只会抱怨但不会阻止mysql访问文件系统的其他区域。 在这种情况下,我选择enforce mode ,只需更改mysqlapparmor策略要更改这些apparmor模式,你必须安装apparmor-utils然后你可以只做sudo aa-complain /usr/sbin/mysqldapparmor现在只会抱怨关于mysql文件系统违规。

两个位置用于更改策略,这些位置是(1) /etc/apparmor.d/usr.sbin.mysqld和(2) /etc/appamrmor.d/local/usr/sbin/mysqld 。 选择哪个将取决于所需的更改类型(网络范围或特定于机器)。 所以改变你的计划。

资源(请看这些):

https://blogs.oracle.com/jsmyth/apparmor-and-mysql

https://blogs.oracle.com/jsmyth/selinux-and-mysql