Docker搭建Mysql8的主從復(fù)制實(shí)例代碼
通過(guò)Docker部署Mysql主從復(fù)制,Docker安裝在前篇有,直接演示:
拉取鏡像
# 獲取有哪些鏡像 docker search mysql # 拉取MySQL鏡像 docker pull mysql:8.0.32 # 查看鏡像 docker images
主節(jié)點(diǎn)的配置
創(chuàng)建數(shù)據(jù)存儲(chǔ)目錄
mkdir -p /docker/mysql/master/data
創(chuàng)建日志目錄
mkdir -p /docker/mysql/master/logs
創(chuàng)建配置文件目錄
mkdir -p /docker/mysql/master/conf
進(jìn)行快速啟動(dòng) - 查看鏡像是否有問(wèn)題 注:不同的版本的配置文件位置不同,可通過(guò)快速創(chuàng)建,查看mysql的對(duì)應(yīng)的配置文件位置,進(jìn)行對(duì)應(yīng)映射。
# 快速啟動(dòng) -d是進(jìn)行守護(hù)進(jìn)程啟動(dòng) docker run -p 3306:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.32 # 啟動(dòng)成功后,進(jìn)入容器內(nèi)部拷貝配置文件,到宿主主機(jī) docker cp mysql8:/etc/mysql /docker/mysql/master/conf # 刪除剛才的容器,重新創(chuàng)建容器 docker stop mysql8 docker rm mysql8
運(yùn)行容器
docker run -p 3340:3306 --name mysql_master --privileged=true \ -v /docker/mysql/master/conf:/etc/mysql/conf.d \ -v /docker/mysql/master/logs:/var/log/mysql \ -v /docker/mysql/master/data:/var/lib/mysql \ -v /etc/localtime:/etc/localtime \ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.32 --init-connect="SET collation_connection=utf8mb4_0900_ai_ci" --init-connect="SET NAMES utf8mb4" --skip-character-set-client-handshake
進(jìn)入容器
docker ps -a docker exec -it mysql_master /bin/bash docker exec -it mysql_master env LANG=C.UTF-8 /bin/bash # 進(jìn)入容器,這種進(jìn)入避免顯示中午亂碼 # 打開(kāi)MySQL,輸入密碼 mysql -uroot -p # 查看數(shù)據(jù)庫(kù) show databases; # 創(chuàng)建數(shù)據(jù)庫(kù) create database 數(shù)據(jù)庫(kù); # 如果遠(yuǎn)程鏈接失敗,可以修改默認(rèn)密碼校驗(yàn)方式(第三方工具可以連接上) ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密碼';
配置遠(yuǎn)程連接(對(duì)外連接的)
# 在MySQL下執(zhí)行 use mysql; # 創(chuàng)建對(duì)外訪問(wèn)的用戶和權(quán)限 CREATE USER '用戶名'@'%' IDENTIFIED WITH mysql_native_password BY '密碼'; # 授權(quán)全部的權(quán)限(范圍大) # GRANT ALL ON *.* TO '用戶名'@'%' WITH GRANT OPTION; # 刷新權(quán)限 FLUSH PRIVILEGES; # 退出 exit
創(chuàng)建自定義的配置文件(主服務(wù)器配置文件)
cd /docker/mysql/master/conf touch my.cnf
my.cnf文件內(nèi)容:
[client] # mysql客戶端默認(rèn)字符集 default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] # 跳過(guò)密碼登錄 #skip-grant-tables #bind-address = 127.0.0.1 init_connect='SET collation_connection = utf8mb4_general_ci' init_connect='SET NAMES utf8mb4' # mysql服務(wù)端默認(rèn)字符集 character-set-server=utf8mb4 collation-server=utf8mb4_general_ci skip-character-set-client-handshake # datadir=/var/lib/mysql # 主服務(wù)器唯一ID 默認(rèn)是1 server-id=1 # 設(shè)置不要復(fù)制的數(shù)據(jù)庫(kù) binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema # 設(shè)置需要復(fù)制的數(shù)據(jù)庫(kù)(先創(chuàng)建好) binlog-do-db=數(shù)據(jù)庫(kù)名 # 啟用二進(jìn)制日志,日志的存放地址(默認(rèn)是binlog),就是在show master status;看到Filed名字 log-bin=/var/lib/mysql/mysql-bin # 主機(jī),1 只讀 0 讀寫(xiě)(默認(rèn)是0) read-only=0 # 設(shè)置logbin格式 有3種格式 # STATEMENT(函數(shù)支持不好) 寫(xiě)指令,會(huì)出現(xiàn)主從數(shù)據(jù)不同步,now()函數(shù) # ROW(行模式大量修改效率不行,但支持存儲(chǔ)引擎) - 默認(rèn)的 # MIXED (綜合,推薦) binlog_format=mixed ## 跳過(guò)主從復(fù)制中遇到的所有錯(cuò)誤或指定類型的錯(cuò)誤,避免slave端復(fù)制中斷。 ## 如:1062錯(cuò)誤是指一些主鍵重復(fù),1032錯(cuò)誤是因?yàn)橹鲝臄?shù)據(jù)庫(kù)數(shù)據(jù)不一致 slave_skip_errors=1062 # 二進(jìn)制日志過(guò)期清理時(shí)間,默認(rèn)是0(不自動(dòng)清理) expire_logs_days=7 # 單個(gè)二進(jìn)制日志大小 max_binlog_size=200M # 設(shè)置每隔多少次事務(wù)提交操作,將這些操作寫(xiě)入二進(jìn)制日志文件 sync_binlog=1 # 使用mysql_native_password插件的認(rèn)證 # default_authentication_plugin=mysql_native_password
重啟mysql容器
docker ps -a docker restart 容器id
創(chuàng)建用戶并授權(quán)給從機(jī)
主機(jī)創(chuàng)建用戶:
# 連接上Mysql服務(wù),執(zhí)行 create user '用戶名'@'%' identified with mysql_native_password by '密碼'; # 授權(quán)復(fù)制的權(quán)限 ON后的*.*代表全部的庫(kù)和表 GRANT REPLICATION SLAVE ON *.* TO '用戶名'@'%'; # 刷新權(quán)限 FLUSH PRIVILEGES; # 如果遠(yuǎn)程鏈接失敗,可以修改默認(rèn)密碼校驗(yàn)方式(第三方工具可以連接上) alter user '用戶名'@'%' identified with mysql_native_password by '密碼';
查詢主機(jī)的狀態(tài):
show master status; # 執(zhí)行上面命令,得到 File(binlog日志) Position(接入點(diǎn)) Binlog_Do_DB(要復(fù)制的數(shù)據(jù)庫(kù)) Binlog_IgnoreDB() # 需要記錄一下File、Position
從節(jié)點(diǎn)配置
創(chuàng)建數(shù)據(jù)目錄
mkdir -p /docker/mysql/slave/data
創(chuàng)建日志目錄
mkdir -p /docker/mysql/slave/logs
創(chuàng)建配置文件目錄
mkdir -p /docker/mysql/slave/conf
創(chuàng)建自定義的配置文件
cd /docker/mysql/slave/conf touch my.cnf
mysql.cnf文件內(nèi)容:
[client] # mysql客戶端默認(rèn)字符集 default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] # 跳過(guò)密碼登錄 #skip-grant-tables #bind-address = 127.0.0.1 init_connect='SET collation_connection = utf8mb4_general_ci' init_connect='SET NAMES utf8mb4' # mysql服務(wù)端默認(rèn)字符集 character-set-server=utf8mb4 collation-server=utf8mb4_general_ci skip-character-set-client-handshake # datadir=/var/lib/mysql # 從服務(wù)器唯一ID server-id = 2 # 開(kāi)啟中繼日志 relay-log=mysql-relay # 從機(jī),1 只讀 0 讀寫(xiě)(默認(rèn)是0) read-only=1 # 啟用二進(jìn)制日志,日志的存放地址,如果從機(jī)變成主機(jī)可以繼續(xù)使用bin日志 # log-bin=mysql-slave-bin # 使用mysql_native_password插件的認(rèn)證 # default_authentiction_plugin=mysql_native_password
運(yùn)行容器
docker run -p 3341:3306 --name mysql_slave --privileged=true \ -v /docker/mysql/slave/conf:/etc/mysql/conf.d \ -v /docker/mysql/slave/logs:/var/log/mysql \ -v /docker/mysql/slave/data:/var/lib/mysql \ -v /etc/localtime:/etc/localtime \ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.32 --init-connect="SET collation_connection=utf8mb4_0900_ai_ci" --init-connect="SET NAMES utf8mb4" --skip-character-set-client-handshake
進(jìn)入容器
docker ps -a docker exec -it mysql_slave /bin/bash
配置遠(yuǎn)程連接(對(duì)外連接的)
# 打開(kāi)MySQL,輸入密碼 mysql -uroot -p # 查看數(shù)據(jù)庫(kù) show databases; # 創(chuàng)建數(shù)據(jù)庫(kù) create database 數(shù)據(jù)庫(kù); # 查看數(shù)據(jù)庫(kù) # 在MySQL下執(zhí)行 use mysql; # 創(chuàng)建對(duì)外訪問(wèn)的用戶和權(quán)限 CREATE USER '用戶名'@'%' IDENTIFIED BY '密碼'; GRANT ALL ON *.* TO '用戶名'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; # 退出 exit
設(shè)置同步信息
# 停止同步(之前配置過(guò),需要執(zhí)行) stop slave; # 設(shè)置同步 CHANGE MASTER TO MASTER_HOST='主機(jī)IP地址', MASTER_PORT=端口, MASTER_USER='主機(jī)用戶',MASTER_PASSWORD='主機(jī)用戶的密碼', MASTER_LOG_FILE='binlog日志名字', MASTER_CONNECT_RETRY=30, MASTER_LOG_POS=具體的接入點(diǎn)值; # MASTER_CONNECT_RETRY 是如果連接失敗,重試時(shí)間間隔,默認(rèn)60秒
如果操作失敗,需要重新配置,執(zhí)行下面2個(gè)命令
stop slave; # 停止同步操作 reset master; # 重置主從配置,刪除之前的中繼日志,會(huì)再生成一份新的
開(kāi)始同步
start slave;
檢查是否成功
show slave status \G; # 檢查狀態(tài) # 如果結(jié)果下面的字段為Yes 代表配置成功 - Slave_IO_Running: Yes - Slave_SQL_Running: Yes
停止和重置
# 從機(jī)上執(zhí)行,停止I/O 線程和SQL線程的操作 stop slave; # 從機(jī)上執(zhí)行,用于刪除SLAVE數(shù)據(jù)庫(kù)的relaylog日志文件,并重新啟用新的relaylog文件 reset slave; # 主機(jī)上執(zhí)行,刪除所有的binglog日志文件,并將日志索引文件清空,重新開(kāi)始所有新的日志文件 reset master;
驗(yàn)證
# 從主機(jī)上,創(chuàng)建表、插入SQL語(yǔ)句 # 創(chuàng)建表 CREATE TABLE `emp` ( `id` int(11) NOT NULL COMMENT '主鍵', `name` varchar(255) DEFAULT NULL COMMENT '員工名', `age` int(11) DEFAULT NULL COMMENT '年齡', `did` int(11) DEFAULT NULL COMMENT '部門id', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='部門表'; INSERT INTO emp (`id`, `name`, `age`, `did`) VALUES (1, '劉備', 55, 1); # 分別 在主機(jī)和從機(jī)進(jìn)行查詢?cè)揝QL語(yǔ)句 select * from emp; # 如:都看到相同的數(shù)據(jù),代表成功
常見(jiàn)問(wèn)題
啟動(dòng)主從同步后,常見(jiàn)錯(cuò)誤是Slave_IO_Running: No 或者 Connecting 的情況,此時(shí)查看下方的 Last_IO_ERROR錯(cuò)誤日志,根據(jù)日志中顯示的錯(cuò)誤信息在網(wǎng)上搜索解決方案即可
一 常見(jiàn)錯(cuò)誤:
`Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from position > file size'`
解決:
-- 在從機(jī)停止slave SLAVE STOP; -- 在主機(jī)查看mater狀態(tài) SHOW MASTER STATUS; -- 在主機(jī)刷新日志 FLUSH LOGS; -- 再次在主機(jī)查看mater狀態(tài)(會(huì)發(fā)現(xiàn)File和Position發(fā)生了變化) SHOW MASTER STATUS; -- 修改從機(jī)連接主機(jī)的SQL,并重新連接即可
二:?jiǎn)?dòng)docker容器后提示 WARNING: IPv4 forwarding is disabled. Networking will not work.
解決:
#修改配置文件: vim /usr/lib/sysctl.d/00-system.conf #追加 net.ipv4.ip_forward=1 #接著重啟網(wǎng)絡(luò) systemctl restart network
總結(jié)
到此這篇關(guān)于Docker搭建Mysql8主從復(fù)制的文章就介紹到這了,更多相關(guān)Docker搭建Mysql8主從復(fù)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL?Flink實(shí)時(shí)流處理的核心技術(shù)之窗口機(jī)制
Flink是一款流處理框架,窗口機(jī)制是其核心技術(shù)之一。Flink的窗口機(jī)制可以將無(wú)限的數(shù)據(jù)流劃分為有限的窗口,并對(duì)窗口內(nèi)的數(shù)據(jù)進(jìn)行處理。Flink的窗口機(jī)制支持時(shí)間、計(jì)數(shù)、會(huì)話等多種窗口類型,并且可以在不同的窗口之間進(jìn)行流轉(zhuǎn)換和數(shù)據(jù)聚合,是實(shí)時(shí)流處理中非常重要的技術(shù)2023-05-05
MySQL解析器的擴(kuò)展開(kāi)發(fā)案例分析:從理論到實(shí)踐
本文介紹了MySQL解析器擴(kuò)展開(kāi)發(fā)策略,包括擴(kuò)展機(jī)制、實(shí)現(xiàn)方法及在實(shí)際項(xiàng)目中的應(yīng)用,詳細(xì)說(shuō)明了每種方式的具體步驟,通過(guò)案例分析,展示了金融系統(tǒng)、電商系統(tǒng)和多租戶系統(tǒng)的擴(kuò)展實(shí)現(xiàn)2026-04-04
MySQL安全模式下創(chuàng)建賬號(hào)的操作指南
MySQL 的安全模式通常指在跳過(guò)權(quán)限驗(yàn)證或限制特定功能的狀態(tài)下啟動(dòng)數(shù)據(jù)庫(kù),常用于管理員密碼遺忘、權(quán)限損壞等緊急維護(hù)場(chǎng)景,本文給大家介紹了如何在MySQL安全模式下創(chuàng)建賬號(hào),需要的朋友可以參考下2026-05-05
數(shù)據(jù)庫(kù)mysql的四種安裝方式(非常全面?。?/a>
這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫(kù)mysql的四種安裝方式,文中通過(guò)圖文以及代碼介紹的非常詳細(xì),不論你是初學(xué)者還是有經(jīng)驗(yàn)的開(kāi)發(fā)者,都希望你能從這個(gè)教程中收獲知識(shí)與樂(lè)趣,需要的朋友可以參考下2024-02-02

