Ubuntu 22.04 LTS 安装 MySQL 8.0 服务器
概述
本教程介绍如何在 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
温馨提示:反馈需要登录