MySQL主從配置

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

  • 切換到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

  • 進入mysql

stop slave;

  • 先暫停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;

  • 啓動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= //只針對指定的表忽略同步

測試主從:

主上操做和從上步驟對比

  1. mysql -uroot gavin -p
  2. use gavin;
  3. show tables;
  4. select count(*) from user;
  5. truncate table user;

到從上操做和主上步驟對比

  1. mysql -uroot gavin -p
  2. use gavin;
  3. show tables;
  4. select count(*) from user;
  5. 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完。
相關文章
相關標籤/搜索