91.mysql主从配置自动部署
16lz
2021-02-21
#!/bin/bash#The script is used for master-slave configuration.#Date 2021-02-21master_ip=192.168.32.1slave_ip=192.168.32.2mysql="/usr/local/mysql/bin/mysql -uroot -ppassword"my_cnf=/etc/my.cnfmaster_dir=/tmp/mysql_slavepass="hSlneoT03j"#检测命令是否执行成功check_ok() {if [ $? -ne 0 ];then echo "$1 command is error." exit 1fi}#检测文件是否存在file_exist() { d=`date +%F-%T` if [ -f $1 ];then mv $1 $1_$d fi}#判断是否含有serve-id配置项,无则添加if ! grep '^server-id' $my_cnf;then sed -i '/^\[mysqld\]$/a\server-id = 1001' $my_cnffi#判断是否含有log-bin配置项,无则添加if ! grep '^log-bin.*=.*' $my_cnf;then sed -i '/^\[mysqld\]$/a\log-bin = maria_bin' $my_cnffi#判断是否含有binlog-ignore-db配置项,无则添加if ! grep '^binlog-ignore-db' $my_cnf;thensed -i '/^log-bin.*/a\binlog-ignore-db = mysql' $my_cnffi#重启mysql服务systemctl restart mysql#检测是否重启成功check_ok "restart mysql"#EOF赋值mysql从库账号密码$mysql << EOF grant replication slave on *.* to 'repl'@$slave_ip identified by '$pass'; flush tables with read lock;EOF#判断是否有该存放目录[ -d $master_dir ] || mkdir -p $master_dir#将master两个参数File和Position存放至master.log$mysql -e "show master status" > $master_dir/master.logfile=`tail -1 $master_dir/master.log |awk '{ print $1}'`pos=`tail -1 $master_dir/master.log |awk '{print $2}'`#判断文件是否存在file_exist $master_dir/slave.sha='EOF'#定义变量#从库shell脚本cat > $master_dir/slave.sh <<EOF#!/bin/bashcheck_ok() {if [ $? -ne 0 ];then echo "$1 command is error." exit 1fi}#判断my.cnf文件是否包含server-id配置项,无则添加if ! grep '^server-id' /etc/my.cnf;then sed -i '/\[mysqld\]$/a\server-id = 1002' /etc/my.cnffi#重启服务systemctl restart mysqlcheck_ok "slave mysql restart"$mysql <<EOF stop slave; change master to master_host="$master_ip",master_user='repl',master_password="$pass", master_log_file="$file",master_log_pos=$pos; start slave;$a#内嵌不能双EOF,用变量代替EOF#检测文件是否存在file_exist $master_dir/rs_slave.expect#内嵌expect交互脚本将slave.sh传输至从库cat > $master_dir/rs_slave.expect <<EOF#!/usr/bin/expectset passwd "password"spawn rsync -a $master_dir/slave.sh root@$slave_ip:/tmp/slave.shexpect { "yes/no" { send "yes\r"} "password:"{ send "\$passwd\r"}}expect eofEOF#rs_slave.expect文件给予执行权限chmod +x $master_dir/rs_slave.expect$master_dir/rs_slave.expectcheck_ok "rysnc"#检测文件是否存在file_exist $master_dir/exe.expect#内嵌expect交互脚本执行命令cat > $master_dir/exe.expect <<EOF#!/usr/bin/expectset password "password"spawn ssh root@$slave_ipexpect { "yes/no"{ send "yes\r"} "password:"{ send "\$password\r" }}expect "]*"send "/bin/bash /tmp/slave.sh\r"expect "]*"send "exit\r"EOF#exe.expect文件给予执行权限chmod +x $master_dir/exe.expect$master_dir/exe.expectcheck_ok "exe.expect excute“#主库解除锁表$mysql -e "unlock tables"
©著作权归作者所有:来自51CTO博客作者Margotchen的原创作品,谢绝转载,否则将追究法律责任
更多相关文章
- Linux发行版的系统目录名称命名规则及用途
- 软链接与硬链接的区别
- 文件的元数据信息查看及修改文件时间戳信息
- 用查找替换命令删除文件中行首的空白字符
- php数据类型与检测
- 不重启JVM,替换掉已经加载的类,偷天换日?
- Mac同名文件夹合并的坑
- linunx知识汇总二
- Git 删除 .gitignore 生成之前上传的文件