
原文收藏
1. 前言
以前給 Mysql 資料庫做主從,都是在主服務器停服的情況下做的,但是最近有一個專案,已經上線幾天了,資料庫也單服務器跑了幾天,才確定要給 Mysql 服務器做一個主從架構,簡單的一主一從架構,
專案最好能在不停服的情況下完成 Mysql 主從搭建,后來翻了一些資料,真的找到了可以在線新建或者重做主從的方法,
其實我們以前停服做主從的主要目的是想鎖表,是想找到 master_log_file 和 master_log_pos 兩個引數,如果有方法在不停服的情況下,能確定這兩個引數,那么在線建立主從架構的功能,就可以實作了,
2. 服務器環境以及版本
系統: CentOS7.5
Mysql: 5.6.x
主端: 172.188.26.221
從端: 172.188.26.229
3. 配置準備
注意:主端不停服的前提是,它已經開啟了bin-log 日志!!
如果之前在主庫沒有開啟 bin-log 日志,那就沒有辦法在新新建了,因為配置 bin-log 日志之后,主庫一定要重啟才能生效,不過,如果現在的情況是重做主庫,那就證明之前是做過主從的,只是可能主從失效了需要重做,這種情況,主庫也不需要重啟,只要重新備份一下資料庫,就可以重建從庫了,
下面繼續說說具體的主從新建程序,
在主庫修改組態檔 my.cnf ,添加開啟 bin-log 日志,格式用 row,注意 server-id ,它在主端和備端的數值要不一樣,一般使用 ip 的最后一段,
server-id=221
log-bin=/data/mysqldata/mysql-bin
binlog-format=ROW
如果之前已經開啟了bin-log 功能,就不用修改了,
接著在主庫上進行備份用戶的授權操作:
mysql>grant replication slave on *.* to 'repel'@'172.188.26.229' identified by 'password';
授權給從庫的 ip 地址,備份的用戶名是 repel,建議不要使用 'repel'@'%' 這種方式進行授權操作,主要是為了安全問題,限制授權的 ip 白名單,
接下來就是要在主庫將需要備份的資料庫匯出來:
- 用 mysqldump 的方式,以下是匯出整個資料庫:
mysqldump -uroot -p --single-transaction --no-autocommit --master-data=https://www.cnblogs.com/carry00/archive/2020/10/12/2 -A >test2.sql
-
用 mysqldump 的方式,如果主端 Mysql 上有不止一個專案的業務庫,但是只想匯出其中一個業務庫,假設叫做 feitian 資料庫:
mysqldump -uroot -p --single-transaction --no-autocommit --master-data=https://www.cnblogs.com/carry00/archive/2020/10/12/2 feitian > feitian_dump.sql
這里有一個關鍵的引數 "--master-data=https://www.cnblogs.com/carry00/archive/2020/10/12/2", 這個引數能幫助我們實作在線重建主從資料庫,( =2時,file和position是被注釋掉的,需要手動指定file和position, =1時,直接匯入備份檔案,start slave不需要指定file和position)
匯出資料庫之后,將它傳到從庫的服務器上,怎么傳,各人隨意了,我使用 scp:
scp feitian_dump.sql [email protected]:/usr/local/src/
接下來就是在從庫上做配置了,
從庫最好是完全“清白”的狀態,或者重新安裝,像安裝 Mysql、Nginx、php 這些常規操作,最好在平時就寫好腳本,準備好安裝包、自己常用的組態檔,當要使用的時候,直接跑一下腳本就安裝好了,
我習慣使用 ansible playbook 來做這種腳本化的操作,
重裝 Mysql 的操作我就不寫了,或者我另寫一篇文章,將自己的腳本分享出來,
Mysql 重裝完成之后,要對資料庫做初始化操作,要修改 root 密碼,這些都是常規操作,
當一個新的 Mysql 安裝好并成功啟動之后,就可以配置從庫功能了,
修改從庫 my.cnf ,由于我只想備份 feitian 業務庫,所以只增加了:
server-id=229
replicate_wild_do_table=feitian.%
- 其實如果進行的是全庫備份,那么只要配置 server-id 和主庫不一樣就可以了,其他的不需要增加,
- 但是,如果只想備份某些特定的業務庫,就需要使用 replicate_wild_do_table 這個引數了,它的作用是告訴從庫只需要備份特定的庫,如果有多個庫,就繼續用逗號隔開添加即可,
- 還有一個功能相反的引數 replicate_wild_ignore_table ,是配置忽略的資料庫,即不備份的資料庫,這個引數使用起來比較多限制,不熟悉最好不使用,
接下來是匯入資料庫,在匯入資料庫前,需要重置一下從庫binlog:
mysql -uroot -p -e 'reset master'
mysql -uroot -p feitian < feitian_dump.sql
重頭戲,下面要配置主從同步了,
在上面提到過,在備份資料庫的時候,使用了一個關鍵的引數 --master-data=https://www.cnblogs.com/carry00/archive/2020/10/12/2.這個引數為什么關鍵呢?因為在備份檔案中,可以看到我們需要的 master_log_file 和 master_log_pos 兩個引數,有了這兩個引數,我們就不需要像以往那樣停服鎖表,來查看了,
具體怎么查找這兩個引數?它們大概在檔案的前 30 行以內,所以可以用 head 命令找到:
[root@ND-BACKUP mysql]# head -n 30 feitian_dump.sql
-- MySQL dump 10.13 Distrib 5.6.39, for linux-glibc2.12 (x86_64)
--
-- Host: localhost Database: feitian
-- ------------------------------------------------------
-- Server version 5.6.39-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000063', MASTER_LOG_POS=144333309;
--
-- Table structure for table `ft_access`
--
在上面的輸出,可以看到 binlog 是 mysql-bin.000063,position 是 144333309.有了這兩個引數,就可以配置從庫同步了,
一般在從庫 change master to 就可以了,
所以,在從庫做以下配置:
# 先重置一下 slave
mysql>reset slave all;
#然后再執行操作
mysql>change master to master_host='172.188.26.221', master_user='repel', master_password='*****', master_port=3306,master_log_file='mysql-bin.000063',
master_log_pos=144333309;
然后,就可以啟動從庫復制了:
mysql>start slave;
檢查一下從庫的狀態:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.188.26.221
Master_User: repel
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000063
Read_Master_Log_Pos: 146576160
Relay_Log_File: nd-feitian-relay-bin.000002
Relay_Log_Pos: 2243134
Relay_Master_Log_File: mysql-bin.000063
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Wild_Do_Table: feitian.%
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 146576160
Relay_Log_Space: 2243311
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
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: 221
Master_UUID: a986c930-214a-11e8-b69c-00163e0cee42
Master_Info_File: /usr/local/mysql/mysqldata/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Auto_Position: 0
- 看到Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes,兩個 yes 說明主從同步基本沒有問題了,
- 確認主從是否同步到相同內容,通過:
- Master_Log_File: mysql-bin.000063 和 Relay_Master_Log_File: mysql-bin.000063 說明主從都已經同步到相同的 binlog 日志了,
- 如果上面兩個引數一樣了,還需要比較 Read_Master_Log_Pos 和 Exec_Master_Log_Pos 兩個引數,看有沒有差異,如果沒有差異則說明主從同步的情況比較好,
在主庫也可以看看主從同步的狀態:
msyql> show processlist;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/169412.html
標籤:其他
