系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 数据库 > Mysql > 详细页面

MySQL自动安装脚本代码实例分享

时间:2023-10-29来源:系统城装机大师作者:佚名

这里分享一个我写的MySQL自动安装脚本mysql_auto_install.sh,它的功能非常简单,就是自动化安装MySQL单实例,让DBA的工作更简单、轻松一些,不用去手工安装MySQL实例。从简单重复的工作中释放出来。

下面是关于mysql_auto_install.sh脚本的一些说明:

  • 1:这个脚本运行在mysql用户下(注意,root用户下运行会报错,需要修改部分地方),主要原因是因为DBA没有root账号权限,只有mysql用户的权限。另外,我也写了一个mysql_auto_install_root.sh脚本,这个脚本是在root用户下面运行,功能更多一些。暂时还在测试当中。

  • 2:此脚本运行在mysql用户下,因为权限问题,不会禁用透明大页,卸载RPM包,调整内核参数、配置systemctl服务等操作,这些工作交给系统管理员处理。而且我们也假设这些都已经是设定好了的。

  • 3:此脚本只适用于Linux,不适用HP-UX等操作系统。

  • 4:my.cnf的模板中的参数要跟脚本中的参数一致。否则可能有问题。另外模板中参数设置请自己保证正确性与合理性。

  • 5:脚本经过多次测试验证,但是并不保证各种场景都没有bug。发现问题,欢迎反馈,我自己也在不断完善、改进这个脚本。

  • 6: 安装前,要准备好MySQL安装介质、mysql_auto_install.sh、alter_root_passwd.sql,my.cnf的模板(这里命名为mysql8_template.cnf)

其中alter_root_passwd.sql是修改root密码的脚本,如下所示,根据实际情况输入密码,安装完成后,删除此脚本。

1
2
ALTER USER 'root'@'localhost' IDENTIFIED BY '********';
flush privileges;

mysql_auto_install.sh脚本的详情如下(格式可能因为代码插件展示问题,有所混乱,请自行调整。原始脚本格式不会有下面乱七八糟的缩进或不对齐问题)

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
#!/bin/bash
 
#########################################################################################
#                                                                                       #
# This script is used for auto install mysql 8.0.xx                                     #
#                                                                                       #
#########################################################################################
#                                                                                       #
# ScriptName            :    mysql_auto_install.sh                                      #
# Author                :    潇湘隐者                                                   #
# CreateDate            :    2019-09-06                                                 #
# Blogs                 :    www.cnblogs.com/kerrycode                                  #
# Email                 :    kerry2008code@qq.com                                       #
#***************************************************************************************#
# 参数配置                                                                              #
#---------------------------------------------------------------------------------------#
# MYSQL_BASE_DIR        /opt/mysql                                                      #
# MYSQL_DATA_DIR        /data/mysql                                                     #
# MYSQL_PORT            3306                                                            #
# LOG_OUT_TYPE          log                                                             #
#---------------------------------------------------------------------------------------#
# 注意事项:                                                                            #
#   1:如果维护的MySQL数据库都规范化安装、配置的化,下面很多参数都不需要修改            #
#   2:my.cnf模板很重要,如果配置有问题,可能导致安装失败。脚本里面有些参数设定都是依赖 #
#       my.cnf模板中的设置,请确保你的my.cnf模板中设定跟脚本参数一致                    #
#   3:此脚本在mysql用户下安装,很多操作受限,例如禁用透明大页、卸载rpm包,调整内核参数 #
#      如需处理这些 建议使用另外一个版本的脚本处理。此处设定系统管理员已经处理好这些事情#
#      **注意**:此脚本只能在mysql用户下运行,root用户下需要修改部分地方才能成功        #
#---------------------------------------------------------------------------------------#
#***************************************************************************************#
# Version        Modified Date            Description                                   #
#***************************************************************************************#
# V.1.0          2019-09-06              创建此脚本                                     #
# V.1.1          2019-10-26              按SHELL编程规范,重新命名规范各类对象          #
# V.2.0          2023-06-16              重新改写该脚本,增加验证/优化步骤              #
#########################################################################################
 
# MySQL的安装路径:basedir的上层目录
MYSQL_BASE_DIR=/opt/mysql
# MySQL数据目录:datadir的上层目录
MYSQL_DATA_DIR=/data/mysql
# MySQL安装日志信息
MYSQL_INSTALL_LOG=/tmp/soft/mysql_install.log
# MySQL压缩包路径
MYSQL_INSTALLER_DIR=/tmp/soft
# MySQL安装介质
# 注意事项,如果安装介质不是tar.xz ,请修改代码中tar.xz
MYSQL_INSTALLER=$MYSQL_INSTALLER_DIR/mysql-8.0.33-linux-glibc2.17-x86_64-minimal.tar.xz
# MySQL的my.cnf模板
MYSQL_CONFIG_FILE=$MYSQL_INSTALLER_DIR/mysql8_template.cnf
# alter_root_passwd文件
SQL_ALTER_USER_PWD=$MYSQL_INSTALLER_DIR/alter_root_passwd.sql
# Log输出方式:log 或out或all
LOG_OUT_TYPE=all
# MySQL的端口号
MYSQL_PORT=3306
 
# 记录安装过程的日志信息
function log_info()
{
    #判断参数个数
    if [ $# -eq 1 ];then
        local log_msg=$1
    else
        echo "[error]:`date '+%Y%m%d %H:%M:%S'`> the number of parameters is incorrect!"
    fi
     
:<<EOF
    if [ $LOG_OUT_TYPE = "print" ];then
        echo "[info ]: `date`> $log_msg"
    else
        echo "[info ]: `date`> $log_msg" >> $MYSQL_INSTALL_LOG
    fi
EOF
    case $LOG_OUT_TYPE in
        out)
            echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg"
            ;;
        log)
            echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
            ;;
        all)
            echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg"
            echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
            ;;
        *)
    esac
         
}
 
# 记录安装过程的错误信息
function log_error()
{
    #判断参数个数
    if [ $# -eq 1 ];then
        local log_msg=$1
    else
        echo "[error]:`date '+%Y%m%d %H:%M:%S'`> the number of parameters is incorrect!"
    fi
     
:<<EOF
    if [ $LOG_OUT_TYPE = "print" ];then
        echo "[error]:`date`> $log_msg"
    else
        echo "[error]:`date`> $log_msg" >> $MYSQL_INSTALL_LOG
    fi
EOF
    case $LOG_OUT_TYPE in
        out)
             echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg"
             ;;
        log)
             echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
             ;;
        all)
             echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg"
             echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
             ;;
        *)
    esac
}
 
# 卸载系统自带的MARIADB
#rpm -qa|grep mariadb |xargs yum remove -y > /dev/null
 
function check_env_setting()
{
    # 检查操作系统是否Linux(此脚本不适用HP-UX/SunOS/AIX)
    if [ `uname -s`="Linux" ];then
        log_info "The os is linux,mysql auto install continue..."
    else
        log_error "the os is not linux, please check it."
        exit 1
    fi
 
    # 检查存放安装包目录是否存在
    if [ ! -d "$MYSQL_INSTALLER_DIR" ];then
        log_error "the mysql installer directory $MYSQL_INSTALLER_DIR didn't exists, please check it"
        exit 1
    else
        log_info "the mysql installer directory $MYSQL_INSTALLER_DIR exist, mysql auto install continue...";
    fi
     
    # 检查MySQL安装文件是否存在
    if [ ! -f "$MYSQL_INSTALLER" ];then
        log_error "the mysql installer file $MYSQL_INSTALLER didn't exist, please check it"
        exit 1
    else
        log_info  "the mysql installer file $MYSQL_INSTALLER exist, mysql auto install continue..."
    fi
     
    # 检查MySQL的my.cnf的模板文件是否存在
    if [ ! -f $MYSQL_CONFIG_FILE ];then
        log_error "the mysql configuration template file $MYSQL_CONFIG_FILE did'nt exist, please check it"
        exit 1
    else
        log_info "the mysql configuration  template file $MYSQL_CONFIG_FILE exists,mysql auto install continue..."
    fi
     
    # 检查修改mysql数据库用户root密码的SQL文件是否存在。
    if [ ! -f $SQL_ALTER_USER_PWD ];then
        log_error "the sql file $SQL_ALTER_USER_PWD did'nt exist, please check it"
        exit 1
    else
        log_info "the sql file $SQL_ALTER_USER_PWD exists,mysql auto install continue..."
    fi
     
     
    # 检查MySQL安装目录的上层目录是否存在
    if [ ! -d "$MYSQL_BASE_DIR" ];then
        log_error "the $MYSQL_BASE_DIR didn't exists, please check it"
        exit 1
    else
        log_info "the $MYSQL_BASE_DIR exists, mysql auto install continue..."
    fi
     
    # 检查MYSQL_DATA_DIR对应的目录是否存在,此目录为datadir的上一层目录
    if [ ! -d "$MYSQL_DATA_DIR" ];then
        log_error "the $MYSQL_DATA_DIR didn't exists, please check it"
        exit 1
    else
        log_info "the $MYSQL_DATA_DIR exists, mysql auto install continue..."
    fi
     
    # 检查MYSQL_DATA_DIR目录下是否存在其目录,如果有其它目录,则退出安装(担心已经安装了MySQL实例)
    if [ -d ${MYSQL_DATA_DIR} -a "`ls -A ${MYSQL_DATA_DIR}`" != "" ];then
        log_error "the $MYSQL_DATA_DIR directory have exists files,plese check it"
        exit 1
    else 
        log_info "the $MYSQL_DATA_DIR check is ok ,mysql auto install continue..."
    fi
     
    # 验证MySQL安装介质的MD5
     
     
    # 检查是否存在MySQL实例
    mysql_status=`netstat -nl awk 'NR>2{if ($4 ~ /.*:'${MYSQL_PORT}'/) {print "Yes";exit 0}}'`
    echo $mysql_status
    if "$mysql_status" "Yes" ];then
        log_error "MySQL instance exists. please check it"
        exit 1
    else
        #只能作为一个依据,并不能完全保证。
        log_info "MySQL instance didn't exists,mysql auto install continue..."
    fi
     
    echo "check_env_setting run successful."
    #read ANS
    read -n1 -p "Do you want to continue [Y/N]?" answer
    case $answer in
        Y | y)
            log_info "mysql auto install continue...";;
        N | n)
            log_info "mysql auto install exit.";;
        *)
            log_error "your choice is wrong!";;
    esac
 
}
 
# 创建MySQL用户和用户组(此处注释,用户由系统管理员创建)
#echo '[info]: create the mysql user...'
#groupadd mysql
#/usr/sbin/groupadd mysql
#useradd -g mysql mysql
#/usr/sbin/useradd -g mysql mysql
 
 
# 创建MySQL的相关目录
function create_mysql_dir()
{
    cd $MYSQL_DATA_DIR
    mkdir conf data  logs  slow_logs  bin_logs  mysql_temp
    chmod 750  $MYSQL_DATA_DIR
    #对目录进行授权
    chmod -R 760  $MYSQL_DATA_DIR/bin_logs
    chmod -R 700  $MYSQL_DATA_DIR/logs
    chmod -R 760  $MYSQL_DATA_DIR/slow_logs
}
 
function mysql_cnf_setting()
{
    # 拷贝my.cnf的模板配置文件,这里不打算直接写入生成my.cnf文件
    cp $MYSQL_CONFIG_FILE $MYSQL_DATA_DIR/conf/my.cnf
    if [ $? -ne 0 ];then
        log_error 'failed to cp the my.cnf,please check it'
        exit 1
    else
        log_info  "cp the $MYSQL_CONFIG_FILE to my.cnf success!"
    fi
}
 
function mysql_env_setting()
{
    # 设置环境变量
    local env_exist=`cat ~/.bash_profile |grep -E "MYSQL_HISTFILE|$MYSQL_BASE_DIR/mysql8.0/bin" wc -l`
    if [ $env_exist -eq 0 ];then
        echo "export PATH=\$PATH:$MYSQL_BASE_DIR/mysql8.0/bin" >> ~/.bash_profile
        echo "export MYSQL_HISTFILE=/dev/null" >> ~/.bash_profile
        source ~/.bash_profile
    else
        log_info "the environment variable exists, please check it!"
    fi
}
 
 
 
# 解压MySQL的二进制安装包
function mysql_install()
{
    echo '[info]:unzip the mysql installation media....'
    tar -xvf $MYSQL_INSTALLER -C $MYSQL_BASE_DIR
    if [ $? -ne 0 ];then
        log_error "mysql media unzip failed,please check the detail."
        exit
    else
        log_info  "mysql media unzip success,mysql auto install continue..."
    fi
     
    # 创建软连接
    local MYSQL_MEDIA_DIR=$(basename ${MYSQL_INSTALLER} '.tar.xz')
    #echo  $MYSQL_MEDIA_DIR
    ln -s $MYSQL_BASE_DIR/$MYSQL_MEDIA_DIR  $MYSQL_BASE_DIR/mysql8.0
    if [ $? -ne 0 ];then
        log_error "create the mysql soft link failed, please check it"
        exit 1
    else
        log_info "create the mysql soft link success,mysql auto install continue..."
    fi
     
     
    #  初始化MySQL
    cd $MYSQL_BASE_DIR/mysql8.0
    $MYSQL_BASE_DIR/mysql8.0/bin/mysqld \
    --defaults-file=$MYSQL_DATA_DIR/conf/my.cnf \
    --initialize \
    --basedir=$MYSQL_BASE_DIR/mysql8.0 \
    --datadir=$MYSQL_DATA_DIR/data  2>&1 | >> $MYSQL_INSTALL_LOG
     
    #
    $MYSQL_BASE_DIR/mysql8.0/bin/mysql_ssl_rsa_setup --datadir=$MYSQL_DATA_DIR/data
}
 
 
function mysql_startup()
{
    $MYSQL_BASE_DIR/mysql8.0/bin/mysqld_safe --defaults-file=$MYSQL_DATA_DIR/conf/my.cnf &
     
    # 休眠几秒,等待MySQL服务启动
    sleep 15
     
    # 检查MySQL服务是否启动成功
    mysql_status=`netstat -nl awk 'NR>2{if ($4 ~ /.*:'${MYSQL_PORT}'/) {print "Yes";exit 0}}'`
    echo $mysql_status
    if "$mysql_status" != "Yes" ];then
        log_error "MySQL did not start. please check it"
        exit 1
    else
        log_info "MySQL start success,mysql auto install continue..."
    fi
}
 
# 修改MySQL的root用户密码
function change_mysql_root_pwd()
{
 
    # 获取root初始密码
    mysql_root_init_passd=`grep "temporary password" $MYSQL_DATA_DIR/logs/mysql_error.log |awk '{print $NF}'`
     
    # 修改MySQL的root密码
    mysql -uroot -p"$mysql_root_init_passd" --connect-expired-password < $SQL_ALTER_USER_PWD 2> /dev/null
     
    if [ $? -ne 0 ];then
        log_error 'fail to perform MySQL operation!!!'
        exit 1
    else
        log_info "alter the mysql user root's password succeed!"
    fi
}
 
 
# MySQL的安全设置,此脚本在mysql用户下运行,默认这些文件的属主为mysql
function mysql_security_setting
{
    #注意,此处写死mysql_error.log,是因为my.cnf模板中命名统一规范
    chmod 660  $MYSQL_DATA_DIR/logs/mysql_error.log
    #注意,此处写死mysql_binlog.*,是因为my.cnf模板中命名统一规范
    chmod 600 $MYSQL_DATA_DIR/bin_logs/mysql_binlog.*
    chmod 400 $MYSQL_DATA_DIR/data/*.pem
    #注意,此处写死mysql_slow.log,是因为my.cnf模板中命名统一规范
    chmod 660 $MYSQL_DATA_DIR/slow_logs/mysql_slow.log
    #plugin_dir的权限设置
    chmod 550 $MYSQL_BASE_DIR/mysql8.0/lib/plugin/ 
 
}
 
function main() {
        check_env_setting
        create_mysql_dir
        mysql_cnf_setting
        mysql_env_setting
        mysql_install
        mysql_startup
        change_mysql_root_pwd
     
        if [ $? -ne 0 ];then
            log_error "change_mysql_root_pwd run failed!"
        else    
            log_info "the mysql auto install was successful!"
        fi
        mysql_security_setting
}
# invoke main function
main 

下面是安装测试过程的截图

下面是安装日志mysql_install.log的输出信息截图:

到此这篇关于MySQL自动安装脚本代码实例分享的文章就介绍到这了

分享到:

相关信息

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载