
文章目录
- [一. MySQL在Ubuntu 20.04 环境安装](#一. MySQL在Ubuntu 20.04 环境安装)
-
- [1.1 更新软件包列表](#1.1 更新软件包列表)
- [1.2 安装MySQL服务器](#1.2 安装MySQL服务器)
- [1.3 配置安全设置](#1.3 配置安全设置)
- [1.4 检查mysql server是否正在运行](#1.4 检查mysql server是否正在运行)
- [1.5 进行连接](#1.5 进行连接)
- [1.6 查询自带的数据库](#1.6 查询自带的数据库)
- [二. 配置文件的修改](#二. 配置文件的修改)
- [三. MySQL连接TCP/IP时的登陆问题](#三. MySQL连接TCP/IP时的登陆问题)
- [四. MySQL中的命令](#四. MySQL中的命令)
一. MySQL在Ubuntu 20.04 环境安装
1.1 更新软件包列表
cpp
root@hcss-ecs-eaf1:~/MySQL# sudo apt-get update

1.2 安装MySQL服务器
cpp
root@hcss-ecs-eaf1:~/MySQL# sudo apt-get install mysql-server

1.3 配置安全设置
cpp
root@hcss-ecs-eaf1:~/MySQL# sudo mysql_secure_installation
-
这里询问我们是否要对密码组件验证进行配置,输入
y
-
这里询问我们强制密码强度,
0
是低,要求密码长度至少八位。1
是中等,长度至少八位,数字大小写混合外加特殊字符。2
是强,在中等的基础上和字典进行比对,排除高危密码。
-
这里询问是否要移除匿名用户,这里可以输入
y
继续
-
这里询问是否禁用
root
用户远程登陆,这里也可以输入y
继续
-
这里询问是否移除测试数据库,我这里选择保留
-
这里询问是否重载权限表,其实就是询问是否让设置立刻生效 ,输入
y
-
此刻就设置完成了
1.4 检查mysql server是否正在运行
cpp
root@hcss-ecs-eaf1:~/MySQL# systemctl status mysql.service

1.5 进行连接
cpp
root@hcss-ecs-eaf1:~/MySQL# sudo mysql -u root -p
1.6 查询自带的数据库
cpp
mysql> show schemas;

二. 配置文件的修改
cpp
root@hcss-ecs-eaf1:~/MySQL# vim /etc/mysql/mysql.conf.d/mysqld.cnf
常见配置项示例
cpp
# 绑定地址(允许远程访问时改为 0.0.0.0)
bind-address = 127.0.0.1
# 监听端口(默认3306)
port = 3306
# 数据存储目录
datadir = /var/lib/mysql
# 字符集配置(避免乱码)
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 最大连接数
max_connections = 200
# 查询缓存(按需启用)
query_cache_type = 1
query_cache_size = 64M
# 日志配置(可选)
general_log_file = /var/log/mysql/mysql.log
general_log = 1
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
重启MySQL并验证
cpp
sudo systemctl restart mysql
检查配置是否生效
cpp
-- 查看字符集
SHOW VARIABLES LIKE 'character_set_server';
-- 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';
-- 查看 InnoDB 缓冲池大小
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
三. MySQL连接TCP/IP时的登陆问题
mysql中用sudo mysql -u root -p可以登陆上,但是用mysql -h 127.0.0.1 -P 3306 -u root -p登陆时出现ERROR1698(28000)是怎么回事?
首先这两种登陆方式的区别:使用sudo mysql -u root -p登陆时,实际上是以系统root用户的权限来运行MySQL客户端,这时候可能绕过了某些权限验证,比如Unixsocket认证方式。而使命令加上-和127.0.0.1则是通过TCP/IP连接到本地MySQL服务器,这时候可能需要正确的用户名和密码,并且用户需要有远程或本地TCP连接的权限。
接下来错误码是1698,对应的是28000错误,通常和访问被拒绝有关。可能原因有以下几个:
- root用户的认证插件问题: 在MSQL8.0及以上版本中,默认的认证插件是cachingsha2 password,而日版本可能是mysql native password。如果客户端不支持新的插件,或者用户没有设置正确的密码,可能会导致连接问题。不过这里错误是访问被拒绝,可能更和权限有关。
- root用户的host配置: MySQL中的用户账户不仅由用户名决定,还包括host部分。例如,root@localhost和root@%是不同的账户。可能root用户没有配置允许从127.0.0.1或者所有IP(%)的连接权限,所以当使用TCP连接时,即使是在本地,也会因为没有权限而被拒绝。
- 密码问题: 可能root用户在使用TCP连接时需要的密码和 Unix socket登录时的密码不同。或者,当通过socket登录时,MySQL使用了auth_socket插件,不需要密码,而通过 TCP则需要密码,这时候如果密码不正确或者没有设置,就会报错。
- MySQL的绑定地址: 检查MySQL服务器是否绑定了127.0.0.1或者允许来自本地TCP连接的地址。如果MySQL配置文件(如my.cnf)中的bind-address设置为127.0.0.1,这应该没问题,但如果设置为localhost或者其他地址,可能会影响连接。
原因分析:
- 认证插件差异 :使用
sudo mysql -u root
通过Unix socket登录时,可能使用了auth_socket
插件,无需密码。但通过TCP连接时,MySQL要求密码验证。 - 用户权限限制 :
root
用户可能仅允许从localhost
(Unix socket)登录,未配置允许从127.0.0.1
(TCP)登录的权限。 - 密码未设置 :若
root
用户未设置密码,或密码不匹配,TCP登录会失败。
解决方案:
步骤1:检查root用户的权限和认证方式
以sudo权限登录MySQL,查看用户信息:
sql
SELECT user, host, plugin, authentication_string FROM mysql.user WHERE user = 'root';
- 若输出中
root
的host
为localhost
且plugin
为auth_socket
,说明需要通过密码认证调整。
步骤2:修改root用户的认证插件并设置密码
sql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;
- 将认证插件改为
mysql_native_password
,并设置密码。
步骤3:允许root通过TCP连接(可选)
若需允许从127.0.0.1
登录:
sql
CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '你的密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;
步骤4:检查MySQL绑定地址
确保MySQL配置文件允许TCP连接:
-
打开配置文件(路径可能不同):
bashsudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
-
确认
bind-address
设置为127.0.0.1
或0.0.0.0
(后者允许所有IP,仅限测试环境):inibind-address = 127.0.0.1
-
重启MySQL服务:
bashsudo systemctl restart mysql
步骤5:使用密码通过TCP连接
bash
mysql -h 127.0.0.1 -P 3306 -u root -p
输入步骤2中设置的密码,即可成功登录。
注意事项
- 安全建议 :生产环境中避免使用
root@%
,建议限制IP并设置强密码。 - 插件兼容性 :若客户端不支持
caching_sha2_password
,改用mysql_native_password
。
四. MySQL中的命令
MySQL 命令列表:
注意: 所有文本命令必须位于行首,并以";"结尾
指令 | 功能 |
---|---|
? (\?) | "help"的同义词。 |
clear (\c) | 清除当前输入的语句。 |
connect (\r) | 重新连接到服务器。可选参数为数据库名和主机名。 |
delimiter (\d) | 设置语句分隔符。 |
edit (\e) | 使用 $EDITOR 编辑命令。 |
ego (\G) | 将命令发送到 MySQL 服务器,垂直显示结果。 |
exit (\q) | 退出 MySQL。与 quit 相同。 |
go (\g) | 将命令发送到 MySQL 服务器。 |
help (\h) | 显示此帮助信息。 |
nopager (\n) | 禁用分页器,将结果打印到标准输出。 |
notee (\t) | 不写入输出文件。 |
pager (\P) | 设置分页器 [to_pager]。通过分页器打印查询结果。 |
print (\p) | 打印当前命令。 |
prompt (\R) | 更改您的 MySQL 提示符。 |
quit (\q) | 退出 MySQL。 |
rehash (#) | 重建补全哈希表。 |
source (.) | 执行 SQL 脚本文件。将文件名作为参数。 |
status (\s) | 从服务器获取状态信息。 |
system (\!) | 如果启用,执行系统 shell 命令。 |
tee (\T) | 设置输出文件 [to_outfile]。将所有内容追加到给定的输出文件中。 |
use (\u) | 使用另一个数据库。将数据库名作为参数。字符集 (\C) 切换到另一个字符集。处理多字节字符集的二进制日志时可能需要。 |
警告 (\W) | 每条语句后显示警告。 |
不显示警告 (\w) | 每条语句后不显示警告。 |
重置连接 (\x) | 清除会话上下文。 |
👍 如果对你有帮助,欢迎:
- 点赞 ⭐️
- 收藏 📌
- 关注 🔔