1. MySQL主從介紹:
MySQL主從介紹:mysql
MySQL主從又叫作Replication、AB複製。簡單講就是A和B兩臺機器作主從後,在A上寫數據,另一臺B也會跟着寫數據,二者數據實時同步的linux
MySQL主從是基於binlog的,主上須開啓binlog才能進行主從。sql
主從過程大體有3個步驟:數據庫
1)主將更改操做記錄到binlog裏vim
2)從將主的binlog事件(sql語句)同步到從本機上並記錄在relaylog裏服務器
3)從根據relaylog裏面的sql語句按順序執行app
主上有一個log dump線程,用來和從的I/O線程傳遞binlogide
從上有兩個線程,其中I/O線程用來同步主的binlog並生成relaylog,另一個SQL線程用來把relaylog裏面的sql語句落地測試
mysql主從原理:this
應用場景:
- 只作備份使用,不進行讀操做;
- 當主的壓力比較大是,從也作讀的操做;
- 從不能有寫的操做,由於數據的同步是從主到從寫入;
2. 配置主:
準備工做:
- 兩臺機器都安裝好mysql;
- 一臺機器做爲主,一臺做爲從;
主mysql上配置:
修改my.cnf,增長server-id=64和log_bin=learnlinux //server-id he log_bin 能夠自定義。
另外還有兩個參數能夠選擇性地使用:
- binlog-do-db=databasename1,databasename2
- binlog-ignore-db=databasename1,databasename2
其中,binlog-do-db=定義須要複製到數據庫,多個數據庫之間用英文逗號分隔,binlog-ignore-db=定義不須要複製的數據庫,這兩個參數用其中一個便可。
設置log_bin=learnlinux後會在/data/mysql下生成learnlinux開頭的文件:
修改完配置文件後,啓動或者重啓mysqld服務
/etc/init.d/mysqld restart
把mysql庫備份並恢復成gavin庫,做爲測試數據:
mysqldump -uroot -pgavin mysql >/tmp/mysql.sql
mysql -uroot -pgavin -e "create database gavin"
mysql -uroot gavin < /tmp/mysql.sql
建立用做同步數據的用戶:
grant replication slave on *.* to 'repl'@slave_ip identified by 'password';
- 這裏的replication slave爲用戶的權限,repl是爲從(slave)端設置的訪問主(master)端的用戶,也就是要完成主從複製的用戶
- replication slave經常使用於創建複製時所須要用到的用戶權限,也就是slave server必須被master server受權具備該權限的用戶,才能經過該用戶複製。而且"show slave hosts"這條命令和replication slave權限有關,不然執行時會報錯:ERROR 1227 (42000): Access denied; you need (at least one of) the REPLICATION SLAVE privilege(s) for this operation
flush tables with read lock;
- 該操做將鎖定數據庫寫操做(暫鎖定數據庫寫操做,保證數據同步的一致性)
show master status;
- 查看master的狀態,這些數據是要記錄的,一下子要在slave端用到
備份數據庫:
cd /data/mysql
ls
- 查看目錄文件
- 其中,藍色的目錄表示mysql的庫;
備份現有的庫,因爲mysql庫中存有用戶的權限等信息,暫不備份複製到從上
- mysqldump -uroot -pgavin gavin > /tmp/gavin.sql
- mysqldump -uroot -pgavin zrlog > /tmp/zrlog.sql
後續會把備份的數據庫文件傳到slave上;
3. 配置從:
查看my.cnf,配置server-id=132,server-id和主不同
- vim /etc/my.cnf //修改server-id=132
修改完配置文件後,啓動或者重啓mysqld服務:
- /etc/init.d/mysqld restart
把主上gavin、zrlog庫同步到從上:
- 能夠先建立gavin、zrlog庫
- 而後把主上的/tmp/gavin.sql和/tmp/zrlog.sql拷貝到從上,而後導入對應的庫
slave上配置:
mysql -uroot -pgavin
stop slave;
change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx,
- change master這個命令打完逗號後也能夠按回車,直到你打分號纔算結束。
- master_host 表示主的ip
- master_user 主上建立的用來同步的用戶
- master_password 用來同步帳戶的密碼
- master_log_file 是master上show master status; 查看到的File值
- master_log_pos 是master上show master status; 查看到的Position值
start slave;
還要到主上執行:
unlock tables
查看主從配置是否成功:
在slave端查看slave狀態
show slave status\G
確認如下兩項參數都爲yes,以下所示:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
還須要關注的地方有:
- Seconds_Behind_Master: 0 //爲主從複製延遲的時間
- Master_SSL_Verify_Server_Cert: No
- Last_IO_Errno: 0
- Last_IO_Error:
- Last_SQL_Errno: 0
- Last_SQL_Error:
若是主從不正常了須要看這裏的error信息。
4. 測試主從同步:
my.cnf中幾個配置參數:
主服務器上:
binlog-do-db= //僅同步指定的庫
binlog-ignore-db= //忽略指定庫
從服務器上:
- replicate_do_db= //指定只同步的庫
- replicate_ignore_db= //忽略同步指定庫
- replicate_do_table= //同步指定的表
- replicate_ignore_table= //忽略同步指定的表
以上幾個存在一個問題,即sql語句中有配合查詢時,只要有這些表就不執行了;通常僅用如下兩種就能夠了:
- replicate_wild_do_table= //針對指定的表都同步,如aming.%, 支持通配符%
- replicate_wild_ignore_table= //只針對指定的表忽略同步
測試主從:
主上操做和從上步驟對比
- mysql -uroot gavin -p
- use gavin;
- show tables;
- select count(*) from user;
- truncate table user;
到從上操做和主上步驟對比
- mysql -uroot gavin -p
- use gavin;
- show tables;
- select count(*) from user;
- select count(*) from user;
主上繼續drop table user;
從上查看user表
主從報錯時:
- slave上不要執行增、刪、修改操做,會引發同步問題
- 同步出錯時能夠stop slave;start slave 看看是否會恢復正常。
- 如恢復不了,從新作下主從reset slave命令重置slave設置。它是直接刪除master.info和relay-log.info文件,並刪除全部的relay log,而後從新生成一個新的relay log,即便relay log中還有SQL沒有被SQL線程apply完。