安装MySQL到Ubuntu 20.04并配置外部连接

本文的内容主要来自对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权限。因为这里使用了auth_socket插件,而不是默认的密码验证。你可以稍后进入MySQL开启密码登录root功能。

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';

如果你想把已有的认证方式改为mysql_native_password ,也可以用ALTER语句:


mysql> ALTER USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY '11111111';

给新用户赋予权限

创建完新用户后,便可以将适当的权限授予该用户,授权的语句格式如下:

mysql> GRANT PRIVILEGE ON database.table TO 'username'@'host';

语句中的PRIVILEGE值为具体权限的定义,可用半角状态的逗号(,)分隔。databasetable为赋予操作权限的数据库和表,可使用星号(*)代替全全部。全部的权限定义见官方文档

这里我给刚才新建测试用户赋予了以下权限

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可根据需求替换为实际权限,如不替换则为全部权限。

参考:mysql数据库允许外部ip访问

发表评论

您的电子邮箱地址不会被公开。