【史上最細教程】服務器MySQL數據庫完成主從復制

文章目錄

  • MySQL完成主從復制教程
    • 準備:
    • 原理:
    • 步驟:
  • 推薦文章

MySQL完成主從復制教程

主從復制(也稱 AB 復制)就是將一個服務器(主服務器)的數據復制到一個或多個MySQL數據庫服務器(從服務器)中。

可以根據配置,指定復制哪個庫哪個表數據。

可以想到復制是通過異步的。

準備:

2臺版本一致的服務器數據庫,一臺作為主庫、一臺作為從庫

(我的兩個數據庫版本:5.7)

一臺服務器搭建2個數據庫實例教程:http://t.csdnimg.cn/aaErM

原理:

image-20231123112751434

主庫一旦變更數據,就會寫入二進制日志文件(Binary log),從庫IO線程( I/O thread)連接到主庫,讀取二進制日志文件內容并寫入自己的中繼日志文件(Realy log),然后從庫 SQL thread 定時檢查中繼日志 (Realy log),發現有更新的內容就自己的庫執行一遍。

從服務器都會copy主服務器二進制日志的全部內容到副本,然后從服務器設備負責決定應該執行副本中的哪些語句。

步驟:

  1. 主庫配置my.cnf文件指定唯一server-id

    image-20231123132152378

    [mysqld]
    ## 同一局域網內注意要唯一
    server-id=100  
    ## 開啟二進制日志功能,可以隨便取(關鍵)
    log-bin=mysql-bin
    ## 復制過濾:不需要備份的數據庫,不輸出(mysql庫一般不同步)
    binlog-ignore-db=mysql
    ## 為每個session 分配的內存,在事務過程中用來存儲二進制日志的緩存
    binlog_cache_size=1M
    ## 主從復制的格式(mixed,statement,row,默認格式是statement)
    binlog_format=mixed
    
  2. 從庫配置my.cnf文件指定唯一server-id

    image-20231123132213780

    [mysqld]
    ## 設置server_id,注意要唯一
    server-id=102
    ## 開啟二進制日志功能,以備Slave作為其它Slave的Master時使用
    log-bin=mysql-slave-bin
    ## relay_log配置中繼日志
    relay_log=edu-mysql-relay-bin
    ##復制過濾:不需要備份的數據庫,不輸出(mysql庫一般不同步)
    binlog-ignore-db=mysql
    ## 如果需要同步函數或者存儲過程
    log_bin_trust_function_creators=true
    ## 為每個session 分配的內存,在事務過程中用來存儲二進制日志的緩存
    binlog_cache_size=1M
    ## 主從復制的格式(mixed,statement,row,默認格式是statement)
    binlog_format=mixed
    ## 跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slave端復制中斷。
    ## 如:1062錯誤是指一些主鍵重復,1032錯誤是因為主從數據庫數據不一致
    slave_skip_errors=1062
    
  3. 重啟3306、3307服務,使配置生效

    # 查看mysql 3306、3307進程
    root@songdanminserver:[/usr/local/mysql/3306/run]ps -ef | grep mysqld
    root      8568 25795  0 13:40 pts/0    00:00:00 grep --color=auto mysqld
    mysql    30201     1  0 Nov10 ?        00:07:13 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3306/my.cnf --user=mysql
    mysql    30473     1  0 Nov10 ?        00:07:46 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3307/my.cnf --user=mysql
    # 停止3306、3307進程服務
    root@songdanminserver:[/usr/local/mysql/3306/run]kill 30201
    root@songdanminserver:[/usr/local/mysql/3306/run]kill 30473
    # 查看mysql進程
    root@songdanminserver:[/usr/local/mysql/3306/run]ps -ef | grep mysqld
    root      8614 25795  0 13:41 pts/0    00:00:00 grep --color=auto mysqld
    # 查看端口占用情況是否沒有3306、3307
    root@songdanminserver:[/usr/local/mysql/3306/run]netstat -ntl
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
    tcp6       0      0 :::111                  :::*                    LISTEN     
    tcp6       0      0 :::8080                 :::*                    LISTEN     
    tcp6       0      0 ::1:25                  :::*                    LISTEN     
    tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN     
    # 重新啟動3306、3307
    root@songdanminserver:[/usr/local/mysql/3306]nohup /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3306/my.cnf --user=mysql &
    [1] 9413
    root@songdanminserver:[/usr/local/mysql/3306]nohup: ignoring input and appending output to ‘nohup.out’
    ^C
    root@songdanminserver:[/usr/local/mysql/3307]nohup /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3307/my.cnf --user=mysql &
    [2] 9457
    root@songdanminserver:[/usr/local/mysql/3307]nohup: ignoring input and appending output to ‘nohup.out’
    ^C
    root@songdanminserver:[/usr/local/mysql/3306]# 查看mysql 3306、3307進程
    root@songdanminserver:[/usr/local/mysql/3307]ps -ef | grep mysqld
    mysql     9413 25795  0 13:52 pts/0    00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3306/my.cnf --user=mysql
    mysql     9559 25795  1 13:54 pts/0    00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3307/my.cnf --user=mysql
    root      9608 25795  0 13:54 pts/0    00:00:00 grep --color=auto mysqld
    
  4. 登錄主庫,授予從庫連接主庫,并復制主庫數據的權限,刷新權限生效

    # 登錄主庫3306
    root@songdanminserver:[/usr/local/mysql/3306]mysql -uroot -h127.0.0.1 -p -P3306
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 5
    Server version: 5.7.36-log MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.# 授予從庫3307的root用戶在指定從庫ip上從主庫復制所有庫、所有表數據的權限
    mysql> grant replication slave, replication client on *.* to 'root'@'你的從庫服務器ip' identified by '你的從庫root用戶密碼';
    Query OK, 0 rows affected, 1 warning (0.00 sec)# 刷新權限
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)# 查看MySQL現在有哪些用戶及對應的IP權限,可以看到你剛授權的從庫user,host
    mysql> select user,host from mysql.user;
    +---------------+--------------+
    | user          | host         |
    +---------------+--------------+
    | root          | %            |
    | root          | 121.41.59.91 |
    | mysql.session | localhost    |
    | mysql.sys     | localhost    |
    +---------------+--------------+
    4 rows in set (0.00 sec)# 查看主庫3306的binlog文件名和位置
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000003 |      612 |              | mysql            |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
  5. 登錄從庫,連接主庫,指定主庫ip、主庫為從庫連接所創建的用戶、密碼、從庫從主庫哪個二進制文件的哪里開始讀取數據等

    # 登錄從庫3307
    root@songdanminserver:[/usr/local/mysql/3306]mysql -uroot -h127.0.0.1 -p -P3307
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3
    Server version: 5.7.36-log MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.# 配置連接主庫3306
    # change master to master_host='主庫服務器ip', master_user='root(上一步主庫授權從庫能進行復制的用戶)', master_password='123456(上一步主庫授權從庫能進行復制的密碼)', master_port=3306(主庫端口), master_log_file='mysql-bin.000002(上一步查看到的主庫日志文件名稱)',master_log_pos=2079(上一步查看到的主庫日志文件位置);
    mysql> change master to master_host='121.41.53.91', master_user='root', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003',master_log_pos=612;
    Query OK, 0 rows affected, 1 warning (0.02 sec)
    
  6. 從庫啟動主從復制,查看是否連接主庫成功

    # 啟動從庫復制主庫
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)# 查看主從復制狀態,查看Slave_IO_Running、Slave_SQL_Running 是否為yes
    mysql> show slave status\G;
    *************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 121.41.53.91  # 綁定的主庫ipMaster_User: root	# 主庫用戶Master_Port: 3306	# 主庫端口Connect_Retry: 60	Master_Log_File: mysql-bin.000003 # 主庫同步日志,從這讀取主庫數據Read_Master_Log_Pos: 612Relay_Log_File: edu-mysql-relay-bin.000002 # 從庫中繼日志Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000003Slave_IO_Running: Yes   # 這里是yes 說明復制成功Slave_SQL_Running: Yes	 # 這里是yes 說明復制成功Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 612Relay_Log_Space: 531Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_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: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 100Master_UUID: cfb53930-7fa2-11ee-8ea9-00163e2859d2Master_Info_File: /usr/local/mysql/3307/data/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 
    1 row in set (0.00 sec)# 停止從庫復制主庫
    mysql> stop slave;
    Query OK, 0 rows affected (0.01 sec)
  7. 測試主從復制是否成功,在主庫建表,插入數據,查看從庫是否也有

    在主庫執行操作:

    • 新增庫
    • 新增表
    • 新增數據
    • 修改數據
    • 刪除數據

    查看從庫3307是否發生變化

    # 進入主庫3306
    root@songdanminserver:[/usr/local/mysql/3306]mysql -uroot -h127.0.0.1 -p -P3306
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 16
    Server version: 5.7.36-log MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    # 新建數據庫 my_test
    mysql> create database my_test;
    Query OK, 1 row affected (0.00 sec)mysql> use my_test;
    Database changed
    mysql> CREATE TABLE test (->   id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,->   name VARCHAR(30) NOT NULL,->   email VARCHAR(50) NOT NULL,->   reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP-> );
    Query OK, 0 rows affected (0.01 sec)
    # 插入初識數據
    mysql> INSERT INTO test (name, email)-> VALUES ('John Doe', 'john@example.com');
    Query OK, 1 row affected (0.00 sec)# 查看從庫變化
    

    image-20231123160935413

?

注意:如果出現從庫復制失敗沒有效果時候,從庫重新綁定主庫(執行6)

造成這類問題的原因一般是在主從復制的時候,基于創建表,然后又去刪除和操作了數據表或者表。

推薦文章

【史上最細教程】一臺服務器上搭建2個MySQL實例

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164012.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164012.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164012.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java飛翔的鳥

創建三個包,存放代碼。把圖片放進文件中 APP包(運行) GameApp類 package APP; import mian.GameFrame;public class GameApp {public static void main(String[] args) {new GameFrame();} } mian包(主內容) Barri…

python獲取json所有節點和子節點

使用python獲取json的所有父結點和子節點 并使用父節點加下劃線命名子節點 先展示一段json代碼 {"level1": {"level2": {"level3": [{"level4": "4value"},{"level4_2": "4_2value"}]},"level2_…

電力行業的智能調度:數字孿生技術

隨著科技的發展,數字孿生技術正逐漸滲透到各個行業領域,其中包括電力行業。數字孿生技術為電力行業帶來了前所未有的機遇,使得電力系統的運行更加高效、安全和可持續。本文借用山海鯨可視化軟件幾個電力行業數字孿生案例探討數字孿生技術在電…

介紹幾種Go語言開發的IDE

文章目錄 1.前言2.幾種ide2.1 Goland2.2 VsCode示例 2.3 LiteIDE2.4 Eclipse插件GoClipse2.5 Atom2.6 Vim2.7 Sublime Text 3.總結寫在最后 1.前言 Go語言作為一種新興的編程語言,近年來受到了越來越多的關注。 它以其簡潔、高效和并發性能而聞名,被廣…

Jmeter 壓測保姆級入門教程

1、Jmeter本地安裝 1.1、下載安裝 軟件下載地址: https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/ 選擇一個壓縮包下載即可 然后解壓縮后進入bin目錄直接執行命令jmeter即可啟動 1.2 修改語言 默認是英文的,修改中文,點擊…

關于解決C# WinForm中Chart控件增刪數據時報錯的解決方法

1.報錯代碼 System.InvalidOperationExceptionHResult=0x80131509Message=集合已修改;可能無法執行枚舉操作。具體報錯表現為,在Application.Run(Form1())中斷。 2.解決方法 這個錯誤通常是由于在枚舉集合時對集合進行了修改而引起的。在修改完chart控件中的內容后,可能會…

Linux---常用命令匯總

文章目錄 關于目錄操作的命令ls/llcdpwdmkdir 關于文件操作的命令touchechocatrmmvcpvim 關于查詢操作的命令greppsnetstat 關于目錄操作的命令 ls/ll ls : 列出當前目錄下的目錄和文件(以行的展示形式) ll : 列出當前目錄下的目錄和文件&…

Django之Cookie與Session,CBV加裝飾器

前言 會話跟蹤技術 在一個會話的多個請求中共享數據,這就是會話跟蹤技術。例如在一個會話中的請求如下: ? 請求銀行主頁; 請求登錄(請求參數是用戶名和密碼);請求轉賬(請求參數與轉賬相關的數…

Thread類常用成員方法

點擊鏈接返回標題-> Java線程的學習-CSDN博客 目錄 前言 有關線程名字的成員方法: String getName() void setName(String name) Thread(String name) 獲取線程對象的成員方法: static Thread currentThread() 讓線程睡眠的成員方法&#xff1…

時間序列分析算法的概念、模型檢驗及應用

時間序列分析是一種用于研究隨時間變化的數據模式和趨勢的統計方法。這類數據通常按照時間順序排列,例如股票價格、氣溫、銷售額等。時間序列分析的目標是從過去的觀測中提取信息,以便預測未來的趨勢。 以下是關于時間序列分析的一些重要概念、模型檢驗…

python 數據類型之集合

常見的數據類型: int,整數類型(整形)bool,布爾類型str,字符串類型list,列表類型tuple,元組類型dict,字典類型,一個容器且元素必須是鍵值對。set,…

I Doc View在線文檔預覽系統RCE漏洞(QVD-2023-45061)

0x01 產品簡介 iDocView是一個在線文檔解析應用,旨在提供便捷的文件查看和編輯服務。 0x02 漏洞概述 漏洞成因 本次漏洞出現在在線文檔解析應用中的遠程頁面緩存功能。具體問題在于該應用未能對用戶輸入的URL進行充分的安全驗證,從而導致存在安全隱患…

前端實現菜單快速檢索的功能

前端CSS <style type"text/css">.btn-box {color: #fff;width: auto;border-radius: 25px;min-width: 40px;height: 40px;margin: 9px;line-height: 40px;display: inline-block;position: relative;overflow: hidden;background-image: linear-gradient(315de…

紅隊攻防實戰之內網穿透隱秘隧道搭建

別低頭&#xff0c;皇冠會掉&#xff1b;別流淚&#xff0c;賤人會笑。 本文首發于先知社區&#xff0c;原創作者即是本人 0x00 前言 構建內網隱蔽通道&#xff0c;從而突破各種安全策略限制&#xff0c;實現對目標服務器的完美控制。 當我們從外網成功獲得攻擊點的時候&…

SAP BAPI For LU01/LU04 記賬更改

場景&#xff1a;采購收貨質檢放行的時候&#xff0c;發現存在有些做QA11的時候&#xff0c;進入到TR-ZONE中&#xff0c;沒有進入到指定的倉位 解決方案&#xff1a;前端通過LU04進入&#xff0c;可以查看到一些未清的記賬更改通知單&#xff0c;點擊工具欄上的創建轉儲單&am…

Docker Swarm總結+service創建和部署、overlay網絡以及Raft算法(2/3)

博主介紹&#xff1a;Java領域優質創作者,博客之星城市賽道TOP20、專注于前端流行技術框架、Java后端技術領域、項目實戰運維以及GIS地理信息領域。 &#x1f345;文末獲取源碼下載地址&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&#x1f3fb;…

新的預測模型的局部評價指標-pAUROCc

新的預測模型的局部評價指標-pAUROCc Background 局部評價主要是用在不平衡數據上&#xff0c;其合理性&#xff1a;1.局部評價比全局評價敏感&#xff0c;更容易區分模型的優劣&#xff1b;2.臨床決策曲線&#xff08;DCA&#xff09;可知&#xff0c;模型使用過程中&#x…

什么是JSX

在React組件中&#xff0c;JSX&#xff08;JavaScript XML&#xff09;是一種語法擴展&#xff0c;用于描述組件的結構和外觀。JSX允許我們在JavaScript中編寫類似HTML的標記語言&#xff0c;以創建React元素。 在React組件中&#xff0c;render方法是用于定義并返回組件的結構…

HarmonyOS開發(六):構建簡單頁面

1、Column&Row組件 1.1、概述 一個頁面由很多組件組成&#xff0c;如果需要把這些組件組織起來布局好&#xff0c;需要借助容器組件來實現。 容器組件是一種特殊的組件&#xff0c;它可以包含其他組件&#xff0c;而且按照一定的規律布局&#xff0c;一個容器組件中可以…

Linux--初識和基本的指令(2)

目錄 前言 1. 指令 1.1 cd其它攜帶指令 1.2 ls其它攜帶指令 1.3 which指令 1.4 alias指令 1.5 mkdir其他攜帶指令 1.7 yum -y install 安裝指令 1.8 stat指令 1.9解決指令失控狀態 1.10 rmdir&&rm指令 1.11 man指令 1.12 cp指令 1.13 mv指令 1.14 nano…