时间: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自动安装脚本代码实例分享的文章就介绍到这了
2023-10-30
windows上的mysql服务突然消失提示10061 Unkonwn error问题及解决方案2023-10-30
MySQL非常重要的日志bin log详解2023-10-30
详解MySQL事务日志redo log一、单表查询 1、排序 2、聚合函数 3、分组 4、limit 二、SQL约束 1、主键约束 2、非空约束 3、唯一约束 4、外键约束 5、默认值 三、多表查询 1、内连接 1)隐式内连接: 2)显式内连接: 2、外连接 1)左外连接 2)右外连接 四...
2023-10-30
Mysql删除表重复数据 表里存在唯一主键 没有主键时删除重复数据 Mysql删除表中重复数据并保留一条 准备一张表 用的是mysql8 大家自行更改 创建表并添加四条相同的数据...
2023-10-30