一键搭建MySQL主从

提醒:本文为合集文章,后续持续更新!点下方蓝字订阅

合集:《shell脚本习题》请将公号设置为星标,第一时间接收推送!

今天直接给大家上一个部署MySQL主从的脚本,其中MySQL版本为8.0.30。不过这主和从都在一台机器上,生产环境中肯定是两台机器,两台的话,还需要通过ssh远程到另外的机器执行,此种情况比较复杂暂不考虑。

#!/bin/bash## 自动安装两个MySQL,并配置主从## 作者:阿铭## 日期:2022-07-20## 版本:v0.9

### 设置变量 ###mysql_url="https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz"

mysql_master_base_dir="/usr/local/mysql"mysql_master_data_dir="/data/mysql"

mysql_slave_base_dir="/usr/local/mysql_slave"mysql_slave_data_dir="/data/mysql_slave"

mysql_root_pwd="aminglinux.Com"mysql_rep_pwd="Aminglinux123"

##########################ck_ok(){if [ $? -ne 0 ]thenecho"$1 error."exit 1fi}

download_mysql(){##下载前,先判断当前目录下是否已经下载过cd /usr/localif [ -f mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz ]thenecho"当前目录已经存在mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz"echo"检测md5" mysql_md5=`md5sum mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz|awk '{print $1}'`if [ ${mysql_md5} == "2469b1ae79e98110277d9b5bee301135" ]thenreturn 0else sudo /bin/mv mysql-8.0.29-linux-glibc2.12-x86_64.tar.xz mysql-8.0.29-linux-glibc2.12-x86_64.tar.xz.oldfifi sudo wget ${mysql_url} ck_ok "下载mysql"}

install_master(){cd /usr/localecho"解压mysql" sudo tar Jxf mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz ck_ok "解压mysql"if [ -d ${mysql_master_base_dir} ]thenecho"${mysql_master_base_dir}已经存在,挪走" sudo /bin/mv ${mysql_master_base_dir}${mysql_master_base_dir}-`date +%s`fi sudo mv mysql-8.0.30-linux-glibc2.12-x86_64 mysqlif id mysql &>/dev/nullthenecho"系统已经存在mysql用户,跳过创建"elseecho"创建mysql用户" sudo useradd -s /sbin/nologin mysqlfi

if [ -d ${mysql_master_data_dir} ]thenecho"${mysql_master_data_dir}已经存在,挪走" sudo /bin/mv ${mysql_master_data_dir}${mysql_master_data_dir}-`date +%s`fiecho"创建mysql datadir" sudo mkdir -p ${mysql_master_data_dir}        sudo chown -R mysql ${mysql_master_data_dir}

if [ -f ${mysql_master_base_dir}/my.cnf ]thenecho"master配置文件已经存在,删除" sudo rm -f ${mysql_master_base_dir}/my.cnffiecho"创建master配置文件my.cnf" cat > /tmp/my.cnf <<EOF[mysqld]user = mysqlport = 3306server_id = 1basedir = ${mysql_master_base_dir}datadir = ${mysql_master_data_dir}socket = /tmp/mysql-master.sockpid-file = ${mysql_master_data_dir}/mysqld.pidlog-error = ${mysql_master_data_dir}/mysql.errEOF sudo /bin/mv /tmp/my.cnf ${mysql_master_base_dir}/my.cnf

echo"安装依赖" sudo apt install -y libaio-dev libtinfo5

echo"初始化" sudo ${mysql_master_base_dir}/bin/mysqld --console --datadir=${mysql_master_data_dir} --initialize-insecure --user=mysql        ck_ok "初始化"

if [ -f /usr/lib/systemd/system/mysqld.service ]thenecho"mysql服务管理脚本已经存在,挪走" sudo /bin/mv /usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/mysqld.service-`date +%s`fiecho"创建服务启动脚本" cat > /tmp/mysqld.service <<EOF[Unit]Description=MYSQL serverAfter=network.target[Install]WantedBy=multi-user.target[Service]Type=forkingTimeoutSec=0PermissionsStartOnly=trueExecStart=${mysql_master_base_dir}/bin/mysqld --defaults-file=${mysql_master_base_dir}/my.cnf --daemonize $OPTIONSExecReload=/bin/kill -HUP -$MAINPIDExecStop=/bin/kill -QUIT $MAINPIDKillMode=processLimitNOFILE=65535Restart=on-failureRestartSec=10RestartPreventExitStatus=1PrivateTmp=falseEOF sudo /bin/mv /tmp/mysqld.service /usr/lib/systemd/system/mysqld.service sudo systemctl unmask mysqld sudo systemctl daemon-reload sudo systemctl enable mysqldecho"启动mysql" sudo systemctl start mysqld ck_ok "启动mysql"

echo"设置mysql密码"${mysql_master_base_dir}/bin/mysqladmin -S/tmp/mysql-master.sock -uroot password "${mysql_root_pwd}" ck_ok "设置mysql密码"}

install_slave(){cd /usr/localecho"解压mysql" sudo tar Jxf mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz ck_ok "解压mysql"if [ -d ${mysql_slave_base_dir} ]thenecho"${mysql_slave_base_dir}已经存在,挪走" sudo /bin/mv ${mysql_slave_base_dir}${mysql_slave_base_dir}-`date +%s`fi sudo mv mysql-8.0.30-linux-glibc2.12-x86_64 mysql_slaveif id mysql &>/dev/nullthenecho"系统已经存在mysql用户,跳过创建"elseecho"创建mysql用户" sudo useradd -s /sbin/nologin mysqlfi

if [ -d ${mysql_slave_data_dir} ]thenecho"${mysql_slave_data_dir}已经存在,挪走" sudo /bin/mv ${mysql_slave_data_dir}${mysql_slave_data_dir}-`date +%s`fiecho"创建mysql datadir" sudo mkdir -p ${mysql_slave_data_dir} sudo chown -R mysql ${mysql_slave_data_dir}

if [ -f ${mysql_slave_base_dir}/my.cnf ]thenecho"slave配置文件已经存在,删除" sudo rm -f ${mysql_slave_base_dir}/my.cnffiecho"创建slave配置文件my.cnf" cat > /tmp/my.cnf <<EOF[mysqld]user = mysqlport = 3307server_id = 2basedir = ${mysql_slave_base_dir}datadir = ${mysql_slave_data_dir}socket = /tmp/mysql-slave.sockpid-file = ${mysql_slave_data_dir}/mysqld.pidlog-error = ${mysql_slave_data_dir}/mysql.errEOF sudo /bin/mv /tmp/my.cnf ${mysql_slave_base_dir}/my.cnf

echo"安装依赖" sudo apt install -y libaio-dev libtinfo5

echo"初始化" sudo ${mysql_slave_base_dir}/bin/mysqld --datadir=${mysql_slave_data_dir} --console --initialize-insecure --user=mysql ck_ok "初始化"

if [ -f /usr/lib/systemd/system/mysqld-slave.service ]thenecho"mysql-slave服务管理脚本已经存在,挪走" sudo /bin/mv /usr/lib/systemd/system/mysqld-slave.service /usr/lib/systemd/system/mysqld-slave.service-`date +%s`fiecho"创建服务启动脚本" cat > /tmp/mysqld-slave.service <<EOF[Unit]Description=MYSQL serverAfter=network.target[Install]WantedBy=multi-user.target[Service]Type=forkingTimeoutSec=0PermissionsStartOnly=trueExecStart=${mysql_slave_base_dir}/bin/mysqld --defaults-file=${mysql_slave_base_dir}/my.cnf --daemonize $OPTIONSExecReload=/bin/kill -HUP -$MAINPIDExecStop=/bin/kill -QUIT $MAINPIDKillMode=processLimitNOFILE=65535Restart=on-failureRestartSec=10RestartPreventExitStatus=1PrivateTmp=falseEOF

sudo /bin/mv /tmp/mysqld-slave.service /usr/lib/systemd/system/mysqld-slave.service sudo systemctl unmask mysqld-slave sudo systemctl daemon-reload sudo systemctl enable mysqld-slaveecho"启动mysql" sudo systemctl start mysqld-slave ck_ok "启动mysql"

echo"设置mysql密码"${mysql_slave_base_dir}/bin/mysqladmin -S/tmp/mysql-slave.sock -uroot password "${mysql_root_pwd}"        ck_ok "设置mysql密码"}

config_rep(){echo"在master上创建rep用户"        sudo ln -s ${mysql_master_base_dir}/bin/mysql /usr/bin/mysql

mysql -uroot -S/tmp/mysql-master.sock -p"${mysql_root_pwd}" -e "create user 'repuser'@'127.0.0.1' identified with 'mysql_native_password' by \"${mysql_rep_pwd}\";" mysql -uroot -S/tmp/mysql-master.sock -p"${mysql_root_pwd}" -e "grant REPLICATION SLAVE ON *.* to 'repuser'@'127.0.0.1'; flush privileges;" ck_ok "创建rep用户"

echo"获取mster的binlog文件和位置" mysql -uroot -S/tmp/mysql-master.sock -p"${mysql_root_pwd}" -e "show master status\G" > /tmp/master_file_pos.txt ck_ok "获取master status" binfile=`grep "File" /tmp/master_file_pos.txt|awk -F': ''{print $2}'` pos=`grep "Position" /tmp/master_file_pos.txt|awk -F': ''{print $2}'`

echo"到slave上配置主从" mysql -uroot -S/tmp/mysql-slave.sock -p"${mysql_root_pwd}" -e "stop slave; change master to master_host='127.0.0.1',master_user='repuser',master_password=\"${mysql_rep_pwd}\",master_log_file=\"${binfile}\",master_log_pos=${pos}; start slave;"

echo"检测主从状态" mysql -uroot -S/tmp/mysql-slave.sock -p"${mysql_root_pwd}" -e "show slave status\G" > /tmp/slave_stat.txt ck_ok "获取slave status" io_run=`grep 'Slave_IO_Running:' /tmp/slave_stat.txt|awk -F': ''{print $2}'` sql_run=`grep 'Slave_SQL_Running:' /tmp/slave_stat.txt|awk -F': ''{print $2}'`if [ ${io_run} == "Yes" ] && [ ${sql_run} == 'Yes' ]thenecho"mysql主从状态正常"elseecho"mysql主从状态不正常"exit 1fi}

main(){ download_mysql install_master install_slave config_rep}

main好了,就这么多吧。

右下角点个"在看"呗!

「点点赞赏,手留余香」

赞赏

  • 0人赞过
0
0
0
评论 0 请文明上网,理性发言

相关文章

  • 一背景 在MySQL8.0之前,Server层和存储引擎(比如InnoDB)会各自保留一份元数据(schemaname,tabledefinition等),不仅在信息存储上有着重复冗余,而且可能存在两者之间存储的元数据不同步的现象。不同存储引擎之间(比如InnoDB和MyISAM)有着不同的元数据存储形式和位置(.F
    骏马_大大XT温v 8 0 0 条评论
  • 在说起MySQL,我想每一个开发者都不会陌生,作为一个超80%开发者都在使用的数据库,几乎所有一线大厂,都在用!01多数人只掌握了一些皮毛但是在我使用MySQL将近20年的过程中,我经常能看到很多程序员和我当年一样,有很多共性问题,比如: 我最开始工作面试的时候,天真的以为会写"增删改查"、做表关联就足够了,可悲催的是
    一号特工www 4 1 0 条评论
  • MySQL作为主流的数据库,是各大厂面试官百问不厌的知识点,但是需要了解到什么程度呢?仅仅停留在建库、创表、增删查改等基本操作的水平可不够。在面试后端开发的时候,一连几个问题,简直会被问到一脸懵。。 MySQL语句怎么优化? 分库,分表都适合哪些场景? 讲讲InnoDB如何使用B+树存储的? 一般来说,准备MySQL面
    qwv729 3 3 0 条评论
  • 作者|不剪发的Tony老师责编|欧阳姝黎 出品|CSDN博客 数据库函数是一种具有某种功能的模块,可以接收零个或多个输入值,并且返回一个输出值。MySQL为我们提供了许多用于处理和分析数据的系统函数,本文给大家介绍10个常用的字符串函数,以及相关的其他函数。 CONCAT() CONCAT(str1,str2,-))
    袭ZcPy 8 2 0 条评论
  • 首先问大家一个问题:MySQL当中的"My"是什么意思? 估计大部分人会说:My的意思不就是"我的"吗?MySQL,就是"我的"SQL。 这样想的话,就是大错特错了。 MySQL的发明者名叫Michael"Monty"Widenius,MySQL是以他女儿的名字"My"来命名的。对这位发明者来说,MySQL数据库就仿佛
    manhua猫咪 4 4 0 条评论
  • 应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库。 操作系统,会有缓冲池(bufferpool)机制,避免每次访问磁盘,以加速数据的访问。 MySQL作为一个存储系统,同样具有缓冲池(bufferpool)机制,以避免每次查询数据都进行磁盘IO。 今天,和大家聊一
    mw1yf5 4 3 0 条评论
  • 来源:https://jeames.blog.csdn.net/?type=blog 前言MySQL在面试中经常被问到,本文总结了面试中的经典问题。 1.数据库三大范式是什么?第一范式:每个列都不可以再拆分。 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。 第三范式:在第二范式的基础
    情商Uk13hf7 8 1 0 条评论
  • 来源|程序员大彬 作者|程序员大彬今天给大家分享MySQL常考的面试题,看看你们能答对多少 本期MySQL面试题的目录如下: 事务的四大特性?事务隔离级别有哪些?索引什么是索引?索引的优缺点?索引的作用?什么情况下需要建索引?什么情况下不建索引?索引的数据结构Hash索引和B+树索引的区别?为什么B+树比B树更适合实现
    勿子糖 6 8 0 条评论
  • 来源|捡田螺的小男孩作者|捡田螺的小男孩每一个好习惯都是一笔财富,本文分SQL后悔药、SQL性能优化、SQL规范优雅三个方向,分享写SQL的21个好习惯。 1.写完SQL先explain查看执行计划。【SQL性能优化】日常开发写SQL的时候,尽量养成这个好习惯呀:写完SQL后,用explain分析一下,尤其注意走不走索
    阿超的小红帽 6 3 0 条评论
  • 又到了一年的金三银四,估计不少人都在暗搓搓地想各种请假理由,准备出去面试。 就在前两天,我跟一个面试官聊,发现一个普遍想象,不少候选人,对数据库的认知,还处在比较基础的阶段,以为会写"增删改查"、做表关联就足够了,那些工作中经常出现的问题,却支支吾吾答不上来,比如: count(*)慢该如何解决? 对于千万级的大表,M
    小薇焚 4 0 0 条评论