mysql主從

數據庫讀法約定:

主庫: master

從庫: slave

mysql 主從同步的原理:

    #主從是異步模式,且是由從庫找主庫進行同步;

    1、主庫開啓IO線程;    開啓binlog;

        #binlog記錄用戶的增刪改

       從庫開啓IO線程;    開啓SQL線程;

    2、主庫授權從庫同步的帳號密碼;

    3、備份主庫數據且導入從庫;

    4、在從庫change master to 導入用於同步主庫的ip、port、user、等信息。

        CHANGE MASTER TO  
        MASTER_HOST='10.0.0.%', 
        MASTER_PORT=3306,

        MASTER_USER='rep', 
        MASTER_PASSWORD='123456', 
        MASTER_LOG_FILE='mysql-bin.000018',
        MASTER_LOG_POS=330;

    5、start slave 開啓從庫;

    6、從庫的IO線程向主庫的IO線程發起請求;

       主庫的IO線程驗證請求從庫的賬戶、密碼等信息是否合法;

       主庫返回從庫請求的數據(file 、pos);

    7、從庫IO接受到主庫的log日誌後,將log寫入中繼日誌relay-log;

       從庫SQL線程讀取relay.log轉換後寫入從庫;

        #如果是級聯,從庫需記錄logbin

       從庫master.info記錄從庫跟新的位置點;

    8、從庫IO線程繼續向主庫請求上一次位置點往下的binlog數據.....




mysql主從同步的步驟:

   1、準備兩臺數據庫環境,或者單臺多實例環境,可以正常啓動和登錄。


   2)、配置my.cnf文件。主庫配置log-binserver-id 參數,從庫配置server-idid不可以和主庫及其它從庫一樣,從庫一般不開啓log-bin功能,注意重啓生效,(從庫在備份、級聯時開啓binlog);

          vi /etc/my.cnf

         49 log-bin=mysql-bin

         46 server-id = 1

         #以上兩個參數要放在my.cnf中的[mysqld]模塊下,否則會出錯;

         查看:egrep -E "server-id|log-bin" /etc/my.cnf
               server-id = 1   

               log-bin=mysql-bin        

           生效查看:

            А、ll ../mysql/data/下是否有mysql-bin.000005日誌生成;

            Β、mysql -uroot-p123456 -e "show variables like 'log_bin';"

                觀察:| log_bin       | ON | 是否爲ON 

         #如果從庫是中繼需開啓binlog、開啓log_slave_updates則可以寫入。

 

  3)、登錄主庫增加用於從庫連接主庫同步的帳號,例如:rep授權replicattion  slave的權限;

         grant resplication slave on *.* to"rep"@"10.0.0.%" identified by "123456"

         刷新權限:

         flush privileges;

        ##replication slave爲mysql同步的必須權限,此處不要授權all;

        ##*.*表示所有庫所有表,可以指定具體的庫和表進行復制

        ##"rep"@"10.0.0.%" rep爲同步帳號。10.0.0.%爲授權的網段,使用%表示整個10.0.0.0網段以rep用戶訪問;


4)主庫登錄,整庫鎖表;然後查看binlog的位置狀態;

            flush table with read lock;

           #窗口關閉後及失效,超時參數到了也失效)

           mysql> show masterstatus;

          +------------------+----------+--------------+------------------+

           | File             | Position | Binlog_Do_DB |Binlog_Ignore_DB |

          +------------------+----------+--------------+------------------+

           | mysql-bin.000022 |      107 |              |                  |

     +------------------+----------+--------------+------------------+

          注意:flush tables with read lock  5.1

                Flush table with readlock   5.5

                mysql-bin.000022=file      107=pos

           

5)新開窗口,linux命令行備份或導出原有數據庫的數據,並拷貝到從庫所在的服務目錄;

         mysqldump -uroot -p123456 -B -A--master-data=1 --events --single-transaction >/back/my.back

#備份,如果數據量很大,允許停機,可以停機打包,而不用mysqldump


6)、解鎖主庫,unlock tables;

 或者--master-data=1

7)把主庫導出的原有數據恢復到從庫。

8)根據主庫的show master status;查看binlog的位置狀態,在從庫執行changemaster  to 語句;

       CHANGE MASTER TO  
        MASTER_HOST='10.0.0.8',

        #主庫的ip地址;
        MASTER_PORT=3306,

        #主庫mysql的端口;
        MASTER_USER='rep',

        #主庫允許從庫備份的帳號
        MASTER_PASSWORD='123456',

        #允許帳號的密碼, 
        MASTER_LOG_FILE='mysql-bin.000018',

      #mysql-bin的位置;
        MASTER_LOG_POS=330;

 

CHANGE MASTER TO  
MASTER_HOST='10.0.0.%', 
MASTER_PORT=3306,
MASTER_USER='rep', 
MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='mysql-bin.000018',
MASTER_LOG_POS=330;

 



9)從庫開啓同步開關:

            start slave

10)、從庫檢查同步狀態,並在主庫進行跟新操作;

         Show slave status\G;

            

          Slave_IO_Running: Yes

        Slave_SQL_Running: Yes

        爲正常

 

線程的啓動與關閉:

停止MYSQL同步

STOP SLAVE IO_THREAD;    #停止IO進程

STOP SLAVE SQL_THREAD;   #停止SQL進程

STOP SLAVE;              #停止IO和SQL進程

  啓動MYSQL同步

START SLAVE IO_THREAD;    #啓動IO進程

START SLAVE SQL_THREAD;   #啓動SQL進程

 

START SLAVE;              #啓動IO和SQL進程

RESET SLAVE;             #重置MYSQL同步

# 用於讓從服務器忘記其在主服務器的二進制日誌中的複製位置, 它會刪除master.info和relay-log.info文件,以及所有的中繼日誌,並啓動一個新的中繼日誌,當你不需要主從的時候可以在從上執行 這個操作。不然以後還會同步,可能會覆蓋掉你的數據庫,我以前就遇到過這樣傻叉的事情。哈哈!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章