install-mysql

1.自动部署mysql5.7

脚本功能:自动部署mysql5.7
测试系统:CentOS7.6
mysql安装文件:二进制包
mysql下载地址:https://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
或者官网下载
将本脚本和二进制包放在同一目录下,脚本会在本目录下创建mysql作为mysql安装目录
本脚本默认会下载二进制包,如果自己上传,可以注释掉
2020.11.10新增rpm包部署选项

脚本命令

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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
#!/bin/bash


#######################定义变量##############################
# 包下载目录
src_dir=$(pwd)/00src00
# 端口
PORT=3306
# mysql部署好后,root的默认密码
my_root_passwd=123456
# mysql版本
mysql_version=5.7.36
unit_file_name=mysqld.service

#****************以上为通用变量*****************************
#****************以下为二进制部署才需要的变量******************
# 部署目录的父目录
DIR=$(pwd)
# 部署目录的名字,最终的部署目录为${DIR}/${mysql_dir_name}
mysql_dir_name=mysql-${mysql_version}

# 解压后的名字
FILE=mysql-${mysql_version}-linux-glibc2.12-x86_64
# mysql二进制包名字
mysql_tgz=${FILE}.tar.gz
#############################################################

# 带格式的echo函数
function echo_info() {
echo -e "[\033[36m$(date +%T)\033[0m] [\033[32mINFO\033[0m] \033[37m$@\033[0m"
}
function echo_warning() {
echo -e "[\033[36m$(date +%T)\033[0m] [\033[1;33mWARNING\033[0m] \033[1;37m$@\033[0m"
}
function echo_error() {
echo -e "[\033[36m$(date +%T)\033[0m] [\033[41mERROR\033[0m] \033[1;31m$@\033[0m"
}

# 解压
function untar_tgz(){
echo_info 解压 $1
tar xf $1
if [ $? -ne 0 ];then
echo_error 解压出错,请检查!
exit 1
fi
}

# 首先判断当前目录是否有压缩包:
# I. 如果有压缩包,那么就在当前目录解压;
# II.如果没有压缩包,那么就检查有没有 ${src_dir} 表示的目录;
# 1) 如果有目录,那么检查有没有压缩包
# ① 有压缩包就解压
# ② 没有压缩包则下载压缩包
# 2) 如果没有,那么就创建这个目录,然后 cd 到目录中,然后下载压缩包,然
# 后解压
# 解压的步骤都在后面,故此处只做下载

# 语法: download_tar_gz 保存的目录 下载链接
# 使用示例: download_tar_gz /data/openssh-update https://mirrors.cloud.tencent.com/openssl/source/openssl-1.1.1h.tar.gz
function download_tar_gz(){
download_file_name=$(echo $2 | awk -F"/" '{print $NF}')
back_dir=$(pwd)
file_in_the_dir='' # 这个目录是后面编译目录的父目录

ls $download_file_name &> /dev/null
if [ $? -ne 0 ];then
# 进入此处表示脚本所在目录没有压缩包
ls -d $1 &> /dev/null
if [ $? -ne 0 ];then
# 进入此处表示没有${src_dir}目录
mkdir -p $1 && cd $1
echo_info 下载 $download_file_name 至 $(pwd)/
# 检测是否有wget工具
if [ ! -f /usr/bin/wget ];then
echo_info 安装wget工具
yum install -y wget
fi
wget $2
if [ $? -ne 0 ];then
echo_error 下载 $2 失败!
exit 1
fi
file_in_the_dir=$(pwd)
# 返回脚本所在目录,这样这个函数才可以多次使用
cd ${back_dir}
else
# 进入此处表示有${src_dir}目录
cd $1
ls $download_file_name &> /dev/null
if [ $? -ne 0 ];then
# 进入此处表示${src_dir}目录内没有压缩包
echo_info 下载 $download_file_name 至 $(pwd)/
# 检测是否有wget工具
if [ ! -f /usr/bin/wget ];then
echo_info 安装wget工具
yum install -y wget
fi
wget $2
if [ $? -ne 0 ];then
echo_error 下载 $2 失败!
exit 1
fi
file_in_the_dir=$(pwd)
cd ${back_dir}
else
# 进入此处,表示${src_dir}目录内有压缩包
echo_info 发现压缩包$(pwd)/$download_file_name
file_in_the_dir=$(pwd)
cd ${back_dir}
fi
fi
else
# 进入此处表示脚本所在目录有压缩包
echo_info 发现压缩包$(pwd)/$download_file_name
file_in_the_dir=$(pwd)
fi
}

function add_user_and_group(){
if id -g ${1} >/dev/null 2>&1; then
echo_warning ${1}组已存在,无需创建
else
groupadd ${1}
echo_info 创建${1}
fi
if id -u ${1} >/dev/null 2>&1; then
echo_warning ${1}用户已存在,无需创建
else
useradd -M -g ${1} -s /sbin/nologin ${1}
echo_info 创建${1}用户
fi
}

function init_account(){
login_pass=$1

systemctl enable ${unit_file_name} >/dev/null 2>&1
systemctl start ${unit_file_name}
# mysql启动失败的话退出
if [ $? -ne 0 ];then
echo_error mysql启动失败,请查看错误信息
exit 2
fi

# mysql启动成功后的操作
source /etc/profile

echo_info 设置密码
mysql -uroot -p"${login_pass}" --connect-expired-password -e "SET PASSWORD = PASSWORD('${my_root_passwd}');flush privileges;" &> /dev/null

echo_info 重启mysql
systemctl restart ${unit_file_name}
echo_info 设置所有主机均可访问mysql
mysql -uroot -p"${my_root_passwd}" -e "grant all on *.* to root@'%' identified by '${my_root_passwd}' WITH GRANT OPTION;" &> /dev/null

echo_info 重启mysql
systemctl restart ${unit_file_name}

echo_info mysql已启动成功!相关信息如下:
echo -e "\033[37m 端口:${PORT}\033[0m"
echo -e "\033[37m 账号:root\033[0m"
echo -e "\033[37m 密码:${my_root_passwd}\033[0m"

echo_info mysql控制命令:
echo -e "\033[37m 启动:systemctl start ${unit_file_name}\033[0m"
echo -e "\033[37m 重启:systemctl restart ${unit_file_name}\033[0m"
echo -e "\033[37m 停止:systemctl stop ${unit_file_name}\033[0m"
}

########## rpm安装mysql
function install_by_rpm(){
rm -f /var/log/mysqld.log
download_tar_gz ${src_dir} http://mirrors.163.com/mysql/Downloads/MySQL-5.7/mysql-${mysql_version}-1.el7.x86_64.rpm-bundle.tar
cd ${file_in_the_dir}
untar_tgz mysql-${mysql_version}-1.el7.x86_64.rpm-bundle.tar

echo_info 安装依赖
yum install -y perl-Data-Dumper perl-JSON
echo_info 使用rpm包安装mysql
rpm -Uvh ./mysql-community-*rpm
#yum install -y ./mysql-community-*rpm
if [ $? -eq 0 ];then
echo_info 已成功安装mysql,即将进行一些优化配置
else
echo_error 安装出错,请检查!
exit 3
fi

if [ -f /etc/my.cnf ];then
mv /etc/my.cnf /etc/my.cnf_`date +%F`
echo_warning 检测到配置文件,已备份为/etc/my.cnf_`date +%F`
fi

# 生成新的/etc/my.cnf
echo_info 初始化/etc/my.cnf
cat > /etc/my.cnf << EOF
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[client]
socket=/var/lib/mysql/mysql.sock

[mysql]
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock

[mysqld]
#skip-grant-tables
# 跳过dns解析,提升连接速度
skip-name-resolve
port=${PORT}
socket=${DIR}/${mysql_dir_name}/data/mysql.sock
basedir=${DIR}/${mysql_dir_name}
datadir=${DIR}/${mysql_dir_name}/data
max_connections=200
character-set-server=utf8mb4
default-storage-engine=INNODB
max_allowed_packet=16M
# 不区分大小写
lower_case_table_names = 1

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
EOF

systemctl start mysqld # 这里启动是为了生成临时密码
temp_pass=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
init_account ${temp_pass}
}

function check_dir() {
if [ -d $1 ];then
echo_error 目录 $1 已存在,退出
exit 4
fi
}

function install_by_tgz(){
download_tar_gz ${src_dir} http://mirrors.163.com/mysql/Downloads/MySQL-5.7/${mysql_tgz}
#download_tar_gz ${src_dir} https://mirrors.cloud.tencent.com/mysql/downloads/MySQL-5.7/${mysql_tgz}
cd ${file_in_the_dir}
untar_tgz ${mysql_tgz}

check_dir ${DIR}/${mysql_dir_name}
mv ${FILE} ${DIR}/${mysql_dir_name}

add_user_and_group mysql

echo_info 初始化mysql
mkdir -p ${DIR}/${mysql_dir_name}/data
chown -R mysql:mysql ${DIR}/${mysql_dir_name}/

# 初始化
cd ${DIR}/${mysql_dir_name}
bin/mysqld --initialize --basedir=${DIR}/${mysql_dir_name} --datadir=${DIR}/${mysql_dir_name}/data --pid-file=${DIR}/${mysql_dir_name}/data/mysql.pid >/tmp/mysql_password.txt 2>&1

# 获取初始密码
init_password=$(awk '/password/ {print $11}' /tmp/mysql_password.txt)
rm -f /tmp/mysql_password.txt

# 初始化完成后,data目录会生成文件,所以重新赋权
chown -R mysql:mysql ${DIR}/${mysql_dir_name}/
echo_info 初始化完毕

# 备份原来的/etc/my.cnf
if [ -f /etc/my.cnf ];then
mv /etc/my.cnf /etc/my.cnf_`date +%F`
echo_warning 检测到配置文件,已备份为/etc/my.cnf_`date +%F`
fi

# 生成新的/etc/my.cnf
echo_info 初始化/etc/my.cnf
cat > /etc/my.cnf << EOF
[client]
socket=${DIR}/${mysql_dir_name}/data/mysql.sock

[mysql]
default-character-set=utf8mb4
socket=${DIR}/${mysql_dir_name}/data/mysql.sock

[mysqld]
#skip-grant-tables
skip-name-resolve
port=${PORT}
socket=${DIR}/${mysql_dir_name}/data/mysql.sock
basedir=${DIR}/${mysql_dir_name}
datadir=${DIR}/${mysql_dir_name}/data
max_connections=200
character-set-server=utf8mb4
default-storage-engine=INNODB
max_allowed_packet=16M
# 不区分大小写
lower_case_table_names = 1

### binlog日志设置
binlog_format = ROW
#设置日志路径,注意路经需要mysql用户有权限写,这里可以写绝对路径,也可以直接写mysql-bin(后者默认就是在/var/lib/mysql目录下)
log-bin = ${DIR}/${mysql_dir_name}/data/mysql-bin.log
#设置binlog清理时间
expire_logs_days = 7
#binlog每个日志文件大小
max_binlog_size = 100m
#binlog缓存大小
binlog_cache_size = 4m
#最大binlog缓存大小
max_binlog_cache_size = 512m
#配置serverid
server-id=1
EOF

# 设置systemctl控制
echo_info 生成${unit_file_name}文件用于systemd控制

cat > /lib/systemd/system/${unit_file_name} << EOF
[Unit]
Description=mysql
After=network.target
[Service]
Type=forking
ExecStart=${DIR}/${mysql_dir_name}/support-files/mysql.server start
ExecStop=${DIR}/${mysql_dir_name}/support-files/mysql.server stop
ExecRestart=${DIR}/${mysql_dir_name}/support-files/mysql.server restart
ExecReload=${DIR}/${mysql_dir_name}/support-files/mysql.server reload
PrivateTmp=true
Restart=always
[Install]
WantedBy=multi-user.target
EOF

# 添加环境变量,这样就能在任意地方使用mysql全套命令
echo_info 配置PATH环境变量
if [ -f /usr/local/bin/mysql ];then
echo_error /usr/local/bin目录有未删除的mysql相关文件,请检查!
exit 5
fi
if [ -f /usr/bin/mysql ];then
echo_error /usr/bin目录有未删除的mysql相关文件,请检查!
exit 6
fi
echo "export PATH=\${PATH}:${DIR}/${mysql_dir_name}/bin" > /etc/profile.d/mysql.sh
source /etc/profile

# 进行账号、密码设置
init_account ${init_password}

echo_warning 由于bash特性限制,在本终端连接mysql需要先手动执行 source /etc/profile 加载环境变量,或者新开一个终端连接mysql
}

function is_run_mysql() {
ps -ef | grep "${DIR}/${mysql_dir_name}" | grep -v grep &> /dev/null
if [ $? -eq 0 ];then
echo_error 检测到mysql正在运行中,退出
exit 7
fi

if [ -d ${DIR}/${mysql_dir_name} ];then
echo_error 检测到目录${DIR}/${mysql_dir_name},请检查是否重复安装,退出
exit 8
fi
}

function install_main_func(){
read -p "请输入数字选择安装类型(如需退出请输入q):" software
case $software in
1)
echo_info 即将使用 rpm包 安装mysql
# 等待1秒,给用户手动取消的时间
sleep 1
install_by_rpm
;;
2)
echo_info 即将使用 二进制包 安装mysql
sleep 1
install_by_tgz
;;
q|Q)
exit 0
;;
*)
install_main_func
;;
esac
}

is_run_mysql

echo -e "\033[31m本脚本支持两种部署方式:\033[0m"
echo -e "\033[36m[1]\033[32m rpm包部署mysql\033[0m"
echo -e "\033[36m[2]\033[32m 二进制包部署mysql\033[0m"
install_main_func

2.自动部署mysql8.0

脚本功能:自动部署mysql8.0
测试系统:CentOS7.6
mysql安装文件:二进制包
将本脚本和二进制包放在同一目录下,脚本会在本目录下创建mysql作为mysql安装目录
本脚本默认会下载二进制包,如果自己上传,可以注释掉

脚本命令

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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
#!/bin/bash


#######################定义变量##############################
# 部署目录的父目录
DIR=$(pwd)
# 部署目录的名字,最终的部署目录为${DIR}/${mysql_dir_name}
mysql_dir_name=mysql-8
# 源码下载目录
src_dir=$(pwd)/00src00
# 端口
PORT=3306
# mysql部署好后,root的默认密码
my_root_passwd=123456
# mysql版本
mysql8_version=8.0.17

# 解压后的名字
FILE=mysql-${mysql8_version}-el7-x86_64
# mysql二进制包名字
mysql_tgz=${FILE}.tar.gz
#############################################################

# 解压
function untar_tgz(){
echo -e "\033[32m[+] 解压 $1 中\033[0m"
tar xf $1
if [ $? -ne 0 ];then
echo -e "\033[31m[*] 解压出错,请检查!\033[0m"
exit 2
fi
}

# 首先判断当前目录是否有压缩包:
# I. 如果有压缩包,那么就在当前目录解压;
# II.如果没有压缩包,那么就检查有没有 ${openssh_source_dir} 表示的目录;
# 1) 如果有目录,那么检查有没有压缩包
# ① 有压缩包就解压
# ② 没有压缩包则下载压缩包
# 2) 如果没有,那么就创建这个目录,然后 cd 到目录中,然后下载压缩包,然
# 后解压
# 解压的步骤都在后面,故此处只做下载

# 语法: download_tar_gz 保存的目录 下载链接
# 使用示例: download_tar_gz /data/openssh-update https://mirrors.cloud.tencent.com/openssl/source/openssl-1.1.1h.tar.gz
function download_tar_gz(){
# 检测是否有wget工具
if [ ! -f /usr/bin/wget ];then
echo -e "\033[32m[+] 安装wget工具\033[0m"
yum install -y wget
fi

download_file_name=$(echo $2 | awk -F"/" '{print $NF}')
back_dir=$(pwd)
file_in_the_dir='' # 这个目录是后面编译目录的父目录

ls $download_file_name &> /dev/null
if [ $? -ne 0 ];then
# 进入此处表示脚本所在目录没有压缩包
ls -d $1 &> /dev/null
if [ $? -ne 0 ];then
# 进入此处表示没有${src_dir}目录
mkdir -p $1 && cd $1
echo -e "\033[32m[+] 下载 $download_file_name$(pwd)/\033[0m"
wget $2
if [ $? -ne 0 ];then
echo_error 下载 $2 失败!
exit 1
fi
file_in_the_dir=$(pwd)
# 返回脚本所在目录,这样这个函数才可以多次使用
cd ${back_dir}
else
# 进入此处表示有${src_dir}目录
cd $1
ls $download_file_name &> /dev/null
if [ $? -ne 0 ];then
# 进入此处表示${src_dir}目录内没有压缩包
echo -e "\033[32m[+] 下载 $download_file_name$(pwd)/\033[0m"
wget $2
if [ $? -ne 0 ];then
echo_error 下载 $2 失败!
exit 1
fi
file_in_the_dir=$(pwd)
cd ${back_dir}
else
# 进入此处,表示${src_dir}目录内有压缩包
echo -e "\033[32m[!] 发现压缩包$(pwd)/$download_file_name\033[0m"
file_in_the_dir=$(pwd)
cd ${back_dir}
fi
fi
else
# 进入此处表示脚本所在目录有压缩包
echo -e "\033[32m[!] 发现压缩包$(pwd)/$download_file_name\033[0m"
file_in_the_dir=$(pwd)
fi
}

function add_user_and_group(){
if id -g ${1} >/dev/null 2>&1; then
echo -e "\033[32m[#] ${1}组已存在,无需创建\033[0m"
else
groupadd ${1}
echo -e "\033[32m[+] 创建${1}组\033[0m"
fi
if id -u ${1} >/dev/null 2>&1; then
echo -e "\033[32m[#] ${1}用户已存在,无需创建\033[0m"
else
useradd -M -g ${1} -s /sbin/nologin ${1}
echo -e "\033[32m[+] 创建${1}用户\033[0m"
fi
}


download_tar_gz ${src_dir} http://mirrors.sohu.com/mysql/MySQL-8.0/${mysql_tgz}
cd ${file_in_the_dir}
untar_tgz ${mysql_tgz}


mv ${FILE} ${DIR}/${mysql_dir_name}

add_user_and_group mysql


echo "初始化mysql..."

mkdir -p ${DIR}/${mysql_dir_name}/data
chown -R mysql:mysql ${DIR}/${mysql_dir_name}/

# 初始化
cd ${DIR}/${mysql_dir_name}
bin/mysqld --initialize --basedir=${DIR}/${mysql_dir_name} --datadir=${DIR}/${mysql_dir_name}/data --pid-file=${DIR}/${mysql_dir_name}/data/mysql.pid >/dev/null 2>&1
echo "初始化完毕"
# 初始化完成后,data目录会生成文件,所以重新赋权
chown -R mysql:mysql ${DIR}/${mysql_dir_name}/
echo "mysql目录授权成功"

# 如果原来有my.cnf,则备份原来的/etc/my.cnf
if [ -f /etc/my.cnf ];then
mv /etc/my.cnf /etc/my.cnf_`date +%F`
echo -e "\033[31m备份/etc/my.cnf_`date +%F`\033[0m"
fi

# 生成新的/etc/my.cnf
echo "初始化/etc/my.cnf..."
cat > /etc/my.cnf << EOF
[client]
socket=${DIR}/${mysql_dir_name}/data/mysql.sock

[mysql]
default-character-set=utf8mb4
socket=${DIR}/${mysql_dir_name}/data/mysql.sock

[mysqld]
skip-grant-tables
skip-name-resolve
port=${PORT}
socket=${DIR}/${mysql_dir_name}/data/mysql.sock
basedir=${DIR}/${mysql_dir_name}
datadir=${DIR}/${mysql_dir_name}/data
max_connections=200
character-set-server=utf8mb4
default-storage-engine=INNODB
max_allowed_packet=16M
lower_case_table_names = 1
EOF
echo "/etc/my.cnf初始化完毕"


# 设置systemctl控制
if [ -f /lib/systemd/system/mysql.service ];then
mv /lib/systemd/system/mysql.service /lib/systemd/system/mysql.service_`date +%F`
echo -e "\033[31m备份/lib/systemd/system/mysql.service_`date +%F`\033[0m"
fi
echo "设置systemctl启动文件,之后使用systemctl start mysql启动"

cat > /lib/systemd/system/mysql.service << EOF
[Unit]
Description=mysql
After=network.target
[Service]
Type=forking
ExecStart=${DIR}/${mysql_dir_name}/support-files/mysql.server start
ExecStop=${DIR}/${mysql_dir_name}/support-files/mysql.server stop
ExecRestart=${DIR}/${mysql_dir_name}/support-files/mysql.server restart
ExecReload=${DIR}/${mysql_dir_name}/support-files/mysql.server reload
PrivateTmp=true
Restart=always
[Install]
WantedBy=multi-user.target
EOF

# 添加环境变量,这样就能在任意地方使用mysql全套命令
echo "export PATH=\${PATH}:${DIR}/${mysql_dir_name}/bin" > /etc/profile.d/mysql.sh
source /etc/profile
if [ -f /usr/local/bin/mysql ];then
echo "/usr/local/bin目录有未删除的mysql相关文件,请检查!"
fi
if [ -f /usr/bin/mysql ];then
echo "/usr/bin目录有未删除的mysql相关文件,请检查!"
fi

echo "设置完毕"
systemctl enable mysql.service >/dev/null 2>&1
systemctl start mysql.service
# mysql启动失败的话退出
if [ $? -ne 0 ];then
echo -e "\n\033[31mmysql启动失败,请查看错误信息\033[0m\n"
exit 1
else
# 提供一些提示信息
echo -e "mysql已启动成功,端口号为:\033[32m${PORT}\033[0m\n"
cat << EOF
mysql控制命令:
启动:systemctl start mysql
重启:systemctl restart mysql
停止:systemctl stop mysql
EOF
echo -e "\033[36m请先执行 \033[0m\033[33msource /etc/profile\033[0m\033[36m 加载环境变量,或者新开一个终端执行下面的命令\033[0m"
echo -e "\n请输入命令:\033[33mmysql\033[0m,进入MySQL修改密码"
echo -e "首先将密码置空:"
echo -e "\033[32mmysql> use mysql;\033[0m"
echo -e "\033[32mmysql> update user set authentication_string = '' where user = 'root';\033[0m"
echo -e "\033[32mmysql> flush privileges;\033[0m"
echo -e "请务必在修改密码后将/etc/my.cnf的skip-grant-tables注释掉并重启mysql"
echo "然后修改密码,不修改将无法操作"
echo -e "\033[32mmysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; \033[0m"
echo -e "\033[32mmysql> flush privileges;\033[0m"
echo -e "\n再次重启mysql"
echo -e "\033[34m"
cat << EOF
mysql8.0后不能使用grant创建用户了,并且设置密码时需要指定 GRANT OPTION,所以远程登录请这么设置
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

EOF
echo -e "\033[0m"
fi

3.docker-compose部署mysql5.7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3'
services:
mysql:
container_name: mysql
image: mysql:5.7.33
restart: always
command:
--lower_case_table_names=1
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: yourpassword
ports:
- "3306:3306"
volumes:
- ./data:/var/lib/mysql

4.mysql GTID主从配置操作

1、mysql主服务器/etc/my.cnf修改,新增内容

1
2
3
4
5
6
7
8
9
10
cat >> /etc/my.cnf <<EOF
server-id = 1
binlog_format = row
expire_logs_days = 30
max_binlog_size = 100M
gtid_mode = ON
enforce_gtid_consistency = ON
master-verify-checksum = 1
log-bin = mysql-bin
EOF

2、重启主服务器mysql

1
systemctl restart mysql

3、主服务器添加同步用户

1
2
grant replication slave on *.* to 'repl'@'172.20.222.%' identified by 'Re3#_pp111';
show master status;

4、mysql从服务器/etc/my.cnf修改,注意server-id要和主服务器不一样

1
2
3
4
5
6
7
8
9
10
11
12
cat >> /etc/my.cnf <<EOF
server-id = 2
gtid_mode = ON
enforce_gtid_consistency = ON
log-bin = mysql-bin
log-slave-updates = ON
expire_logs_days = 30
max_binlog_size = 100M
master_info_repository=TABLE
relay_log_info_repository=TABLE
skip_slave_start=1 # 从服务器崩溃之后,重新启动,不会自动复制。崩溃后启动复制,可能数据不一致
EOF

5、重启从没服务器mysql

1
systemctl restart mysql

6、从服务器配置master信息

1
2
3
CHANGE MASTER TO MASTER_HOST='172.20.222.43',MASTER_USER='repl',MASTER_PASSWORD='Re3#_pp111',MASTER_AUTO_POSITION=1;
start slave;
show slave status\G