今天下午在電腦上配置主從服務器,本機windows7 虛擬機ubuntu 12.10 一切工做準備就緒。 php
主從服務器同步原理,根據生成的二進制文件進行同步,也就是mysql配置的log-bin生成的二進制文件。結束時介紹一下mysql的日誌分類。 html
首先配置主服務器: mysql
打開my.ini(win7)在[mysqld]添加 web
server-id=1
log-bin="D:\APMServ5.2.6\MySQL5.1\logs\mysql-bin"
主服務器是不須要其餘配置的。 sql
而後添加mysql主從用戶:grant replication slave on *.* to 'repuser'@'%' IDENTIFIED by '123456'; 數據庫
flush privileges;
從數據庫配置: ubuntu
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
character-set-server = utf8
replicate-ignore-db = mysql,information_schema,test //無需同步的名稱
replicate-do-db = gktcms //同步的數據庫庫名。
expire_logs_days = 10
max_binlog_size = 100M windows
mysql 5.x以上版本已經不支持在配置文件中指定主服務器相關選項 master-host=master-user= master-password=master-port=寫入配置文件,須要進入到Mysql中進行命令配置。 change master to master_host='1234',master_port='3306',master_user='123',master_password='1234'; 緩存
slave start;開啓主從複製
安全
這兩個狀態必須所有爲yes的時候才能正常運行。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
當遇到NO的狀況的時候不要慌。
Slave_SQL_Running: No
有時候只須要從新啓動一次slave便可解決此問題。
1.程序可能在slave上進行了寫操做
2.也多是slave機器重起後,事務回滾形成的.
通常是事務回滾形成的:
解決辦法:
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
解決辦法2、
首先停掉Slave服務:slave stop
到主服務器上查看主機狀態:
記錄File和Position對應的值
進入master
mysql> show master status;
+----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| localhost-bin.000094 | 33622483 | | |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
而後到slave服務器上執行手動同步:
mysql> change master to
> master_host='master_ip',
> master_user='user',
> master_password='pwd',
> master_port=3306,
> master_log_file=localhost-bin.000094',
> master_log_pos=33622483 ;
1 row in set (0.00 sec)
mysql> slave start;
1 row in set (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
........
Master_Log_File: localhost-bin.000094
Read_Master_Log_Pos: 33768775
Relay_Log_File: localhost-relay-bin.000537
Relay_Log_Pos: 1094034
Relay_Master_Log_File: localhost-bin.000094
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
手動同步須要中止master的寫操做!
基本的操做就是這樣。5、配置參數說明
server-id
ID值惟一的標識了複製羣集中的主從服務器,所以它們必須各不相同。master_id必須爲1到232–1之間的一個正整數值,slave_id值必須爲2到232–1之間的一個正整數值。
log-bin
表示打開binlog,打開該選項才能夠經過I/O寫到Slave的relay-log,也是能夠進行replication的前提;
binlog-do-db
表示須要記錄進制日誌的數據庫。若是有多個數據庫可用逗號分隔,或者使用多個binlog-do-db選項
binlog-ignore-db
表示不須要記錄二進制日誌的數據庫。若是有多個數據庫可用逗號分隔,或者使用多個binlog-do-db選項
replicate-do-db
表示須要同步的數據庫,若是有多個數據庫可用逗號分隔,或者使用多個replicate-do-db選項
replicate-ignore-db=mysql
表示不須要同步的數據庫,若是有多個數據庫可用逗號分隔,或者使用多個replicate-ignore-db=mysql選項
log-slave-updates
配置從庫上的更新操做是否寫入二進制文件,若是這臺從庫,還要作其餘從庫的主庫,那麼就須要打這個參數,以便從庫的從庫可以進行日誌同步
slave-skip-errors
在複製過程,因爲各類緣由致使binlog中的sql出錯,默認狀況下,從庫會中止複製,要用戶介入。能夠設置Slave-skip-errors來定義錯誤號,若是複製過程當中遇到的錯誤號是定義的錯誤號,即可以跳過。若是從庫是用來作備份,設置這個參數會存在數據不一致,不要使用。若是是分擔主庫的查詢壓力,能夠考慮。
sync_binlog=1 or N
sync_binlog的默認值是0,這種模式下,MySQL不會同步到磁盤中去。這樣的話,MySQL依賴操做系統來刷新二進制日誌binary log,就像操做系統刷其餘文件的機制同樣。所以若是操做系統或機器(不只僅是MySQL服務器)崩潰,有可能binlog中最後的語句丟失了。要想防止這種狀況,你可使用sync_binlog全局變量,使binlog在每N次binlog寫入後與硬盤同步。當sync_binlog變量設置爲1是最安全的,由於在crash崩潰的狀況下,你的二進制日誌binary log只有可能丟失最多一個語句或者一個事務。可是,這也是最慢的一種方式(除非磁盤有使用帶蓄電池後備電源的緩存cache,使得同步到磁盤的操做很是快)。
即便sync_binlog設置爲1,出現崩潰時,也有可能表內容和binlog內容之間存在不一致性。若是使用InnoDB表,MySQL服務器處理COMMIT語句,它將整個事務寫入binlog並將事務提交到InnoDB中。若是在兩次操做之間出現崩潰,重啓時,事務被InnoDB回滾,但仍然存在binlog中。能夠用–innodb-safe-binlog選項來增長InnoDB表內容和binlog之間的一致性。(註釋:在MySQL 5.1中不須要–innodb-safe-binlog;因爲引入了XA事務支持,該選項做廢了),該選項能夠提供更大程度的安全,使每一個事務的 binlog(sync_binlog =1)和(默認狀況爲真)InnoDB日誌與硬盤同步,該選項的效果是崩潰後重啓時,在滾回事務後,MySQL服務器從binlog剪切回滾的 InnoDB事務。這樣能夠確保binlog反饋InnoDB表的確切數據等,並使從服務器保持與主服務器保持同步(不接收回滾的語句)。
auto_increment_offset和auto_increment_increment
auto_increment_increment和auto_increment_offset用於主-主服務器(master-to-master)複製,並能夠用來控制AUTO_INCREMENT列的操做。兩個變量都可以設置爲全局或局部變量,而且假定每一個值均可覺得1到65,535之間的整數值。將其中一個變量設置爲0會使該變量爲1。
這兩個變量影響AUTO_INCREMENT列的方式:auto_increment_increment控制列中的值的增量值,auto_increment_offset肯定AUTO_INCREMENT列值的起點。
若是auto_increment_offset的值大於auto_increment_increment的值,則auto_increment_offset的值被忽略。例如:表內已有一些數據,就會用如今已有的最大的自增值作爲初始值。
6、二進制日誌清除
主同步服務器產生的二進制日誌會佔據大量的磁盤空間,應按期刪除過時的bin-log。
A、經過PURGE MASTER LOGS刪除
若是您有一個在用的從屬服務器,該服務器當前正在讀取您正在試圖刪除的日誌之一,則本語句不會起做用,而是會失敗,並伴隨一個錯誤。不過,若是從屬服務器是中止的,而且您碰巧清理了其想要讀取的日誌之一,則從屬服務器啓動後不能複製。當從屬服務器正在複製時,本語句能夠安全運行。您不須要中止它們。
要清理日誌,需按照如下步驟:
一、在每一個從屬服務器上,使用SHOW SLAVE STATUS來檢查它正在讀取哪一個日誌。
二、使用SHOW MASTER LOGS得到主服務器上的一系列日誌。
三、在全部的從屬服務器中斷定最先的日誌。這個是目標日誌。若是全部的從屬服務器是更新的,這是清單上的最後一個日誌。
四、製做您將要刪除的全部日誌的備份。(建議備份)
五、清理全部的日誌,可是不包括目標日誌。
PURGE 語法
PURGE {MASTER | BINARY} LOGS TO ‘log_name’
PURGE {MASTER | BINARY} LOGS BEFORE ‘date’
用於刪除列於在指定的日誌或日期以前的日誌索引中的全部二進制日誌。這些日誌也會從記錄在日誌索引文件中的清單中被刪除,這樣被給定的日誌成爲第一個。
BEFORE變量的date自變量能夠爲’YYYY-MM-DD hh:mm:ss’格式。MASTER和BINARY是同義詞。
例如:
1 2 3 4 5 6 7 8 9 |
#刪除binlog.000002以前的而不包含binlog.000002 mysql> PURGE MASTER LOGS TO 'binlog.000002'; #刪除2011-05-28 1:35:00以前的 mysql> PURGE MASTER LOGS BEFORE '2011-05-28 1:35:00'; #清除3天前的binlog mysql> PURGE MASTER LOGS BEFORE DATE_SUB(NOW( ), INTERVAL 3 DAY); |
B、設置expire-logs-days參數
缺省expire-logs-days爲30天。這裏設爲7天,可根據本身狀況調整。
1 2 |
[mysqld] expire-logs-days = 7 |
7、用於控制主、從服務器的SQL語句
A、用於控制主服務器的SQL語句
PURGE MASTER LOGS
用於刪除列於在指定的日誌或日期以前的日誌索引中的全部二進制日誌。這些日誌也會從記錄在日誌索引文件中的清單中被刪除,這樣被給定的日誌成爲第一個。
RESET MASTER
能夠刪除列於索引文件中的全部二進制日誌,把二進制日誌索引文件從新設置爲空,並建立一個新的二進制日誌文件。
SET SQL_LOG_BIN
若是客戶端使用一個有SUPER權限的帳戶鏈接,則能夠禁用或啓用當前鏈接的二進制日誌記錄。若是客戶端沒有此權限,則語句被拒絕,並伴隨有錯誤。
SHOW BINLOG EVENTS
用於在二進制日誌中顯示事件。若是您不指定’log_name’,則顯示第一個二進制日誌。
SHOW MASTER LOGS
用於列出服務器中的二進制日誌文件。
SHOW MASTER STATUS
用於提供主服務器二進制日誌文件的狀態信息。
SHOW SLAVE HOSTS
用於顯示當前使用主服務器註冊的複製從屬服務器的清單。
B、用於控制從服務器的SQL語句
CHANGE MASTER TO
能夠更改從屬服務器用於與主服務器進行鏈接和通信的參數。
LOAD DATA FROM MASTER
用於對主服務器進行快照,並拷貝到從屬服務器上。
LOAD TABLE tbl_name FROM MASTER
用於把表的拷貝從主服務器轉移到從屬服務器。
MASTER_POS_WAIT()
這其實是一個函數,而不是一個語句。它被用於確認,從屬服務器已讀取並執行了到達主服務器二進制日誌的給定位置。
RESET SLAVE
用於讓從屬服務器忘記其在主服務器的二進制日誌中的複製位置。
SET GLOBAL SQL_SLAVE_SKIP_COUNTER
從主服務器中跳事後面的n個事件。要復起因語句致使的複製停止,這是有用的。
SHOW SLAVE STATUS
用於提供有關從屬服務器線程的關鍵參數的信息。
START SLAVE
用於啓動從屬服務器線程
STOP SLAVE
用於停止從屬服務器線程
以上內容摘自MySQL官方手冊,具體用法詳見:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#reset-master
8、主從複製如何提升可靠性
主從單向複製,從服務器只是實時的保存了主服務器的一個副本。當主服務器發生故障時,能夠切換到從服務器繼續作查詢,但不能更新。
若是採用雙向複製,即兩臺mysql服務器即做爲主服務器,又做爲從服務器。那麼二者均可以執行更新操做並能實現負載均衡,當一方出現故障時,另外一方不受影響。可是,除非能保證任何更新操做順序都是安全的,不然雙向複製會致使失敗。
爲了更好的提升可靠性和可用性,須要當主服務器不可用時,令從服務器成爲Master。原來的主服務器設定爲Slave,並重新的Master上同步更新。如今已經有了一個這樣開源解決方案[MySQL Master-Master Replication Manager],後面我會在寫一篇關MySQL MMM架構的方案,敬請期待!
9、參考文檔
http://www.google.com
http://blogold.chinaunix.net/u3/93755/showart.php?id=2213538
http://hahaxiao.techweb.com.cn/archives/465.html
http://blog.csdn.net/libraworm/archive/2007/07/23/1703365.aspx
http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#reset-master