ubuntu 22.04 安装MySQL8后的基本设置
安装
sudo apt update
sudo apt upgrade
sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql
初始化配置
MySQL初始化配置以及设置 root 密码
- 初始化 MySQL 安全配置
sudo mysql_secure_installation
这个命令会提示您进行一系列的安全设置,包括:
- 是否设置 root 密码
- 是否删除匿名用户
- 是否禁止 root 用户远程登录
- 是否删除测试数据库
- 是否立即应用以上更改
密码策略
seeding@ihopeso:~$ sudo mysql_secure_installation
[sudo] password for seeding:
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: 1
Skipping password set for root as authentication with auth_socket is used by default.
If you would like to use password authentication instead, this can be done with the "ALTER_USER" command.
See https://dev.mysql.com/doc/refman/8.0/en/alter-user.html#alter-user-password-management for more information.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.
All done!
策略向导
-
当您运行 mysql_secure_installation 命令时,它会提示您是否要设置 VALIDATE PASSWORD 组件。这个组件可以对密码强度进行检查,帮助您设置更安全的密码。
-
如果您选择"y"继续设置 VALIDATE PASSWORD 组件,接下来它会让您选择密码策略,可以选择 LOW、MEDIUM 或 STRONG。选择更高的级别可以增加密码复杂度要求。
-
之后它会要求您设置 root 用户的密码。由于您使用的是 MySQL 8.0,它会跳过这一步,因为 MySQL 8.0 默认使用 auth_socket 插件进行 root 用户身份验证,不需要设置密码。
-
接下来它会提示您是否删除匿名用户、禁止 root 用户远程登录,以及删除测试数据库等。您可以根据实际需求选择是否执行这些操作。
密码策略低中高
MySQL 的 VALIDATE PASSWORD 组件中不同密码策略的区别:
- LOW 策略
密码最小长度为 8 个字符。
不要求包含大写字母、小写字母、数字或特殊字符。
这是最宽松的密码策略,更容易被暴力破解。不建议在生产环境中使用。
- MEDIUM 策略
密码最小长度为 8 个字符。
密码必须包含大写字母、小写字母和数字中的两种。
不需要包含特殊字符。
这是一个较为安全的默认策略。
- STRONG 策略
密码最小长度为 8 个字符。
密码必须包含大写字母、小写字母、数字和特殊字符中的三种。
这是最安全的策略,但可能会让用户设置密码变得比较困难。
使用更高级别的密码策略可以提高密码的安全性,但同时也会增加用户设置密码的难度。通常建议使用 MEDIUM 策略,它在安全性和用户体验之间达到了较好的平衡。
如果您有特殊需求,也可以根据实际情况调整这些参数,比如将密码最小长度调整为 12 个字符。但是请务必权衡安全性和用户体验,找到最合适的设置。
查看密码策略
- 设置密码失败的时候,可能需要使用该命令
SHOW VARIABLES LIKE 'validate_password%';
查看当前用户
mysql> SELECT User, Host, authentication_string, plugin FROM mysql.user;
mysql> SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| User | Host | plugin |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
设置Root密码【本地】
- 设置root本地密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
设置远程访问【远程】
步骤一
root有一些默认设置,加上root可以设置本地密码和远程密码,设置起来比较麻烦,所以选择新建一个用户admin并赋予远程权限
- 创建远程用户admin并设置密码(本地和远程可以不一样)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY 'your_new_password' WITH GRANT OPTION;
CREATE USER 'admin'@'%' IDENTIFIED BY 'Remote@8123';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
#或者
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';
FLUSH PRIVILEGES;
- 以上命令进阶理解,带不带
WITH GRANT OPTION
这两条 SQL 语句确实很相似,但它们之间还是有一些细微的差别。
-
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
- 这条语句会授予
'admin'@'%'
用户对所有数据库和表的所有权限,包括GRANT OPTION
。 GRANT OPTION
意味着该用户有权限将自己的权限授予其他用户。- 拥有
GRANT OPTION
权限的用户可以创建新用户并授予权限。
- 这条语句会授予
-
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';
- 这条语句会授予
'admin'@'%'
用户对所有数据库和表的所有权限。 - 但是该用户没有
GRANT OPTION
权限,也就无法将自己的权限授予其他用户。
- 这条语句会授予
总的来说,这两条语句都会授予 'admin'@'%'
用户对所有数据库和表的完全访问权限。不同之处在于第一条语句还赋予了该用户授权其他用户的能力。
如果您只是想给 'admin'@'%'
用户分配最高权限,使用第二条语句就足够了。但如果您还希望该用户能够管理其他用户的权限,那么使用第一条语句会更合适。
- 示例:创建一个用户blog设置密码
Blog@8123
对数据库blog拥有所有权限
CREATE USER 'blog'@'%' IDENTIFIED BY 'Blog@8123';
GRANT ALL PRIVILEGES ON blog.* TO 'blog'@'%';
FLUSH PRIVILEGES;
看来您在尝试授予 root 用户远程访问权限时遇到了权限问题。错误 1410 表示当前连接的用户没有创建新用户的权限。
出现这个问题可能有以下几种原因:
-
您当前登录的 MySQL 用户不是 root 用户。只有 root 用户才有创建新用户的权限。请确保您是以 root 用户登录的。
-
MySQL 8.0 中默认 root 用户无法直接修改自己的权限。您需要先创建一个具有 CREATE USER 权限的用户,然后使用该用户来修改 root 用户的权限。
如果您是以 root 用户登录的,可以尝试以下步骤:
-
创建一个具有 CREATE USER 权限的用户:
CREATE USER 'admin'@'%' IDENTIFIED BY 'your_admin_password'; GRANT CREATE USER ON *.* TO 'admin'@'%'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
-
使用 admin 用户登录 MySQL:
mysql -u admin -p
-
然后使用 admin 用户执行授权命令:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
这样就可以成功为 root 用户授予远程访问权限了。
步骤二
允许所有主机远程访问还需要修改mysql配置文件
$ vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 修改一下内容
#bind-address = 127.0.0.1
bind-address = 0.0.0.0
- 操作完成后可能需要重启下服务
sudo systemctl restart mysql
常用命令
sudo mysql -u root -p
常用 MySQL 命令
- 查看数据库列表:
SHOW DATABASES;
- 创建数据库:
CREATE DATABASE database_name;
- 切换数据库:
USE database_name;
- 创建表:
CREATE TABLE table_name (column1 datatype, column2 datatype, ...);
- 查看表结构:
DESCRIBE table_name;
- 插入数据:
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
- 查询数据:
SELECT * FROM table_name;
设置密码注意事项
-
mysql_native_password
是 MySQL 8.0 默认使用的身份验证插件。 -
如果您在这里遇到问题,很可能是因为 MySQL 的密码策略设置过于严格。
-
检查密码策略
SHOW VARIABLES LIKE 'validate_password%';
这个命令可以查看当前 MySQL 的密码策略设置,包括:
validate_password.policy
:密码强度策略,可设置为 LOW、MEDIUM 或 STRONG。validate_password.length
:密码最小长度。validate_password.mixed_case_count
:密码中必须包含的大小写字母个数。validate_password.number_count
:密码中必须包含的数字个数。validate_password.special_char_count
:密码中必须包含的特殊字符个数。
调整密码策略
如果当前设置过于严格,可以根据需要适当调整这些参数,例如:
SET GLOBAL validate_password.policy = 'LOW';
SET GLOBAL validate_password.length = 6;
调整完密码策略后,再次尝试设置 root 密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
注意,在 IDENTIFIED BY 之前使用 IDENTIFIED WITH mysql_native_password。这是 MySQL 8.0 中设置密码的正确语法。
在 MySQL 8.0 中,root 用户确实可以同时拥有两个不同的密码,一个用于本地登录,一个用于远程登录。
-
首先,使用以下命令设置 root 用户的本地登录密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
-
然后,使用以下命令设置 root 用户的远程登录密码:
ALTER USER 'root'@'%' IDENTIFIED BY 'Remoteyour_new_password';
注意,这里我们没有使用
IDENTIFIED WITH mysql_native_password
。因为 root 用户的远程登录密码可以与本地密码不同。 -
最后,执行以下命令刷新权限:
FLUSH PRIVILEGES;
这样就可以同时设置 root 用户的本地登录密码和远程登录密码了。在您的示例中,确实不需要在第 4 步中再次输入密码,因为它已经在第 2 步中设置过了。
现在,root 用户可以使用 your_new_password
在本地登录,使用 Remoteyour_new_password
在远程登录。这样可以提高安全性,因为即使一个密码泄露,另一个密码也不会受影响。
MySQL 8.0 对 root 用户有一些默认设置,可能导致无法直接修改远程访问密码。您可以尝试先删除用户,然后重新创建。
DROP USER 'admin'@'%';
CREATE USER 'admin'@'%' IDENTIFIED BY 'Remoteyour_new_password';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;