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 my_root_passwd=123456 mysql_version=5.7.36 unit_file_name=mysqld.service DIR=$(pwd ) mysql_dir_name=mysql-${mysql_version} FILE=mysql-${mysql_version} -linux-glibc2.12-x86_64 mysql_tgz=${FILE} .tar.gz 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 } 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 mkdir -p $1 && cd $1 echo_info 下载 $download_file_name 至 $(pwd )/ 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 cd $1 ls $download_file_name &> /dev/null if [ $? -ne 0 ];then echo_info 下载 $download_file_name 至 $(pwd )/ 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 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} if [ $? -ne 0 ];then echo_error mysql启动失败,请查看错误信息 exit 2 fi 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" } 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 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 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} 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 chown -R mysql:mysql ${DIR} /${mysql_dir_name} / echo_info 初始化完毕 if [ -f /etc/my.cnf ];then mv /etc/my.cnf /etc/my.cnf_`date +%F` echo_warning 检测到配置文件,已备份为/etc/my.cnf_`date +%F` fi 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 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 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 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 ) mysql_dir_name=mysql-8 src_dir=$(pwd )/00src00 PORT=3306 my_root_passwd=123456 mysql8_version=8.0.17 FILE=mysql-${mysql8_version} -el7-x86_64 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 } function download_tar_gz (){ 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 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 cd $1 ls $download_file_name &> /dev/null if [ $? -ne 0 ];then 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 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} /datachown -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 "初始化完毕" chown -R mysql:mysql ${DIR} /${mysql_dir_name} /echo "mysql目录授权成功" 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 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初始化完毕" 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 echo "export PATH=\${PATH}:${DIR} /${mysql_dir_name} /bin" > /etc/profile.d/mysql.shsource /etc/profileif [ -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 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
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
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