mysql 主從配置



1. MySQL主從原理以及應用場景MySQL的Replication原理非常簡單,總結一下:
每個從僅可以設置一個主。
主在執行sql之後,記錄二進制log文件(bin-log)。
從連接主,並從主獲取binlog,存於本地relay-log,並從上次記住的位置起執行sql,一旦遇到錯誤則停止同步。
從這幾條Replication原理來看,可以有這些推論:
主從間的數據庫不是實時同步,就算網絡連接正常,也存在瞬間,主從數據不一致。
如果主從的網絡斷開,從會在網絡正常後,批量同步。
如果對從進行修改數據,那麼很可能從在執行主的bin-log時出現錯誤而停止同步,這個是很危險的操作。所以一般情況下,非常小心的修改從上的數據。
一個衍生的配置是雙主,互爲主從配置,只要雙方的修改不衝突,可以工作良好。
如果需要多主的話,可以用環形配置,這樣任意一個節點的修改都可以同步到所有節點。

可以應用在讀寫分離的場景中,用以降低單臺MySQL服務器的I/O 
可以實現MySQL服務的HA集羣
可以是1主多從,也可以是相互主從(主主)

準備兩臺機器:

首先確保主從服務器上的Mysql版本相同

(master)ip:192.168.1.107

(slave) ip:192.168.1.109

2. 安裝、配置MySQL 

cd /usr/local/src/ 
wget http://syslab.comsenz.com/downloads/linux/mysql-5.1.40-linux-i686-icc-glibc23.tar.gz
注意:上面的地址是32位機器用的,如果你的機器是64位,下載這個包(http://syslab.comsenz.com/downloads/linux/mysql-5.1.40-linux-x86_64-icc-glibc23.tar.gz)安裝方法是一樣的。

tar zxvf /usr/local/src/mysql-5.1.40-linux-i686-icc-glibc23.tar.gz 
mv mysql-5.1.40-linux-i686-icc-glibc23 /usr/local/mysql 
useradd -s /sbin/nologin mysql 
cd /usr/local/mysql 
mkdir -p /data/mysql 
chown -R mysql:mysql /data/mysql 
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql 
cp support-files/my-large.cnf /etc/my.cnf 
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld



vim /etc/init.d/mysqld

需要修改的地方有 

basedir=/usr/local/mysql

datadir=/data/mysql


在master(192.168.1.107)創建測試庫: create database db1; 
然後導出主的mysql庫數據然後導入給db1
mysqldump -uroot -S /tmp/mysql.sock mysql > 123.sql ;
mysql -uroot -S /tmp/mysql.sock db1 < 123.sql 

4. 配置主(master)
vim /etc/my.cnf   #修改或添加:
server-id=1
log-bin=mysql-bin  
兩個可選參數(2選1):
         binlog-do-db=db1,db2 #需要同步的庫
         binlog-ignore-db=db1,db2 #忽略不同步的庫
修改配置文件後,重啓mysql


你可以把mysql加入到PAHT中 

vim /etc/profile.d/path.sh 

#!/bin/bash
PATH=$PATH:/usr/local/mysql/bin/

增加完後 source !$



新安裝的mysql是沒有密碼的
啓動mysql:mysql

設置一個從數據庫的賬戶,使用REPLICATION SLAVE賦予權限,如:

GRANT ALL PRIVILEGES ON *.* TO 'real'@'192.168.1.109' IDENTIFIED BY '123.com' WITH GRANT OPTION;
flush privileges;


show databases;

你可以看到db1 這個庫;

之後可以得到主服務器當前二進制日誌名和偏移量,這個操作的目的是爲了在從數據庫啓動後,從這個點開始進行數據的恢復 
 
mysql> show master status\G; 
*************************** 1. row *************************** 
File: mysql-bin.000004
Position: 369
Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec) 

記住File Position 後面的參數;

注意在導出數據之前先對主數據庫進行READ LOCK,以保證數據的一致性 
 
mysql> flush tables with read lock; 
Query OK, 0 rows affected (0.19 sec)



5. 設置從(slave)
vim /etc/my.cnf  #修改或增加
server-id = 2 #這個數值不能和主一樣
可選參數:replicate-do-db=db1,db2 和 replicate-ignore-db=db1,db2 #意義同主的那兩個可選參數

拷貝主的db1庫數據到從:

mysqldump -h192.168.1.107 -P3306 -uroot -p123.com db1> db1.sql;mysql -p -e  "create database db1"; mysql -uroot -p  db1 < db1.sql


啓動 mysql:service mysqld start 

如果 啓動時你遇到了這樣的錯誤:


Starting MySQL…… ERROR! Manager of pid-file quit without updating file

那麼 你需要做這樣的操作


vi /etc/my.cnf

log-bin=mysql-bin

binlog_format=mixed

註釋掉這兩行,然後重啓


登陸從的mysql

slave stop; 
change master to master_host='192.168.1.107', master_port=3306, master_user='real', master_password='123123', master_log_file='mysql-bin.000004', master_log_pos=369
slave start;
主上: mysql -uroot -S /tmp/mysql2.sock -p123456 -e "unlock tables" 
從上查看從的狀態: show slave status\G;

 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

查看這兩個是否爲yes


6. 測試主從
主上清空db1庫的db表 :use db1; select count(*) from db"; truncate table db;  
進入slave,查看db1庫db表: use db1; select count(*) from db";  
主上刪除表db: drop table db;
從上看db表不存在了
建議: MySQL主從機制比較脆弱,謹慎操作。如果重啓master,務必要先把slave停掉,也就是說需要在slave上去執行 slave stop 命令,然後再去重啓master的mysql服務,否則很有可能就會中斷了。當然重啓完後,還需要把slave給開啓 slave start.

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