準備工作
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 root@121.199.27.227:~/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主從同步的配置方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
您可能感興趣的文章:- ubuntu系統中Mysql ERROR 1045 (28000): Access denied for user root@ localhost問題的解決方法
- Ubuntu下MySQL root密碼忘記的解決方法
- Ubuntu下mysql與mysql workbench安裝教程
- 解決ubuntu 16.04安裝mysql5.7.17后,登錄時出現ERROR 1045 (28000): Access denied for user ''root''@''localhost''問題
- Ubuntu手動安裝mysql5.7.10
- Linux(Ubuntu)下mysql5.7.17安裝配置方法圖文教程
- Ubuntu16.04 server下配置MySQL,并開啟遠程連接的方法
- 詳解Ubuntu Server下啟動/停止/重啟MySQL數據庫的三種方式