MySQL9.1.0實(shí)現(xiàn)最基礎(chǔ)主從復(fù)制的步驟
1 實(shí)驗(yàn)介紹
本次實(shí)驗(yàn) 使用 docker 鏡像,開啟三個容器,實(shí)現(xiàn)一主兩從。
| 容器主機(jī) | IP地址 | 映射主機(jī)端口 |
|---|---|---|
| mysql-master | 192.168.1.2 | 3306 |
| mysql-slave1 | 192.168.1.3 | 3307 |
| mysql-slave2 | 192.168.1.4 | 3308 |
2 實(shí)驗(yàn)準(zhǔn)備
2.1 創(chuàng)建目錄為MySQL掛載使用
使用 docker 做MySQL這一種有狀態(tài)的,需要很好的保持?jǐn)?shù)據(jù)的可靠性,所以得使用宿主機(jī)掛載到容器內(nèi)
[root@chucong mysql_zhucong]# tree /data/ -L 3
/data/
├── master # master的目錄
│ ├── conf # 配置文件存放目錄
│ │ └── my.cnf # 配置文件
│ └── master-data # 存放數(shù)據(jù)的地方
├── slave1
│ ├── conf
│ │ └── my.cnf
│ └── slave1-data
└── slave2
├── conf
│ └── my.cnf
└── slave2-data
?
# MySQL 配置文件
[root@chucong mysql_zhucong]# cat /data/master/conf/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log_bin=mysql-bin # 開啟bin-log日志,注意只有主配置文件需開啟
server_id=10
#gtid_mode=ON # 開啟GTID
#enforce-gtid-consistency=ON # 保證GTID的強(qiáng)一致性 ?
?
[root@chucong mysql_zhucong]# cat /data/slave1/conf/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
server_id=20
#super_read_only=on #只讀
#gtid_mode=ON # 開啟GTID
#enforce-gtid-consistency=ON # 保證GTID的強(qiáng)一致性
?
[root@chucong mysql_zhucong]# cat /data/slave2/conf/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
server_id=30
#super_read_only=on #只讀
#gtid_mode=ON # 開啟GTID
#enforce-gtid-consistency=ON # 保證GTID的強(qiáng)一致性2.2 編寫 docker-compose.yml 文件
[root@chucong mysql_zhucong]# docker pull mysql:9.1.0
[root@chucong mysql_zhucong]# vim docker-compose.yml
version: '2.27.1'
services:
mysql-master:
image: mysql:9.1.0
container_name: mysql-master
environment: # 定義系統(tǒng)值
MYSQL_ROOT_PASSWORD: root # root密碼
MYSQL_USER: repl # 創(chuàng)建復(fù)制用戶
MYSQL_PASSWORD: root # 設(shè)置密碼
ports:
- 3306:3306
volumes:
- /data/master/master-data:/var/lib/mysql # 掛載宿主機(jī)目錄到容器
- /data/master/conf/my.cnf:/etc/my.cnf
restart: always
networks:
mynet1:
ipv4_address: 192.168.1.2
?
mysql-slave1:
image: mysql:9.1.0
container_name: mysql-slave1
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: repl
MYSQL_PASSWORD: root
ports:
- 3307:3306
volumes:
- /data/slave1/slave1-data:/var/lib/mysql # 掛載宿主機(jī)目錄到容器
- /data/slave1/conf/my.cnf:/etc/my.cnf
restart: always
networks:
mynet1:
ipv4_address: 192.168.1.3
?
mysql-slave2:
image: mysql:9.1.0
container_name: mysql-slave2
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: repl
MYSQL_PASSWORD: root
ports:
- 3308:3306
volumes:
- /data/slave2/slave2-data:/var/lib/mysql # 掛載宿主機(jī)目錄到容器
- /data/slave2/conf/my.cnf:/etc/my.cnf
restart: always
networks:
mynet1:
ipv4_address: 192.168.1.4
?
networks:
mynet1: # 使用自定義橋接模式
driver: bridge
ipam:
config:
- subnet: 192.168.1.0/24 # 定義網(wǎng)段
gateway: 192.168.1.1 # 定義網(wǎng)關(guān)2.3 啟動容器
[root@chucong zhucong]# docker compose up -d # 查看容器是否運(yùn)行 [root@chucong zhucong]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e5776a980697 mysql:9.1.0 "docker-entrypoint.s…" 59 minutes ago Up 43 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql-slave1 0bb3a700077c mysql:9.1.0 "docker-entrypoint.s…" 59 minutes ago Up 43 minutes 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp mysql-slave2 af2f63aa00e8 mysql:9.1.0 "docker-entrypoint.s…" 59 minutes ago Up 4 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-master
3 主從復(fù)制操作
3.1 MASTER 操作指令
[root@chucong mysql_zhucong]# docker exec -it mysql-master bash
bash-5.1# mysql -uroot -proot
?
?
# 假如說沒有設(shè)置變量自動創(chuàng)建可以手動創(chuàng)建,設(shè)置了可以省略以下命令
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'root';
?
# 賦予所有庫所有表 repl 用戶 REPLICATION SLAVE 的權(quán)限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql> FLUSH PRIVILEGES;
?
mysql> SHOW BINARY LOG STATUS\G # 與過往版本不一樣了,以前為 SHOW MASTER status\G
*************************** 1. row ***************************
File: mysql-bin.000034 # 注意此處的
Position: 198 # 還有此出處,這兩行在從庫操作的時候有至關(guān)重要的作用
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: d83de5a7-b723-11ef-a65b-0242c0a80104:1-2
1 row in set (0.00 sec)3.2 SLAVE1 操作指令
[root@chucong mysql_zhucong]# docker exec -it mysql-slave1 bash
bash-5.1# mysql -uroot -proot
?
# 假如說沒有設(shè)置變量自動創(chuàng)建可以手動創(chuàng)建,設(shè)置了可以省略以下命令
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'root';
?
# 以下這整條命令也是發(fā)生了巨大的改變,并且不需要指定端口了
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.2', # MASTER 的 IP
SOURCE_USER='repl', # 創(chuàng)建的用戶
SOURCE_PASSWORD='root', # 密碼
SOURCE_LOG_FILE='mysql-bin.000034', # 為主庫使用 SHOW BINARY LOG STATUS\G 中的File值
GET_SOURCE_PUBLIC_KEY=1, # 此處注意 自動獲取主服務(wù)器的公鑰(適用于caching_sha2_password)
SOURCE_LOG_POS=198; # 為主庫使用 SHOW BINARY LOG STATUS\G 中的Position值
?
# 舊版本的命令如下,可指定端口
# mysql> CHANGE MASTER TO
# -> MASTER_HOST='192.168.1.2',
# -> MASTER_PORT=3306,
# -> MASTER_USER='repl',
# -> MASTER_PASSWORD='root',
# -> MASTER_LOG_FILE='mysql-bin.000034',
# -> MASTER_LOG_POS=198;
?
?
?
mysql> START REPLICA; # 啟動復(fù)制 9.1.0 變化的命令 以前版本為 START SLAVE;
mysql> SHOW REPLICA STATUS; # 啟動復(fù)制 9.1.0 變化的命令 以前版本為 SHOW SLAVE STATUS;
?
mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************
Replica_IO_State: Waiting for source to send event
Source_Host: 192.168.1.2
Source_User: repl
Source_Port: 3306
Connect_Retry: 60
Source_Log_File: mysql-bin.000034
Read_Source_Log_Pos: 7061047
Relay_Log_File: e5776a980697-relay-bin.000002
Relay_Log_Pos: 7061177
Relay_Source_Log_File: mysql-bin.000034
Replica_IO_Running: Yes # IO 線程YES表示已經(jīng)連接成功,如果不是會顯示no或者connect
Replica_SQL_Running: Yes 3.3 SLAVE2 操作指令
[root@chucong mysql_zhucong]# docker exec -it mysql-slave2 bash
bash-5.1# mysql -uroot -proot
?
# 假如說沒有設(shè)置變量自動創(chuàng)建可以手動創(chuàng)建,設(shè)置了可以省略以下命令
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'root';
?
# 以下這整條命令也是發(fā)生了巨大的改變,并且不需要指定端口了
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.2', # MASTER 的 IP
SOURCE_USER='repl', # 創(chuàng)建的用戶
SOURCE_PASSWORD='root', # 密碼
SOURCE_LOG_FILE='mysql-bin.000034', # 為主庫使用 SHOW BINARY LOG STATUS\G 中的File值
GET_SOURCE_PUBLIC_KEY=1, # 此處注意 自動獲取主服務(wù)器的公鑰(適用于caching_sha2_password)
SOURCE_LOG_POS=198; # 為主庫使用 SHOW BINARY LOG STATUS\G 中的Position值
?
# 舊版本的命令如下,可指定端口
# mysql> CHANGE MASTER TO
# -> MASTER_HOST='192.168.1.2',
# -> MASTER_PORT=3306,
# -> MASTER_USER='repl',
# -> MASTER_PASSWORD='root',
# -> MASTER_LOG_FILE='mysql-bin.000034',
# -> MASTER_LOG_POS=198;
?
mysql> START REPLICA; # 啟動復(fù)制 9.1.0 變化的命令 以前版本為 START SLAVE;
mysql> SHOW REPLICA STATUS; # 啟動復(fù)制 9.1.0 變化的命令 以前版本為 SHOW SLAVE STATUS;
?
mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************
Replica_IO_State: Waiting for source to send event
Source_Host: 192.168.1.2
Source_User: repl
Source_Port: 3306
Connect_Retry: 60
Source_Log_File: mysql-bin.000034
Read_Source_Log_Pos: 7061047
Relay_Log_File: 0bb3a700077c-relay-bin.000002
Relay_Log_Pos: 7061177
Relay_Source_Log_File: mysql-bin.000034
Replica_IO_Running: Yes
Replica_SQL_Running: Yes4 驗(yàn)證是否實(shí)現(xiàn)主從
4.1 導(dǎo)入sql腳本查看是否正常主從復(fù)制
# MASTER [root@chucong ~]# docker cp smart_work_v3.sql mysql-master:/ Successfully copied 6.53MB to mysql-master:/ [root@chucong ~]# docker exec -it mysql-master bash bash-5.1# ls afs boot docker-entrypoint-initdb.d home lib64 mnt proc run smart_work_v3.sql sys usr bin dev etc lib media opt root sbin srv tmp var ? bash-5.1# mysql -uroot -proot mysql> CREATE DATABASE shuyan; # 創(chuàng)建數(shù)據(jù)庫 mysql> USE shuyan # 切換到數(shù)據(jù)庫 Database changed ? mysql> SOURCE smart_work_v3.sql # 導(dǎo)入sql腳本 ? mysql> SHOW TABLES; +----------------------------------------+ | Tables_in_shuyan | +----------------------------------------+ | aaa | | abi_http_log | | act_app_appdef | | act_app_databasechangelog | | act_app_databasechangeloglock | | act_app_deployment | | act_app_deployment_resource | | act_cmmn_casedef | +----------------------------------------+
4.2 檢驗(yàn)從庫是否看見復(fù)制是否成功
mysql> USE shuyan; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A ? Database changed mysql> SHOW TABLES; +----------------------------------------+ | Tables_in_shuyan | +----------------------------------------+ | aaa | | abi_http_log | | act_app_appdef | | act_app_databasechangelog | | act_app_databasechangeloglock | | act_app_deployment | | act_app_deployment_resource | | act_cmmn_casedef | | act_cmmn_databasechangelog | | act_cmmn_databasechangeloglock | | act_cmmn_deployment | +----------------------------------------+
到此這篇關(guān)于MySQL9.1.0實(shí)現(xiàn)最基礎(chǔ)主從復(fù)制的步驟的文章就介紹到這了,更多相關(guān)MySQL9.1.0 主從復(fù)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中DATE_FORMAT()函數(shù)的具體使用
本文主要介紹了MySQL中DATE_FORMAT()函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
MYSQL單表操作學(xué)習(xí)之DDL、DML及DQL語句示例
DML、DDL、DCL和DQL是數(shù)據(jù)庫中常用的四種語言,分別用于數(shù)據(jù)操作、數(shù)據(jù)定義、數(shù)據(jù)控制和數(shù)據(jù)查詢,下面這篇文章主要給大家介紹了關(guān)于MYSQL單表操作學(xué)習(xí)之DDL、DML及DQL語句的相關(guān)資料,需要的朋友可以參考下2024-03-03
MYSQL常用字符串函數(shù)和時間函數(shù)示例詳解
字符串函數(shù)是最常用的的一種函數(shù),在一個具體應(yīng)用中通常會綜合幾個甚至幾類函數(shù)來實(shí)現(xiàn)相應(yīng)的應(yīng)用,這篇文章主要介紹了MYSQL常用字符串函數(shù)和時間函數(shù)的相關(guān)資料,需要的朋友可以參考下2025-07-07
在CentOS上運(yùn)行MySQL報(bào)錯Too many connections(連接數(shù)打滿)的解決方案
在CentOS服務(wù)器上運(yùn)維MySQL時,經(jīng)常會遇到 Too many connections 報(bào)錯,尤其是通過 mysqld_safe 腳本啟動、而非系統(tǒng) systemctl 管理的MySQL實(shí)例,本文結(jié)合實(shí)際運(yùn)維場景,詳細(xì)講解該報(bào)錯的原因、應(yīng)急解決步驟、永久優(yōu)化方案,需要的朋友可以參考下2026-03-03

