本文的内容主要来自对How To Install MySQL on Ubuntu 20.04的翻译。在根据该文的指导下,我在自己的Ubuntu 20.04.3 LTS版本中安装了MySQL 8。
后面根据需要还配置了从外部IP访问本地Mysql数据库,如已安装Mysql可以直接跳过安装步骤。
Step 1. 安装MySQL
使用apt命令安装MySQL之前,最好先更新下安装包索引
sudo apt update
然后安装mysql-server包。以下命令只安装MySQL但不做任何配置,包括设置用户密码等操作。
sudo apt install mysql-server
Step 2. 配置MySQL
现在MySQL处于全新安装状态,我们需要对它的安全性做一些基础配置。好在这里提供了一个安全配置的安装脚本,我们可以运行它并根据提示做一些简单的配置。
sudo mysql_secure_installation
运行该脚本后首先询问你是否要安装一个用于密码强度校验的插件VALIDATE PASSWORD COMPONENT,这里我选择了安装,输入y。然后要求你从3个校验策略里选择一个,从0到2依次增强。由于这里我仅用于开发环境,因此选择了0,最简单的强度校验。(即最少输入8个字符作为密码)
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
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: 0
0
根据你选择的校验策略,为MySQL的root用户设置一个密码,并再次输入验证。
下面的提示是对你输入的密码强度进行评估,如果你满意该密码并决定使用,可以直接输入y继续。接下来会有一系列提示帮助你配置其他安全性问题,根据自己的需求设置即可。
Step 3. 创建一个专用的MySQL用户并提升权限
创建一个新的MySQL用户
由于MySQL的root用户具有最高权限,为了安全起见我们应该创建一个专用的用户来操作数据库。如果你只用这个环境作为开发测试使用,则可以忽略这步。
在Ubuntu系统中运行MySQL 5.7或之后的版本,如果用MySQL的root账户登录,则需要系统的root权限。因为这里使用了
插件,而不是默认的密码验证。你可以稍后进入MySQL开启密码登录root功能。auth_socket
sudo mysql
如果已经是能了密码登录root用户的功能,则可以用下面的命令登录
mysql -u root -p
进入到MySQL控制台后,就可以用CREATE USER语句创建新用户了:
mysql> CREATE USER 'username'@'localhost' IDENTIFIED WITH authentication_plugin BY 'password';
其中
代表只允许用户从本地系统访问数据库。注意这两部分要用单引号包围并用@符号连接。username
是你想要使用的用户名,
localhost
后面的
。 WITH authentication_plugin
部分代表要使用的认证插件。这里使用使用前面提到的
auth_socket
插件来认证用户,即只用使用Ubuntu系统下所登录的用户才能登录到对应的MySQL账户。也可以完全省略该部分,使用默认的认证插件
caching_sha2_password
运行下面的语句来创建一个用户名为test的MySQL账户,并使用
插件认证用户密码。请务必根据你的需求自定义用户名和密码,我这里使用了简单的密码,不要学我哈。caching_sha2_password
mysql> CREATE USER 'test'@'localhost' IDENTIFIED BY '11111111';
注意:有些版本的PHP对caching_sha2_password的认证方式存在bug,所以如果你使用类似phpMyAdmin这样的PHP应用来管理数据库,推荐使用旧的认证方式
:
mysql_native_password
mysql> CREATE USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY '11111111';
如果你想把已有的认证方式改为
,也可以用ALTER语句:
mysql_native_password
mysql> ALTER USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY '11111111';
给新用户赋予权限
创建完新用户后,便可以将适当的权限授予该用户,授权的语句格式如下:
mysql> GRANT PRIVILEGE ON database.table TO 'username'@'host';
语句中的
为赋予操作权限的数据库和表,可使用星号(*)代替全全部。全部的权限定义见官方文档。PRIVILEGE
值为具体权限的定义,可用半角状态的逗号(,)分隔。
database
和
table
这里我给刚才新建测试用户赋予了以下权限
mysql> GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'test'@'localhost' WITH GRANT OPTION;
简要描述下上面语句权限的定义:
- CREATE, ALTER, 和 DROP代表用户具有创建、修改和删除数据库、表和用户的权限;
- INSERT, UPDATE, 和 DELETE代表有权插入、更新和删除表的数据;
- SELECT 可查询表数据;
- REFERENCES可创建外键;
- RELOAD 可以使用FLUSH操作。
代表对所有数据库和所有表赋予上述权限。on *.*
表示该用户可以对其他用户赋予他所拥有的这些权限。WITH GRANT OPTION
注意:使用以下语句可以给用户赋予最高权限,和root用户一样(但极其不建议这样做):
mysql> GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost' WITH GRANT OPTION;
最后使用
语句释放以上所有语句操作数据库后留下的缓存FLUSH PRIVILEGES
mysql> FLUSH PRIVILEGES;
退出MySQL控制台:
mysql> exit
使用以下语句登录刚才新建的MySQL用户:
mysql -u test -p
Step 4. 测试MySQL运行状态
键入以下命令来查看MySQL服务是否正常运行:
systemctl status mysql.service
如果看到类似下面的输出则代表已经正常运行,注意这里
即代表运行状态Active: active (running)
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2022-01-18 09:39:36 CST; 22min ago Process: 860 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS) Main PID: 1085 (mysqld) Status: "Server is operational" Tasks: 38 (limit: 19092) Memory: 417.2M CGroup: /system.slice/mysql.service └─1085 /usr/sbin/mysqld
如果MySQL未正常启动,可以使用该命令来启动:sudo systemctl start mysql
附:其他配置
从外部连接本地数据库
默认配置下我们是给Mysql用户赋予了从本地localhost连接数据库的权限,如果我们在开发环境,想从局域网的其他主机连接本地的数据库,或者想从物理机连接虚拟机的的数据库,就需要对连接IP不做限制。
- 首先修改登录表,使用root用户登录到Mysql控制台
mysql>use mysql;
mysql>update user set host = '%' where user ='[user]';
mysql>select host, user from user;
mysql>flush privileges;
- 然后授权用户权限
mysql>GRANT ALL PRIVILEGES ON *.* TO '[user]'@'%' IDENTIFIED BY '[password]' WITH GRANT OPTION;
mysql>flush privileges;
注意:这里的
ALL PRIVILEGES
可根据需求替换为实际权限,如不替换则为全部权限。