1. 程式人生 > 資料庫 >ubuntu 16.04配置MySQL主從同步的配置方法

ubuntu 16.04配置MySQL主從同步的配置方法

準備工作

1.主從資料庫版本最好一致

2.主從資料庫內資料保持一致

主資料庫:121.199.27.227 /ubuntu 16.04 MySQL 5.7.21 ( 阿里雲 )

從資料庫:182.254.149.39 /ubuntu 16.04 MySQL 5.7.21 ( 騰訊雲 )

防火牆配置

配置主伺服器只允許特定 IP 訪問資料庫的埠,避免不必要的攻擊。

主庫防火牆配置

# iptables -A INPUT -p tcp -s slave_ip --dport 3306 -j ACCEPT
#刪除可能已經存在的配置,避免出現多條重複記錄
$ sudo iptables -D INPUT -p tcp -s 182.254.149.39 --dport 3306 -j ACCEPT 
$ sudo iptables -D INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT 
$ sudo iptables -D INPUT -p tcp --dport 3306 -j DROP 
$ sudo iptables -D INPUT -p udp --dport 3306 -j DROP 
$ sudo iptables -D INPUT -p sctp --dport 3306 -j DROP
#增加配置,只允許特定地址訪問資料庫埠
$ sudo iptables -A INPUT -p tcp -s 182.254.149.39 --dport 3306 -j ACCEPT
$ sudo iptables -A INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
$ sudo iptables -A INPUT -p udp --dport 3306 -j DROP
$ sudo iptables -A INPUT -p sctp --dport 3306 -j DROP
$ sudo iptables -L -n
#儲存配置
$ sudo apt-get install iptables-persistent
$ sudo netfilter-persistent save
#配置被儲存到/etc/iptables/rules.v4 /etc/iptables/rules.v6這兩個檔案下面,
#最好確認一下實際儲存的內容,尤其是安裝了denyhosts等其他安全軟體的情況下,
#可能會記錄了多餘的規則,需要手工刪除
從庫防火牆配置
# iptables -A OUTPUT -p tcp -d master_ip --dport 3306 -j ACCEPT
#刪除可能已經存在的配置,避免出現多條重複記錄
$ sudo iptables -D OUTPUT -p tcp -d 121.199.27.227 --dport 3306 -j ACCEPT
#增加配置
$ sudo iptables -A OUTPUT -p tcp -d 121.199.27.227 --dport 3306 -j ACCEPT
$ sudo iptables -L -n
#儲存配置
$ sudo apt-get install iptables-persistent
$ sudo netfilter-persistent save
#配置被儲存到/etc/iptables/rules.v4 /etc/iptables/rules.v6這兩個檔案下面,
#最好確認一下實際儲存的內容,尤其是安裝了denyhosts等其他安全軟體的情況下,
#可能會記錄了多餘的規則,需要手工刪除

主資料庫master配置

1.修改mysql配置

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

在[mysqld]部分進行如下修改:

[mysqld]
log-bin = /var/log/mysql/mysql-bin.log #開啟二進位制日誌,預設是註釋掉的,我們去掉註釋
server-id = 1 #設定server-id
bind-address = 0.0.0.0 #預設是127.0.0.1,此處我們設定為任意地址,放開遠端訪問,這麼操作之前一定要確保防火牆配置正確,否則會產生安全風險

2.重啟mysql,建立用於同步的使用者賬號

建立使用者並授權:使用者:repl 密碼:slavepass

$ sudo service mysql restart
$ mysql -u root -p -e "CREATE USER 'repl'@'182.254.149.39' IDENTIFIED BY 'slavepass';" #建立使用者
$ mysql -u root -p -e "GRANT REPLICATION SLAVE ON *.* TO 'repl'@'182.254.149.39';" #分配許可權
$ mysql -u root -p -e "flush privileges;" #重新整理許可權

3.檢視master狀態,記錄二進位制檔名(mysql-bin.000001)和位置(333802):

$ mysql -u root -p -e "SHOW MASTER STATUS;"
Enter password: 
+------------------+----------+--------------+------------------+-------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |  333802 |       |         |          |
+------------------+----------+--------------+------------------+-------------------+

4.主庫備份,為從庫的第一次資料同步準備資料

使用如下指令碼產生資料庫備份檔案

#此處以備份wordpress資料庫為例子
datadump=`which mysqldump`
mysqluser="root"
userpass="password" 
wordpressdb="wordpress"
backupwordpress_sql=$wordpressdb.`date +%Y%m%d`.sql
if $datadump -u $mysqluser --password=$userpass -h localhost --opt $wordpressdb > $backupwordpress_sql 2>&1
then
  echo " backup $wordpressdb success"
else
  echo " backup $wordpressdb error"
  exit 1
fi
#檢驗檔案尾部是否存在 “-- Dump completed on”,如果存在不存在,則說明備份出錯了。
if [ 0 -eq "$(sed '/^$/!h;$!d;g' $backupwordpress_sql | grep -c "Dump completed on")" ]; 
then
 echo " backup $wordpressdb error"
 exit 1 
else
 echo " backup $wordpressdb success"
fi

執行指令碼,確保最後輸出備份成功

$ cd ~
$ sudo bash backup_wordpress.sh

從伺服器slave配置

1.修改mysql配置

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

修改server-id,每個資料庫的server-id要求是唯一的,不能相互衝突

[mysqld]
server-id = 2 #設定server-id,必須唯一
log_bin         = /var/log/mysql/mysql-bin.log #日誌也最好開啟

2.首次還原資料庫:

$ sudo service mysql restart
$ scp -P 22 -r [email protected]:~/wordpress.*.sql ./
#刪除可能存在的一行警告資訊,這行警告資訊可能導致我們無法恢復資料
$ sed -i "/^mysqldump: \[Warning\] Using a password on the command line interface can be insecure\./d" wordpress.*.sql
$ mysql -u root -p -e "drop database wordpress;"
$ mysql -u root -p -e "create database wordpress;"
$ mysql -u root -p wordpress < wordpress.*.sql

3.重啟mysql,開啟mysql會話,執行同步SQL語句(需要主伺服器主機名,登陸憑據,二進位制檔案的名稱和位置):

$ mysql -u root -p -e "CHANGE MASTER TO MASTER_HOST='121.199.27.227',MASTER_USER='repl',MASTER_PASSWORD='slavepass',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=333802;"

4.啟動slave同步程序:

$ mysql -u root -p -e "start slave;"

5.檢視slave狀態:

$ mysql -u root -p -e "show slave status\G;"
Enter password:
*************************** 1. row ***************************
        Slave_IO_State: Waiting for master to send event
         Master_Host: 121.199.27.227
         Master_User: repl
         Master_Port: 3306
        Connect_Retry: 60
       Master_Log_File: mysql-bin.000001
     Read_Master_Log_Pos: 9448236
        Relay_Log_File: VM-114-251-ubuntu-relay-bin.000002
        Relay_Log_Pos: 17780
    Relay_Master_Log_File: mysql-bin.000001
       Slave_IO_Running: Yes
      Slave_SQL_Running: No
       Replicate_Do_DB:
     Replicate_Ignore_DB:
      Replicate_Do_Table:
    Replicate_Ignore_Table:
   Replicate_Wild_Do_Table:
 Replicate_Wild_Ignore_Table:
    ...

當Slave_IO_Running和Slave_SQL_Running都為YES的時候就表示主從同步設定成功了。接下來就可以進行一些驗證了,比如在主master資料庫的test資料庫的一張表中插入一條資料,在slave的test庫的相同資料表中檢視是否有新增的資料即可驗證主從複製功能是否有效,還可以關閉slave(mysql>stop slave;),然後再修改master,看slave是否也相應修改(停止slave後,master的修改不會同步到slave),就可以完成主從複製功能的驗證了。

還可以用到的其他相關引數:

master開啟二進位制日誌後預設記錄所有庫所有表的操作,可以通過配置來指定只記錄指定的資料庫甚至指定的表的操作,具體在mysql配置檔案的[mysqld]可新增修改如下選項:

# 不同步哪些資料庫 
binlog-ignore-db = mysql 
binlog-ignore-db = test 
binlog-ignore-db = information_schema 
# 只同步哪些資料庫,除此之外,其他不同步 
binlog-do-db = game

如之前檢視master狀態時就可以看到只記錄了test庫,忽略了manual和mysql庫。

總結

以上所述是小編給大家介紹的ubuntu 16.04配置MySQL主從同步的配置方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!