这是一个经过完整修复和逻辑优化的脚本。
主要修正点:
新增初始化步骤 :在启动服务前执行 mysqld --initialize,这是导致你之前启动失败的核心原因。补全 Socket 目录 :你的配置文件指定了 socket=/var/lib/mysql/mysql.sock,脚本增加了重建 /var/lib/mysql 的步骤,防止被清理脚本误删导致无法生成 sock 文件。SELinux 顺序调整 :调整了授权和上下文恢复的顺序,确保文件被正确初始化后再应用安全策略。请将以下内容保存为 install_mysql.sh:
Bash
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#!/bin/bash
# ==========================================
# 步骤 1: 清理旧环境 (Clean up)
# ==========================================
echo "正在停止数据库服务并清理旧环境..."
systemctl stop mysqld
systemctl stop mysql
systemctl stop mariadb
# 强制杀掉可能卡住的进程
pkill -9 mysqld
pkill -9 mysqld_safe
# 卸载相关包
yum remove -y mysql-community-*
yum remove -y mysql* MySQL*
yum remove -y mariadb*
# 删除旧的数据和配置文件
# 注意:这会清空 /data/mysql 下的所有数据,请确保已备份
rm -rf /data/mysql
rm -rf /var/lib/mysql
rm -rf /etc/my.cnf*
rm -rf /var/log/mysqld.log
echo "环境清理完成。"
# ==========================================
# 步骤 2: 安装软件 (Install)
# ==========================================
echo "开始安装 MySQL..."
# 检查安装包是否存在 (防止脚本报错)
if [ ! -f "mysql-5.7.40.tar.bz2" ] ; then
echo "错误: 当前目录下未找到 mysql-5.7.40.tar.bz2 文件!"
exit 1
fi
tar xvf mysql-5.7.40.tar.bz2
yum localinstall -y mysql-5.7.40/*
# ==========================================
# 步骤 3: 写入配置文件 (Configuration)
# ==========================================
echo "正在写入配置文件..."
cp -ar /etc/my.cnf{ ,.backup} 2>/dev/null
# --- 以下内容为你指定的配置,未做任何改动 ---
cat > /etc/my.cnf << EOF
[mysql]
#定义MySQL监听端口
port=3306
#定义MySQL监听IP地址
bind-address=0.0.0.0
[mysqld]
#定义MySQL字符集
character_set_server=utf8
init_connect='SET NAMES utf8'
#定义程序用户
user = mysql
#定义sock路径
socket=/var/lib/mysql/mysql.sock
#定义MySQLdata路径
datadir=/data/mysql/data
#定义MySQL最大链接
max_connections = 2000
#relay-log的结构和binlog非常相似,只不过他多了一个master.info和relay-log.info的文件。
#master.info记录了上一次读取到master同步过来的binlog的位置,以及连接master和启动复制必须的所有信息。
#relay-log.info记录了文件复制的进度,下一个事件从什么位置开始,由sql线程负责更新。
relay-log=/data/mysql/data/relay-log
#binlog的主要作用是记录数据库中表的更改,它只记录改变数据的sql
log-bin=/data/mysql/data/mysql-bin
#定义最大binlog大小
max_binlog_size = 500M
#为每个session分配内存,事务中用于二进制日志缓存存储,默认32K,提高bin_log的效率
binlog_cache_size = 128K
#定义无需主从同步的数据库,多个数据库需要重复设置于bin-do-db相反。
binlog-ignore-db = mysql
#MySQL-binlog保存时间
expire_logs_days = 7
#定义binlog格式
binlog_format="ROW"
#server-id集群标识不能重复
server-id=1
#跳过外部锁定用于多进程条件下为MyISAM数据表进行锁定
skip-external-locking
#禁用dns解析,此处如果禁用授权仅可授权ip
skip-name-resolve
#不添加log-slave-updates参数,从库从主库复制的数据不会写入log-bin日志文件里
#开启log-slave-updates参数后,从库从主库复制的数据会写入log-bin日志文件里,数据量过大会导致主从同步变慢
#log-slave-updates=1
#从服务器可能会遇到执行BINLOG中的SQL出错的情况lave-skip-errors的作用就是用来定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号
slave-skip-errors=1
#配置文件会限制server接受的数据包的大小。如果写入大数据时,因为默认的配置太小,插入和更新操作会因为 max_allowed_packet 参数限制,而导致失败。
max_allowed_packet = 100M
#忽略表明大小写
lower_case_table_names=1
#开启慢查询日志
slow_query_log=on
#定义慢查询日志路径
slow_query_log_file=/data/mysql/logs/slow_query_log.log
#定义慢查询日志触发时间
long_query_time=2
#是否只支持软连接=0表示不开启
symbolic-links=0
#MySQL-errorlog路径
log-error=/data/mysql/logs/mysql.err
#定义MySQL-SQLmodule
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#单个host链接错误次数等于max_connect_errors(默认10)
max_connect_errors = 100
###innodb优化参数
#默认8M可根据项目实际情况调整
innodb_buffer_pool_size=128M
#限制Innodb能打开的表的数据。根据库内表数量进行调整。默认300
innodb_open_files=800
[mysqld_safe]
#定义pid文件路径
pid-file=/var/run/mysqld/mysqld.pid
#error-log路径
log-error=/data/mysql/logs/mysql.err
EOF
# --- 配置写入结束 ---
# ==========================================
# 步骤 4: 目录初始化与权限 (Directory & Init)
# ==========================================
echo "正在配置目录和权限..."
# 创建数据目录和日志目录
mkdir -pv /data/mysql/{ data,logs}
# 【重要修复】创建 Socket 目录
# 配置文件里写了 socket=/var/lib/mysql/mysql.sock,如果不创建此目录,启动会报错
mkdir -pv /var/lib/mysql
# 修改权限
chown -R mysql:mysql /data/mysql/
chown -R mysql:mysql /var/lib/mysql/
# 确保必要的 SELinux 工具已安装 (防止 semanage 命令未找到)
if ! command -v semanage & > /dev/null; then
echo "正在安装 policycoreutils-python 以支持 SELinux 管理..."
yum install -y policycoreutils-python || yum install -y policycoreutils-python-utils
fi
# ==========================================
# 步骤 5: 数据库初始化 (Initialize DB)
# ==========================================
echo "正在初始化数据库 (这可能需要几秒钟)..."
# 【关键修复】手动执行初始化
# 使用 --initialize 会生成随机密码,记录在 log-error 文件中
mysqld --initialize --user= mysql --datadir= /data/mysql/data
if [ $? -ne 0 ] ; then
echo "错误: 数据库初始化失败!请检查 /data/mysql/logs/mysql.err"
exit 1
fi
# ==========================================
# 步骤 6: 启动与 SELinux (Startup)
# ==========================================
echo "正在处理 SELinux 并启动服务..."
# 先临时关闭 SELinux 以确保服务能顺利启动
setenforce 0
# 设置 SELinux 上下文 (如果开启了 SELinux)
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?" 2>/dev/null
restorecon -Rv /data/mysql
# 启动服务
systemctl start mysqld
systemctl enable mysqld
# 恢复 SELinux (可选,如果不想恢复可注释掉)
# setenforce 1
# ==========================================
# 步骤 7: 结果验证 (Verification)
# ==========================================
echo "----------------------------------------------------"
# 检查服务状态
if systemctl is-active --quiet mysqld; then
echo "✅ MySQL 启动成功!"
echo "数据库文件路径: /data/mysql/data"
echo "Socket 文件路径: /var/lib/mysql/mysql.sock"
# 提取临时密码
echo "----------------------------------------------------"
echo "正在获取 root 初始密码..."
temp_password = $( grep 'temporary password' /data/mysql/logs/mysql.err | awk '{print $NF}' )
if [ -n " $temp_password " ] ; then
echo "Root 初始密码: $temp_password "
else
echo "未找到临时密码,请手动查看日志: cat /data/mysql/logs/mysql.err"
fi
echo "----------------------------------------------------"
echo "请使用以下命令登录并修改密码:"
echo "mysql -uroot -p -S /var/lib/mysql/mysql.sock"
else
echo "❌ MySQL 启动失败。"
echo "请查看详细日志: cat /data/mysql/logs/mysql.err"
systemctl status mysqld -l
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
用上面的脚本运行的话,没有加载密码强度验证插件
你先登录上修改密码
在 mysql> 提示符下,输入以下命令(将 123456 换成你想设置的密码):
ALTER USER 'root' @'localhost' IDENTIFIED BY '123456' ;
FLUSH PRIVILEGES;
\q
mysql -uroot -p123456
INSTALL PLUGIN validate_password SONAME 'validate_password.so' ;
#再来用上面的指令来安装这个插件
就可以设置密码的强度了
#将策略改为最低(只校验长度)
set global validate_password_policy = 0;
# 将密码最小长度限制改为4(或者6)如果不改这个默认要求是8位
set global validate_password_length = 4;
#执行修改密码
alter user 'root' @'localhost' identified by '123123' ;
本文采用 CC BY-NC-SA 4.0 许可协议