在Debian12中使用二进制方式安装MySQL8

2026-09-12 10:29:00
丁国栋
原创 9
摘要:本文记录如何使用MySQL二进制包安装。

使用通用二进制的安装方式。MySQL官方的手册:

使用通用二进制方式配置MySQL多实例。

所以我们依然使用传统的安装配置方式,每个实例使用单独的目录,使用mysqld命令初始化数据库,使用support-files/mysql.server来启动和关闭MySQL数据库。

注意:二进制的mysql依然可能需要一些依赖库,比如 libaio ,可以先尝试启动再根据报错安装 apt install -y libaio-dev

因为主机上已经安装过MySQL server并且处于运行中,所以我们在安装第二个实例时就可以复用一些配置,比如省去了新增mysql用户和组。同时端口号需要用另外一个,不能使用默认的3306端口。


注意:我们从官方地址 https://dev.mysql.com/downloads/mysql/ 下载MySQL 二进制包时,需要特别注意glibc(GNU C Library)的版本,一般来说官网会提供同一个MySQL版本号的两个不同的glibc版本。比如 8.0.43 的MySQL版本提供了 Linux - Generic (glibc 2.28) (x86, 64-bit) 和 Linux - Generic (glibc 2.17) (x86, 64-bit)。这时我们最好查询下当前系统已经安装的glibc版本,查询版本有两个基本方法:查询包管理器 dpkg -l |grep libc或者执行 ls -al /lib/x86_64-linux-gnu/libc.so* 看输出结果。版本高的 libc 支持兼容低版本的 libc,因此下载的MySQL二进制的文件libc版本必须等于或低于系统已安装的版本


我们以 https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.46-linux-glibc2.28-x86_64.tar.xz 为例,演示在 Debian GNU/Linux 12 (bookworm)  上配置,配置其服务端口为3306。

先准备一个基本的my.cnf配置文件:

cat > /usr/local/mysql/my.cnf <<'eof'
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
port=3306
pid-file=/usr/local/mysql/mysqld.pid
log-error=/usr/local/mysql/error.log
eof

基本命令大致如下:

groupadd mysql #mysql:x:110:
useradd -r -g mysql -s /bin/false mysql #mysql:x:105:110:MySQL Server,,,:/nonexistent:/bin/false
cd /usr/local/
wget -c https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.46-linux-glibc2.28-x86_64.tar.xz
tar xf mysql-8.0.46-linux-glibc2.28-x86_64.tar.xz
ln -s mysql-8.0.46-linux-glibc2.28-x86_64 mysql
echo | tee /usr/local/mysql/error.log
chown mysql:mysql -R /usr/local/mysql/
/usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/my.cnf --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --lc-messages-dir=/usr/local/mysql/share --lc-messages=en_US --explicit_defaults_for_timestamp --initialize --user=mysql --console --log-error=/usr/local/mysql/error.log
/usr/local/mysql/support-files/mysql.server start

以上步骤需要注意以下几点:

  1. bin/mysqld第一个参数必须是 --defaults-file=/usr/local/mysql/my.cnf,否则mysqld可能会加载其他 mysql 配置文件,导致初始化失败。
  2. 在使用mysqld初始化数据库时使用了--console --log-error=/usr/local/mysql/error.log 参数,数据库的默认密码会输出到 /usr/local/mysql/error.log 日志中,搜索字符串 [Note] A temporary password is generated for root@localhost
  3. Ubuntu系统特有的apparmor类似RHEL系的SELinux,需要进行配置或者禁用,否则可能会在/var/log/syslog里收到来自内核(apparmor运行在内核)的错误提示 apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/usr/local/mysql/share/english/errmsg.sys" pid=1036654 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=1000 ouid=1000apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/usr/local/mysql/data/" pid=1036654 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=1000 ouid=135。可以通过命令 apparmor_status 查看apparmor 加载状态。如果要完全禁用 apparmor 可能需要重启。
  4. support-files/mysql.server 文件里建议修改三个参数设置:basedir=,datadir=和mysqld_pid_file_path=,建议值:basedir=/usr/local/mysqldatadir="$basedir/data"mysqld_pid_file_path="$basedir/mysqld.pid"

使用密码登录到新的MySQL实例

mysql -S /usr/local/mysql/mysql.sock -p

注意:有的系统自带的mysql命令可能版本较低,无法支持一些新特性,建议使用新安装的mysql目录下的二进制文件,例如一个典型报错


使用ALTER USER语句完成用户的初始化(就像首次使用必须更改密码),否则会收到mysql提示:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'XXXXXXXX'

在配置和调试的过程中,我们需要有以下认知:

  1. 从可信的官网文档中查找最佳实践方法,确保方法是对的,可以行得通的,如果出现问题,那问题多数不在官方,而是在自己的环境和步骤中;
  2. 在遇到问题时,坚信没有诡异的问题,只有没有搞明白的问题,问题依然存在的原因只是因为我们没有找到问题的根源;
  3. 保持心平气和的心态,不浮躁;

注意:如果启动mysql后报错但没有记录到日志,可以考虑禁用配置文件中的 log-error 配置,使用 syslog,因为有的mysql版本只能把某些错误(例如 error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory)打印到 syslog。参考命令行/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/mysql/my.cnf --user=mysql --datadir=/usr/local/mysql/data/ --pid-file=/usr/local/mysql/mysqld.pid --syslog


发表评论
博客分类