MySQL主從復制(docker搭建)

文章目錄

    • 1.MySQL主從復制配置
        • 1.主服務器配置
          • 1.拉取mysql5.7的鏡像
          • 2.啟動一個主mysql,進行端口映射和目錄掛載
          • 3.進入/mysql5.7/mysql-master/conf中創建my.cnf并寫入主mysql配置
            • 1.進入目錄
            • 2.執行命令寫入配置
          • 4.重啟mysql容器,使配置生效
          • 5.進入主mysql,創建要同步的用戶并設置權限
            • 1.進入主mysql容器
            • 2.登錄mysql(輸入啟動容器時設置的密碼)
            • 3.允許slave用戶連接到主服務器(master)并請求數據復制,密碼123456
            • 4.允許用戶查詢主服務器的狀態或從服務器的狀態
            • 5.檢查是否有slave用戶
            • 6.檢查slave用戶權限
          • 6.開啟3307端口
            • 1.寶塔開啟
            • 2.騰訊云安全組開啟
        • 2.在另一臺服務器安裝docker
          • 1.卸載舊版本的docker
          • 2.安裝 gcc相關
          • 3.安裝`yum-utils`軟件包
          • 4.docker設置阿里云的鏡像倉庫,最好不要設置國外的
          • 5.更新yum包的索引(linux基礎,以后使用yum會快一些)
          • 6.安裝最新版的docker
          • 7.啟動docker進程并查看docker是否成功啟動
          • 8.運行docker
          • 9.停止docker
          • 10.設置docker自啟動并確認是否設置成功!
          • 11.阿里云鏡像加速器配置
            • 1.找到容器鏡像服務
            • 2.得到鏡像加速器地址
            • 3.創建目錄
            • 4.通過修改daemon配置文件/etc/docker/daemon.json來使用加速器
            • 5.重啟daemon
            • 6.重啟docker
        • 3.從服務器配置
          • 1.拉取mysql5.7的鏡像
          • 2.啟動一個主mysql,進行端口映射和目錄掛載
          • 3.進入/mysql5.7/mysql-slave/conf目錄新建my.cnf寫入配置
            • 1.進入目錄
            • 2.配置文件
            • 3.執行腳本寫入配置
          • 4.重啟mysql容器,使配置生效
          • 5.在主數據庫中查看主從復制狀態
          • 6.從機進入mysql命令行
            • 1.進入容器
            • 2.進入命令行
          • 7.從機配置主從復制
            • 1.配置指令
            • 2.執行指令,配置主從復制
            • 3.在從數據庫中查看主從復制狀態
            • 4.從數據庫中開啟主從同步
          • 8.測試
            • 1.主機執行sql
            • 2.從機讀取數據
          • 9.開啟端口3308
            • 1.寶塔開啟
            • 2.騰訊云安全組開啟
    • 2.使用主從復制
        • 1.IDEA測試連接兩個數據庫的連接
          • 1.主數據庫
          • 2.從數據庫
        • 2.解決中文插入失敗的問題
          • 1.引出問題
          • 2.主服務器中查詢編碼,發現都是latin1
          • 3.進入主服務器配置目錄/mysql5.7/mysql-master/conf
          • 4.編輯my.cnf 添加如下配置
          • 5.重啟mysql容器
          • 6.啟動失敗了
            • 1.查看mysql日志
            • 2.因為配置文件中指定的字符集 `utf8mb4"` 不正確。從錯誤信息來看,字符集名稱后面多了一個引號
            • 3.確實多了個引號,編輯配置文件刪除引號后再次重啟,成功!
          • 7.測試插入中文,還是插入失敗,猜測原因可能是從服務器的編碼不能滿足中文
            • 1.進入從服務器配置目錄/mysql5.7/mysql-slave/conf
            • 2.編輯my.cnf 添加如下配置
            • 3.重啟服務使配置生效
          • 8.再次插入還是失敗,分別查詢一下主從數據庫的字符集
            • 1.主數據庫
            • 2.從數據庫
          • 9.那么就只有一種可能了,就是之前創建數據庫的時候沒有指定編碼,所以使用的默認的,也就是即使修改了默認編碼原來的數據庫還是不支持中文
            • 1.主數據庫重新創建db,插入中文,成功!
            • 2.從數據庫查詢,成功!

1.MySQL主從復制配置

1.主服務器配置
1.拉取mysql5.7的鏡像
docker pull mysql:5.7
2.啟動一個主mysql,進行端口映射和目錄掛載
  • 端口3307
  • –name:mysql-master
  • -v:掛載三個目錄
  • -e:設置密碼
  • -d:后臺啟動
  • mysql:5.7:鏡像名字
docker run -p 3307:3306 --name mysql-master \
-v /mysql5.7/mysql-master/log:/var/log/mysql \
-v /mysql5.7/mysql-master/data:/var/lib/mysql \
-v /mysql5.7/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=\
-d mysql:5.7

image-20240518191847292

3.進入/mysql5.7/mysql-master/conf中創建my.cnf并寫入主mysql配置
1.進入目錄
cd /mysql5.7/mysql-master/conf
2.執行命令寫入配置
cat <<EOF > my.cnf
[mysqld]
## 設置 server_id,同一復制體系中需要唯一
server_id=101## 指定要忽略的數據庫在復制過程中不傳送
binlog-ignore-db=mysql## 開啟二進制日志功能
log-bin=mall-mysql-bin## 設置二進制日志緩存大小為1M(更多)
binlog_cache_size=1M## 設置使用的二進制日志格式(mixed, statement, row)
binlog_format=mixed## 二進制日志過期刪除時間為7天。超過此期限的日志將被自動刪除
expire_logs_days=7## 針對復制過程中遇到的特定錯誤編號忽略錯誤處理,避免 slave 端復制中斷。
## 如:1062錯誤是指一些主鍵重復錯誤,1032錯誤是因為主從數據不一致
slave_skip_errors=1062
EOF

image-20240518192603828

4.重啟mysql容器,使配置生效
docker restart mysql-master

image-20240518192847680

5.進入主mysql,創建要同步的用戶并設置權限
1.進入主mysql容器
docker exec -it mysql-master /bin/bash
2.登錄mysql(輸入啟動容器時設置的密碼)
mysql -u root -p

image-20240518193345946

3.允許slave用戶連接到主服務器(master)并請求數據復制,密碼123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
4.允許用戶查詢主服務器的狀態或從服務器的狀態
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
5.檢查是否有slave用戶
SELECT user, host FROM mysql.user WHERE user = 'slave';
6.檢查slave用戶權限
SHOW GRANTS FOR 'slave'@'%';

image-20240518194149917

6.開啟3307端口
1.寶塔開啟
systemctl start firewalld && firewall-cmd --permanent --add-port=3307/tcp && firewall-cmd --reload && firewall-cmd --query-port=3307/tcp

image-20240518194947035

2.騰訊云安全組開啟

image-20240518195109726

2.在另一臺服務器安裝docker
1.卸載舊版本的docker
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine

image-20240517154553368

2.安裝 gcc相關
yum -y install gcc && yum -y install gcc-c++

image-20240518195238121

3.安裝yum-utils軟件包
yum install -y yum-utils

image-20240517155524244

4.docker設置阿里云的鏡像倉庫,最好不要設置國外的

image-20240517155332913

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

image-20240517155823043

5.更新yum包的索引(linux基礎,以后使用yum會快一些)
yum makecache fast

image-20240517155949744

6.安裝最新版的docker
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

image-20240517160300623

7.啟動docker進程并查看docker是否成功啟動
systemctl start docker && ps -aux | grep docker

image-20240517160628449

8.運行docker

在本地找不到,會到遠程倉庫查找鏡像

docker run hello-world

image-20240517160742958

9.停止docker
systemctl stop docker && ps -aux | grep docker

image-20240517161145268

10.設置docker自啟動并確認是否設置成功!
systemctl enable docker && systemctl is-enabled docker

image-20240517161257256

11.阿里云鏡像加速器配置
1.找到容器鏡像服務

https://cr.console.aliyun.com/cn-beijing/instances

image-20240517161923588

2.得到鏡像加速器地址

image-20240517162247947

3.創建目錄
mkdir -p /etc/docker
4.通過修改daemon配置文件/etc/docker/daemon.json來使用加速器
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://s0qrw5u9.mirror.aliyuncs.com"]
}
EOF
5.重啟daemon
systemctl daemon-reload
6.重啟docker
systemctl restart docker && ps -aux | grep docker
3.從服務器配置
1.拉取mysql5.7的鏡像
docker pull mysql:5.7

image-20240518200017473

2.啟動一個主mysql,進行端口映射和目錄掛載
  • 端口3308
  • –name:mysql-slave
  • -v:掛載三個目錄
  • -e:設置密碼
  • -d:后臺啟動
  • mysql:5.7:鏡像名字
docker run -p 3308:3306 --name mysql-slave \
-v /mysql5.7/mysql-slave/log:/var/log/mysql \
-v /mysql5.7/mysql-slave/data:/var/lib/mysql \
-v /mysql5.7/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=\
-d mysql:5.7

image-20240518200104571

3.進入/mysql5.7/mysql-slave/conf目錄新建my.cnf寫入配置
1.進入目錄
cd /mysql5.7/mysql-slave/conf
2.配置文件
[mysqld]
## 設置 server_id,同一復制體系中需要唯一
server_id=102## 指定要忽略的數據庫在復制過程中不傳送
binlog-ignore-db=mysql## 開啟二進制日志功能,以 slave 為前綴來區分這是針對 Master 的日志
log-bin=mall-mysql-slave1-bin## 設置二進制日志緩存大小為1M(更多)
binlog_cache_size=1M## 設置使用的二進制日志格式(mixed, statement, row)
binlog_format=mixed## 二進制日志過期刪除時間為7天。超過此期限的日志將被自動刪除
expire_logs_days=7## 針對復制過程中遇到的特定錯誤編號忽略錯誤處理,避免 slave 端復制中斷
## 如:1062錯誤是指一些主鍵重復錯誤,1032錯誤是因為主從數據不一致
slave_skip_errors=1062## 設置從服務器的 relay log 文件名
relay_log=mall-mysql-relay-bin## log_slave_updates表示從服務器在接收到主服務器的日志后也將這些變更寫入自己的日志
log_slave_updates=1## 設置該服務器為只讀(具有 super 權限的用戶除外)
read_only=1
3.執行腳本寫入配置
cat <<EOF > my.cnf
[mysqld]
server_id=102
binlog-ignore-db=mysql
log-bin=mall-mysql-slave1-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=mall-mysql-relay-bin
log_slave_updates=1
read_only=1
EOF

image-20240518200559198

4.重啟mysql容器,使配置生效
docker restart mysql-slave

image-20240518200702959

5.在主數據庫中查看主從復制狀態
  • 這里的File就是后面主從復制的master_log_file
  • 這里的Position就是后面主從復制的master_log_pos
show master status;

image-20240518201037571

6.從機進入mysql命令行
1.進入容器
docker exec -it mysql-slave /bin/bash
2.進入命令行
mysql -u root -p
7.從機配置主從復制
1.配置指令
  • master_host: 指定主服務器的 IP 地址或主機名。
  • master_user: 用于復制過程的 MySQL 用戶名。
  • master_password: 該用戶的密碼。
  • master_log_file: 從服務器開始讀取的二進制日志文件名。這通常是從服務器上次停止復制的位置,或者是一個新的復制起點。
  • master_log_pos: 從指定的二進制日志文件開始復制的位置(字節單位)。這指定了從哪里開始復制日志事件。
  • master_port: 主服務器的 MySQL 端口號,如果不是默認的 3306,則需要指定。
  • master_connect_retry: 如果連接失敗,從服務器在嘗試重新連接前等待的時間(秒)。
CHANGE MASTER TOmaster_host='',master_user='slave',master_password='123456',master_log_file='mall-mysql-bin.000001',master_log_pos=617,master_port=3307,master_connect_retry=30;
2.執行指令,配置主從復制

image-20240518201849652

3.在從數據庫中查看主從復制狀態
show slave status \G;
4.從數據庫中開啟主從同步
start slave;
8.測試
1.主機執行sql
create database db01;
use db01;
create table test
(id int,name varchar(32)
);
insert into test (id, name)
values (1, 'test');
select *
from test;

image-20240518202559561

2.從機讀取數據
use db01;
select * from test;

image-20240518202645123

9.開啟端口3308
1.寶塔開啟
systemctl start firewalld && firewall-cmd --permanent --add-port=3308/tcp && firewall-cmd --reload && firewall-cmd --query-port=3308/tcp

image-20240518202930965

2.騰訊云安全組開啟

image-20240518203025997

2.使用主從復制

1.IDEA測試連接兩個數據庫的連接
1.主數據庫
2.從數據庫
2.解決中文插入失敗的問題
1.引出問題

image-20240518203737783

image-20240518203741304

2.主服務器中查詢編碼,發現都是latin1
show variables like 'character%';

image-20240518203915018

3.進入主服務器配置目錄/mysql5.7/mysql-master/conf
cd /mysql5.7/mysql-master/conf
4.編輯my.cnf 添加如下配置
vim my.cnf
[client]
## 設置客戶端的默認字符集
default_character_set=utf8mb4[mysqld]
## 設置mysql的默認字符集
collation_server = utf8mb4_unicode_ci
character_set_server = utf8mb4

image-20240518204400910

5.重啟mysql容器
docker restart mysql-master

image-20240518204656277

6.啟動失敗了
1.查看mysql日志
docker logs mysql-master

image-20240518204904823

2.因為配置文件中指定的字符集 utf8mb4" 不正確。從錯誤信息來看,字符集名稱后面多了一個引號

image-20240518204937660

3.確實多了個引號,編輯配置文件刪除引號后再次重啟,成功!

image-20240518205100535

7.測試插入中文,還是插入失敗,猜測原因可能是從服務器的編碼不能滿足中文
1.進入從服務器配置目錄/mysql5.7/mysql-slave/conf
cd /mysql5.7/mysql-slave/conf
2.編輯my.cnf 添加如下配置
vim my.cnf
[client]
## 設置客戶端的默認字符集
default_character_set=utf8mb4[mysqld]
## 設置mysql的默認字符集
collation_server = utf8mb4_unicode_ci
character_set_server = utf8mb4

image-20240518205842833

3.重啟服務使配置生效
docker restart mysql-slave
8.再次插入還是失敗,分別查詢一下主從數據庫的字符集
1.主數據庫

image-20240518210413934

2.從數據庫

image-20240518210424714

9.那么就只有一種可能了,就是之前創建數據庫的時候沒有指定編碼,所以使用的默認的,也就是即使修改了默認編碼原來的數據庫還是不支持中文
1.主數據庫重新創建db,插入中文,成功!
create database db02;
use db02;
create table test
(id int,name varchar(32)
);
insert into test (id, name)
values (1, '孫顯圣');
select *
from test;

image-20240518210800324

2.從數據庫查詢,成功!
use db02;
select *
from test;

image-20240518210842345

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

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

相關文章

python篇-pywinauto使用-持續更新

1- pywinauto 中的uia是什么意思&#xff1f; 在pywinauto庫中&#xff0c;uia指的是UI Automation&#xff0c;這是Windows操作系統提供的一種技術框架&#xff0c;用于實現用戶界面(UI)的自動化測試和輔助功能訪問。UI Automation是微軟從Windows Vista開始引入的核心技術&am…

2024年電工杯高校數學建模競賽(B題) 建模解析| 大學生平衡膳食食譜的優化設計 |小鹿學長帶隊指引全代碼文章與思路

我是鹿鹿學長&#xff0c;就讀于上海交通大學&#xff0c;截至目前已經幫200人完成了建模與思路的構建的處理了&#xff5e; 本篇文章是鹿鹿學長經過深度思考&#xff0c;獨辟蹊徑&#xff0c;實現綜合建模。獨創復雜系統視角&#xff0c;幫助你解決電工杯的難關呀。 本題&…

面試八股之MySQL篇5——主從同步原理篇

&#x1f308;hello&#xff0c;你好鴨&#xff0c;我是Ethan&#xff0c;一名不斷學習的碼農&#xff0c;很高興你能來閱讀。 ??目前博客主要更新Java系列、項目案例、計算機必學四件套等。 &#x1f3c3;人生之義&#xff0c;在于追求&#xff0c;不在成敗&#xff0c;勤通…

IP地址的風險畫像及其應用

在現代互聯網環境中&#xff0c;IP地址不僅是設備在網絡中的唯一標識符&#xff0c;還是分析網絡安全和風險管理的重要工具。IP地址的風險畫像通過分析IP地址的行為和相關數據&#xff0c;揭示潛在的安全威脅&#xff0c;為企業和組織提供有效的風險管理方案。本文將探討IP地址…

齊業成工程行業數字化預算費控方案:編制、執行、數據分析全過程閉環管理

工程建設企業具備項目周期長、業務復雜的特點&#xff0c;預算費控涉及內部管理、項目、客戶、收支等&#xff0c;賬目多、且難控。 在工程企業日常預算費控過程中存在著諸多挑戰&#xff1a; ? 數據核對難&#xff1a;涉及數據多&#xff0c;需多部門協同填寫&#xff0c;需…

人工智能的陰暗面:犯罪分子如何利用 AI 進行欺詐

在當今數字化時代&#xff0c;人工智能&#xff08;AI&#xff09;正迅速成為推動各行各業生產力和創新的關鍵力量&#xff0c;而一些不法分子也開始探索如何將這些先進的工具用于他們自己的非法目的。從網絡釣魚到深度偽造&#xff0c;再到人肉搜索、越獄服務和身份驗證系統的…

【動態維護樹的直徑】【HBCPC2023】I. Colorful Tree

題目 https://codeforces.com/gym/105139/problem/I 思路 其實相當于是分別求黑色點和白色點所構成的樹的直徑。 當兩個連通塊連在了一起&#xff0c;假設它們的直徑是 ( u 1 , v 1 ) &#xff0c; ( u 2 , v 2 ) (u_1,v_1)&#xff0c;(u_2,v_2) (u1?,v1?)&#xff0c;(u…

【程序填空】三維點坐標平移(增量運算符重載)

題目描述 定義一個三維點Point類&#xff0c;利用友元函數重載""和"--"運算符&#xff0c;并區分這兩種運算符的前置和后置運算。 表示x\y\z坐標都1&#xff0c;--表示x\y\z坐標都-1 請完成以下程序填空 輸入 只有一行輸入&#xff0c;輸入三個整數&a…

Linux運維工程師基礎面試題整理(二)

Linux運維工程師基礎面試題整理(二) 1. 如何配置Linux網絡?請說出3種以上方法?2. 如何查詢某個目錄下的每個文件大小?3. 如何診斷ping不通服務器?4.在Linux中,如何讓一個命令在后臺運行?5. 如何查看Linux系統日志?6. 如何查看磁盤空間情況?7. 如何在Linux中查看和管理…

一個開源的工具類輪子是怎么造出來的

心路歷程 為什么要做 在22年9月的某一天&#xff0c;在公司開需求評審時&#xff0c;接到了一個給PDF、圖片添加水印的需求。做為一個剛工作的CURD程序員&#xff0c;在遇到這些問題時&#xff0c;第一反應是去github上找找有沒有類似的開源框架。但是&#xff0c;出乎我意料…

2024年 電工杯 (B題)大學生數學建模挑戰賽 | 大學生平衡膳食食譜的優化設計 | 數學建模完整代碼解析

DeepVisionary 每日深度學習前沿科技推送&頂會論文&數學建模與科技信息前沿資訊分享&#xff0c;與你一起了解前沿科技知識&#xff01; 本次DeepVisionary帶來的是電工杯的詳細解讀&#xff1a; 完整內容可以在文章末尾全文免費領取&閱讀&#xff01; 問題1&…

快手二面準備【面試準備】

快手二面準備【面試準備】 前言版權快手二面準備秋招一面中的問題實習一面中的問題計算機網絡和操作系統論壇項目登錄注冊ThreadLocal代替session存儲用戶秒殺項目登錄注冊->阿里驗證碼->rpcsession為什么改為token實現&#xff0c;redis存儲用戶信息由binlog的用法->…

Python魔法學院:PySpider篇——網絡世界的探險與征服

Hi&#xff0c;我是阿佑&#xff0c;迎來到Python魔法學院&#xff0c;今天阿佑要帶大家學習的是PySpider篇——一門讓你在網絡世界中探險與征服的魔法課程。從環境搭建到高級功能應用&#xff0c;再到性能優化&#xff0c;每一個章節都是成為數據大師的必經之路&#xff01; 文…

為什么拼命賺錢:窮怕了

我內心深處比較自卑。 從小在農村長大&#xff0c;爸不管媽不愛。 這么說大家沒感覺&#xff0c;從小什么都干&#xff0c;六歲開始做飯&#xff0c;每次開學都會全員大掃除&#xff0c;站在那里腳踩泥土地、眼神呆滯、雙手無處安放、眼神都不敢直視的小伙子就是我&#xff0…

VS Code中使用 Anaconda 環境

在 Visual Studio Code (VS Code) 中使用 Anaconda 環境進行 Python 開發&#xff0c;可以充分利用 Anaconda 提供的包管理和虛擬環境功能&#xff0c;同時享受 VS Code 提供的強大開發工具和調試功能。以下是詳細步驟&#xff1a; 1. 安裝 Visual Studio Code 和 Anaconda 首…

JavaScript Window對象

一、BOM&#xff08;瀏覽器對象模型&#xff09; window對象是一個全局對象&#xff0c;也可以說是JavaScript中的頂級對象。 像document、alert()、console.log()這些都是window的屬性&#xff0c;基本BOM的屬性和方法都是window的。 所有通過var定義在全局作用域中的變量、…

GitLab的原理及應用詳解(四)

本系列文章簡介&#xff1a; 隨著軟件開發的不斷進步和發展&#xff0c;版本控制系統成為了現代軟件開發過程中不可或缺的一部分。而GitLab作為其中一種流行的版本控制工具&#xff0c;在軟件開發領域享有廣泛的應用。GitLab不僅提供了強大的版本控制功能&#xff0c;還集成了項…

四川古力科技抖音小店,創新科技點亮購物新體驗

在這個數字化浪潮洶涌的時代&#xff0c;四川古力科技以其前瞻性的戰略眼光和創新能力&#xff0c;閃耀于抖音小店這片電商新藍海&#xff0c;開啟了未來購物的新紀元。作為一家集技術研發、產品創新、市場營銷于一體的科技型企業&#xff0c;古力科技不僅為消費者帶來了前所未…

idea中顯示git的Local Changes

1. 第一打開idea中的Settings文件 2. 找到Version Contro中的commint 3. 取消勾選應用即可 4. 本地提交就會顯示出來

ruoyi出現的那些bug

1、 npm install --registryhttps://registry.npm.taobao.org/element-ui request to https://registry.npm.taobao.org/element-ui failed, reason: certificate has expired 路徑錯誤 ? npm install https://registry.npmmirror.com 2、自定義模塊401 {"msg"…