Linux下mysql主從同步

Mysql作為目前世界上使用最廣泛的免費數(shù)據(jù)庫,在實際的生產(chǎn)環(huán)境中喊巍,由單臺Mysql作為獨立的數(shù)據(jù)是不能完全滿足實際需求的路媚,無論是在安全性、高可用性還是高并發(fā)等各個方面苗缩。

因此饵蒂,一般來說都是通過主從復(fù)制(Master-Slave)的方式來同步數(shù)據(jù),再通過讀寫分離(Mysql-Proxy)來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力酱讶。
Mysql數(shù)據(jù)庫自身提供的主從復(fù)制功可以很方便的實現(xiàn)數(shù)據(jù)庫的多重備份退盯,實現(xiàn)數(shù)據(jù)庫的拓展。多個數(shù)據(jù)庫本分不僅可以加強數(shù)據(jù)庫的安全性,通過實現(xiàn)讀寫分離還能進(jìn)一步提升數(shù)據(jù)庫的負(fù)載性能渊迁。

一主多從數(shù)據(jù)庫間主從復(fù)制與讀寫分離模型如下圖所示:

Mysql數(shù)據(jù)庫的源碼安裝方法:Linux下安裝MySQL

示例所用數(shù)據(jù)庫版本:mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

一 慰照、Mysql主從復(fù)制(Master-Slave)

在一主多從的數(shù)據(jù)庫體系中,多個從服務(wù)器采用異步的方式更新主數(shù)據(jù)庫的數(shù)據(jù)變化琉朽,業(yè)務(wù)服務(wù)器在執(zhí)行寫或者相關(guān)修改數(shù)據(jù)庫的操作是在主服務(wù)器上進(jìn)行的毒租,讀操作則是在各個從服務(wù)器上進(jìn)行的。如果配置了多個從服務(wù)器則又會涉及到負(fù)載均衡的問題漓骚。

Mysql主從復(fù)制的實現(xiàn)原理圖如下:

MySQL主從數(shù)據(jù)庫之間數(shù)據(jù)的復(fù)制基礎(chǔ)是二進(jìn)制日志文件蝌衔。主數(shù)據(jù)庫(Master)啟用二進(jìn)制日志后,它的數(shù)據(jù)庫中的所有操作都會以“事件”的方式記錄在二進(jìn)制日志中蝌蹂,其他從數(shù)據(jù)庫(Slave)通過一個I/O線程與主數(shù)據(jù)庫保持通信噩斟,并監(jiān)控Master的二進(jìn)制日志文件的變化,如果Slave發(fā)現(xiàn)Master中二進(jìn)制日志文件發(fā)生變化孤个,則會把變化復(fù)制到自己的中繼日志中剃允,然后Slave的一個SQL線程會把相關(guān)的“事件”執(zhí)行到自己的數(shù)據(jù)庫中,從而保持主從數(shù)據(jù)庫的一致性齐鲤,也就實現(xiàn)了主從數(shù)據(jù)復(fù)制斥废。

實現(xiàn)MySQL主從復(fù)制的配置方式

數(shù)據(jù)庫主從復(fù)制,最好能夠滿足以下兩點要求:主從數(shù)據(jù)庫庫版本最好一致给郊;主從數(shù)據(jù)庫內(nèi)數(shù)據(jù)保持一致牡肉。

主服務(wù)器:開啟二進(jìn)制日志;配置唯一的server-id;獲取master二進(jìn)制日志文件名和位置淆九;創(chuàng)建一個用于主從通信的用戶賬號统锤。

從服務(wù)器:配置唯一的server-id;使用主服務(wù)器分配的用戶賬號讀取master二進(jìn)制日志;啟用slave服務(wù)炭庙。

0饲窿、如果主庫中已經(jīng)存在數(shù)據(jù),可以現(xiàn)在主庫中執(zhí)行 FLUSH TABLES WITH READ LOCK; 禁用表寫入焕蹄。同步完成后逾雄,執(zhí)行 UNLOCK TABLES; 解除表寫入限制。

1腻脏、修改主數(shù)據(jù)庫配置
打開my.cnf文件(一般在/etc/my.cnf鸦泳,根據(jù)你安裝時新建位置確定,如果不確定位置可以使用find / - name my.cnf命令進(jìn)行查找)永品,在[mysqld]下添加:

[mysqld]
log-bin=mysql-bin
server-id=2           #用于標(biāo)識唯一數(shù)據(jù)庫辽故,在從庫必須設(shè)置為不同的值
binlog-do-db=test    #指定需要同步的數(shù)據(jù)庫

2、修改完配置后腐碱,重啟mysql

service mysqld restart

3誊垢、進(jìn)入mysql掉弛,賦予從庫權(quán)限賬號,允許用戶在主庫上讀取日志喂走,并給它replication slave的權(quán)限殃饿。
創(chuàng)建數(shù)據(jù)庫賬號:root2/123456

[root@localhost ~]# mysql -uroot -p
Enter password:輸入數(shù)據(jù)庫密碼
mysql> 
mysql> CREATE USER 'root2'@'%' IDENTIFIED BY '123456';    #創(chuàng)建賬號
mysql> GRANT REPLICATION SLAVE ON *.* TO 'root2'@'%';  #賦予權(quán)限
mysql>flush privileges; #刷新權(quán)限

“%”表示允許所有機(jī)器成為從庫,也可設(shè)置為固定IP

4芋肠、修改從數(shù)據(jù)庫配置
修改my.cnf文件乎芳,在[mysqld]下添加:

[mysqld]
log-bin=mysql-bin
server-id=3
replicate-do-db=test

5、重啟mysql帖池,打開mysql會話奈惑,執(zhí)行同步SQL語句。

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='182.92.172.80',
    ->     MASTER_USER='root2',
    ->     MASTER_PASSWORD='123456',
    ->     MASTER_LOG_FILE='mysql-bin.000002',
    ->     MASTER_LOG_POS=73;
  • MASTER_HOST : 主數(shù)據(jù)庫IP
  • MASTER_USER : 主數(shù)據(jù)庫授權(quán)賬號
  • MASTER_PASSWORD : 主數(shù)據(jù)庫授權(quán)密碼
  • MASTER_LOG_FILE : 在主數(shù)據(jù)庫中通過SHOW MASTER STATUS命令獲取File字段的值
  • MASTER_LOG_POS : 在主數(shù)據(jù)庫中通過SHOW MASTER STATUS命令獲取Position字段的值

主數(shù)據(jù)庫執(zhí)行 SHOW MASTER STATUS;

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |     1485 | test         |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

6睡汹、啟動從數(shù)據(jù)庫的同步進(jìn)程

mysql>start slave;

7肴甸、查看從數(shù)據(jù)的狀態(tài)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.1
                  Master_User: root2
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 50
               Relay_Log_File: iZmcZ-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: test
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 775
              Relay_Log_Space: 545
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1001
                  Master_UUID: e1f8-a4-1e9-8b3-0cc47ac1430e
             Master_Info_File: /usr/local/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 

當(dāng)Slave_IO_Running和Slave_SQL_Running都為YES的時候就表示主從同步設(shè)置成功了。接下來就可以進(jìn)行一些驗證了囚巴,比如在主master數(shù)據(jù)庫的test數(shù)據(jù)庫的一張表中插入一條數(shù)據(jù)原在,在slave的test庫的相同數(shù)據(jù)表中查看是否有新增的數(shù)據(jù)即可驗證主從復(fù)制功能是否有效,還可以關(guān)閉slave(mysql>stop slave;),然后再修改master彤叉,看slave是否也相應(yīng)修改(停止slave后庶柿,master的修改不會同步到slave),就可以完成主從復(fù)制功能的驗證了秽浇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浮庐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柬焕,更是在濱河造成了極大的恐慌兔辅,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件击喂,死亡現(xiàn)場離奇詭異,居然都是意外死亡碰辅,警方通過查閱死者的電腦和手機(jī)懂昂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來没宾,“玉大人凌彬,你說我怎么就攤上這事⊙ィ” “怎么了铲敛?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長会钝。 經(jīng)常有香客問我伐蒋,道長工三,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任先鱼,我火速辦了婚禮俭正,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘焙畔。我一直安慰自己掸读,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布宏多。 她就那樣靜靜地躺著儿惫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伸但。 梳的紋絲不亂的頭發(fā)上肾请,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音砌烁,去河邊找鬼筐喳。 笑死,一個胖子當(dāng)著我的面吹牛函喉,可吹牛的內(nèi)容都是我干的避归。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼管呵,長吁一口氣:“原來是場噩夢啊……” “哼梳毙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捐下,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤账锹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坷襟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奸柬,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年婴程,在試婚紗的時候發(fā)現(xiàn)自己被綠了廓奕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡档叔,死狀恐怖桌粉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衙四,我是刑警寧澤铃肯,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站传蹈,受9級特大地震影響押逼,放射性物質(zhì)發(fā)生泄漏步藕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一宴胧、第九天 我趴在偏房一處隱蔽的房頂上張望漱抓。 院中可真熱鬧,春花似錦恕齐、人聲如沸乞娄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仪或。三九已至,卻和暖如春士骤,著一層夾襖步出監(jiān)牢的瞬間范删,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工拷肌, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留到旦,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓巨缘,卻偏偏與公主長得像添忘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子若锁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容