Ubuntu 22.04 LTS 安装 MySQL 8.0 服务器

Last Modified: 2023/12/27

概述

本教程介绍如何在 Ubuntu 22.04 LTS 上安装 MySQL 8.0 服务器。安装过程比较简单,大家主要是要注意安装前后的一些问题。

注:以下所有以 sudo 打头的命令,表示需要管理员权限。如果当前用户已是 root 用户,则无需 sudo。

更新软件源

sudo apt-get update

Ubuntu 安装 mysql server

由于我们要安装 mysql server,因此可以先使用 apt-cache 命令搜索可用的包

apt-cache search mysql-server

在 Ubuntu 22.04 LTS 上输出如下:

mysql-server - MySQL database server (metapackage depending on the latest version)
mysql-server-8.0 - MySQL database server binaries and system database setup
mysql-server-core-8.0 - MySQL database server binaries
default-mysql-server - MySQL database server binaries and system database setup (metapackage)
default-mysql-server-core - MySQL database server binaries (metapackage)
mariadb-server-10.6 - MariaDB database server binaries
mariadb-server-core-10.6 - MariaDB database core server files

如需进一步查看包的具体信息,可以使用 apt info 命令。例如查看上面第一行中 mysql-server 的具体信息

apt info -a mysql-server

用同样的方法可以查看 mysql-server-8.0 这个包的具体版本信息

apt info -a mysql-server-8.0

apt info 输出内容如下

确定了版本信息之后,具体到安装就比较简单了,直接使用 apt install 命令安装即可。

sudo apt install mysql-server-8.0

有时候需要忽略表名大小写,这个在 8.0 以上版本需要在 MySQL 数据初始化之前配置好,之后配置无效。配置方法可以参考 如何配置MySQL8中的lower_case_table_names来让其忽略大小写?

在安装 mysql-server 之前没有配置忽略大小写,也是可以补救的,补救方法可以参考 lower_case_table_names Settings in MySQL 8.0.12

使用 apt 安装 MySQL 服务器完成后,mysql 服务会自动启动。接下来我们需要给 root 用户设置一个密码,因为默认情况下 root 用户不需要密码就可以登录,这显然是不安全的。

给 mysql 服务器设置密码

sudo mysql

执行上面的命令会进入 mysql 控制台,此时我们就可以通过 sql 语句修改 root 用户的密码了

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Yourpasswordhere';

接下来讲一下安装完成后可能遇到的问题以及对应的解决方案。

允许远程连接 mysql 服务

默认情况下,mysql 服务器仅允许 localhost 访问服务器,在开发过程中往往大家共享一个 mysql 服务器,因此有必要让 mysql 服务接受远程访问。

修改 /etc/mysql/mysql.conf.d/my.cnf 中 bind_address

bind_address = 0.0.0.0

然后连接到 mysql -uroot -p 命令连接到 mysql 服务并执行下面的 sql 语句

use mysql;
update user set host='%' where user='root';

然后就可以通过 exit 命令退出 mysql 控制台。这还没完,最后一步重启 mysql 服务器。

sudo systemctl restart mysql.service

MySQL zero date 问题

zero date 也就是 '0000-00-00'。默认情况下,mysql server 8.0 将 zero date 视为无效日期,如果想支持 zero date,需要修改 sql-mode。在修改之前我们查看当前的 sql-mode。

select @@global.sql_mode;
select @@session.sql_mode;

观察上面的图,可以看出有一个 NO_ZERO_DATE,这个时候我们需要修改 mysql 服务器的配置,将 NO_ZERO_DATE 去掉。仍然是修改 /etc/mysql/mysql.conf.d/my.cnf 文件,在 [mysqld] 下面加入以下配置

sql-mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

配置完成后,需要重启 mysql 服务才能生效!

好好的为什么要支持 zero date 呢?如果你要导入历史数据,很可能历史数据中就包含这种格式的数据,修改历史数据费时费力,不如直接支持 zero date 就完事。

MySQL group by 问题

5.7 以前 select 后面接的字段无需全部包含在 group by 中,但是 5.7 以后 sql mode 默认 ONLY_FULL_GROUP_BY,也就是说 select 后面的字段得完全包含在 group by 中,否则你就可能会见到下面的报错。

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause
and contains nonaggregated column 'xxx' which is not functionally
dependent on columns in GROUP BY clause; this is incompatible
with sql_mode=only_full_group_by

如果想兼容以前老的写法,就需要将 sql mode 中的 ONLY_FULL_GROUP_BY 去掉

sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

配置完成后,需要重启 mysql 服务才能生效!

管理 MySQL 服务相关的命令

# 启动 mysql 服务
sudo systemctl start mysql.service
# 停止 mysql 服务
sudo systemctl stop mysql.service
# 重启 mysql 服务
sudo systemctl restart mysql.service
有问题吗?点此反馈!

温馨提示:反馈需要登录