參考文章:https://www.jianshu.com/p/b0cf461451fb
需求:爲了無縫上線小程序,需要兩個同構的數據庫來做支撐(一個線上,一個預備上線)。
問題:兩個數據庫在同一臺服務器的mysql服務下。
解決問題的方案:
1.在同一臺服務器下安裝兩個mysql服務(從服務器版本可以比主服務器版本高),進行主從/主主配置(這種方式不建議,以免服務器宕機)
2.將同構數據庫分別部署在兩臺服務器上。(這種實現方式比較主流,還能防備宕機)。
着手實現:
服務器(將單機拆成多機):
master:xxx.xxx.xxx.1 mysql版本:5.6.43
slave: xxx.xxx.xxx.2 mysql版本:5.6.43
配置步驟:
看到網上大多都是先鎖庫,備份,解鎖庫,在進行配置主從(疑問:如果解鎖後數據變動怎麼辦?)。
所以我個人理解應該先配置master的my.cnf,在進行先鎖庫,備份,解鎖庫,在進行配置slave。
1.先配置master服務器的/etc/my.cnf
server_id = 1
binlog-do-db = db (主從複製需要的數據庫)
#binlog-ignore-db=db(主從複製需要忽略的數據庫,和上面二選一進行配置)
#log-slave-updates=true (雙主需要開啓,同步slave中binlog日誌)
#sync_binlog = 0
#sync-master-info=1
#auto_increment_offset = 1
#auto_increment_increment = 2
#expire_logs_days = 7
#log_bin_trust_function_creators = 1
配置完成重啓數據庫服務,讓配置生效
2.拷貝master服務器上的數據庫備份到slave上
mysql>use db;
mysql>flush tables with read lock; // 鎖庫,防止這段時間有寫入。
[root@master~]# mysqldump -uroot -pxxxx db > /root/db.sql;
// 只是導出數據結構+數據 如果需要導出函數和存儲過程自行查看
mysql>show master status; // 查看主庫binlog的pos位置。
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 4 | db | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>unlock tables; // 解鎖數據庫
3.創建replication用戶,使slave通過I/O線程以該用戶名連接到master,並讀取binlog二進制日誌。
mysql>grant replication slave on *.* to 'replicate'@'%' identified by 'replicate';
myqsl>flush privileges;(刷新緩存,使用戶生效)
mysql>show processlist \G;(查看是否已有生效的master的I/O線程)
//state=Master has sent all binlog to slave; waiting for binlog to be updated;user=replicate
4.將db.sql文件發送到slave服務器,然後進行數據導入
[root@slave ~]scp [email protected]:/root/db.sql /root/db.sql(同一網絡下使用scp拷貝)
mysql>create datebase db;
mysql>source /root/db.sql;(拷貝成功)
5.配置slave服務器中的/etc/my.cnf
server_id=2
replicate-do-db=db(需要同步主庫的從庫名稱)
#replicate-ignore-db=xxx(忽略不需要進行主從的數據庫)
同樣重啓slave服務器的mysql服務,讓配置生效。
6.此時slave應該要知道如何連接到master,並重訪其二進制日誌。
不需要去修改數據庫配置了,而是需要在mysql服務裏面執行下面語句就能連接到master服務,獲取到二進制日誌
mysql>CHANGE MASTER TO
mysql>MASTER_HOST='xxx.xxx.xxx.1',
mysql>MASTER_USER='replicate',
mysql>MASTER_PASSWORD='replicate',
mysql>MASTER_LOG_FILE='mysql-bin.000001',
mysql>MASTER_LOG_POS=4;
mysql>show slave status \G;(查看slave的運行狀態,此時應該是尚未運行)
// slave_io_state爲空slave_io_running、slave_sql_running爲no
mysql>start slave;(開啓slave服務)
// slave_io_state =Waiting for master to send event
// slave_io_running = yes
// slave_sql_running = yes
當我們看到slave_io_running和slave_sql_running爲雙yes的時候,我們配置已經完成,接下來我們可以開始進行測試了。
7.查看二進制日誌文件,由於二進制日誌格式比較特殊,我們不能用tail指令去查看日誌。
[root@slave ~]# mysqlbinlog mysql-bin.000001 | tail -500
8.重點:確定你分配的mysql用戶的權限問題,當權限不可達的時候同步數據會失敗。
我遇到一個問題,至今還沒考慮清楚。如果有大佬遇到過想明白了,還想不吝賜教:
使用root@%用戶的時候,用來測試主從同步數據不成功(主庫用binlog日誌,從庫有relay-bin日誌;master的I/O線程正常,slave的I/O線程和sql線程都正常,卡了好久)。
後來使用root@localhost用戶登錄數據庫才測試成功的。現在莫名其妙的root@%用戶一切正常了。期間沒做任何改動,不知道原因。看服務器history,也沒有看到其他人修改過其他地方,滿臉的懵逼。
寫得不好,還在初級階段,還望大家多多指教。