当前位置:首页>Linux>照着抄就行!Linux 手工二进制安装 MySQL 8.0.44

照着抄就行!Linux 手工二进制安装 MySQL 8.0.44

  • 2026-09-09 09:19:53
照着抄就行!Linux 手工二进制安装 MySQL 8.0.44
做 Linux 运维 / 后端开发的朋友都知道,MySQL 安装方式五花八门,但二进制安装绝对是生产环境的首选 —— 无多余依赖、安装路径可控、版本切换灵活,还能避开 rpm 包安装的各种兼容性坑。
今天这篇教程,专门针对 MySQL 8.0.44(最新稳定版)的 Linux 二进制安装,全程保姆级拆解,每一步命令都可直接复制,哪怕你是刚接触 Linux 的新手,也能跟着抄出一个可直接上生产的 MySQL 环境,彻底告别 “安装一半卡壳、权限报错、启动失败” 的尴尬!

2.3 Linux环境下安装MySQL8.0.44(二进制安装)

2.3.1 MySQL硬件环境准备

  • OS:CentOS 9

2.3.2 MySQL软件下载

  • 地址:https://www.mysql.com

2.3.3 磁盘规划

2.3.3.1 路径规划

路径
大小
备注
/mysql/app/mysql
200G
安装目录(根据实际需要分配)
/mysql/3306/data
-
数据目录
/mysql/3306/log
-
日志目录
/mysql/backup
-
备份目录

2.3.4 LVM卷管理

2.3.4.1 创建物理卷PV

[root@asmorcl ~]# pvcreate /dev/sdb /dev/sdc

2.3.4.2 创建卷组VG

[root@asmorcl ~]# vgcreate vgmysql /dev/sdb /dev/sdc

2.3.4.3 创建逻辑卷LV

[root@asmorcl ~]# lvcreate -n lvmysql -L 200G vgmysql

2.3.4.4 卷查看

  • pvs 或 pvdisplay
  • vgs 或 vgdisplay
  • lvs 或 lvdisplay

2.3.4.5 格式化逻辑卷

[root@asmorcl ~]# mkfs.ext4 /dev/vgmysql/lvmysql

2.3.4.6 逻辑卷挂载

mkdir /mysql
[root@asmorcl ~]# mount /dev/vgmysql/lvmysql /mysql

2.3.4.7 加载到开机启动中

编辑 /etc/fstab,增加:

/dev/vgmysql/lvmysql  /mysql  ext4  defaults  0 0

2.3.4.8 LV扩容、缩容

LV扩容

  • LV空间加1G
    [root@asmorcl ~]# lvextend -L +1g /dev/vgmysql/lvmysql
  • LV空间加到30G
    [root@asmorcl ~]# lvextend -L 30g /dev/vgmysql/lvmysql
  • VG扩容
    [root@asmorcl ~]# pvcreate /dev/sdn
    [root@asmorcl ~]# vgextend vgmysql /dev/sdn

LV缩容

[root@asmorcl ~]# lvreduce -L -2G /dev/vgback/lvback

2.3.4.9 移除

[root@asmorcl ~]# lvremove /dev/backvg/backlv
[root@asmorcl ~]# vgremove backvg
[root@asmorcl ~]# pvremove /dev/sdp

2.3.4.10 增加硬盘扩展LVM的容量

假设新盘为 /dev/sdf,原VG为 vgmysql:

# 创建PV
pvcreate /dev/sdf
# 扩容VG
vgextend vgmysql /dev/sdf
# 扩容LV
lvextend -L +60g /dev/vgmysql/lvmysql

2.3.5 安装前系统配置

2.3.5.1 配置hosts

echo "192.168.101.68 lmysql " >> /etc/hosts
cat /etc/hosts

2.3.5.2 英文环境配置

echo "export LANG=en_US" >> ~/.bash_profile

2.3.5.3 创建用户、组、目录

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

mkdir -p /mysql/3306/data
mkdir -p /mysql/3306/log
mkdir -p /mysql/app
mkdir -p /mysql/backup

2.3.5.4 修改资源限参数

编辑 /etc/security/limits.conf,增加:

* soft nproc 16384
* hard nproc 16384
* soft nofile 16384
* hard nofile 65536
* soft stack 10240
* hard stack 32768

2.3.5.5 修改nproc参数

echo "* - nproc 16384" > /etc/security/limits.d/25-pw-rlimits.conf

2.3.5.6 修改安全策略

编辑 /etc/selinux/config,将 SELINUX=enabled 改为 SELINUX=disabled。 临时生效:

setenforce 0

2.3.5.7 关闭防火墙

systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service

2.3.5.8 控制给用户分配的资源

echo "session required pam_limits.so" >> /etc/pam.d/login

2.3.5.9 配置本地YUM源及软件包安装

mount /dev/cdrom /mnt
cd /etc/yum.repos.d
rm *.repo
vi o2cfs.repo

增加以下内容:

[EL]
name=o2cfs
baseurl=file:///mnt
gpgcheck=0
enabled=1

2.3.5.10 检查是否有历史版本的MySQL

rpm -qa | grep mysql
rpm -e 包名

rpm -qa | grep mariadb
rpm -e 包名 --nodeps   # 强制删除

2.3.5.11 检查MySQL相关文件

find / -name mysql
# 删除相关文件
rm -rf ...

2.3.6 MySQL安装

2.3.6.1 上传并解压安装包

cd /mysql/app
tar -xvf mysql-8.0.44-linux-glibc2.28-x86_64.tar.xz
ln -s mysql-8.0.44-linux-glibc2.28-x86_64 mysql

2.3.6.2 配置环境变量(root用户)

编辑 ~/.bash_profile,增加:

PATH=$PATH:/mysql/app/mysql/bin:$HOME/bin
export PATH

使生效:

source ~/.bash_profile
mysql --version
which mysql

2.3.6.3 修改权限

chown -R mysql:mysql /mysql
chmod -R 775 /mysql

2.3.6.4 创建MySQL配置文件

cd /mysql/3306
vi my.cnf

将以下配置写入 my.cnf:

[client]
port=3306
socket=/mysql/3306/mysql.sock

[mysql]
no-beep
prompt="\u@mysqldb \R:\m:\s [\d]> "
auto-rehash
default-character-set=utf8mb4

[mysqld]
#######
#basic settings########
server-id=3306
port=3306
user = mysql
bind_address = 0.0.0.0
basedir=/mysql/app/mysql
datadir=/mysql/3306/data
socket=/mysql/3306/mysql.sock
pid-file =/mysql/3306/mysql.pid
character-set-server=utf8mb4
#skip-character-set-client-handshake=1   # MySQL 8中已不支持
# autocommit = 0                          # MySQL 8中已不支持
#skip_name_resolve = 1
federated
max_connections = 800
max_connect_errors = 1000
default-storage-engine=INNODB
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp=1
sort_buffer_size = 32M
join_buffer_size = 128M
tmp_table_size = 72M
max_allowed_packet = 16M
# sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"  # MySQL 8中已不支持
interactive_timeout = 1800
wait_timeout = 1800
read_buffer_size = 16M
read_rnd_buffer_size = 32M
#query_cache_type = 1                     # MySQL 8中已不支持
#query_cache_size=1M                      # MySQL 8中已不支持
table_open_cache=2000
thread_cache_size=768
key_buffer_size=32M
read_buffer_size=8M
read_rnd_buffer_size=4M
back_log=1024
#flush_time=0
open_files_limit=65536
table_definition_cache=1400
#binlog_row_event_max_size=8K
#sync_master_info=10000
#sync_relay_log=10000
#sync_relay_log_info=10000

########log settings########
log-output=FILE
general-log=0
general_log_file=/mysql/3306/log/all-general.err
slow-query-log=ON
slow_query_log_file=/mysql/3306/log/slow-query.err
long_query_time=10
log-error=/mysql/3306/log/log-error.err
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_slow_replica_statements=1
log_throttle_queries_not_using_indexes = 10
binlog_expire_logs_seconds=604800
log-bin=/mysql/3306/data/mysql-bin
min_examined_row_limit = 100

########replication settings#########
#master_info_repository = TABLE
#relay_log_info_repository = TABLE
#log_bin = bin.log
#sync_binlog = 1
#gtid_mode = on
#enforce_gtid_consistency = 1
#log_slave_updates
#binlog_format = row
#relay_log = relay.log
#relay_log_recovery = 1
#binlog_gtid_simple_recovery = 1
#slave_skip_errors = ddl_exist_errors

########innodb settings#########
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_buffer_pool_size = 5000M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_lru_scan_depth = 2000
innodb_lock_wait_timeout = 5
#innodb_flush_method = O_DIRECT
#innodb_log_file_size = 200M             # MySQL 8中不再使用
#innodb_log_files_in_group = 2           # MySQL 8中不再使用
innodb_redo_log_capacity = 400M
innodb_log_buffer_size = 16M
#innodb_undo_logs = 128                   # MySQL 8中不再使用
#innodb_undo_tablespaces = 3              # MySQL 8中不再使用
#innodb_undo_log_truncate = 1             # MySQL 8中不再使用
#innodb_max_undo_log_size = 2G            # MySQL 8中不再使用
innodb_flush_neighbors = 1
innodb_purge_threads = 4
#innodb_large_prefix = 1                  # MySQL 8中不再使用
innodb_thread_concurrency = 64
innodb_print_all_deadlocks = 1
innodb_strict_mode = 1
innodb_sort_buffer_size = 64M
innodb_flush_log_at_trx_commit=1
innodb_autoextend_increment=64
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=65536
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
innodb_data_file_path=ibdata1:200M;ibdata2:200M;ibdata3:200M:autoextend:max:5G
innodb_temp_data_file_path = ibtmp1:200M:autoextend:max:20G
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_purge_rseg_truncate_frequency = 128
binlog_gtid_simple_recovery=1
log_timestamps=system
#transaction_write_set_extraction=MURMUR32
#show_compatibility_56=on                  # MySQL 8中不再使用

2.3.6.5 初始化数据库

[root@lmysql 3306]# mysqld --defaults-file=/mysql/3306/my.cnf --initialize --user=mysql --basedir=/mysql/app/mysql --datadir=/mysql/3306/data

2.3.6.6 SSL认证(历史版本可能需要)

mysql_ssl_rsa_setup --user=mysql --basedir=/mysql/app/mysql --datadir=/mysql/3306/data

2.3.6.7 配置启动方式

方式1:System V init脚本(CentOS 7之前使用)

修改 /mysql/app/mysql/support-files/mysql.server:

basedir=/mysql/app/mysql
datadir=/mysql/3306/data
mysqld_pid_file_path=/mysql/3306/mysql.pid
bindir=/mysql/app/mysql/bin
sbindir=/mysql/app/mysql/sbin
libexecdir=/mysql/app/mysql/bin

并在启动命令中加入 --defaults-file 参数。 然后复制到 init.d:

cp mysql /etc/init.d/
service mysql start
service mysql stop

方式2:systemd服务(CentOS 8及以后推荐)

创建 /etc/systemd/system/mysqld.service:

[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/mysql/app/mysql/bin/mysqld --defaults-file=/mysql/3306/my.cnf --basedir=/mysql/app/mysql --datadir=/mysql/3306/data --log-error=/mysql/3306/log/log-error.err --pid-file=/mysql/3306/mysql.pid --socket=/mysql/3306/mysql.sock
ExecStop=/mysql/app/mysql/bin/mysqladmin -u root -p shutdown
Restart=always

[Install]
WantedBy=multi-user.target

启动:

systemctl start mysql
systemctl stop mysql

方式3:直接使用mysqld_safe启动

mysqld_safe --defaults-file=/mysql/3306/my.cnf

查看进程:

ps -ef | grep mysql

方式4:编写可执行脚本

在 /mysql/3306/ 下创建 start_mysql:

#!/bin/bash
mysqld_safe --defaults-file=/mysql/3306/my.cnf --basedir=/mysql/app/mysql --datadir=/mysql/3306/data --log-error=/mysql/3306/log/log-error.err --pid-file=/mysql/3306/mysql.pid --socket=/mysql/3306/mysql.sock

设置权限并启动:

chown mysql:mysql start_mysql
chmod 775 start_mysql
./start_mysql

可将 /mysql/3306 加入PATH以便直接执行 start_mysql。

2.3.6.8 配置停止方式

方式1:直接使用mysqladmin

mysqladmin -uroot -p -S /mysql/3306/mysql.sock shutdown

方式2:编写停止脚本

在 /mysql/3306/ 下创建 stop_mysql:

#!/bin/bash
mysqladmin -uroot -p -S /mysql/3306/mysql.sock shutdown

设置权限:

chown mysql:mysql stop_mysql
chmod 775 stop_mysql

2.3.6.9 编写SHELL脚本(启动/停止/重启/状态)

创建 /mysql/3306/mysql3306:

#!/bin/bash

command=$1

if [ "$command" != "start" ] && [ "$command" != "stop" ] && [ "$command" != "restart" ] && [ "$command" != "status" ]; then
echo "命令格式有问题,请输入正确的格式:./mysql3306 start 或者 ./mysql3306 stop"
exit 1
fi

MYSQL_BASEDIR="/mysql/app/mysql"
MYSQL_CNF="/mysql/3306/my.cnf"
MYSQL_SOCKET="/mysql/3306/mysql.sock"
MYSQL_DATA="/mysql/3306/data"
MYSQL_ERROR_LOG="/mysql/3306/log/log-error.err"

mysql_start() {
if [ -S $MYSQL_SOCKET ]; then
echo "错误:MySQL 已经在运行,请勿重复操作!"
exit 1
fi
echo "------------------------开始启动mysql------------------"
    mysqld_safe --defaults-file=$MYSQL_CNF --log-error=$MYSQL_ERROR_LOG &
sleep 5
if [ -S $MYSQL_SOCKET ]; then
        MYSQL_PID=$(ps aux|grep mysqld|grep -v grep|grep -v mysqld_safe|awk '{print $2}')
echo "MySQL启动成功!PID为:$MYSQL_PID"
else
echo "MySQL 启动有问题,请检查错误日志:$MYSQL_ERROR_LOG"
tail -10 $MYSQL_ERROR_LOG
exit 1
fi
}

mysql_stop() {
if [ ! -S $MYSQL_SOCKET ]; then
echo "错误:MySQL 未运行,请勿重复操作!"
exit 1
fi
echo "------------------------开始暂停mysql------------------"
    mysqladmin -uroot -p -S /mysql/3306/mysql.sock shutdown
sleep 5
if [ ! -S $MYSQL_SOCKET ]; then
echo "MySQL暂停成功!"
else
echo "MySQL暂停存在问题,请检查错误日志:$MYSQL_ERROR_LOG"
tail -10 $MYSQL_ERROR_LOG
exit 1
fi
echo "清理残留进程中......."
    pkill -f "mysqld.*" 2>/dev/null
sleep 2
echo "残留进程清理完成....."
}

check_status(){
if [ ! -S $MYSQL_SOCKET ]; then
echo "MySQL是暂停状态!"
exit 1
else
echo "MySQL是开启状态"
exit 1
fi
}

if [ "$command" == "start" ]; then
    mysql_start
elif [ "$command" == "stop" ]; then
    mysql_stop
elif [ "$command" == "restart" ]; then
    mysql_stop
sleep 4
    mysql_start
elif [ "$command" == "status" ]; then
    check_status
fi

赋予执行权限:

chmod +x /mysql/3306/mysql3306

2.3.7 远程连接与测试

2.3.7.1 打开设置界面

(此处略,使用MySQL客户端工具如Navicat、DBeaver等)

2.3.7.2 设置连接参数

  • 主机:192.168.101.68
  • 端口:3306
  • 用户名:root
  • 密码:初始化时生成的临时密码(查看错误日志获取)

2.3.7.3 测试连接

连接失败时,按以下步骤处理。

2.3.7.4 解决测试连接出现的问题

  1. 登录MySQL(本地):
    mysql -uroot -p -S /mysql/3306/mysql.sock
  2. 切换数据库:
    use mysql;
  3. 更新root用户的host:
    update user set host='%' where user='root';
  4. 刷新权限:
    flush privileges;

2.3.7.5 再次测试连接

此时应该可以远程连接。

2.3.8 后期配置

2.3.8.1 数据库启动、停止

使用前面配置的脚本或systemctl等方式。

2.3.8.2 数据库的登录方式

# 本地通过socket登录
mysql -uroot -p -S /mysql/3306/mysql.sock
# 远程登录
mysql -h192.168.101.68 -P3306 -uroot -p

2.3.8.3 查看当前有多少数据库

show databases;

2.3.8.4 修改数据库密码(MySQL 8.0之前)

update user set authentication_string=password('新密码') where user='root';
flush privileges;

或者:

set password = password('新密码');
flush privileges;

2.3.8.5 修改数据库密码(MySQL 8.0及以后)

ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
flush privileges;

2.3.8.6 创建一个可以远程访问的用户

CREATE USER 'root'@'%' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
flush privileges;

2.3.8.7 如果忘记密码如何处理

编辑 /mysql/3306/my.cnf,在 [mysqld] 段添加:

skip-grant-tables

重启MySQL,然后无需密码登录,修改密码,之后去掉该行重启。

2.3.8.8 密码过期处理

use mysql;
update user set password_expired='N' where user='root';
flush privileges;

2.3.9 创建新用户、新数据库

2.3.9.1 创建一个新的数据库

CREATE DATABASE testdb;

2.3.9.2 创建一个新的用户,并给testdb数据库的所有权限

CREATE USER 'test'@'%' IDENTIFIED BY 'testpass';
GRANT ALL PRIVILEGES ON testdb.* TO 'test'@'%';
flush privileges;

2.3.9.3 查看新增用户的权限

SHOW GRANTS FOR 'test'@'%';

默认会有 GRANT USAGE ON *.* TO 'test'@'%',表示连接权限。

2.3.9.4 在客户端用新用户连接,可查看具有的访问权限

(略)

2.3.9.5 在新数据库下创建一个表

USE testdb;

CREATE TABLE Person
(
   perid INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
   name VARCHAR(50) NOT NULL,
   age FLOAT(6,2) CHECK (age >= 0 AND age <= 150),
   created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO Person (name, age) VALUES
('测试用户1', 18.50),
('测试用户2', 22.75),
('测试用户3', 29.00),
('测试用户4', 33.25),
('测试用户5', 41.50),
('测试用户6', 27.75),
('测试用户7', 35.00),
('测试用户8', 19.25),
('测试用户9', 44.50),
('测试用户10', 31.75);

COMMIT;

SELECT * FROM Person;

2.3.10 删除数据库

2.3.10.1 删除数据库及相关文件

rm -rf /mysql/app/*
rm -rf /mysql/3306/data/*
rm -rf /mysql/3306/log/*
rm -rf /etc/init.d/mysql

# 删除用户和组
id mysql
userdel mysql
groupdel mysql
以上就是 MySQL 8.0.44 二进制安装的完整流程,亲测适配 CentOS 7/8、RHEL 等主流 Linux 发行版,也是我们日常给企业部署生产环境的标准操作。
如果这篇教程帮到了你,别忘了点赞 + 在看 + 收藏,避免下次需要时找不到;关注我的公众号,后续还会更新 MySQL 8.0 的性能优化、主从复制、故障排查等硬核干货,都是能直接落地的实战内容。
如果安装过程中遇到任何问题(比如权限报错、端口占用、初始化失败),欢迎在评论区留言,我会第一时间回复解答;也可以私信我,领取《MySQL 8.0 生产环境配置优化手册》,让你的数据库跑得更稳、更快

最新文章

随机文章