mysql主從自動配置腳本

1、在使用之前需要在主服務器上編輯/etc/my.cnf文件,在[mysqld]的下面加入下面代碼:

  • log-bin=mysql-bin

  • server-id=1

  • innodb_flush_log_at_trx_commit=1

  • sync_binlog=1

  • binlog-do-db=centos

  • 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]下面加入:

  • server-id=2

只要保證唯一的並且比主的server-id大就行。

3、腳本分爲兩個,一個是配置mysql主服務器的shell腳本,另一個是遠程連接mysql從服務器的exp腳本。

bash shell腳本:master.sh:

#!/bin/bash
                          
export mysqlbinpath="/usr/bin" #mysql路徑
                          
#variables for master
export master_mysql_root_passwd="root"  #mysql主數據庫的root密碼
export replication_user="copydb"  #用於複製的mysql用戶
export replication_passwd="123456" #mysql用戶copydb的密碼
export replication_db="centos" #需要同步的數據庫名
export master_ip="8.8.8.8"    #mysql主服務器IP
                          
#variables for slave
export slave_mysql_root_passwd="123456" #mysql從數據庫的root密碼
export slave_ip="8.8.4.4"               #從服務器IP地址
export slave_ssh_root_passwd="123456"  #mysql從數據庫的ssh的root密碼
                          
#create replication user
{
${mysqlbinpath}/mysql -uroot -p${master_mysql_root_passwd} <<EOF
CREATE USER '$replication_user'@'$slave_ip' IDENTIFIED BY '$replication_passwd';
GRANT REPLICATION SLAVE ON *.* TO '$replication_user'@'$slave_ip' IDENTIFIED BY '$replication_passwd';
FLUSH TABLES WITH READ LOCK;
select sleep(10);
EOF
} &
                          
#export the database sql data.
${mysqlbinpath}/mysqldump -uroot -p${master_mysql_root_passwd} ${replication_db} > ${replication_db}.sql
                          
#get the master status info.
export status=`${mysqlbinpath}/mysql -uroot -p${master_mysql_root_passwd} -e"show master status\G"`
export binlogname=`echo "$status" | grep "File" | awk '{print $2}'`
export position=`echo "$status" | grep "Position" | awk '{print $2}'`
                          
#create database on slave server.
export createdb="${mysqlbinpath}/mysql -uroot -p${slave_mysql_root_passwd} -e'drop database if exists ${replication_db};create database ${replication_db};'"
                          
#import database sql data on slave server.
export importsql="${mysqlbinpath}/mysql -uroot -p${slave_mysql_root_passwd} ${replication_db} < /root/${replication_db}.sql"
                          
#deploy the slave mysql server.
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'"
                          
yum -y install expect
./slave.exp


expect腳本:slave.exp

#!/usr/bin/expect -f
spawn scp $env(replication_db).sql root@$env(slave_ip):/root
expect {
    "*assword" {set timeout 300; send "$env(slave_ssh_root_passwd)\r";}
    "yes/no" {send "yes\r"; exp_continue;}
  }
expect eof
                  
spawn ssh root@$env(slave_ip) "$env(createdb);$env(importsql);$env(change_master)"
expect {
    "*assword" {set timeout 300; send "$env(slave_ssh_root_passwd)\r";}
    "yes/no" {send "yes\r"; exp_continue;}
      }
expect eo

使用方法:
上傳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秒,則需要調大鎖表時間,否則可能會有用戶寫入數據而使導致主從配置失敗。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章