複製多主一從mysql
replicaionsql
原理緩存
複製有三個步驟:(分爲三個線程 slave:io線程 sql線程 master:io線程)服務器
一、master將改變記錄到二進制日誌(binary log)中(這些記錄叫作二進制日誌事件,binary log events)socket
二、slave將master的binary log events拷貝到它的中繼日誌(relay log)spa
三、slave讀取中繼日誌中的事件,將其重放到slave數據之上線程
日誌解釋日誌
從庫先經過io線程讀取主庫的二進制文件(Master_Log_File)和位置(Read_Master_Log_Pos)而後緩存到本地(從庫服務器)的中繼文件(Relay_Log_File)中並記錄已經讀取到的位置(Relay_Log_Pos),再經過從庫的sql線程去讀取中繼文件(Relay_Log_File),這個sql線程執行會記錄已經執行到了哪一個文件(Relay_Master_Log_File)和哪一個位置(Exec_Master_Log_Pos)。code
配置複製server
一、在master建立複製帳號
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repl@'192.168.0.%' IDENTIFIED BY 'PASSWD';
二、配置master和slave
master server-id = 1 log-bin = mysql-bin expire-logs-days = 10 # 設置二進制日誌過時的天數 max_binlog_size = 512M # 二進制日誌滾動的閥值 slave server-id = 2 expire-logs-days = 10 max-relay-log-size = 512M relay-log = mysql-relay-bin relay_log_recovery = 1 # 修復中繼日誌 replicate_wild_ignore_table = mysql.% # 過濾哪些主庫不復制
三、通知slave鏈接到master並從master複製數據
CHANGE MASTER TO MASTER_HOST='master',MASTER_USER='repl',MASTER_PASSWORD='passwd',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=0;
四、啓動複製,查看狀態
slave
START SLAVE
show slave status\G
在輸出信息中查看I/O線程和SQL線程的狀態值(YES爲正常,NO爲錯誤)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysqld_multi
與安裝單實例同樣,只是要初始化多個數據目錄對應相應的實例
mkdir -p /storage/data/mysql{1,2,3} chown -R mysql:mysql /storage/data/mysql{1,2,3} scripts/mysql_install_db --user=mysql --datadir=/storage/data/mysql1 scripts/mysql_install_db --user=mysql --datadir=/storage/data/mysql2 scripts/mysql_install_db --user=mysql --datadir=/storage/data/mysql3
添加多實例管理用戶
GRANT SHUTDOWN ON *.* TO 'multi'@'localhost' IDENTIFIED BY 'multi'
mysqld_multi
Usage: mysqld_multi [OPTIONS] {start|stop|report} [GNR,GNR,GNR...]
my.cnf
[mysqld_multi] mysqld = /storage/server/mysql/bin/mysqld_safe mysqladmin = /storage/server/mysql/bin/mysqladmin user = multi password = multi log = /storage/data/mysqld_multi.log [mysqld1] # 3306 mysql1 port = 3306 socket = /tmp/mysql3306.sock basedir = /storage/server/mysql datadir = /storage/data/mysql1 character-set-server=utf8 collation-server=utf8_unicode_ci server-id = 2 expire-logs-days = 10 max-relay-log-size = 512M relay-log = mysql1-relay-bin relay_log_recovery = 1 replicate_wild_ignore_table=mysql.% [mysqld2] # 3307 mysql2 port = 3307 socket = /tmp/mysql3307.sock basedir = /storage/server/mysql datadir = /storage/data/mysql2 character-set-server=utf8 collation-server=utf8_unicode_ci server-id = 2 expire-logs-days = 10 max-relay-log-size = 512M relay-log = mysql2-relay-bin relay_log_recovery = 1 replicate_wild_ignore_table=mysql.% [mysqld3] # 3308 mysql3 port = 3308 socket = /tmp/mysql3308.sock basedir = /storage/server/mysql datadir = /storage/data/mysql3 character-set-server=utf8 collation-server=utf8_unicode_ci server-id = 2 expire-logs-days = 10 max-relay-log-size = 512M relay-log = mysql3-relay-bin relay_log_recovery = 1 replicate_wild_ignore_table=mysql.%
mysql主從常見錯誤
error 1062
錯誤緣由:主鍵衝突 出現這種狀況就是從庫出現插入操做 主庫又從新來了一遍 iothread沒問題 sqlthread出錯
解決方案:從庫
mysql> stop slave; mysql> set global sql_slave_skip_counter=1; mysql> start slave;