1、在使用之前需要在主服务器上编辑/etc/my.cnf文件,在[mysqld]的下面加入下面代码:

  1. log-bin=mysql-bin

  2. server-id=1

  3. innodb_flush_log_at_trx_commit=1

  4. sync_binlog=1

  5. binlog-do-db=centos

  6. binlog_ignore_db=mysql

server-id=1中的1可以任定义,只要是唯一的并且比从服务器的server-id小就行。
binlog-do-db=centos是表示binlog只记录centos数据库的日志,即只同步centos。
binlog_ignore_db=mysql表示忽略备份mysql。
不加binlog-do-db和binlog_ignore_db,那就表示备份全部数据库。
2、在从服务器编辑配置文件my.cnf,在[mysqld]下面加入:

  1. server-id=2

可以自己定义,只要保证唯一的并且比主的server-id大就行。

mysql安装之后,root密码是空的。为了提高安全性有必要给root加上密码。

#mysql

mysql>SET PASSWORD FOR ‘root’@'localhost'=password("password");

3、脚本分为两个,一个是配置mysql主服务器的shell脚本,另一个是远程连接mysql从服务器的exp脚本。
bash shell脚本:master.sh

  1. #!/bin/bash


  2. export mysqlbinpath="/usr/bin" #mysql路径


  3. #variables for master

  4. export master_mysql_root_passwd="root"  #mysql主数据库的root密码

  5. export replication_user="copydb"  #用于复制的mysql用户

  6. export replication_passwd="123456" #mysql用户copydb的密码

  7. export replication_db="centos" #需要同步的数据库名

  8. export master_ip="192.168.0.52"    #mysql主服务器IP


  9. #variables for slave

  10. export slave_mysql_root_passwd="123456" #mysql从数据库的root密码

  11. export slave_ip="192.168.0.53"               #从服务器IP地址

  12. export slave_ssh_root_passwd="123456"  #mysql从数据库的ssh的root密码


  13. #create replication user

  14. {

  15. ${mysqlbinpath}/mysql -uroot -p${master_mysql_root_passwd} <<EOF

  16. CREATE USER '$replication_user'@'$slave_ip' IDENTIFIED BY '$replication_passwd';

  17. GRANT REPLICATION SLAVE ON *.* TO '$replication_user'@'$slave_ip' IDENTIFIED BY '$replication_passwd';

  18. FLUSH TABLES WITH READ LOCK;

  19. select sleep(10);

  20. EOF

  21. } &


  22. #export the database sql data.

  23. ${mysqlbinpath}/mysqldump -uroot -p${master_mysql_root_passwd} ${replication_db} > ${replication_db}.sql


  24. #get the master status info.

  25. export status=`${mysqlbinpath}/mysql -uroot -p${master_mysql_root_passwd} -e"show master status\G"`

  26. export binlogname=`echo "$status" | grep "File" | awk '{print $2}'`

  27. export position=`echo "$status" | grep "Position" | awk '{print $2}'`


  28. #create database on slave server.

  29. export createdb="${mysqlbinpath}/mysql -uroot -p${slave_mysql_root_passwd} -e'drop database if exists ${replication_db};create database ${replication_db};'"


  30. #import database sql data on slave server.

  31. export importsql="${mysqlbinpath}/mysql -uroot -p${slave_mysql_root_passwd} ${replication_db} < /root/${replication_db}.sql"


  32. #deploy the slave mysql server.

  33. export change_master="${mysqlbinpath}/mysql -uroot -p${slave_mysql_root_passwd} -e'stop slave;CHANGE MASTER TO MASTER_HOST=\"${master_ip}\",MASTER_USER=\"${replication_user}\",MASTER_PASSWORD=\"${replication_passwd}\",MASTER_PORT=3306,MASTER_LOG_FILE=\"${binlogname}\",MASTER_LOG_POS=${position},MASTER_CONNECT_RETRY=10;start slave;select sleep(3);show slave status\G'"


  34. yum -y install expect

  35. ./slave.exp

expect脚本:slave.exp

  1. #!/usr/bin/expect -f

  2. spawn scp $env(replication_db).sql root@$env(slave_ip):/root

  3. expect {

  4.    "*assword" {set timeout 300; send "$env(slave_ssh_root_passwd)\r";}

  5.    "yes/no" {send "yes\r"; exp_continue;}

  6.  }

  7. expect eof


  8. spawn ssh root@$env(slave_ip) "$env(createdb);$env(importsql);$env(change_master)"

  9. expect {

  10.    "*assword" {set timeout 300; send "$env(slave_ssh_root_passwd)\r";}

  11.    "yes/no" {send "yes\r"; exp_continue;}

  12.      }

  13. expect eof

使用方法:
上传master.sh和slave.exp两个文件到mysql主服务器,执行master.sh脚本开始配置mysql主从。最后执行完输出的从服务器状态中的 Slave_IO_Running和Slave_SQL_Running都为Yes的话,则说明主从已经配置成功,否则失败。

使用注意:
master.sh文件中的23行有一个select sleep(10)语句,10是指锁表10秒,这个时间根据导出sql数据所需时间定,如果导出sql数据超过10秒,则需要调大锁表时间,否则可能会有用户写入数据而使导致主从配置失败。

转载自:http://www.centos.bz/2012/11/deploy-mysql-master-slave-using-shell-script/