![如何让MySQL(mysqld)创建并写入“/var/run/mysqld”目录?](https://linux22.com/image/968502/%E5%A6%82%E4%BD%95%E8%AE%A9MySQL%EF%BC%88mysqld%EF%BC%89%E5%88%9B%E5%BB%BA%E5%B9%B6%E5%86%99%E5%85%A5%E2%80%9C%2Fvar%2Frun%2Fmysqld%E2%80%9D%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
我真的不明白 Linux 中所有这些权限是如何运作的。
要启动 MySQL 服务器mysqld
程序,必须将其.pid
文件写入/var/run/mysqld/
目录。但我们知道FHS(文件系统层次标准)那:
在启动过程开始时,必须清除(根据需要删除或截断)此目录下的文件。
所以mysqld
不得不在以下位置创建/mysqld
目录/var/run/
每次MySQL 服务器已启动。
的所有者和组/var
是root
并且/var
是:
drwxr-xr-x 13 root root 4096 may 20 23:41 var.
我们还从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
问题是:如果标准禁止打开此目录进行写入,那么如何mysqld
写入.pid
文件/var/run/mysqld/
?这显然是矛盾的,不是吗?
我的问题是:如何在不改变目录权限的情况mysqld
下创建和写入文件?目前我看到的唯一方法:/var/run/mysqld/
/var/run
user@user-desktop:$ sudo chmod a+w /var
但标准禁止这样做。
答案1
/var/run 对于非特权用户来说应该是不可写的意味着允许 root 和 sudo 帐户(因为这些是特权用户)对其进行写入。
MySQL 的 upstart 脚本以 root 身份启动,然后允许在 中创建文件或目录/var/run
。并且此文件使用配置中设置的权限创建。这应该是/etc/my.cnf
,它将具有类似这样的:
[mysqld]
user = mysql
socket = /var/lib/mysql/mysql.sock
/etc/init.d
安装 MySQL 服务器后,您应该会发现一些与 mysql 相关的东西,我得到了以下信息:
您确定没有安装 MySQL 客户端吗?
答案2
(服务器版本:WSL2 中的 5.7.28-0ubuntu0.18.04.4(Ubuntu))
Apparmor 保存着控制其他文件权限的系统二进制文件。在第一次成功连接到 mysqld 服务器之前,我在“允许 pid、套接字、套接字锁定文件访问”下添加了此行,之后我将其删除,但仍然可以再次连接。
~$ sudo nano /etc/apparmor.d/usr.sbin.mysqld
/run/mysqld/*, rwx
~$ sudo service apparmor reload
在此之前,我遇到了其他一些错误...必须更改安装时自动创建的 /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
secure_file_priv = /var/lib/mysql-files
此外,我还必须添加这一点,因为错误告诉我:
explicit_defaults_for_timestamp = ON
在 WSL 中,您不必初始化 mysql。在安装时发生(/var/lib/mysql/ 中的初始化内容)。所以我们可以直接登录。如果我不在登录命令开头写 sudo,则会出现“ERROR 1698 (28000): 拒绝用户‘root’@‘localhost’访问”:
~$ sudo service mysql start
~$ sudo mysql -u root -p
Enter Password: [just ENTER]
然后最后修复“没有目录,使用 HOME=/ 登录”:
~$ sudo service mysql stop
~$ sudo usermod -d /var/lib/mysql/ mysql
ps 在编辑配置文件之前一定要先复制一份,并更改标准端口 3306,然后搜索手册。