最近在读《MySQL是怎样运行的:从根儿上理解MySQL》一书。由于书上以MacOS代表UNIX系统进行操作演示,虽然都为类UNIX系统,但细节上与Linux系统还是略有不同,对于小白而言还是得探索一番。另外网上许多教程的内容都是针对MySQL 5.xx版本的,一些操作与MySQL 8.xx有所不同。
本文是我探索过程的一个记录。若本文能帮助到您,将是我的荣幸;而若有错误之处,希望能在评论区指出,万分感谢。
1. 我的环境
需要注意我我的环境与你的是否相同,若不同,某些具体细节上可能是有所不同的。
- Ubuntu20.04系统;
- mysql使用apt install命令安装;
- mysql版本为
mysql Ver 8.0.33-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))
2. 安装
有两种安装方式: 一是在官网下载deb安装包或者源文件自行编译,二是直接使用Ubuntu的apt install命令从Ubuntu的原仓库中安装。以下演示较为简单的第二种安装方式。 需要注意的是,Linux下mysql的服务端与客户端是分开安装的。
sudo apt update
# 安装mysql服务端
sudo apt install mysql-server
# 以下两条命令都可以查看mysql服务是否已经开启
sudo systemctl status mysql
service mysql status
3. 安全设置
在许多教程中,安装完成后,就使用mysql_secure_installation进行安全性方面的设置。
sudo mysql_secure_installation
第一步是选择是否使用VALIDATE PASSWORD PLUGIN插件来验证MySQL用户的密码强,按下y表示使用,按下其它任何键表示不使用:
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: y
若上一步中按下了y,终端则会有如下输出。密码验证策略分为低,中,强三个级别,输入0,1,2来选择使用哪个级别。
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
在下一个提示符下,将要求您设置MySQL root用户的密码:
Please set the password for root here.
New password:
Re-enter new password:
键入y以确认密码:
Estimated strength of the password: 50
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
此时就会出现如下错误:
... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the
authentication method used doesn't store authentication data in the MySQL server.
Please consider using ALTER USER instead if you want to change authentication
parameters.
它提示我们要使用 ALTER USER 命令来改变授权的参数,这个是mysql的命令,需要连接mysql后才能执行,但十分尴尬的是,如果我们现在在终端输入mysql,会输出如下错误:
ERROR 1045 (28000): Access denied for user 'xxxx'@'localhost' (using password: NO)
我猜测,这是因为直接使用mysql命令,mysql会使用当前登陆的ubuntu用户名来尝试连接mysql,而此时mysql中是不存在这个用户的(mysql用户与ubuntu用户是独立的)。
搜索以上错误,找到的解决方案是使用root用户登陆,再修改密码。
mysql -u root -p
# 不输入密码,直接回车
Enter password:
# 终端输出错误
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
经过一轮搜索,终于在ask ubuntu找到了原因:使用root用户连接,需要加上sudo前缀
sudo mysql -u root -p
# 不输入密码,直接回车
Enter password:
# 就可以看到直接连接上mysql了
mysql>
zhuanlan.zhihu.com/p/610793026
连接上mysql后,就使用ALTER USER命令,修改root和自己用户的密码
# 修改密码
mysql> ALTER USER 'root'@'localhost' WITH mysql_native_password IDENTIFIED BY '123';
Query OK, 0 rows affected (0.05 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.05 sec)
如果修改密码时,有如下错误:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
可以参考文章
下次使用root用户登陆就需要使用刚才设置的密码了,也可以使用mysql_native_password修改root用户的密码。
(www.jianshu.com/p/d7b9c468f…) 我们使用以下命令可以创建一个mysql用户:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
- username:你将创建的用户名
- host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符
% - password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
背后原因探索
后来,我在如何在Ubuntu 20.04安装MySQL一文中找到了上述现象的原因:
“在MySQL 8.0上,对root用户使用auth_socket插件进行身份验证。auth_socket插件仅对从localhost连接到Unix socket文件用户进行身份验证。这意味着您无法通过提供密码来以root用户连接到MySQL服务器。但你可以通过命令sudo mysql连接到MySQL服务器。"
我对于上面一段话的理解是使用auth_socket验证方式,就只能使用Unix Socket来进行验证,而用过shell应用是不能进行验证的。而使用ALTER USER命令后,身份验证方法就变为了mysql_native_password,如此下次就可以使用密码进行登陆。
此时再回过头读这段错误,它的意思就是 由于当前使用的验证方法不在MySQL服务器中存储验证数据,所以SET PASSWORD这个命令对于'root'@'localhost'用户没有意义。
... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the
authentication method used doesn't store authentication data in the MySQL server.
Please consider using ALTER USER instead if you want to change authentication
parameters.
如果下次忘记了root用户的密码,应该如何处理?
使用sudo mysql命令登陆后再按上面的步骤修改密码。
4. 各种文件的目录
配置文件
与书中一致
启动服务器程序的可执行文件
这些文件都在在目录/usr/bin/中,
ls /usr/bin | grep -n mysql
851:mysql
852:mysqladmin
853:mysqlanalyze
854:mysqlbinlog
855:mysqlcheck
856:mysql_config_editor
857:mysqld_multi
858:mysqld_safe
859:mysqldump
860:mysqldumpslow
861:mysqlimport
862:mysql_migrate_keyring
863:mysqloptimize
864:mysqlpump
865:mysqlrepair
866:mysqlreport
867:mysql_secure_installation
868:mysqlshow
869:mysqlslap
870:mysql_ssl_rsa_setup
871:mysql_tzinfo_to_sql
872:mysql_upgrade
mysql.server文件
在Ubuntu 20.04上,我并没有找到mysql.server 文件。但在 /etc/init.d/ 目录中,有一个mysql文件,这个文件的功能应该是与mysql.server文件是相同。