如何让MySQL(mysqld)创建并写入“/var/run/mysqld”目录?

Gre*_*een 5 filesystem mysql permissions

我真的不明白所有这些特权在 Linux 中是如何工作的。

要启动 MySQL 服务器mysqld程序,必须将其.pid文件写入/var/run/mysqld/目录。但我们从FHS(文件系统层次结构标准)得知:

在启动过程开始时,必须清除(根据需要删除或截断)此目录下的文件。

所以每次MySQL服务器启动时都mysqld 必须在下面创建/mysqld目录。/var/run/

的所有者和组/varroot并且/var是:

drwxr-xr-x  13 root root  4096 may 20 23:41 var.
Run Code Online (Sandbox Code Playgroud)

我们还从 FHS(文件系统层次结构标准)得知:

/var/run 对于非特权用户(root 或运行守护程序的用户)应该是不可写的;如果任何用户可以在该目录中写入,这将是一个主要的安全问题。

所以mysqld无法写入该目录。事实上,当我运行mysqld启动 MySQL 服务器时,我总是收到错误:

user@user-desktop:~$ sudo mysqld --console
130720 23:43:02 [ERROR] Can't start server : Bind on unix socket: Permission denied
130720 23:43:02 [ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ?
130720 23:43:02 [ERROR] Aborting
Run Code Online (Sandbox Code Playgroud)

问题是:如果标准禁止打开该目录进行写入,mysqld如何写入.pid文件?/var/run/mysqld/这是一个明显的矛盾,不是吗?

我的问题是:如何在不更改目录权限的情况mysqld下创建和写入文件?目前我看到唯一的方法:/var/run/mysqld//var/run

user@user-desktop:$ sudo chmod a+w /var
Run Code Online (Sandbox Code Playgroud)

但这是标准所禁止的。

Rin*_*ind 4

/var/run 对于非特权用户来说应该是不可写的,这意味着 root 和 sudo 帐户(因为这些是特权用户)可以对其进行写入。

MySQL 的 upstart 脚本以 root 身份启动,然后可以在/var/run. 该文件是使用配置中设置的权限创建的。这应该是/etc/my.cnf这样

[mysqld]
user   = mysql
socket = /var/lib/mysql/mysql.sock
Run Code Online (Sandbox Code Playgroud)

在安装 MySQL 服务器之后,您应该有与 mysql 相关的内容,/etc/init.d我得到:

在此输入图像描述

您确定没有安装MySQL客户端吗?


jak*_*inn 3

(服务器版本:WSL2 中的 5.7.28-0ubuntu0.18.04.4 (Ubuntu))

Apparmor 保存控制其他文件权限的系统二进制文件。在第一次成功连接到 mysqld 服务器之前,我在“允许 pid、socket、socket 锁定文件访问”下添加了这一行,之后我将其删除,并且仍然可以第二次连接。

~$ sudo nano /etc/apparmor.d/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)
/run/mysqld/*, rwx
Run Code Online (Sandbox Code Playgroud)
~$ sudo service apparmor reload
Run Code Online (Sandbox Code Playgroud)

在此之前,我遇到了一些其他错误...必须更改在安装时自动创建的 /mysqld-files/ 文件夹的所有权和权限。然后将此选项添加到配置文件中,该文件默认设置为 null,这意味着服务器禁用导入和导出操作:

~$ sudo chown <username> /var/lib/mysql-files/ && chmod 750 /var/lib/mysql-files/
~$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Run Code Online (Sandbox Code Playgroud)
secure_file_priv = /var/lib/mysql-files
Run Code Online (Sandbox Code Playgroud)

我还必须添加这个,因为错误然后告诉我:

explicit_defaults_for_timestamp = ON
Run Code Online (Sandbox Code Playgroud)

在 WSL 中,您不必初始化 mysql。发生在安装时(/var/lib/mysql/ 中的初始化内容)。这样我们就可以直接登录了。如果我不在登录命令开头写入 sudo,则“错误 1698 (28000):用户 'root'@'localhost' 的访问被拒绝”:

~$ sudo service mysql start
~$ sudo mysql -u root -p
Enter Password: [just ENTER]
Run Code Online (Sandbox Code Playgroud)

然后最后修复“无目录,使用 HOME=/ 登录”:

~$ sudo service mysql stop
~$ sudo usermod -d /var/lib/mysql/ mysql
Run Code Online (Sandbox Code Playgroud)

ps 在编辑配置文件之前始终复制一份,并更改 std 端口 3306,并搜索手册