【个人留用】Ubuntu安装MySQL

81 阅读3分钟

前言

使用WSL2技术在windows11系统上创建了一个Ubuntu虚拟机。

在此记录一下在Ubuntu上安装mysql的方式和遇到的问题解决方法。

使用lsb_release -a查看系统为:Ubuntu 22.04.3 LTS

MySQL

安装

在Ubuntu上可以直接使用sudo apt install安装mysql-server

# 使用apt安装前更新软件包列表
sudo apt update
# 搜索可用的mysql-server版本
sudo apt search mysql-server
# 安装指定版本mysql-server
sudo apt install mysql-server-8.0

一路按 ENTER 和 y 进行安装,若途中未提示输入密码,则需要查看/etc/mysql/debian.cnf文件,其中有安装时自动创建的用户,需要先通过该用户进行登录,然后重新设置root账户的密码

sudo vim /etc/mysql/debian.cnf

image.png

这是我的debian.cnf,每个人的密码会有所不同

记下该账户和密码以及socket路径,后续会有用

安装完毕后,MySQL会自动启动,若未启动可使用下列命令启动mysql服务,其日志位于/var/log/mysql/error.log

sudo systemctl start mysql

通过下列命令查看MySQL状态

sudo systemctl status mysql

image.png

这样即为MySQL正常运行状态

使用下列命令将mysql设为开机启动

sudo systemctl enable mysql

密码设置和外部访问

  1. 登录

使用debian.cnf中的账户(若安装时提示输入了密码,则使用root账户和设置的密码进行登录即可)登录MySQL

mysql -u debian-sys-maint -p

此处可能报错提示ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2),意为无法通过本地套接字连接MySQL服务器,可以先通过下列命令通过TCP连接MySQL服务器

mysql -h 127.0.0.1 -u debian-sys-maint -p

若通过该方法能正常登录,说明MySQL服务正常运行

出现该错误是因为/tmp下的mysql.sock套接字文件可能被误删或创建失败了,网络上的教程大部分是使用find / -name mysql.sock命令先查找该文件,但我使用该命令查找时会进入文件循环,无法正常查询。

前面debian.cnf中的socket路径,其实就是/tmp/mysql.sock,在/tmp下做个软连接即可恢复,也能正常使用本地套接字进行访问MySQL了

ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
  1. 密码设置

若使用debian.cnf中的debian-sys-maint账户登录,建议重新设置root账户的密码方便登录

查看mysql.user表,查看各账户的身份验证状态

SELECT user,authentication_string,plugin,host FROM mysql.user;

其中Host字段为可接受的客户端IP,若为localhost则只能在本地访问,若为%则接受所有远程访问

Plugin字段为加密方式

通过下列命令修改root用户的登录密码

# 均为在mysql环境中使用
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
# 更新root账户host访问主机( MySQL8.0可用 )
UPDATE mysql.user SET host='%' WHERE user='root';
# 刷新缓冲
flush privileges;

设置完毕后就可以使用root账户通过设置的密码进行远程登录了

  1. 创建用户

使用root直接操纵数据库很方便,但是当数据库可能被多人访问时就存在一定风险,可以创建另一用户用来访问数据库

# 以下操作均为root账户
# 创建新账户user1以密码password只能在localhost登录
CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password';
# 将user1设为可远程登录
UPDATE mysql.user SET host='%' where user='user1';
# 给予user1权限,使其能对数据库database_name的所有表进行任意操作
GRANT ALL PRIVILEGES ON database_name.* TO 'user1'@'%';

下列命令撤销权限

# 撤销user1在database_name数据库在class表上的INSERT权限
REVOKE INSERT ON database_name.class FROM 'user01'@'%';
# 撤销user1在database_name数据库在score表上的所有权限
REVOKE ALL ON database_name.score FROM 'user01'@'%';

下列命令删除用户

# 删除可远程访问的用户user1
DROP USER `user1`@`%`