MySQL主從原理很是簡單,總結一下:
每一個從僅能夠設置一個主。
主在執行sql以後,記錄二進制 log文件(bin-log)。
從鏈接主,並從主獲取 binlog,存於本地relay-log,並從上次記住的位置起執行 sql,
一旦遇到錯誤則中止同步。
從這幾條Replication 原理來看,能夠有這些推論:
主從間的數據庫不是實時同步,就算網絡鏈接正常,也存在瞬間,主從數據不一致。
若是主從的網絡斷開,從會在網絡正常後,批量同步。
若是對從進行修改數據,那麼極可能從在執行主的bin-log時出現錯誤而中止同步,這
個是很危險的操做。因此通常狀況下,很是當心的修改從上的數據。
一個衍生的配置是雙主,互爲主從配置,只要雙方的修改不衝突,能夠工做良好。
若是須要多主的話,能夠用環形配置,這樣任意一個節點的修改均可以同步到全部節點。
能夠應用在讀寫分離的場景中,用以下降單臺 MySQL服務器的I/O
能夠實現MySQL服務的HA 集羣
能夠是1主多從,也能夠是相互主從(主主)
說明: 如下文檔爲在同一個機器上,配置兩個 mysql服務,在咱們上課的時候,會用
兩臺單獨的機器來演示,但步驟基本上同樣。
1.安裝配置mysql
進入/usr/local/src下載
wget http://mirrors.sohu.com/mysql/MySQL-5.1/mysql-5.1.73-linux-i686-glibc23.tar.gz
初始化MySQL
#tar zxvf /usr/local/src/mysql-5.1.73-linux-i686-icc-glibc23.tar.gz //解壓
#mv mysql-5.1.73-linux-i686-icc-glibc23 /usr/local/mysql //挪動位置
#useradd -s /sbin/nologin mysql //創建 mysql 用戶
#cd /usr/local/mysql
#mkdir -p /data/mysql // 建立 datadir,數據庫文件會放到這裏面
#chown -R mysql:mysql /data/mysql //更改權限
#./scripts/mysql_install_db --user=mysql --datadir=/data/mysqlmysql
配置 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」 (前面初始化數據庫時定義的目錄)。linux
爲了作實驗方便,咱們在同一臺機器上配置兩
個MySQL服務(跑兩個端口)。
#cd /usr/local/
#cp -r mysql mysql_2
#cd mysql_2;
初始化mysql2
#./scripts/mysql_install_db --user=mysql --datadir=/data/mysql2
拷貝配置文件
#cp /etc/my.cnf ./my.cnf
修改配置文件相關參數
#vim my.cnf
更改port爲3307 以及socket爲/tmp/mysql2.sock
cp /etc/init.d/mysqld /etc/init.d/mysqld2
vim /etc/init.d/mysqld2
更改以下內容:
basedir=/usr/local/mysql_2
datadir=/data/mysql2
conf=$basedir/my.cnf
保存退出,而後啓動mysql2
/etc/init.d/mysqld2 startsql
配置主從準備工做
咱們設定/usr/local/mysql_2 爲主,端口3307,/usr/local/mysql爲從,端口爲 3306。
在主上建立測試庫
#mysql -uroot -S /tmp/mysql2.sock -e "create database db1;"
而後導出主的mysql庫數據而後導入給db1
#mysqldump -uroot -S /tmp/mysql2.sock mysql > 123.sql
#mysql -uroot -S /tmp/mysql2.sock db1 < 123.sql 數據庫
配置主(master)
#vim /usr/local/mysql_2/my.cnf
修改或添加:
server-id=1
log-bin=mysql-bin
兩個可選參數(2 選1):
binlog-do-db=db1,db2 #用來指定須要同步的庫
binlog-ignore-db=db1,db2 #指定忽略不一樣步的庫
修改配置文件後,重啓 mysql_2
#pid=ps uax |grep mysql2.sock |grep -v grep |awk '{print $2}'
; kill $pid; cd
/usr/local/mysql_2/bin/; ./mysqld_safe --defaults-file=../my.cnf --user=mysql & ##/etc/init.d/mysqld2 restart
設置root密碼
#mysqladmin -u root -S /tmp/mysql2.sock password 'a123456bc'
#mysql -u root -S /tmp/mysql2.sock -pa123456bc
而後受權給從一個用來同步數據的用戶 repl vim
grant replication slave on . to 'repl'@'127.0.0.1' identified by '123123';
flush privileges;
flush tables with read lock;
show master status; #必定要記住前兩列的內容,後面會用到 服務器
設置從(slave) 網絡
修改或增長
server-id = 2 #這個數值不能和主同樣
可選參數replicate-do-db=db1,db2 和 replicate-ignore-db=db1,db2,意義同主的那兩個可
選參數,若是主已經定義過了,那麼從上就不用再次加這些參數了。而後重啓 mysqld 服務。 socket
拷貝主的db1庫數據到從
#mysqldump -uroot -S /tmp/mysql2.sock -pa123456bc db1 > db1.sql ide
給從上建立db1數據庫
#mysql -uroot -S /tmp/mysql.sock -e "create database db1";
而後把db1.sql導入給從庫 測試
#mysql -uroot -S /tmp/mysql.sock db1 < db1.sql
登陸從mysql
mysql -uroot -S /tmp/mysql.sock
執行以下指令
slave stop;
change master to master_host='127.0.0.1', master_port=3307, master_user='repl',
master_password='123123', master_log_file='mysql-bin.000006', master_log_pos=474952;
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,纔算正常。
測試主從
在主上清空db1庫的 db表
use db1;
select count() from db";
truncate table db;
進入slave,查看 db1庫db表
use db1;
select count() from db;
若是得出的結果爲 0了,說明主從是同步的。
而後在主上刪除表 db
drop table db;
在從上看db表不存在了
select count(*) from db;
建議: MySQL主從機制比較脆弱,謹慎操做。若是重啓 master,務必要先把 slave停掉,也就是說須要在slave 上去執行slave stop命令,而後再去重啓 master的 mysql 服務,不然頗有可能就會中斷了。固然重啓完後,還須要把slave 給開啓slave start。