MySQL(Percona Server) 5.6 主從複製

來源:互聯網
上載者:User

標籤:

    MySQL(Percona Server) 5.6.15    主庫:192.168.2.21    從庫:192.168.2.22

 

例如我們同步的資料庫為:test。 如果需要同步多個資料庫下面會有說明。

MySQL 主從複製原理
1. master將改變記錄到二進位日誌(binary log)中(這些記錄叫做二進位日誌事件,binary log events,可以通過show binlog events進行查看);2. slave將master的binary log events拷貝到它的中繼日誌(relay log);3. slave重做中繼日誌中的事件,將改變反映它自己的資料。

主庫(192.168.2.21):

主庫開放 3306 連接埠
# /sbin/iptables -I INPUT -s 192.168.2.0/24 -p tcp --dport 3306 -j ACCEPT# service iptables save

 

 

查看開放的連接埠:

# service iptables status或# iptables -L -n

 

 
授權同步賬戶
mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected]‘192.168.2.22‘ IDENTIFIED BY ‘123‘;mysql> flush privileges;

 

 

授權格式為:GRANT REPLICATION SLAVE ON *.* TO [email protected]‘ipaddress‘ IDENTIFIED BY ‘password‘

現在可以在 192.168.2.22 從庫上測試是否可以訪問:

# /usr/local/mysql/bin/mysql -h192.168.2.21 -urep -p123

 

 
配置主庫 my.cnf
# vi /etc/my.cnf[mysqld]log-bin=mysql-bin  #開啟 MYSQL 二進位日誌server-id=1  #主程式庫伺服器 ID,注意伺服器 ID 不能重複binlog-do-db=test  #需要做主從備份的資料庫名,如果複製多個資料庫,重複設定這個選項即可expire-logs-days=7  #只保留 7 天的二進位日誌,以防磁碟被日誌佔滿binlog_format=MIXED  #設定 binlog 的格式為 MIXED

 

binlog 的三種格式 STATEMENTROWMIXED,詳見 MySQL Binlog ROW 和 STATEMENT 選擇。

可以通過 show variables like ‘binlog_format‘; 查看。

儲存,重啟 MySQL

# service mysql restart
拷貝主庫需要同步的資料到從庫

進入 mysql 終端 /usr/local/mysql/bin/mysql -uroot -p

設定主庫成唯讀狀態

mysql> use test;mysql> FLUSH TABLES WITH READ LOCK;

重設 binlog 日誌

mysql> RESET MASTER;

查看運行狀態

mysql> SHOW MASTER STATUS\G;******************* 1. row *******************             File: mysql-bin.000001         Position: 120     Binlog_Do_DB: test Binlog_Ignore_DB:Executed_Gtid_Set:1 row in set (0.00 sec)

此處需記錄 FilePosition 兩個值,下面從庫的 CHANGE MASTER TO 命令中需要用到這兩個值。

接下來切換到從程式庫伺服器,匯出主庫中需要同步的資料,並匯入到從庫:

# /usr/local/mysql/bin/mysqldump -h192.168.2.21 -urep -p test > dumptest.db# /usr/local/mysql/bin/mysql -uroot -p test < dumptest.db

再回到主程式庫伺服器解鎖主庫資料庫唯讀狀態

mysql> UNLOCK TABLES;

從庫(192.168.2.22):

配置從庫 my.cnf
# vi /etc/my.cnf[mysqld]server-id=2  #從程式庫伺服器 ID,注意伺服器 ID 不能重複replicate-do-db=test  #需要做複製的資料庫名,如果複製多個資料庫,重複設定這個選項即可slave-skip-errors=1032,1062,126,1114,1146,1048,1396  #自動跳過的錯誤碼,以防複製出錯被中斷

如果資料庫中有不需要同步的表可以添加 replicate-ignore-table=table_name,... 配置項,自動跳過這些表。

儲存,重啟 MySQL

# service mysql restart
指定主庫

進入 MySQL 終端:

mysql> CHANGE MASTER TO  MASTER_HOST=‘192.168.2.21‘,  MASTER_USER=‘rep‘,  MASTER_PASSWORD=‘123‘,  MASTER_LOG_FILE=‘mysql-bin.000001‘,  MASTER_LOG_POS=120;
啟動從庫串連
mysql> start slave;

查看從庫狀態

mysql> SHOW SLAVE STATUS\G; ......  Slave_IO_Running: Yes Slave_SQL_Running: Yes ......

兩個 Yes 成功。

測試

現在可以在主庫中插入/更新資料,添加表等操作,看從庫是否可以同步相應的資料。

問題

在最後使用 SHOW SLAVE STATUS\G; 查看 slave 運行狀態時,有一個錯誤:

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

server uuid 是從 MySQL 5.6 開始添加進來的, 由於我偷了個懶,從庫是直接在 VirtualBox 中 Clone 的主庫,所以 /var/lib/mysql/auto.cnf 檔案中的 server-uuid 的值是一樣的。 隨便改一個值,但是值的格式不能變,不與群組中的其他 server-uuid 重複即可。

改完之後,重啟 mysql:

# service mysql restart

再次使用 SHOW SLAVE STATUS\G; 查看狀態正常。

附兩個小命令:

mysql> SHOW SLAVE HOSTS;  #需在 master 中執行,查看 slave 列表,包括相應的 server-uuid 值mysql> show variables like ‘server_uuid‘;  #查看原生 server-uuid 值

Good Luck!

MySQL(Percona Server) 5.6 主從複製

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.