- mysql 服務器允許將一個服務器設定為主服務器,另外設定多個從資料庫服務器允許將來自一個mysql資料庫服務器的資料復制到一個或多個mysql資料庫的服務器上
- mysql主從是異步復制的程序
- 底層是什么東西在支撐這主從復制?
答: master 開啟bin-log功能,日志檔案用于記錄資料庫的讀寫增刪
在主從配置中一共需要三個執行緒:
- master: IO執行緒:
主服務器的上面的任何修改都會通過自己的IO 執行緒保存在二進制日志里面 bin-log
- slave 開啟: IO執行緒:
從服務器上也會開啟一個IO Thread 通過配置好的用戶名和密碼,連接到主服務器上面請求讀取二進制日志,然后把讀取到的內容存在本地的一個Realy log (中繼日志) 里面
- slave開啟:SQL執行緒:
從服務器上面同時開啟一個sql Theard 定時檢查Realy log 如果有發現有更新立即把更新的內容在本機的資料庫上面執行一遍
三個執行緒的作業原理:
slave開啟 IO執行緒 和 sql 執行緒 ,slave 負責通過IO執行緒連接master 并且請求某個bin-log position之后的內容,master 服務器收到slave IO執行緒發來的日志的請求資訊,io執行緒將bin-log內容和position回傳給slave IO執行緒
slave服務器收到bin-log日志內容,將bin-log日志內容寫入relay-log中繼日志,創建一個master.info的檔案,該檔案記錄了master ip 用戶名 密碼 master bin-log名稱,bin-log position,
slave端開啟SQL執行緒,實時監控relay-log日志內容是否有更新,決議檔案中的SQL陳述句,在slave資料庫中去執行,
上圖:

下面我們來看一下如何配置,在配置之前我們要保證mysql是安裝在兩個服務器上的,
這里我用的兩臺服務器分別是
master: 10.55.185.80
slave: 10.55.185.81
第一步:
配置mysql檔案 my.ini 解釋:
配置說明:
#[必須]服務器唯一ID,每臺服務器需不同
server-id = 1
#[必須]啟用二進制檔案
log-bin = /home/mysql/mysql-bin
#[不是必須]二進制檔案啟用混合模式
binlog_format = mixed
#[不是必須]二進制檔案過期時間,單位是天
expire-logs-days = 14
#[不是必須]當每進行1次事務提交之后,MySQL將進行一次磁盤同步指令來將binlog_cache中的資料強制寫入磁盤
sync-binlog = 1
#[不是必須]只將對應的資料庫變動寫入二進制檔案,如果有多個資料庫可用逗號分隔,或者使用多個binlog-do-db選項
binlog-do-db = test,androidpnserver
#[必須]不需要記錄二進制日志的資料庫,如果有多個資料庫可用逗號分隔,或者使用多個binlog-do-db選項,一般為了保證主主同步不沖突,會忽略mysql資料庫,
binlog-ignore-db = mysql,information_schema,performance_schema
#[必須]做主主備份的時候,因為每臺資料庫服務器都可能在同一個表中插入資料,如果表有一個自動增長的主鍵,那么就會在多服務器上出現主鍵沖突,
#解決這個問題的辦法就是讓每個資料庫的自增主鍵不連續,上面兩項說的是,假設需要將來可能需要10臺服務器做備份,將auto-increment-increment設為10,而auto-increment-offset=1表示這臺服務器的序號,從1開始,不超過auto-increment-increment,
auto-increment-increment = 10
auto-increment-offset = 1
主服務器的mysql組態檔內容:
[mysqld]
server-id=1
log-bin = mysql-bin
binlog-do-db = bd-ecxel
binlog-ignore-db = mysql,information_schema,performance_schema
auto-increment-increment = 10
auto-increment-offset = 2
從服務器的mysql組態檔內容:
[mysqld]
server-id=2
log-bin = mysql-bin
binlog-do-db = bd-ecxel
binlog-ignore-db = mysql,information_schema,performance_schema
auto-increment-increment = 10
auto-increment-offset = 2
注: 這里的server-id 要確保唯一
第二步:
首先將mysql 重啟:
#停止mysql服務
net stop mysql
#開啟mysql服務
net start mysql
進入mysql
mysql -u root -p
注意: 在資料庫主從配置之前要確保主從的資料庫暫時是同步的,可以先把主服務器的資料庫開鎖,禁止對資料庫做增刪改操作
第三步:
首先重繪,停止執行緒
mysql>stop slave;
mysql>reset slave;
重繪mysql的系統權限相關表
mysql>flush privileges;
第四步:
在主服務器上創建同步賬號:(如果做的是主-從復制那么就只需要在主服務器上進行創建同步賬號
如果做的是主-主復制,那么主從都需要創建同步賬號)
grant replication slave on *.* to '<userName>'@'<hostIp>' identified by '<passWord>';`
?
# userName 用戶名,默認root
# passWord 用戶密碼(均為資料庫賬戶,密碼)
# hostIp 需要同步的主機IP,可以寫%,表示全部
實體:
grant replication slave on *.* to 'root'@'%' identified by '123456';
第五步:
在主服務器上查看master狀態,記錄二進制檔案名 , 注意記住 File 和 Position 在從機上面會用到
mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73 | test | manual,mysql |
+------------------+----------+--------------+------------------+
第六步:
設定從庫同步,注意該處的同步點,就是主庫show master status資訊里的| File| Position兩項
(如果是主-從那么只需要在從機上進行同步,如果是主主那么都需要執行這步)
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.55.185.80',
-> MASTER_USER='root',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='mysql-bin.000003',
-> MASTER_LOG_POS=73;
主機啟動slave 同步執行緒
mysql>stop slave;
mysql>start slave;
主機查看 slave 狀態:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.55.185.80
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 11662
Relay_Log_File: mysqld-relay-bin.000022
Relay_Log_Pos: 11765
Relay_Master_Log_File: mysql-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
...

這個就是從機的兩個執行緒 如果都為yes那么就是成功!
補充: 如果在查看狀態的時候有錯誤,那么就可以根據錯誤碼來檢測錯誤的原因,
一般錯誤的解決方式有一下兩種:
第一種:忽略錯誤后,繼續同步
stop slave;
#表示跳過一步錯誤,后面的數字可變
set global sql_slave_skip_counter =1;
start slave;
之后再用mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
ok,現在主從同步狀態正常了,
第二種:在組態檔中指定跳過錯誤代碼,繼續同步
主鍵沖突、表已存在等錯誤代碼如1062,1032,1060等,可以在mysql主組態檔指定略過此類例外并繼續下條sql同步,這樣也可以避免很多主從同步的例外中斷
[mysqld]
slave-skip-errors = 1062,1032,1060
重新啟動mysql
service mysqld restart
之后再用mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/190516.html
標籤:其他
上一篇:資料庫三大范式介紹
下一篇:Mybatis示例
