單伺服器MySQL主從複製實踐

來源:互聯網
上載者:User

標籤:

一、先配置好兩個MySQL執行個體並可以正常啟動

1. 首先在Linux上先安裝好MySQL資料庫,此處省略詳細的安裝步驟(可以使用yum安裝)

yum -y install mysqld mysql

 

2. 在/usr/local目錄下建立目錄mysqls/mysql1, mysqls/mysql2 分別作為我們的主要資料和從資料庫目錄,建立mysqls/run作為MySQL PID存放目錄,建立mysqls/log作為MySQL日誌目錄

mkdir -p /usr/local/mysqls/mysql1 /usr/local/mysqls/mysql2
mkdir -p /usr/local/mysqls/run /usr/local/mysqls/log

 

3. 複製MySQL預設的設定檔/etc/my.cnf到/usr/local/mysqls下,並複製兩份分別命名為mysql1.cnf和mysql2.cnf。這兩個檔案將作為主從MySQL資料庫的設定檔(使用這種方式,可以不影響原有MySQL配置,預設MySQL仍可正常使用)

cp /etc/my.cnf /usr/local/mysqls/mysql1.cnf
chown -R mysql:mysql
cd /usr/local/mysqls
cp mysql1.cnf mysql2.cnf

 

4. 修改MySQL執行個體設定檔,指定datadir, socket, port, log-error, pid-file的路徑:

mysql1.cnf 配置如下:

[mysqld]
datadir=/usr/local/mysqls/mysql1
socket=/usr/local/mysqls/mysql1/mysql.sock
port=33061
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#default-character-set=utf8
character-set-server=utf8 
[mysqld_safe]
log-error=/usr/local/mysqls/log/mysql1.log
pid-file=/usr/local/mysqls/run/mysql1.pid
[client]
default-character-set=utf8
socket=/usr/local/mysqls/mysql1/mysql.sock

 

mysql2.cnf 參考上面配置,使用mysql2目錄,連接埠號碼設定為33062

 

5. 接下來使用mysql_install_db指令碼初始化這兩個MySQL資料庫執行個體(該指令碼會在mysql1和mysql2目錄下自動安裝MySQL基本資料庫 : mysql)

/usr/bin/mysql_install_db --defaults-file=/usr/local/mysqls/mysql1.cnf
/usr/bin/mysql_install_db --defaults-file=/usr/local/mysqls/mysql2.cnf

 

6. 為了每次方便啟動執行個體,我們可以編寫如下啟動指令碼,指令碼中使用mysqld_safe啟動MySQL執行個體:

start_mysql1.sh 內容如下:

#/bin/bash
no=1
exe=/usr/bin/mysqld_safe
madmin=/usr/bin/mysqladmin
base=/usr/local/mysqls
sub=mysql$no
conf=$base/$sub.cnf
socket=$base/$sub/mysql.sock
pidfile=$base/run/$sub.pid
port=3306$no
timeout=60
 
$exe --defaults-file=$conf 2>&1 &
while [ $timeout -gt 0 ]; do
        $madmin --socket="$socket" --user=root --port=$port ping >/dev/nul 2>&1
        mret=$?
        if [ $mret -eq 0 ]; then
                now=`date +‘%Y-%m-%d %H:%M:%S‘`
                echo "[$now] Start $sub : OK"
                echo "[$now] PID : `cat $pidfile`"
                netstat -atulnp | grep $port
                break
        fi
        sleep 1
        let timeout=${timeout}-1
done

 

start_mysql1.sh 用於啟動mysql1,同樣我們可以類似編寫start_mysql2.sh用於啟動mysql2(修改no變數的值為2即可)

 註:shell 指令檔在執行前需要設定可執行許可權(類似這樣:chown u+x start_mysql1.sh)

 

7. 至此,MySQL兩個執行個體的準備工作就做好了,我們可以嘗試啟動它們了(以mysql1為例)

/usr/local/mysqls/start_mysql1.sh

 如果一切順利,將出現以下結果:

 

 

二、 接下來,我們開始設定主從複製

1. 停止MySQL執行個體,為了方便同樣編寫停止指令碼

stop_mysql.sh內容如下:

#/bin/bash
 
if [ $# -ne 1 ]; then
        echo "Usage : $0 <mysql no>"
        exit -1
fi
 
no=$1
sub=mysql$no
base=/usr/local/mysqls
pidfile=$base/run/$sub.pid
 
if [ ! -f "$pidfile" ]; then
        echo "‘$pidfile‘ not exist, mysql server may not start"
        exit -2
fi
pid=`cat $pidfile`
kill $pid

 

執行:stop_mysql.sh 1 即可停止mysql1, 後面參數改為2即可停止mysql2,就像下面這樣:

 

2. 配置主要資料庫,開啟複製功能(這裡使用mysql1作為主要資料庫,mysql2作為從資料庫)

mysql1.cnf中[mysqld]標記下面增加如下配置:

[mysqld]
...
#replication
log-bin=/usr/local/mysqls/log/mysql1-bin.log    # 這是MySQL bin log的位置
server-id=1    # server id, 標識mysql
# 下面兩個參數表示確保InnoDB交易資料庫可以保持最大的持久性和一致性
innodb_flush_log_at_trx_commit=1
sync_binlog=1
# 額外的參數,我們可以設定置複製哪個庫、哪個表,不複製哪個庫、哪個表(這裡不詳述,具體參考MySQL官方文檔)
# 例如:
# replicate-do-db=mydb
# replicate-do-table=mytable
# replicate-ignore-db=mysql
# replicate-ignore-table=user

 

3. 啟動mysql1,mysql命令串連並添加複製賬戶,同時查看master狀態

start_mysql1.sh
mysql -S /usr/local/msyqls/mysql1.sock -uroot -p
mysql> grant all on *.* to ‘rep‘@‘localhost‘ identified by ‘replpass‘; # 實際環境中這雷根據自己需求而定
mysql> flush privileges;
mysql> show master status \G
*************************** 1. row ***************************
           File: mysql1-bin.000002
       Position: 1486
   Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

 

4. 如果主從資料庫是全新搭建的(沒有實際資料)可以不用備份主庫到從庫,否則需要匯出主庫資料到從庫

# 設定讀鎖(禁止寫入)
mysql> flush tables with read lock; 
# 執行備份操作
/usr/bin/mysqldump -uroot -p --database mydb1, mydb2 ... > dump.sql
#解鎖

mysql> unlock tables;

 

?

5. 配置從資料庫複寫參數

mysql2.cnf中mysqld標記下增加如下配置:

#replication
log-bin=/usr/local/mysqls/log/mysql2-bin.log
server-id=2
master-host=localhost    # 主庫地址
master-port=33061        # 主庫連接埠號碼
master-user=rep          # 上面所設定的複製賬戶
master-pass=somepass     # 複製賬戶密碼

master-connect-retry=60  # 重試串連的間隔時間

 

6. 啟動從資料庫,若主庫有資料需要匯入則先匯入剛才的備份,接著設定複製起始位置,啟動slave

start_mysql2.sh
mysql -S /usr/local/mysqls/mysql2/mysql.sock -uroot -p < dump.sql 
mysql -S /usr/local/mysqls/mysql2/mysql.sock -uroot -p
mysql> change master to
   -> master_log_file=mysql1-bin.000002
   -> master_log_pos=1486;
mysql> start slave;
mysql> show slave status \G
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
                 Master_Host: localhost
                 Master_User: rep
                 Master_Port: 33061
               Connect_Retry: 60
             Master_Log_File: mysql1-bin.000002
         Read_Master_Log_Pos: 1486
              Relay_Log_File: mysql2-relay-bin.000002
               Relay_Log_Pos: 252
       Relay_Master_Log_File: mysql1-bin.000002
            Slave_IO_Running: Yes
           Slave_SQL_Running: Yes
             Replicate_Do_DB: 
         Replicate_Ignore_DB: 
          Replicate_Do_Table: 
      Replicate_Ignore_Table: 
     Replicate_Wild_Do_Table: 
 Replicate_Wild_Ignore_Table: 
                  Last_Errno: 0
                  Last_Error: 
                Skip_Counter: 0
         Exec_Master_Log_Pos: 106
             Relay_Log_Space: 554
             Until_Condition: None
              Until_Log_File: 
               Until_Log_Pos: 0
          Master_SSL_Allowed: No
          Master_SSL_CA_File: 
          Master_SSL_CA_Path: 
             Master_SSL_Cert: 
           Master_SSL_Cipher: 
              Master_SSL_Key: 
       Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
               Last_IO_Errno: 0
               Last_IO_Error: 
              Last_SQL_Errno: 0
              Last_SQL_Error: 
1 row in set (0.00 sec)
 

7. OK , MySQL兩執行個體主從複製就搭建好了。

註:文中使用mysql命令時指定socket檔案是必須的,亦可以類似寫相應的指令碼以免每次串連都需加這個參數

mysql1.sh 內容如下:

#/bin/bash
no=1
base=/usr/local/mysqls/
sub=mysql$no
socket=$base/$sub/mysql.sock
mysql -S $socket $* 


mysql2.sh 則修改no的值為2

 

單伺服器MySQL主從複製實踐

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.