MYSQL5.6/5.0管理之主從同步管理 及搭建主從庫

MYSQL管理之主從同步管理php

MYSQL主從同步架構是目前使用最多的數據庫架構之一,尤爲是負載比較大的網站,所以對於主從同步的管理也就顯得很是重要,新手每每在出現主從同步錯誤的時候不知道如何入手,這篇文章就是根據本身的經驗來詳細敘述mysql主從的管理。html

MYSQL主從同步的做用mysql

(1) 數據分佈
(2) 
負載平衡(load balancing)
(3) 
備份
(4) 
高可用性(high availability)和容錯linux

MYSQL主從同步的原理sql

關於MYSQL的主從同步,最主要的是要了解MYSQL的主從同步是如何工做的也即主從同步的原理,經過下圖能很明白的指導其工做的過程:數據庫

大體描述一下過程:從服務器的IO線程從主服務器獲取二進制日誌,並在本地保存爲中繼日誌,而後經過SQL線程來在從上執行中繼日誌中的內容,從而使從庫和主庫保持一致。主從同步的詳細過程以下:windows

1. 主服務器驗證鏈接。服務器

2. 主服務器爲從服務器開啓一個線程。網絡

3. 從服務器將主服務器日誌的偏移位告訴主服務器。架構

4. 主服務器檢查該值是否小於當前二進制日誌偏移位。

5.  若是小於,則通知從服務器來取數據。

6.  從服務器持續從主服務器取數據,直至取完,這時,從服務器線程進入睡眠,主服務器線程同時進入睡眠。

7. 當主服務器有更新時,主服務器線程被激活,並將二進制日誌推送給從服務器,並通知從服務器線程進入工做狀態。

8. 從服務器SQL線程執行二進制日誌,隨後進入睡眠狀態。

 

MYSQL主從同步的搭建實戰

主從同步的搭建是一項比較細的技術活,前期作好了一些事情會讓你在之後的工做中減小不少工做,搭建的時候須要注意一些問題,一會搭建的時候會一邊搭建一邊介紹須要注意的問題,讓初學者能在剛開始的時候就有效的規避掉一些潛在的問題(MYSQL安裝這裏不作介紹):

1.  主從同步環境介紹

操做系統環境:Centos 5.5 64 bit

MYSQL版本:MYSQL 5.6.50

主服務器的IP:10.1.1.75

從服務器的IP:10.1.1.76

2.   在主服務器上創建同步賬號

GRANT REPLICATION SLAVE,FILE ON *.* TO 'replication'@'10.1.1.%' IDENTIFIED BY '123456';

FLUSH PRIVILEGES;

配置MySQL主服務器的my.cnf文件  windows下查看mysql cmd窗口屬性 後的ini參數路徑
vi /etc/my.cnf   #編輯配置文件,在[mysqld]部分添加下面內容
server-id=1   #設置服務器id,爲1表示主服務器,注意:若是原來的配置文件中已經有這一行,就不用再添加了。
log_bin=mysql-bin  #啓動MySQ二進制日誌系統,注意:若是原來的配置文件中已經有這一行,就不用再添加了。
binlog-do-db=osyunweidb  #須要同步的數據庫名,若是有多個數據庫,可重複此參數,每一個數據庫一行
binlog-ignore-db=mysql   #不一樣步mysql系統數據庫
log_bin_trust_function_creators=1

修改配置時最好 stop  mysql在更改my.conf 
而後在啓動mysql服務。
在主庫配置binlog-ignore-db=mysql 在從庫也要配置相應的replicate-ignore-db=mysql


注意:你們在設置權限的時候不要將密碼設置過於簡單!

3.   從服務器配置文件的更改(加到 [mysqld] 標籤下 不然可能不生效)

server-id = 2

binlog-do-db=osyunweidb  #須要同步的數據庫名,若是有多個數據庫,可重複此參數,每一個數據庫一行
binlog-ignore-db=mysql   #不一樣步mysql系統數據庫,若是有多個數據庫,可重複此參數,每一個數據庫一行

replicate-wild-ignore-table=mysql.%

log-slave-updates =1 #這個有須要能夠開啓,若是須要在當前的庫下掛載其餘從庫就開啓這個

log_bin_trust_function_creators=1

注意:

1)  server-id這一項須要認真檢查,必定不能和主服務器衝突了,否則到時候會出現莫民其妙的問題,由於同步的時候會會根據server-id作判斷,若是server-id同樣就不進行同步了,否則可能會致使死循環(主主同步或者環狀同步的時候)

2)   有的人會感受奇怪我這裏爲何要使用replicate-wild-ignore-table參數,而不是用replicate-do-db或者replicate-ignore-db來過濾須要同步的數據庫和不須要同步的數據庫。這裏有幾個緣由:

A. replicate-wild-ignore-table參數能同步全部跨數據庫的更新,好比replicate-do-db或者replicate-ignore-db不會同步相似

use mysql;

UPDATE test.aaa SET amount=amount+10;

B. replicate-wild-ignore-table=mysql.%在之後須要添加同步數據庫的時候能方便添加而不須要從新啓動從服務器的數據庫。由於之後極可能須要同步其餘的數據庫。

3) auto_increment_incrementauto_increment_offset參數,這 兩個參數通常用在主主同步中,用來錯開自增值, 防止鍵值衝突

4)  --slave-skip-errors參數,不要胡亂使用這些跳過錯誤的參數,除非你很是肯定你在作什麼。當你使用這些參數時候,MYSQL會忽略那些錯誤,這樣會致使你的主從服務器數據不一致。

4.  從主服務器獲得一個快照版本

若是你的是MYISAM或者既有MYISAM又有INNODB的話就在主服務器上使用以下命令導出服務器的一個快照:

mysqldump -uroot -p --lock-tables --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql

試過只有INNODB的話就是用以下命令:

mysqldump -uroot -p --single-transaction --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql

這裏須要注意幾個參數的使用:

--single-transaction 這個參數只對innodb適用。

--databases 後面跟除mysql之後的其餘全部數據庫的庫名,我這裏只有一個test庫。

--master-data 參數會記錄導出快照時候的mysql二進制日誌位置,一會會用到。

5.  將快照版本還原到從服務器上

mysqldump -uroot -p -h 10.1.1.76 test < db.sql

將快照版本還原到從服務器上之後,此時從服務器上的數據和主服務器的數據是一致的。

6.  在從服務器上使用change master從主服務器上同步

使用grep命令查找到二進制日誌的名稱以及位置

[root@ns1 ~]# grep -i "change master" db.sql

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;

生成CHANGE MASTER語句,而後在從上執行

STOP SLAVE; 

CHANGE MASTER TO MASTER_HOST='10.1.1.75',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;

START SLAVE;

這樣就完成了主從同步的搭建,最後使用SHOW SLAVE STATUS\G;查看Slave_IO_Running和Slave_SQL_Running的狀態,若是都爲Yes,就大功告成了。

注意:不要將同步的信息寫入配置文件中,不方便管理,尤爲是有變更須要重啓。

 

MYSQL主從同步的管理

這裏介紹一些管理MYSQL主從同步的命令:

1.  中止MYSQL同步

STOP SLAVE IO_THREAD;    #中止IO進程

STOP SLAVE SQL_THREAD;    #中止SQL進程

STOP SLAVE;                               #中止IO和SQL進程

2.  啓動MYSQL同步

START SLAVE IO_THREAD;    #啓動IO進程

START SLAVE SQL_THREAD;  #啓動SQL進程

START SLAVE;                             #啓動IO和SQL進程

3.   重置MYSQL同步

RESET SLAVE;

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

4.   查看MYSQL同步狀態

SHOW SLAVE STATUS;

這個命令主要查看Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master、Last_IO_Error、Last_SQL_Error這些值來把握複製的狀態。

5.  臨時跳過MYSQL同步錯誤

常常會朋友mysql主從同步遇到錯誤的時候,好比一個主鍵衝突等,那麼我就須要在確保那一行數據一致的狀況下臨時的跳過這個錯誤,那就須要使用SQL_SLAVE_SKIP_COUNTER = n命令了,n是表示跳事後面的n個事件,好比我跳過一個事件的操做以下:

STOP SLAVE;

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

START SLAVE;

6.  從指定位置從新同步

有的時候主從同步有問題了之後,須要從log位置的下一個位置進行同步,至關於跳過那個錯誤,這時候也可使用CHANGE MASTER命令來處理,只要找到對應的LOG位置就能夠,好比:

CHANGE MASTER TO MASTER_HOST='10.1.1.75',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;

START SLAVE;

MYSQL主從同步的管理經驗介紹

1.   不要亂使用SQL_SLAVE_SKIP_COUNTER命令。

這個命令跳過以後極可能會致使你的主從數據不一致,必定要先將指定的錯誤記錄下來,而後再去檢查數據是否一致,尤爲是核心的業務數據。

2.   結合percona-toolkit工具pt-table-checksum按期查看數據是否一致。

這個是DBA必需要按期作的事情,呵呵,有合適的工具何樂而不爲呢?另外percona-toolkit還提供了對數據庫不一致的解決方案,能夠採用pt-table-sync,這個工具不會更改主的數據。還可使用pt-heartbeat來查看從服務器的複製落後狀況。具體的請查看:http://blog.chinaunix.net/uid-20639775-id-3229211.html

3.   使用replicate-wild-ignore-table選項而不要使用replicate-do-db或者replicate-ignore-db

緣由已經在上面作了說明。

4.   將主服務器的日誌模式調整成mixed

5.   每一個表都加上主鍵,主鍵對數據庫的同步會有影響尤爲是居於ROW複製模式。



參考文: 鎖表等相關命令

MySQL的主從同步是一個很成熟的架構,優勢爲:
①在從服務器能夠執行查詢工做(即咱們常說的讀功能),下降主服務器壓力;
②在從主服務器進行備份,避免備份期間影響主服務器服務;
③當主服務器出現問題時,能夠切換到從服務器。
因此我在項目部署和實施中常常會採用這種方案.

+ 數據庫目錄及其它
my.cnf配置文件       /etc/my.cnf
mysql數據庫位置      datadir=/var/lib/mysql

主數據庫:192.168.2.119
從數據庫:192.168.2.220
操做系統:RHEL5.x 32位
服務器類型: 虛擬機

+ mysql5.0.77 安裝:
① 配置好linux的yum服務後,直接yum -y install mysql便可
附:安裝php\mysql一條命令安裝:yum -y install httpd php mysql mysql-server php-mysql

② 啓動MySQL
service mysqld start(restart|stop)


1、設置主庫
一、修改主庫my.cnf,主要是設置個不同的id和logbin(#這部可依具體環境而定,壓力大的化可採用huge.cnf)
[root @localhost etc]#vi /etc/my.cnf
# 記住這部分必定要配置在[mysqld]後面,不然沒法找到從節點,各個配置項的含義可本身查閱文檔
[mysqld]
log-bin=mysql-bin
server-id=1
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql

二、啓動主庫生效
[root @localhost etc]service mysqld restart

三、登錄主庫
[root @localhost etc]mysql -u root -p

四、賦予從庫權限賬號,容許用戶在主庫上讀取日誌
mysql> grant all privileges on *.* to '用戶名'@'%' identified by '密碼'; 

五、檢查建立是否成功
select user,host from mysql.user;

六、鎖主庫表 
mysql> flush tables with read lock; 

七、顯示主庫信息
記錄File和Position,從庫設置將會用到
mysql> show master status;
+------------------+----------+--------------+------------------+
| File                   | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 98    |                     |                           | 
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

# 說明,若是執行這個步驟始終爲Empty set(0.00 sec),那說明前面的my.cnf沒配置對。

八、另開一個終端登錄220,打包主庫遷移數據(若是你使用的yum安裝,有默認數據庫並未作任何改動,則不須要進行拷貝)
目的是爲了保證兩臺服務器的mysql數據庫一致,這裏能夠自行tar打包或者使用mysqldump命令備份恢復的方式進行。


2、設置從庫
一、傳輸拿到主庫包、解包
# 登錄從庫
從上一步中備份的數據庫恢復到220服務器節點上。

二、在119節點上解鎖主庫表(對應第一點設置主庫中第6步鎖主庫表的操做) 
mysql> unlock tables; 

三、在220節點上修改從庫my.cnf(位置同樣)
[root @localhost etc]vi my.cnf 
# 記住這部分必定要配置在[mysqld]後面,不然沒法找到從節點,各個配置項的含義可本身查閱文檔
[mysqld]
log-bin=mysql-bin
server-id=2
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql
replicate-do-db=test
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60

master-host=192.168.2.119
master-user=root
master-password=pfingo

四、在220節點上驗證鏈接主庫
[root@localhost etc]mysql -h 192.168.2.119 -u 用戶名 -p 

五、在220節點從庫上設置同步
#設置鏈接MASTER MASTER_LOG_FILE爲主庫的File,MASTER_LOG_POS爲主庫的Position
#注意下面第二條命令語句中的master_log_file='mysql-bin.000001', master_log_pos=98;對應爲前面在主庫中執行的show master status;結果
mysql> slave stop;
mysql> change master to master_host='192.168.2.119',master_user='root',master_password='pfingo',master_log_file='mysql-bin.000001', master_log_pos=98;
mysql> slave start;

六、啓動從庫服務
mysql> slave start;

七、進行測試
在主庫上的test庫上創建名爲myTest的表
mysql> CREATE TABLE `myTest` (
`id` INT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`username` VARCHAR( 20 ) NOT NULL ,
`password` CHAR( 32 ) NOT NULL ,
`last_update` DATETIME NOT NULL ,
`number` FLOAT( 10 ) NOT NULL ,
`content` TEXT NOT NULL ,
PRIMARY KEY ( `id` ) 
) ENGINE = MYISAM ;

在從表中立刻看到了效果,主從同步成功了;
爲了更進一步驗證在從庫上輸入show slave status\G;
mysql> show slave status\G;
Slave_IO_Running: Yes(網絡正常);
Slave_SQL_Running: Yes(表結構正常)

進一步驗證了以上過程的正確性。

更高效複雜的主從庫 結構 搭建請參考另一篇:
高性能Mysql主從架構的複製原理及配置詳解

http://blog.csdn.net/truelove12358/article/details/50469188




相關文章
相關標籤/搜索