mysql-主從複製

 

MySQL主從同步

1. 主從同步的定義html

  主從同步使得數據能夠從一個數據庫服務器複製到其餘服務器上,在複製數據時,一個服務器充當主服務器(master),其他的服務器充當從服務器(slave)。mysql

  由於複製是異步進行的,因此從服務器不須要一直鏈接着主服務器,從服務器甚至能夠經過撥號斷斷續續地鏈接主服務器。經過配置文件,能夠指定複製全部的數據庫,某個數據庫,甚至是某個數據庫上的某個表。sql

2.mysql 主從同步做用:數據庫

  1.讀寫分離vim

  2.分流,減輕服務器壓力centos

  3. 數據備份安全

    80% 查詢,20% 寫入,bash

3.使用主從同步的好處:服務器

(1) 經過增長從服務器來提升數據庫的性能,在主服務器上執行寫入和更新,在從服務器上向外提供讀功能,能夠動態地調整從服務器的數量,從而調整整個數據庫的性能。網絡

(2)提升數據安全,由於數據已複製到從服務器,從服務器能夠終止複製進程,因此,能夠在從服務器上備份而不破壞主服務器相應數據

(3) 在主服務器上生成實時數據,而在從服務器上分析這些數據,從而提升主服務器的性能

4. 主從同步的機制

  Mysql服務器之間的主從同步是基於二進制日誌機制,主服務器使用二進制日誌來記錄數據庫的變更狀況,從服務器經過讀取和執行該日誌文件來保持和主服務器的數據一致。

在使用二進制日誌時,主服務器的全部操做都會被記錄下來,而後從服務器會接收到該日誌的一個副本。從服務器能夠指定執行該日誌中的哪一類事件(譬如只插入數據或者只更新數據),默認會執行日誌中的全部語句。

每個從服務器會記錄關於二進制日誌的信息:文件名和已經處理過的語句,這樣意味着不一樣的從服務器能夠分別執行同一個二進制日誌的不一樣部分,而且從服務器能夠隨時鏈接或者中斷和服務器的鏈接。

主服務器和每個從服務器都必須配置一個惟一的ID號(在my.cnf文件的[mysqld]模塊下有一個server-id配置項),另外,每個從服務器還須要經過CHANGE MASTER TO語句來配置它要鏈接的主服務器的ip地址,

日誌文件名稱和該日誌裏面的位置(這些信息存儲在主服務器的數據庫裏)

3.主從同步流程:

  1.主和從庫的數據保持一致

    作法:備份主庫,而後在從庫恢復

  2. mysql 任何操做均可以寫到日誌文件中(默認關閉,須要開啓);從庫能夠實時讀取主庫的日誌文件,而後將主庫的操做也執行一遍,從而達到同步

  3.從庫訪問主庫日誌,須要登陸主庫,從而須要讓主庫爲從庫分配帳號密碼(專用於主從同步),slave

 

 

配置mysql主服務器(MASTER)

0)查看mysql的啓動狀態

systemctl status mysqld.service

 

1)修改/etc/my.cnf配置文件

server-id       = 11                        //mysql數據的惟一標示(不能重複)

binlog-format=ROW      //選擇row模式 

log-slave-updates=true                 //容許連級複製  (增長)

log-bin=master-bin                         //二進制文件名(修改)

binlog_format=mixed      //二進制文件

2) 重啓MySQL服務

systemctl stop mysqld.service

ststemctl start mysqld.service

 3)建立主從複製的用戶(mysql8.0)

 create user 'nxznxz'@'%' identified WITH mysql_native_password by 'Pass1234!';

 grant replication slave on *.* to 'nxznxz'@'%';

4)注意須要開放端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent

firewall-cmd --reload

firewall-cmd --list-ports

 

四、 配置從服務器

1) 在/etc/my.cnf中修改如下內容

[root@centos3 ~]# vim /etc/my.cnf

server-id       = 22                                                //不能與其餘實例重複

log-bin=master-bin                                                        //二進制日誌文件名 修改

relay-log=relay-log-bin                                        //複製過來的二進制文件名,增長

relay-log-index=slave-relay-bin.index                //中繼日誌存放的文件名稱,增長

 

注意server-id不能與主服務器相同,可是從服務器要相同。

2) 重啓mysql服務

3) 登陸mysql,配置同步(按照主服務器結果更改下面命令中

master_file和master_log_pos參數)

change master to master_host='192.168.1.131',master_user='root', master_password='Pass1234!',master_log_file='master-bin.000001',master_log_pos=467;

4)啓動同步

 

5) 查看slave狀態,確保如下兩個值爲YES

五、 驗證主從複製效果

1) 在主服務器上新建數據庫「IT」

2) 在從服務器上查看數據庫,若是和主服務器相同,說明主從複製成功。

 

 

從庫多線程複製:

  https://blog.csdn.net/punk_lover/article/details/78424896

  https://blog.csdn.net/demonson/article/details/80774899

 

附一個一鍵安裝mysql8.0的腳本:

#!/bin/bash
############   一鍵安裝 MySQL 8.0 腳本  ############
# Updates:能夠在安裝的時候更改root初始密碼        #
#######################  END  ######################

function install(){
    #先把多餘的卸載了
    unload
    cd ~
    U_mysqlUrl=https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
    #下載MySQL8.0的rpm包
    if [ -e "./mysql80-community-release-el7-1.noarch.rpm" ]
    then
        echo -e "\033[1;32m正在解壓~~~\033[0m"
    else
        wget ${U_mysqlUrl}
        if [ $? -ne 0 ]
            then
            echo -e "\033[1;31m下載 MySQL 安裝包失敗,請檢查您的網絡!\033[0m"
            exit
        fi
    fi

    #解壓rpm包 ##*/  表示刪除最後一個/ 及其左邊的字符
    rpm -Uvh ${U_mysqlUrl##*/}

    #安裝MySQL8.0
    yum install mysql-server -y

    #啓動MySQL
    echo -e "                  ************  \033[1;33m正在啓動 MySQL\033[0m  *****************"
    systemctl start mysqld.service

    #查看狀態
    a=$(systemctl status mysqld.service | grep Active)
    b=${a##*active}
    c=${b%% since*}
    d="(running)"
    if [ "$c" = "$d" ]
    then
        echo -e "             **************  \033[1;32mMySQL 啓動成功\033[0m ******************"
    fi

    #找出初始密碼,創建登陸腳本
    findpass=$(grep 'temporary password' /var/log/mysqld.log)
    initpass=${findpass##* }
    rm -rf ~/.my.cnf
    touch ~/.my.cnf
    echo "[client]" > ~/.my.cnf
    echo "user=root" >> ~/.my.cnf
    echo "password=\"${initpass}\"" >> ~/.my.cnf
    #設置此登陸文件只有全部者能夠讀寫
    chmod 770 ~/.my.cnf

    #修改密碼
    chose_pass
}

#修改密碼
function chose_pass() {
    declare -i settime=0
    while [ ${settime} -lt 3 ]
    do
        read -p "是否如今修改 MySQL 的 root 密碼?[y/n] " chose
        if [[ "$chose" = "n" || "$chose" = "N" ]]
        then
            notchk_pass
            exit
        elif [[ "$chose" = "y" || "$chose" = "Y" ]]
        then
            modify_pass
            ((settime+=3))
            exit
        else
            echo -e "\033[1;33m請輸入 y 或 n\033[0m"
        fi
        settime=$((++settime))            
    done
}
#不修改密碼提示函數
function notchk_pass() {
    echo -e "\033[1;34;40mMySQL安裝成功!!"
    echo "###############  請在輸入命令 mysql 後進入數據庫  ######################"
    echo "## 輸入語句:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';     #"
    echo "## 並在 ~/.my.cnf 文件中更新你的密碼,以方便往後免密登陸               #"
    echo "########################################################################"
    echo -e "\033[0m"
}

#修改密碼操做函數
function modify_pass() {
    #若是密碼格式不符合3次則退出
    declare -i chktime=0
    while [ ${chktime} -lt 3 ]
    do
        echo -e "\033[1;32m請輸入您的新密碼"
        read -p "至少一個大寫字母、一個小寫字符、數字和符號:" NEWPASS
        echo -e "\033[0m"    
                
        SQL="ALTER USER 'root'@'localhost' IDENTIFIED BY \"${NEWPASS}\";flush privileges;"
        mysql --connect-expired-password -e "${SQL}"
        if [ $? -eq 0 ]
        then
            #修改登陸腳本
            rm -rf ~/.my.cnf
            touch ~/.my.cnf
            echo "[client]" > ~/.my.cnf
            echo "user=root" >> ~/.my.cnf
            echo "password=\"${NEWPASS}\"" >> ~/.my.cnf
            chmod 0600 ~/.my.cnf
            
            echo -e "\033[1;34;40mMySQL安裝成功!!"
            echo "###############  請在輸入命令 mysql 後進入數據庫  ######################"
            echo "## 自動登陸腳本:~/.my.cnf                                             #"
            echo "########################################################################"
            echo -e "\033[0m"
            rm -rf transfer.txt
            #設置對了直接退出
            ((chktime+=4))
            exit
        fi
        chktime=$((++chktime))
        #第三次的時候提示並退出
        if [ ${chktime} -eq 3 ]
        then
            echo -e "\033[1;31m密碼修改失敗,請自行修改密碼\033[0m"
            exit
        fi
    done
}

#卸載
function unload() {
    #停掉 MySQL 數據庫
    systemctl stop mysqld.service
    #卸載各項服務
    yum remove mysql mysql-server mysql-libs compat-mysql51 -y
    #刪除各個目錄
    rm -rf /var/lib/mysql
    rm -rf /etc/my.cnf
    rm -rf /usr/share/mysql-8.0/
    touch list.txt
    #查一下繼續卸載
    rpm -qa | grep mysql > list.txt
    for a in `cat list.txt`
    do
        yum remove $a -y
    done
    rm -rf list.txt
    #刪除自動登陸配置文件
    rm -rf ~/.my.cnf
    #刪除日誌文件
    rm -rf /var/log/mysqld.log
    #刪除安裝包
    #rm -rf ~/mysql80-community-release-el7-1.noarch.rpm
}

clear

echo -e "\033[1;36m############  歡迎使用一鍵安裝 MySQL 8.0 腳本  ############\033[0m"
echo -e "\033[1;36m#                                                         #\033[0m"
echo -e "\033[1;36m#                    請保持網絡暢通···                    #\033[0m"
echo -e "\033[1;36m#                                                         #\033[0m"
echo -e "\033[1;36m#                    一、安裝 MySQL                        #\033[0m"
echo -e "\033[1;36m#                    二、卸載 MySQL                        #\033[0m"
echo -e "\033[1;36m#                    三、退出                              #\033[0m"
echo -e "\033[1;36m#                                                         #\033[0m"
echo -e "\033[1;36m###########################################################\033[0m"

declare -i style
read -p "請輸入選項 [ 1 | 2 | 3 ]:" style

case "$style" in
1)
    #檢查目錄是否存在
    if [ -e "/var/lib/mysql80" ]
    then
        echo -e "\033[1;33m您的系統已安裝 MySQL 數據庫,請檢查目錄\033[0m"
    else
    install
    fi
    ;;
2)
    unload
    ;;
3)
    exit
    ;;
*)
    echo -e "\033[5;32;40m參數錯誤!!!\033[0m"
    ;;
esac

 

 

原博客:https://www.w3cschool.cn/timlc/timlc-u3xg24y8.html

相關博客:http://www.javashuo.com/article/p-mfqgvbtg-m.html

相關文章
相關標籤/搜索