当初为了方便配置主从数据库 写了shell脚本
也是边学边写 记录一下 但愿能不停地完善
具体流程可见上一篇:Mysql主从数据库配置
代码能够对照着上面这篇一块儿看 可能会比较好理解
我也尽可能多写注释 毕竟本身也会忘 (~ ̄▽ ̄)~ mysql
上代码web
#!/bin/bash
#source /home/alpha/shelltest/config.ini 直接导配置文件可能会方便一点 这里我就不改了
cat $1 | while read line
do
#master side
masterIp=$(echo $line |awk '{print $1}') #master ip地址
masterSqlname=$(echo $line |awk '{print $2}') #master数据库用户名
masterSqlpass=$(echo $line |awk '{print $3}') #master数据库密码
slaveName=$(echo $line |awk '{print $4}') #master受权给slave远程登陆master数据库的用户名
slavePass=$(echo $line |awk '{print $5}') #slave 登陆master时的密码
slaveIp=$(echo $line |awk '{print $6}') #slave ip地址
slaveSqlname=$(echo $line |awk '{print $7}') #slave 数据库用户名
slaveSqlpass=$(echo $line |awk '{print $8}') #slave 数据库密码
port=$(echo $line |awk '{print $9}') #端口号
echo ${line}
echo
#在数据库中给slave登陆master数据库的权限
grantCmd="grant replication slave on*.*to '${slaveName}'@'${slaveIp}' identified by '${slavePass}';"
echo "grant cmd:" ${grantCmd}
#在master的mysql数据库中执行grant操做
remoteCmd="mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e \"${grantCmd}\""
echo "remote cmd:" ${remoteCmd}
mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e "${grantCmd}"
if [ $? -eq 0 ]; then
echo "exec: <grant replication slave...> success"
else
echo "exec: <grant replication slave...> failure"
fi
echo
#查看master状态
statusCmd="mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e \"show master status;\""
echo "status cmd:" ${statusCmd}
mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e "show master status;"
if [ $? -eq 0 ]; then
echo "exec: <show master status> success"
else
echo "exec: <show master status> failure"
fi
echo
#查看master状态 获取file 以及position的信息
bininfo=$(mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e "show master status;")
file=$(echo $bininfo | awk '{print $5}')
pos=$(echo $bininfo | awk '{print $6}')
echo "bininfo:" $bininfo
echo "file name:" $file
echo "position:" $pos
#查看master中mysql的登陆帐户信息
queryCmd="mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e \"select Host, User, Password from mysql.user;\""
echo "query cmd:" ${queryCmd}
mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e "select Host, User, Password from mysql.user;"
if [ $? -eq 0 ]; then
echo "exec: <select *from mysql.user> success"
else
echo "exec: <select *from mysql.user> failure"
fi
#slave side
#首先确保slave中的mysql 中止slave
startCmd="mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e \"slave stop;\""
echo "start cmd:"${startCmd}
mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e "slave stop;"
if [ $? -eq 0 ]; then
echo "exec: <slave stop> success"
echo
else
echo "exec: <slave stop> failure"
echo
fi
#change master
changeCmd="change master to MASTER_HOST='${masterIp}',MASTER_PORT=${port},MASTER_USER='${slaveName}',MASTER_PASSWORD='${slavePass}',MASTER_LOG_FILE='${file}',MASTER_LOG_POS=${pos};"
echo "change cmd:" ${changeCmd}
#登陆slave的mysql进行 change操做
remoteCmd="mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e \"${changeCmd}\""
echo "remote cmd:" ${remoteCmd}
mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e "${changeCmd}"
if [ $? -eq 0 ]; then
echo "exec: <change master...> success"
echo
else
echo "exec: <change master...> failure"
echo
fi
echo
#启动slave
startcmd="mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e \"slave start;\""
echo "start cmd:" ${startcmd}
mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e "slave start;"
if [ $? -eq 0 ]; then
echo "exec: <slave start> success"
echo
else
echo "exec: <slave start> failure"
echo
fi
#查看slave状态
statusCmd="mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e \"show slave status\G\""
echo "status cmd:" ${statusCmd}
mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e "show slave status\G"
if [ $? -eq 0 ]; then
echo "exec: <show slave status> success"
echo
else
echo "exec: <show slave status> failure"
echo
fi
done
同时配一个configsql
masterip msqlname msqlpass slavename slavepass slaveip ssqlname ssqlpass 3306
若是是直接source导入的话会方便点 举个例子shell
masterIp=xxx.xxx.xxx.xxx
masterSqlname=alpha
masterSqlpass=alpha
slaveName=slavename
slavePass=slavepass
slaveIp=xxx.xxx.xxx.xxx
slaveSqlname=root
slaveSqlpass=root
port=3306
执行的话数据库
./master_slave.sh config
遇到的一些问题bash
在master登陆mysql数据库的帐号必须有Grant_priv权限
也就是说你登陆mysql的帐号是可以给其余帐号开权限的
我由于用了mysql -hip地址 登陆 没有发现这样登陆没有权限
因此须要在mysql的database中的user表里面对Grant_priv进行修改ide
主从数据库同步前的内容须要一致
这个问题是在网上看到的,但奇怪的是我同步以前在master中就有数据,可是并无报错。只是没有将这一部分数据同步到slave中,只有配置好以后在master中添加数据的操做才会同步到slave中。 没有找到是什么缘由致使svg
slave中的数据库若是以前已经启动了slave 须要先将slave stop
这一点我已经在代码中添加,以前没有发现slave这台机子已经作过主从 因此直接change master 会报错学习
还有什么其余问题会继续添加
我也还在学习shell中
但愿可以多与你们交流
有什么问题也能够一块儿讨论
谢谢ui