MySQL是一個流行的關系型數據庫管理系統(tǒng),許多業(yè)務都要使用MySQL進行數據存儲和管理。在一些場景中,需要將兩個數據庫之間的數據進行實時同步,以便于業(yè)務數據的聯通。在MySQL中,可以通過以下方式實現兩個庫的實時同步。
首先需要創(chuàng)建兩個數據庫,分別命名為mysql_a和mysql_b。在mysql_a中創(chuàng)建一個表user_info:
CREATE TABLE user_info ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, age INT NOT NULL );
在mysql_b中創(chuàng)建一個空表,名稱和字段和mysql_a中的表完全一致。
CREATE TABLE user_info ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, age INT NOT NULL );
接著安裝mysql_binlog插件,開啟binlog功能并進行配置:
mysql>INSTALL PLUGIN mysql_binlog SONAME 'mysql_binlog.so'; mysql>SET GLOBAL binlog_format = 'ROW'; mysql>SET GLOBAL binlog_row_image = 'FULL'; mysql>SET GLOBAL binlog_rows_query_log_events = ON; mysql>SET GLOBAL binlog_row_metadata = FULL;
最后編寫腳本實現雙向同步數據的邏輯。腳本代碼如下:
#!/bin/bash MASTER_HOST=192.168.x.x MASTER_PORT=3306 MASTER_USER=root MASTER_PASSWD=123456 MASTER_LOG_FILE=mysql-bin.000001 MASTER_LOG_POS=996 SLAVE_HOST=192.168.y.y SLAVE_PORT=3306 SLAVE_USER=root SLAVE_PASSWD=123456 while true do RESULT=`mysql -h $MASTER_HOST -P $MASTER_PORT -u $MASTER_USER -p$MASTER_PASSWD -e "SHOW MASTER STATUS\G" | grep -E 'File|Position'` CURRENT_LOG_FILE=`echo $RESULT | awk '{print $2}'` CURRENT_LOG_POS=`echo $RESULT | awk '{print $4}'` if [[ "$CURRENT_LOG_FILE" != "$MASTER_LOG_FILE" || "$CURRENT_LOG_POS" != "$MASTER_LOG_POS" ]] ; then mysql -h $SLAVE_HOST -P $SLAVE_PORT -u $SLAVE_USER -p$SLAVE_PASSWD -e "STOP SLAVE;" mysql -h $SLAVE_HOST -P $SLAVE_PORT -u $SLAVE_USER -p$SLAVE_PASSWD -e "CHANGE MASTER TO MASTER_HOST='$MASTER_HOST', MASTER_USER='$MASTER_USER', MASTER_PASSWORD='$MASTER_PASSWD', MASTER_PORT=$MASTER_PORT, MASTER_LOG_FILE='$CURRENT_LOG_FILE', MASTER_LOG_POS=$CURRENT_LOG_POS;" mysql -h $SLAVE_HOST -P $SLAVE_PORT -u $SLAVE_USER -p$SLAVE_PASSWD -e "START SLAVE;" MASTER_LOG_FILE=$CURRENT_LOG_FILE MASTER_LOG_POS=$CURRENT_LOG_POS fi sleep 10 done
該腳本循環(huán)獲取mysql_a庫的master狀態(tài)并將這個狀態(tài)同步到mysql_b庫的slave狀態(tài)。如果mysql_a庫的master狀態(tài)發(fā)生了變化,則停止mysql_b庫的slave,以便于將其切換為新的master狀態(tài)。
以上腳本可以通過Linux的crontab服務來啟動。使用該腳本實現的雙向同步為實時同步。