1、複制的介紹
MySQL支援單向、異步複制,複制過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。主伺服器将更新寫入二進制日志檔案,并維護檔案的一個索引以跟蹤日志循環。這些日志可以記錄發送到從伺服器的更新。當一個從伺服器連接配接主伺服器時,它通知主伺服器從伺服器在日志中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖并等待主伺服器通知新的更新。
請注意當你進行複制時,所有對複制中的表的更新必須在主伺服器上進行。否則,你必須要小心,以避免使用者對主伺服器上的表進行的更新與對從伺服器上的表所進行的更新之間的沖突。
單向複制有利于健壯性、速度和系統管理:
· 主伺服器/從伺服器設定增加了健壯性。主伺服器出現問題時,你可以切換到從伺服器作為份。
· 通過在主伺服器和從伺服器之間切分處理客戶查詢的負荷,可以得到更好的客戶響應時間。SELECT查詢可以發送到從伺服器以降低主伺服器的查詢處理負荷。但修改資料的語句仍然應發送到主伺服器,以便主伺服器和從伺服器保持同步。如果非更新查詢為主,該負載均衡政策很有效,但一般是更新查詢。
· 使用複制的另一個好處是可以使用一個從伺服器執行備份,而不會幹擾主伺服器。在備份過程中主伺服器可以繼續處理更新。
MySQL 提供了資料庫的同步功能,這對我們實作資料庫的冗災、備份、恢複、負載均衡等都是有極大幫助的
2、環境
用的是radhat 5.1作業系統 mysql5.0.22版本
master 計算機名:node1 IP位址:192.168.0.1
slave 計算機名:node2 IP位址:192.168.0.2
3、mysql的單向複制
注意 mysql 資料庫的版本,兩個資料庫版本要相同,或者slave比master版本低!
a、 在node1、node2上安裝沒mysql軟體,通過源碼安裝
mysql軟體可以在[url]http://www.mysql.com[/url] 上下載下傳,下來通過ftp或則其他的軟體上傳到伺服器上:
1)在linux系統中添加運作Mysql的使用者群組
[root@node1 ~]# groupadd mysql
[root@node1 ~]# useradd -g mysql mysql
2)解壓縮源碼包
[root@node1 ~]# tar -zxvf mysql-5.0.22.tar.gz
[root@node1 ~]# cd mysql-5.0.22
3)配置編譯
配置mysql的安裝目錄
[root@node1 mysql-5.0.22]# ./configure --prefix=/usr/local/mysql)編譯并安裝
[root@node1 mysql-5.0.22]#make #編譯
[root@node1 mysql-5.0.22]#make install
5)裝載原始授權到資料庫
[root@node1 mysql-5.0.22]#./scripts/mysql_install_db
6)copy mysql的配置檔案到/etc目錄
[root@node1 mysql-5.0.22]# cp support-files/my-medium.cnf /etc/my.cnf
7)copy mysql的啟動腳本到資源目錄
[root@node1 mysql-5.0.22]#cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
8)添加mysql服務,讓系統啟動時自動啟動mysql服務
[root@node1 mysql-5.0.22]#chmod +x /etc/rc.d/init.d/mysqld
[root@node1 mysql-5.0.22]#chkconfig --level 235 mysqld on
9)更改目錄屬主
[root@node1 mysql-5.0.22]#chown -R mysql.mysql /var/lib/mysql
10)設定環境變量
在 /etc/profile添加一行就 ,在運作mysql的時候就不用輸入很長的路經了
export PATH=$PATH:/usr/local/mysql/bin
11)啟動mysql服務
[root@node1 mysql-5.0.22]#service mysqld start
到這裡mysql軟體就按轉完畢,node2上的mysql安裝按照上面的就行了。
b、配置mysql的配置檔案
1)進入mysql指令行,為slave使用者添加同步專用權限
輸入密碼 ,就進入到mysql指令行中了,一般剛裝好的沒有密碼。
[root@node1 ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 5.0.22
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO 'replication'@'192.168.1.2' IDENTIFIED BY '123456';
#給與從伺服器使用者replication的同步權限
mysql> Grant ALL PRIVILEGES ON *.* TO li@'%'
IDENTIFIED BY '123456';
#如果需要的話添加管理使用者,通過mysql的用戶端來測試同步的情況
mysql>Flush privileges;
#重新整理權限,使設定生效
2)配置node1 的/etc/my.cnf配置檔案
建立更新日志的目錄并給mysql使用者的權限
[root@node1 ~]# mkdir /var/log/mysql
[root@node1 ~]# chown -R mysql.mysql /var/log/mysql
修改配置檔案中如下内容,如果沒有添加上去:
log-bin=mysql-bin | 啟動二進制日志系統 |
binlog-do-db=test | 二進制需要同步的資料庫名 |
server-id = 1 | 本機資料庫ID 标示為主,該部分還應有一個server-id=Master_id選項,其中master_id必須為1到232–1之間的一個正整數值 |
log-bin=/var/log/mysql/updatelog | #設定生成log檔案名,這裡的路徑沒有mysql目錄要手動建立并給于它mysql使用者的權限。 |
binlog-ignore-db=mysql | # 避免同步mysql使用者配置,以免不必要的麻煩 |
3)停止資料庫,并将本地需要同步資料庫打包拷貝到從資料庫上
[root@node1 ~]#service mysqld stop #停止mysql的服務
[root@node1 ~]#tar -cvf /root/db.tar /usr/local/mysql/test #備份主伺服器需要同步的資料庫
[root@node1 ~]#scp /root/db.tar [email protected]:/usr/local/mysql #通過遠端拷貝到從伺服器上,通過這個拷貝的時候需要輸入node2的root密碼。
[root@node1 ~]#Service mysqld start #啟動主伺服器mysql服務
二、同步slave 從伺服器配置
1)配置slave伺服器/etc/my.cnf檔案
将以下配置啟用:
server-id = 2 | 從伺服器ID号,不要和主ID相同 , 如果設定多個從伺服器,每個從伺服器必須有一個唯一的server-id值,必須與主伺服器的以及其它從伺服器的不相同。可以認為server-id值類似于IP位址:這些ID值能唯一識别複制伺服器群集中的每個伺服器執行個體。 |
master-host = 192.168.1.1 | 指定主伺服器IP位址 |
master-user = replication | 制定在主伺服器上可以進行同步的使用者名 |
master-password = 123456 | 密碼 |
master-port = 3306 | 同步所用的端口 |
master-connect-retry=60 | 斷點重新連接配接時間 |
replicate-ignore-db=mysql | 屏蔽對mysql庫的同步,以免有麻煩 |
replicate-do-db=test | 同步資料庫名稱 |
2)裝載主伺服器資料庫:
[root@node2 ~]#cd /var/lib/mysql #進入資料庫庫檔案主目錄
[root@node2 ~]#tar -xvf db.tar #解壓縮
[root@node2 ~]#service mysqld start #啟動從資料庫服務
三、查詢配置
在node1上進入mysql的指令行
用下面的指令檢視
[root@node1 ~]# mysql #進入mysql指令行
mysql> show master status; #顯示(不同主機結果不同)
+------------------+----------+-------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
| updatelog.000028 | 313361 |db1 | mysql |
(同步之前如果懷疑主從資料不同步可以采取:上面冷備份遠端拷貝法或者在從伺服器上命行同步方法)
在從伺服器執行MySQL指令下:
mysql> slave stop; #先停止slave服務
mysql> CHANGE MASTER TO MASTER_LOG_FILE='updatelog.000028',MASTER_LOG_POS=313361;
#根據上面主伺服器的show master status的結果,進行從伺服器的二進制資料庫記錄回歸,達到同步的效果
mysql>slave start; #啟動從伺服器同步服務
mysql> show slave status\G;
用show slave status\G;看一下從伺服器的同步情況
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes,那代表已經在同步
利用mysql的用戶端來測試,要比在指令行友善的多。
更多詳細資訊以及參數設定,請參考MySQL 5.0 Manual手冊.
4、進行mysql 雙向同步配置
a、 先修改原slave 伺服器配置
1)配置原slave伺服器/etc/my.cnf檔案(紅字為添加内容)
從伺服器ID号,不要和主ID相同 | |
master-user = repl | |
master-password = 123 | |
屏蔽對mysql庫的同步 | |
replicate-do-db=db1 | |
設定生成log檔案名 | |
binlog-do-db=db1 | 設定同步資料庫名 |
避免同步mysql使用者配置,以免不必要的麻煩 |
2)重新啟動mysql服務,建立一個同步專用賬号
輸入密碼 ,就進入到mysql指令行中了,一般剛裝好的沒有密碼。
mysql> Grant ALL PRIVILEGES ON *.* TO li@'%' IDENTIFIED BY '123456';
b、 修改原master主伺服器的my.cnf,添加如下内容(紅色為添加部分)
本機資料庫ID 标示為主 | |
#設定生成log檔案名 | |
master-host = 192.168.1.2 | 設定從原slave資料庫同步更新 |
更新使用者 | |
端口 | |
需要更新的庫 | |
啟動mysql服務
[root@node1 ~]#service mysqld restart
在node2伺服器執行MySQL指令符下:
mysql> show master status;
看看有無作為主伺服器的資訊
| updatelog.000028 | 313361 |test | mysql |
在node1伺服器執行MySQL指令下:
[root@node1 ~]#mysql #進入mysql指令行
mysql> slave stop; #先停止slave服務
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.2',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_PORT=3306MASTER_LOG_FILE='updatelog.000028',MASTER_LOG_POS=313361;
mysql> slave start; #啟動從伺服器同步服務
c、 測試
1)在node1伺服器上進入mysql指令行
[root@node1 ~]#mysql
mysql>SHOW SLAVE STATUS\
此處Slave_IO_Running ,Slave_SQL_Running 都應該是yes,表示從庫的I/O,Slave_SQL線程都正确開啟.
表明資料庫正在同步。
2)在node2伺服器上進入mysql指令行,用 show slave status;檢視
此處Slave_IO_Running ,Slave_SQL_Running 都應該是yes,表示從庫的I/O,Slave_SQL線程都正确開啟.表明資料庫正在同步。
3)這裡我找到了一個mysql的用戶端。利用在mysql上建立的管理使用者登陸資料庫,可以直接在表中寫入值,去另一個資料庫上看能不能重新整理出來,在那裡資料庫上寫入的資料。下面可以下載下傳.