1. 程式人生 > >MySQL主從複製詳解

MySQL主從複製詳解

目錄

1 MySQL主從複製原理

1、MySQL的主從複製是一個非同步的複製過程(雖然一般情況下感覺是實時的),資料將從一個MySQL資料庫(我們稱之為Master)複製到另一個MySQL資料庫(我們稱之為Slave),在Master與Salve之間實現整個主從複製的過程是由三個執行緒參與完成的。其中有兩個執行緒(SQL執行緒IO執行緒)在Slave端,另外一個執行緒(I/O執行緒)在Master端。
2、要實現MySQL的主從複製,首先必須開啟Master端的binlog記錄功能,否則就無法實現。因為整個複製過程實際上就是Slave從Master端獲取binlog日誌,然後再在Slave上以相同順序執行獲取的binlog日誌中所記錄的各種SQL操作。注意binlog日誌只記錄增刪改(不記錄查詢語句)
3、從庫IO在第一次把資訊放入到relay

中後會觸發SQL執行緒,然後後邊就交給SQL執行緒來處理,把binlog檔案中的SQL語句解析出來後變成SQL語句放入資料庫中

2 MySQL主從複製原理圖

這裡寫圖片描述

3 MySQL主從複製小結

1)主從複製是非同步的邏輯的SQL語句級的複製。
2)複製時,主庫有一個I/O執行緒,從庫有兩個執行緒,I/O和SQL執行緒
3)實現主從複製的必要條件是主庫要開啟記錄binlog功能
4)作為複製的所有MySQL節點的server-id都不能相同(0<server-id<2^23-1)
5)binlog檔案只記錄對資料庫有更改的SQL語句(來自主資料庫內容的變更,不記錄任何查詢(select,show)語句。

主從複製條件
1)主庫開啟binlog功能(從庫除非做雙向複製)
2)主庫建立同步賬號
3)從庫配置master.info(CHANGE MASTER TO …來實現)
4)複製開關:start slave

需要了解一下概念
1)3執行緒,主庫(IO),從庫IO和SQL,及作用
2)master.info作用
3)relay-log作用
4)非同步複製和同步複製的區別
5)binlog作用

4 MySQL多例項主從複製

主庫:

# 1、檢視binlog功能是否開啟
[[email protected] ~]# grep log-bin /data/{3306,3307}/my.cnf
/data/3306/my.cnf:log-bin = /data/3306/mysql-bin
/data/3307/my.cnf:log-bin = /data/3307/mysql-bin

# 2、檢視監聽埠及server-id是否一樣
[
[email protected]
~]# netstat -lntup |grep 330* tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 47293/mysqld tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 5804/mysqld [[email protected] ~]# grep server-id /data/{3306,3307,3308}/my.cnf /data/3306/my.cnf:server-id = 1 /data/3307/my.cnf:server-id = 3 /data/3308/my.cnf:server-id = 8 # 3、登入3306主資料庫,授權3307 slave登入使用者 mysql> grant replication slave on *.* to [email protected]'172.16.1.%' identified by '123456'; Query OK, 0 rows affected (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> select user,host from mysql.user; +---------+------------+ | user | host | +---------+------------+ | root | 127.0.0.1 | | rep | 172.16.1.% | | oldboy2 | localhost | | root | localhost | | test | localhost | | test2 | localhost | +---------+------------+ 6 rows in set (0.00 sec) mysql> show grants for [email protected]'172.16.1.%'; +-------------------------------------------------------------------------------------------------------------------------+ | Grants for [email protected]% | +-------------------------------------------------------------------------------------------------------------------------+ | GRANT REPLICATION SLAVE ON *.* TO 'rep'@'172.16.1.%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' | +-------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) # 4、鎖表,檢視binlog檔案及位置點 mysql> flush table with read lock; Query OK, 0 rows affected (0.00 sec) mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000010 | 2892 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) # 5、新開視窗全備資料(下邊可能會報錯,由於mysql5.5之後添加了新特性,實驗環境可以不鎖表操作) [[email protected] ~]# mysqldump -uroot -p123456 -A -B --events -S /data/3306/mysql.sock |gzip >/server/backup/req_$(date +%F).sql.gz mysqldump: Got error: 1142: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'cond_instances' when using LOCK TABLES [[email protected] backup]# ll total 152 -rw-r--r-- 1 root root 152756 Jun 9 14:02 req_2018-06-09.sql.gz # 6、解鎖 mysql> unlock table; Query OK, 0 rows affected (0.00 sec)

從庫:

# 確保server-id不同
[root@db02 ~]# grep log-bin /data/{3306,3307}/my.cnf
/data/3306/my.cnf:log-bin = /data/3306/mysql-bin
/data/3307/my.cnf:log-bin = /data/3307/mysql-bin

# 開啟服務
/data/3307/mysql start

# 把主庫的全備匯入到從庫
[root@db02 backup]# gzip -d /server/backup/req_2018-06-09.sql.gz
[root@db02 backup]# ls
req_2018-06-09.sql
[root@db02 backup]# mysql -uroot -p123456 -S /data/3307/mysql.sock </server/backup/req_2018-06-09.sql
[root@db02 backup]# mysql -uroot -p123456 -S /data/3307/mysql.sock

# 找位置點,配置master.info檔案
# (若change master內容有誤,不要修改master.info檔案,直接reset slave all)
CHANGE MASTER TO
MASTER_HOST='172.16.1.52',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000010',
MASTER_LOG_POS=2892;
[root@db02 ~]# ll /data/3307/data/master.info
-rw-rw---- 1 mysql mysql 77 Jun  9 14:15 /data/3307/data/master.info
[root@db02 ~]# cat /data/3307/data/master.info
18
mysql-bin.000010
2892
172.16.1.52
rep
123456
3306
60
0





0
1800.000

0

# 開啟從庫開關
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.52
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000010
          Read_Master_Log_Pos: 3194
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 555
        Relay_Master_Log_File: mysql-bin.000010
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 3194
              Relay_Log_Space: 705
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)

mysql>

測試:

# 主庫建立資料庫
mysql> create database rsq123;
Query OK, 1 row affected (0.00 sec)

# 從庫檢視
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| oldboy             |
| oldgirl            |
| performance_schema |
| rsq123             |
| test               |
+--------------------+
7 rows in set (0.00 sec)

5 MySQL主從複製步驟小結

和上邊實驗不同步,此為後來新增的
主庫:

1、開啟binlog功能
2、確保所有例項server-id不同
3、授權複製的使用者rep(grant replication slave on . to [email protected]’172.16.1.%’ identified by ‘123456’;)
4、鎖表(flush table with read lock;),檢視binlog檔案及位置點(show master status;/–master-data=2)
5、新開視窗匯出全備(mysqldump -uroot -p123456 -A -B –events -S /data/3306/mysql.sock |gzip >/server/backup/req_$(date +%F).sql.gz)
6、解鎖,開放使用者寫入功能(unlock table)

從庫

1、確保所有例項server-id不同
2、把主庫的全備匯入到從庫
3、找位置點,配置master.info
CHANGE MASTER TO
MASTER_HOST=’172.16.1.52’,
MASTER_PORT=3306,
MASTER_USER=’rep’,
MASTER_PASSWORD=’123456’,
MASTER_LOG_FILE=’mysql-bin.000010’,
MASTER_LOG_POS=2892;
4、start slave;show slave status\G
若出現slave中的兩執行緒狀態為YES,基本上就成功了

6 快速新增MySQL從庫

# 先備份前一個從庫資料,用--master-data=2引數,可以省去鎖表的步驟
mysqldump -uroot -p123456 -S /data/3306/mysql.sock -A -B -R -F -x --master-data=2 --events|gzip >/server/backup/rep3308_$(date +%F).sql.gz

# 解壓後匯入新的從庫
gzip -d /server/backup/rep3308_2018-06-09.sql.gz
mysql -uroot -p123456 -S /data/3308/mysql.sock </server/backup/rep3308_2018-06-09.sql

# 查詢解壓後的sql檔案,查詢CHANGE,複製出來
vim /server/backup/rep3308_2018-06-09.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=107;

# 分別執行兩條CHANGE
CHANGE MASTER TO
MASTER_HOST='172.16.1.52',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='123456';

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=107;

# 開啟slave
start slave;
show slave status\G

# 完事

7 MySQL主從複製故障解決

# 出現SQL執行緒問題
mysql> show slave status\G
... ...
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
... ...
               Last_SQL_Errno: 1008
               Last_SQL_Error: Error 'Can't drop database 'rsq'; database doesn't exist' on query. Default database: 'rsq'. Query: 'drop database rsq'
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1

stop slave;
set global sql_slave_skip_counter = 1;   # 將同步指標向下移動一個,如果多次不同步,可以重複操作,增大指標值都可以。
start slave;

# 方法二:把Last_SQL_Errno值給提前加入配置檔案中,這樣再有類似錯誤值的報錯就直接忽略了
grep slave-skip /data/3306/my.cnf
slave-skip-errors = 1032,1062,1007

其他可能引起復制故障的問題:

  • 1、MySQL自身的原因及人為重複插入資料。
  • 2、不同的資料庫版本會引起不同步,低版本到高版本可以,但是高版本往往不能往低版本複製
  • 3、MySQL的執行錯誤或者程式BUG
  • 4、binlog記錄模式,例如:row level模式就比預設的語句要好

相關推薦

MySQL主從複製

目錄 1 MySQL主從複製原理 1、MySQL的主從複製是一個非同步的複製過程(雖然一般情況下感覺是實時的),資料將從一個MySQL資料庫(我們稱之為Master)複製到另一個MySQL資料庫(我們稱之為Slave),在Master與Sal

Mysql主從複製和實戰

Mysql主從複製詳解和實戰 一、主從複製原理 1.1 基本介紹 MySQL 內建

MySQL主從說明MySQL主從不同步處理方案

mysql mysql主從 mysql復制 mysql主從不同步 MySQL主從說明 同步問題 mysqldump:此工具適用於10G以下數據庫或幾個表percona-Xtrabackup備份工具:適用於100G-500GLVM快照:更大的數據量,或分庫分表 主從復制目的 讀寫分離,減

MySQL主從同步

一:mysql主從原理 1.1 基本介紹 MySQL 內建的複製功能是構建大型,高效能應用程式的基礎。將 MySQL 的 數億分佈到到多個系統上去,這種分步的機制,是通過將 MySQL 的某一臺主機的資料複製到其它主機( Slave )上,並重新執行一遍來實現的。複製過程中一個伺服器充當

redis持久化及主從複製(轉)

作者:silenceper 日期:2013-10-03 redis 與memcached 最大的一個區別就是Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用。 一、redis提供的持久化: 1). RDB持久化:  該

Mysql主從配置(第一篇,共五篇)

使用Docker容器搭建MySql主從複製 使用Docker容器搭建MySql主從複製 檢視容器ip命令為docker inspect 96fd[id前四位] Master_mysql_ip_172.17.0.4 slave_mysql_ip_172.17.0.5

mysql主從複製與讀寫分離配置

mysql主從複製與讀寫分離配置詳解 當網站達到一定規模時,資料庫最先出現壓力,這時候使用者會明顯感覺到卡頓,其原因是資料庫的寫入操作,影響了查詢的效率。這時可以考慮對資料庫配置主從複製和讀寫分離。設定多臺資料庫伺服器,包括一個主伺服器和n個從伺服器,主伺服器負責寫入資料,從伺服器負

mysql主從複製原理

master將改變記錄到二進位制日誌中binlog,slave將master的binlog拷貝到自己的中繼日誌中,然後執行一遍sql語句就達到同步了 一個伺服器當主庫,另一個或多個伺服器當從庫,主

MySQL 主從複製:基於二進位制檔案複製配置

##MySQL-主從複製:基於二進位制檔案複製詳解 ###前言 主從複製是指把一個MySQL的資料庫伺服器作為主伺服器(master),然後把master的資料複製到一個或者多個MySQL資料庫伺服器作為從伺服器(slave)。從master到slave的複製一般是非同步複製,所以從伺服器的複製可以隨時停止

MySQL服務器主從服務

leg 開啟 water soc 數據分布 ide 功能 ant true MySQL主從復制概念 Mysql內建的復制功能是構建大型,高性能應用程序的基礎。將Mysql的數據分布到多個系統上去,這種分布的機制,是通過將Mysql的某一臺主機的數據復制到其它主機(sla

mysql資料庫的複製

1.mysql的二進位制日誌檔案MySQL的二進位制日誌(binary log)是一個二進位制檔案,主要用於記錄修改資料或有可能引起資料變更的MySQL語句。二進位制日誌(binary log)中記錄了

MySQL觸發器使用

變量 inno 出錯 小寫 基本操作 插入 yun date 關鍵字 原文鏈接 MySQL包含對觸發器的支持。觸發器是一種與表操作有關的數據庫對象,當觸發器所在表上出現指定事件時,將調用該對象,即表的操作事件觸發表上的觸發器的執行。 創建觸發器在mysql中,創建觸發器

mysql group by

target ron 分組 tar 一個 詳解 targe strong 字段 GROUP BY X意思是將所有具有相同X字段值的記錄放到一個分組裏。 那麽GROUP BY X, Y呢? GROUP BY X, Y意思是將所有具有相同X字段值和Y字段值的記錄放到一個分組

MySQL之索引

分布 i/o .cn 能夠 b+ images 電路 普通 磁道 這篇博客將要闡述為什麽使用b+樹作為索引,而不是b樹或者其他樹 1.什麽是b樹

三、mysql登錄及版本號查詢

ppa l數據庫 server gpo 方法 win sql查詢 spa nbsp 1.用window+r,輸入cmd,用mysql -uuser -ppassword登錄時出現‘mysql’不是有效的內部命令? 答:這是因為沒有配置My

MySQLmysql命令使用

common follow for page zed rds wait sca dex MySQL Name mysql - the MySQL command-line tool Synopsis mysql [options] db_name Descripti

MySQL Online DDL

summary hat toc ise columns 性能 alc primary AS MySQL online DDL的功能就是在對表就行DDL操作的同時也可以對表進行讀寫操作,即對表的DDL操作不會影響該表上的事務。 該功能的優點: 改善繁忙生產環境的響

高效性MySQL集群(一)

二進制日誌 網絡 keepal font 集群 二進制 數據讀寫 腦裂 sun 一.常見的高可用MySQL解決方案: 1.常見的高可用MySQL解決方案: 數據庫作為最基礎的數據存儲服務之一,在存儲系統中有著非常重要的地址,因此要求其具備高可用性無可厚非。能實現不同SL

高性能MySQL集群(二)

主服務器 過濾 一主多從 orm failover 線程 alived 除了 設計思路 一.通過Keepalived搭建MySQL雙主模式的高可用集群系統 1.MySQL Replication介紹: MySQL Replication是MySQL自身提供的一個主從

MySQL參數

com sta ipv4 www. http 參考 mysq style 客戶 以下參數都是參考他人的博客而來的,這裏會粘貼原文地址。 https://www.cnblogs.com/mydriverc/p/8296814.html 1、back_log 含義講解: