前言
使用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
这是我的debian.cnf,每个人的密码会有所不同
记下该账户和密码以及socket路径,后续会有用
安装完毕后,MySQL会自动启动,若未启动可使用下列命令启动mysql服务,其日志位于/var/log/mysql/error.log
sudo systemctl start mysql
通过下列命令查看MySQL状态
sudo systemctl status mysql
这样即为MySQL正常运行状态
使用下列命令将mysql设为开机启动
sudo systemctl enable mysql
密码设置和外部访问
- 登录
使用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
- 密码设置
若使用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账户通过设置的密码进行远程登录了
- 创建用户
使用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`@`%`