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
MySQL之mysql命令使用詳解
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 含義講解: