做 Linux 运维 / 后端开发的朋友都知道,MySQL 安装方式五花八门,但二进制安装绝对是生产环境的首选 —— 无多余依赖、安装路径可控、版本切换灵活,还能避开 rpm 包安装的各种兼容性坑。
今天这篇教程,专门针对 MySQL 8.0.44(最新稳定版)的 Linux 二进制安装,全程保姆级拆解,每一步命令都可直接复制,哪怕你是刚接触 Linux 的新手,也能跟着抄出一个可直接上生产的 MySQL 环境,彻底告别 “安装一半卡壳、权限报错、启动失败” 的尴尬!
[root@asmorcl ~]# pvcreate /dev/sdb /dev/sdc
[root@asmorcl ~]# vgcreate vgmysql /dev/sdb /dev/sdc
[root@asmorcl ~]# lvcreate -n lvmysql -L 200G vgmysql
pvs 或 pvdisplayvgs 或 vgdisplaylvs 或 lvdisplay[root@asmorcl ~]# mkfs.ext4 /dev/vgmysql/lvmysql
mkdir /mysql
[root@asmorcl ~]# mount /dev/vgmysql/lvmysql /mysql
编辑 /etc/fstab,增加:
/dev/vgmysql/lvmysql /mysql ext4 defaults 0 0
[root@asmorcl ~]# lvextend -L +1g /dev/vgmysql/lvmysql
[root@asmorcl ~]# lvextend -L 30g /dev/vgmysql/lvmysql
[root@asmorcl ~]# pvcreate /dev/sdn
[root@asmorcl ~]# vgextend vgmysql /dev/sdn
[root@asmorcl ~]# lvreduce -L -2G /dev/vgback/lvback
[root@asmorcl ~]# lvremove /dev/backvg/backlv
[root@asmorcl ~]# vgremove backvg
[root@asmorcl ~]# pvremove /dev/sdp
假设新盘为 /dev/sdf,原VG为 vgmysql:
# 创建PV
pvcreate /dev/sdf
# 扩容VG
vgextend vgmysql /dev/sdf
# 扩容LV
lvextend -L +60g /dev/vgmysql/lvmysql
echo "192.168.101.68 lmysql " >> /etc/hosts
cat /etc/hosts
echo "export LANG=en_US" >> ~/.bash_profile
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
编辑 /etc/security/limits.conf,增加:
* soft nproc 16384
* hard nproc 16384
* soft nofile 16384
* hard nofile 65536
* soft stack 10240
* hard stack 32768
echo "* - nproc 16384" > /etc/security/limits.d/25-pw-rlimits.conf
编辑 /etc/selinux/config,将 SELINUX=enabled 改为 SELINUX=disabled。 临时生效:
setenforce 0
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
echo "session required pam_limits.so" >> /etc/pam.d/login
mount /dev/cdrom /mnt
cd /etc/yum.repos.d
rm *.repo
vi o2cfs.repo
增加以下内容:
[EL]
name=o2cfs
baseurl=file:///mnt
gpgcheck=0
enabled=1
rpm -qa | grep mysql
rpm -e 包名
rpm -qa | grep mariadb
rpm -e 包名 --nodeps # 强制删除
find / -name mysql
# 删除相关文件
rm -rf ...
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
编辑 ~/.bash_profile,增加:
PATH=$PATH:/mysql/app/mysql/bin:$HOME/bin
export PATH
使生效:
source ~/.bash_profile
mysql --version
which mysql
chown -R mysql:mysql /mysql
chmod -R 775 /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中不再使用
[root@lmysql 3306]# mysqld --defaults-file=/mysql/3306/my.cnf --initialize --user=mysql --basedir=/mysql/app/mysql --datadir=/mysql/3306/data
mysql_ssl_rsa_setup --user=mysql --basedir=/mysql/app/mysql --datadir=/mysql/3306/data
修改 /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
创建 /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
mysqld_safe --defaults-file=/mysql/3306/my.cnf
查看进程:
ps -ef | grep mysql
在 /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。
mysqladmin -uroot -p -S /mysql/3306/mysql.sock shutdown
在 /mysql/3306/ 下创建 stop_mysql:
#!/bin/bash
mysqladmin -uroot -p -S /mysql/3306/mysql.sock shutdown
设置权限:
chown mysql:mysql stop_mysql
chmod 775 stop_mysql
创建 /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
(此处略,使用MySQL客户端工具如Navicat、DBeaver等)
连接失败时,按以下步骤处理。
mysql -uroot -p -S /mysql/3306/mysql.sock
use mysql;
update user set host='%' where user='root';
flush privileges;
此时应该可以远程连接。
使用前面配置的脚本或systemctl等方式。
# 本地通过socket登录
mysql -uroot -p -S /mysql/3306/mysql.sock
# 远程登录
mysql -h192.168.101.68 -P3306 -uroot -p
show databases;
update user set authentication_string=password('新密码') where user='root';
flush privileges;
或者:
set password = password('新密码');
flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
flush privileges;
CREATE USER 'root'@'%' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
flush privileges;
编辑 /mysql/3306/my.cnf,在 [mysqld] 段添加:
skip-grant-tables
重启MySQL,然后无需密码登录,修改密码,之后去掉该行重启。
use mysql;
update user set password_expired='N' where user='root';
flush privileges;
CREATE DATABASE testdb;
CREATE USER 'test'@'%' IDENTIFIED BY 'testpass';
GRANT ALL PRIVILEGES ON testdb.* TO 'test'@'%';
flush privileges;
SHOW GRANTS FOR 'test'@'%';
默认会有 GRANT USAGE ON *.* TO 'test'@'%',表示连接权限。
(略)
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;
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 生产环境配置优化手册》,让你的数据库跑得更稳、更快