大纲 前言 本文将介绍 Debian 11 如何使用已编译的二进制包原生安装 MySQL 8.4(LTS 版本),绝大部分安装步骤同样适用于其他 Linux 发行版,比如 CentOS、Ubuntu 等。值得一提的是,Debian 11 不支持使用 APT 存储库的方式来安装 MySQL 8.4,因为 MySQL 官方没有相应的支持。
版本历史 LTS 版本 MySQL 8.4 是一个长期支持(LTS)版本,它的主流支持 将持续到 2029 年 4 月 30 日 ,而延长支持 将持续到 2032 年 4 月 30 日 。这意味着 MySQL 8.4 将享有总计 8 年的支持周期,其中前 5 年为完全支持,后 3 年为延长支持。
准备工作 更换软件源 1 2 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
1 2 3 4 5 6 7 8 9 10 11 12 13 14 sudo cat > /etc/apt/sources.list << EOF deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bullseye-security main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bullseye-security main contrib non-free EOF
安装常用工具 1 sudo apt install -y vim curl tree net-tools binutils
安装软件依赖 1 sudo apt-get install -y libaio1 libncurses6 libnuma1 sysv-rc-conf
安装 GLIBC 依赖 执行以下命令查看系统是否支持 GLIBC 2.28,如果没有任何输出内容,则说明不支持,此时则需要手动安装 GLIBC 2.28。
1 2 sudo strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_2.28
创建 Linux 用户 1 2 3 4 5 sudo groupadd mysql sudo useradd -r -g mysql -s /bin/false mysql
MySQL 下载 打开 MySQL 官方网 ,根据自己的系统架构选择下载对应的二进制包。
或者通过 wget
命令下载,比如:
1 wget https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.2-linux-glibc2.28-x86_64.tar.xz
MySQL 安装 移除旧版本数据库 特别注意
如果以前安装过旧版本的 MySQL,切记要先备份数据,然后再移除旧版本 MySQL。
1 2 sudo systemctl stop mysql
1 2 3 4 5 6 sudo apt-get remove --purge mysql-* sudo apt-get autoremove sudo apt-get autoclean
1 2 3 4 sudo rm -rf /etc/my.cnf sudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysql
安装新版本数据库 解压文件 1 2 3 4 5 6 7 8 sudo tar -xvf mysql-8.4.2-linux-glibc2.28-x86_64.tar.xz -C /usr/local / sudo mv /usr/local /mysql-8.4.2-linux-glibc2.28-x86_64/ /usr/local /mysql sudo chown mysql:mysql -R /usr/local /mysql/
创建目录 1 2 3 4 5 sudo mkdir -p /var/lib/mysql sudo chown mysql:mysql /var/lib/mysql
1 2 3 4 5 6 7 8 sudo mkdir -p /var/log /mysql sudo touch /var/log /mysql/error.log sudo chown mysql:mysql -R /var/log /mysql
添加环境变量 1 2 3 4 5 6 7 8 sudo vim /etc/profile export PATH=$PATH :/usr/local /mysql/binsudo source /etc/profile
创建配置文件 创建配置文件,MySQL 在初始化和正常运行的时候都会使用到该配置文件 1 2 3 4 5 sudo touch /etc/my.cnf sudo chown mysql:mysql /etc/my.cnf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [client] # 设置客户端的默认字符集 default-character-set=utf8mb4 # 客户端连接时使用的套接字文件路径 socket = /var/lib/mysql/mysql.sock [mysql] # 设置命令行客户端的默认字符集 default-character-set=utf8mb4 [mysqld] # MySQL 服务的运行用户 user = mysql # MySQL 的监听端口 port = 3306 # 允许访问数据库的 IP 地址 bind-address=0.0.0.0 # MySQL 的安装目录 basedir = /usr/local/mysql # MySQL 的数据目录 datadir = /var/lib/mysql # MySQL 服务器端的套接字文件路径 socket = /var/lib/mysql/mysql.sock # MySQL 的 PID 文件路径 pid_file = /var/lib/mysql/mysql.pid # MySQL 的错误日志文件路径 log_error = /var/log/mysql/error.log # 允许的最大连接数 max_connections = 151 # 设置每个客户端在连接时默认使用的字符集,如何客户端在连接时明确指定了字符集,则客户端指定的字符集具有较高优先级 init_connect = 'SET NAMES utf8mb4' # 设置服务端的默认字符集 character-set-server = utf8mb4 # 设置服务端的默认排序规则 collation-server=utf8mb4_unicode_ci # 创建新表时使用的默认存储引擎 default-storage-engine = INNODB # MySQL8 默认使用 caching_sha2_password 插件认证,以前默认是 mysql_native_password(已被弃用) mysql_native_password = ON # MySQL 使用的 SQL 模式 sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
初始化 MySQL 初始化 MySQL,未指定的初始参数默认会从配置文件 /etc/my.conf
获取,成功初始化后会在 MySQL 的数据目录下创建对应的数据文件。
1 2 sudo /usr/local /mysql/bin/mysqld --initialize
若需要指定部分初始参数,可以参考以下命令:
1 2 sudo /usr/local /mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local /mysql --datadir=/var/lib/mysql --log-error=/var/log /mysql/error.log
初始化参数说明:
--user
:指定使用哪个 Linux 用户--basedir
:指定 MySQL 的安装目录--datadir
:指定 MySQL 的数据目录--log-error
:指定 MySQL 的错误日志文件初始化完成后,默认会将 root
账户的初始化密码输出在错误日志文件中。
1 2 sudo cat /var/log /mysql/error.log
错误日志文件的内容如下,其中包含了 root
账户的初始化密码
1 2 3 4 5 6 2024-05-02T08:35:45.327763Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start. 2024-05-02T08:35:48.227966Z 0 [System] [MY-013169] [Server] /usr/local /mysql/bin/mysqld (mysqld 8.4.2) initializing of server in progress as process 723 2024-05-02T08:35:48.308630Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2024-05-02T08:35:53.705371Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2024-05-02T09:33:05.832399Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: _:ti(yFd58rh 2024-05-02T09:33:14.256519Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.
或者直接使用以下命令来查看 root
账户的初始化密码
1 sudo grep 'root@localhost:' /var/log /mysql/error.log | cut -d':' -f2-
创建运行时文件 1 2 3 4 5 6 7 8 sudo touch /var/lib/mysql/mysql.pid sudo touch /var/lib/mysql/mysql.sock sudo chown mysql:mysql -R /var/lib/mysql
注册 MySQL 服务 方法一 提示
推荐使用此方式来注册 MySQL 服务,因为可以手动指定 MySQL 使用哪个配置文件来启动。
注册服务 1 sudo touch /lib/systemd/system/mysqld.service
1 sudo vim /lib/systemd/system/mysqld.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [Unit] Description=MySQL Server After=network.target [Service] Type=simple ExecStart=/usr/local /mysql/bin/mysqld --defaults-file=/etc/my.cnf User=mysql Group=mysql TimeoutSec=300 PrivateTmp=true [Install] WantedBy=multi-user.target
1 sudo systemctl daemon-reload
移除服务 1 sudo systemctl stop mysqld
1 sudo rm /lib/systemd/system/mysqld.service
1 sudo systemctl daemon-reload
方法二 特别注意
不推荐使用此方式来注册 MySQL 服务,因为 /etc/my.conf
配置文件里指定的 PID 文件和 Socket 文件不会生效。
注册服务 1 2 3 4 5 6 7 8 sudo cp /usr/local /mysql/support-files/mysql.server /etc/init.d/mysqld sudo chmod +x /etc/init.d/mysqld sudo sysv-rc-conf mysqld on
1 2 3 4 5 sudo sysv-rc-conf --list sudo sysv-rc-conf --level 345 mysqld on
移除服务 1 sudo systemctl stop mysqld
运行 sysv-rc-conf
命令,然后找到需要移除的服务。在交互式界面中,取消该服务所有运行级别(0-6)中的复选框,这将从所有运行级别中禁用该服务 1 sudo rm /etc/init.d/mysqld
1 sudo update-rc.d -f mysqld remove
1 sudo service --status-all
管理 MySQL 服务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sudo systemctl enable mysqld sudo systemctl start mysqld sudo systemctl stop mysqld sudo systemctl restart mysqld sudo systemctl status mysqld
MySQL 连接 更改 Root 用户的密码 登录 MySQL,root
账户的初始化密码在 /var/log/mysql/error.log
错误日志文件中 1 mysql -h localhost -u root -p
1 ALTER USER 'root' @'localhost' IDENTIFIED WITH mysql_native_password BY '123456' ;
若希望可以使用 root
账户远程登录 MySQL,则可以执行以下授权(考虑到数据库的安全性,不建议授权 root
账户远程登录) 1 2 3 4 5 6 7 8 9 10 11 # 切换数据库 USE mysql; # 更改记录 UPDATE user set host = '%' where user = 'root' ; # 刷新权限 FLUSH PRIVILEGES; # 验证修改结果 select host, user from user ;
常见问题 初始化 MySQL 失败 MySQL 初始化失败,一般是配置文件 /etc/my.conf
的内容有误,解决方法如下:
查看 MySQL 的错误日志文件,观察有没有可用的错误信息 1 sudo cat /var/log /mysql/error.log
1 sudo rm -rf /var/lib/mysql/*
1 sudo echo "" > /var/log /mysql/error.log
修正 MySQL 配置文件 /etc/my.conf
的内容后,重新初始化 MySQL 1 2 sudo /usr/local /mysql/bin/mysqld --initialize
查看 MySQL 的错误日志文件,观察是否初始化成功 1 sudo cat /var/log /mysql/error.log
1 2 3 4 5 6 7 8 sudo touch /var/lib/mysql/mysql.pid sudo touch /var/lib/mysql/mysql.sock sudo chown mysql:mysql -R /var/lib/mysql
1 2 3 4 5 6 7 8 sudo systemctl enable mysqld sudo systemctl start mysqld sudo systemctl status mysqld
参考资料