Centos7离线安装Mysql8.0版本
文章目录
- 安装前准备离线安装包
- 前置依赖包
- mysql安装包下载
- MySQL 官网下载
- 阿里云下载
- 安装前置依赖
- 卸载系统自带的 MariaDB(避免冲突)
- 安装依赖
- 安装Mysql
- 创建Mysql用户和目录
- 解压二进制包到部署目录
- 配置 MySQL
- 创建配置文件/etc/my.cnf
- 设置环境变量:
- 配置系统服务
- 执行mysql命令提示"command not found"的问题
- 登录 MySQL 并修改初始密码
- 登录时输入密码报【1045】异常
- 修改 root 密码(MySQL 8.0 需使用新密码插件):
- (可选)允许远程登录:
- 配置防火墙(可选)
- 检查进程
- 查看监听端口
- 总结
- 常见问题
本文是通过Centos7操作演示的
安装前准备离线安装包
前置依赖包
libaio和numactl
查看版本名:
cat /etc/centos-release
输出结果:CentOS Linux release 7.9.2009 (Core)
通过https://vault.centos.org/地址去下载:其中Centos版本和CPU架构根据需要选择
#示例如下
libaio-0.3.109-13.el7.x86_64.rpm
numactl-2.0.12-5.el7.x86_64.rpm
numactl-libs-2.0.12-5.el7.x86_64.rpm
mysql安装包下载
MySQL 官网下载
访问MySQL 官网,选择Linux - Generic,下载对应版本(如mysql-8.0.34-linux-glibc2.12-x86_64.tar.xz)。
阿里云下载
下载Linux通用版本:linux-glibc
https://mirrors.aliyun.com/mysql
安装前置依赖
卸载系统自带的 MariaDB(避免冲突)
rpm -qa | grep mariadb
sudo rpm -e --nodeps 上述命令输出的包名
安装依赖
数据库安装必备:MySQL/Oracle 等依赖 libaio 异步 I/O 和 numactl 内存管理
高性能计算:NUMA 架构优化需 numactl 控制 CPU-内存绑定’
判断是否需要安装依赖:
# 校验安装,应显示 libaio 版本
rpm -qa | grep libaio
# 应显示 numactl 版本(如 numactl-2.0.9)
rpm -qa | grep numactl
查询有值则说明依赖已安装,如果没有值则需要把对应的依赖安装下面步骤完成
cd 到上传依赖的目录上执行
# 安装 libaio
rpm -ivh libaio-*.rpm --nodeps --force # 忽略依赖校验# 安装 numactl
rpm -ivh numactl-*.rpm --nodeps --force # 忽略依赖校验# 校验安装,应显示 libaio 版本
rpm -qa | grep libaio
# 应显示 numactl 版本(如 numactl-2.0.9)
rpm -qa | grep numactl # 检查 NUMA
numactl --hardware
安装Mysql
创建Mysql用户和目录
# 创建mysql用户组和用户
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql# 创建安装目录和数据目录(可自定义路径)
sudo mkdir -p /usr/local/mysql
sudo mkdir -p /data/mysql
#将上述目录赋权R权限给mysql用户
sudo chown -R mysql:mysql /usr/local/mysql /data/mysql
解压二进制包到部署目录
#如果目录不存在则创建
mkdir -p /usr/local/mysql/
# 解压安装包到安装目录
tar -xvf mysql-8.0.34-linux-glibc2.12-x86_64.tar.xz -C /usr/local/mysql/
# 进入安装目录
cd /usr/local/mysql# 初始化数据库(生成初始密码,记录在日志中)
# user=mysql(mysql操作linux时使用的用户), basedir=/usr/local/mysql(安装目录) datadir=/data/mysql(数据目录)
sudo bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
# 注意:初始化成功后,日志中会显示临时密码(如A temporary password is generated for root@localhost: xxxxx),需记录下来。# 启用SSL(可选,增强安全性)
sudo bin/mysql_ssl_rsa_setup --datadir=/data/mysql
配置 MySQL
创建配置文件/etc/my.cnf
sudo /etc/my.cnf
写入内容
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql
socket = /tmp/mysql.sock
port = 3306
bind-address=0.0.0.0
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
log-error = /data/mysql/mysqld.log
pid-file = /data/mysql/mysqld.pid
设置环境变量:
#将环境变量写入到/etc/profile.d/mysql_env.sh
sudo echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile.d/mysql_env.sh
#环境变量生效
sudo source /etc/profile
配置系统服务
#复制脚本到/etc/init.d/
sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
修改服务脚本中的路径(确保与实际安装路径一致):
sudo vi /etc/init.d/mysqld
#修改内容
basedir=/usr/local/mysql
datadir=/data/mysql
# 添加服务
sudo chkconfig --add mysqld
# 开机自启
sudo chkconfig mysqld on
# 启动服务
sudo service mysqld start
#验证服务状态
sudo service mysqld status
#查看mysql版本
mysql --version
执行mysql命令提示"command not found"的问题
#系统默认查找路径/usr/bin下无mysql命令链接
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
登录 MySQL 并修改初始密码
使用临时密码登录:
mysql -u root -p
输入初始化时记录的临时密码
登录时输入密码报【1045】异常
修改/etc/my.cnf文件
#在mysqld,添加skip-grant-tables
skip-grant-tables
关闭并启动mysqld服务
service mysqld stop
service mysqld start
登录mysql
mysql -u root
修改密码
-- 切换到mysql数据库
use mysql;-- 更新密码(注意替换新密码)
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';-- 刷新权限
FLUSH PRIVILEGES;-- 退出
exit;
修改/etc/my.cnf,注释掉跳过密码验证
#在mysqld,添加skip-grant-tables
skip-grant-tables
关闭并启动mysqld服务
service mysqld stop
service mysqld start
修改 root 密码(MySQL 8.0 需使用新密码插件):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewPassword@123';
FLUSH PRIVILEGES;
(可选)允许远程登录:
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'NewPassword@123';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
配置防火墙(可选)
如果需要远程访问,开放 3306 端口:
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
# 查看MySQL版本
mysql --version
检查进程
ps -ef | grep mysql
查看监听端口
netstat -tulpn | grep 3306
总结
常见问题
初始化失败:检查目录权限(确保 mysql 用户拥有/data/mysql权限),或清理数据目录(/data/mysql)后重新初始化。
登录报错 “Access denied”:确认临时密码正确,若遗忘可删除/data/mysql目录后重新初始化。
服务启动失败:查看日志/data/mysql/mysqld.log定位具体错误(如配置文件语法错误、端口被占用)。
# Mysql 离线安装
# 上传文件已完成之后的操作
# 因需要root权限,脚本需要 sudo mysql.sh
echo "开始mysql安装,前置依赖"
mariadb=`rpm -qa | grep mariadb`
#-z 是判断为空, -n判断不为空, "$"是防止变量未定义报错
if [ -z "$mariadb" ]; thenecho "mariadb已经卸载!"
elserpm -e $mariadb --nodepsecho "卸载mariadb"
fi
# 安装 libaio
libaio=`rpm -qa | grep libaio`
if [ -n "$libaio" ]; thenrpm -e $libaio --nodepsecho "卸载libaio"
fi
rpm -ivh libaio-*.rpm --nodeps --force # 忽略依赖校验# 安装 numactl
numactl=`rpm -qa | grep numactl`
if [ -n "$numactl" ]; thenrpm -e $numactl --nodepsecho "卸载libaio"
fi
rpm -ivh numactl-*.rpm --nodeps --force # 忽略依赖校验# 校验安装,应显示 libaio 版本
rpm -qa | grep libaio
# 应显示 numactl 版本(如 numactl-2.0.9)
rpm -qa | grep numactl # 检查 NUMA
numactl --hardware #创建用户组和用户
mysql_group=mysql
mysql_name=msyql
if getent group $mysql_group >/dev/null; thenecho "$mysql_group,用户组已存在"
elsesudo groupadd "$mysql_group"echo "$mysql_group,用户组创建成功"
fiif id -u "$mysql_name" >/dev/null 2>&1; thenecho "$mysql_name用户存在"}
elsesudo useradd -g $mysql_group -s /bin/shell $mysql_nameecho "$mysql_name用户不存在"
fi#创建mysql安装目录
mysql_path=/opt/hadoop/mysql
mysql_data=/opt/hadoop/mysql/data#-r(可读)、-w(可写)、-x(可执行)、-s(非空文件)
#-f 文件, -d 目录, -e 文件或目录
if [ -e "$mysql_path" ]; thenrm -rf $mysql_pathecho "$mysql_path,已删除"
fi
sudo mkdir -p $mysql_path
echo "$mysql_path,创建目录成功!"if [ -e "$mysql_data" ]; thenrm -rf $mysql_dataecho "$mysql_data,目录已删除"
fi
sudo mkdir -p $mysql_data
echo "$mysql_data,创建目录成功!"#对用户添加可读权限
sudo chown -R $mysql_group:$mysql_name $mysql_path # 解压安装包到安装目录
tar -xvf mysql-8.0.34-linux-glibc2.12-x86_64.tar.xz -C $mysql_path
# 进入安装目录
cd $mysql_path# 初始化数据库(生成初始密码,记录在日志中)
# user=mysql(mysql操作linux时使用的用户), basedir=/usr/local/mysql(安装目录) datadir=/data/mysql(数据目录)
sudo bin/mysqld --initialize --user=$mysql_name --basedir=$mysql_path --datadir=$mysql_data
# 注意:初始化成功后,日志中会显示临时密码(如A temporary password is generated for root@localhost: xxxxx),需记录下来。# 启用SSL(可选,增强安全性)
#bin/mysql_ssl_rsa_setup --datadir=$mysql_data# 创建配置文件 /etc/my.cnf
cat > /etc/my.cnf << EOF
[mysqld]
basedir=$mysql_path
datadir=$mysql_data
port = 3306
socket=/var/lib/mysql/mysql.sock
log-error=$myql_log/mysqld.log
pid-file=$myql_log/mysqld.pid
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
EOF#将环境变量写入到/etc/profile.d/mysql_env.sh
sudo echo "export PATH=$PATH:$mysql_path/bin" >> /etc/profile.d/mysql_env.sh
#环境变量生效
sudo source /etc/profile #复制脚本到/etc/init.d/#basedir=/usr/local/mysql
#datadir=/data/mysql
sudo cp $mysql_path/support-files/mysql.server /etc/init.d/mysqld# 添加服务
sudo chkconfig --add mysqld
# 开机自启
sudo chkconfig mysqld on
# 启动服务
sudo service mysqld start
#验证服务状态
sudo service mysqld status #修改初始化密码
# 获取临时密码
TEMP_PASS=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
[ -z "$TEMP_PASS" ] && { echo "获取临时密码失败"; exit 1; } # 修改密码策略并设置新密码
NEW_PASS="123123"
echo "正在修改root密码..."
mysql --connect-expired-password -uroot -p"$TEMP_PASS" <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$NEW_PASS';
SET GLOBAL validate_password.policy=LOW;
SET GLOBAL validate_password.length=4;
FLUSH PRIVILEGES;
EOF # 创建测试用户
mysql -uroot -p"$NEW_PASS" <<EOF
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'NewPassword@123';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EOF# 创建测试用户
mysql -uroot -p"$NEW_PASS" <<EOF
CREATE USER 'test'@'%' IDENTIFIED BY 'Test1234';
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%';
FLUSH PRIVILEGES;
EOF # 防火墙配置
echo "配置防火墙..."
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload