文章目錄
- 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
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
4.重啟mysql容器,使配置生效
docker restart mysql-master
5.進入主mysql,創建要同步的用戶并設置權限
1.進入主mysql容器
docker exec -it mysql-master /bin/bash
2.登錄mysql(輸入啟動容器時設置的密碼)
mysql -u root -p
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'@'%';
6.開啟3307端口
1.寶塔開啟
systemctl start firewalld && firewall-cmd --permanent --add-port=3307/tcp && firewall-cmd --reload && firewall-cmd --query-port=3307/tcp
2.騰訊云安全組開啟
2.在另一臺服務器安裝docker
1.卸載舊版本的docker
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
2.安裝 gcc相關
yum -y install gcc && yum -y install gcc-c++
3.安裝yum-utils
軟件包
yum install -y yum-utils
4.docker設置阿里云的鏡像倉庫,最好不要設置國外的
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.更新yum包的索引(linux基礎,以后使用yum會快一些)
yum makecache fast
6.安裝最新版的docker
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7.啟動docker進程并查看docker是否成功啟動
systemctl start docker && ps -aux | grep docker
8.運行docker
在本地找不到,會到遠程倉庫查找鏡像
docker run hello-world
9.停止docker
systemctl stop docker && ps -aux | grep docker
10.設置docker自啟動并確認是否設置成功!
systemctl enable docker && systemctl is-enabled docker
11.阿里云鏡像加速器配置
1.找到容器鏡像服務
https://cr.console.aliyun.com/cn-beijing/instances
2.得到鏡像加速器地址
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
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
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
4.重啟mysql容器,使配置生效
docker restart mysql-slave
5.在主數據庫中查看主從復制狀態
- 這里的File就是后面主從復制的master_log_file
- 這里的Position就是后面主從復制的master_log_pos
show master status;
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.執行指令,配置主從復制
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;
2.從機讀取數據
use db01;
select * from test;
9.開啟端口3308
1.寶塔開啟
systemctl start firewalld && firewall-cmd --permanent --add-port=3308/tcp && firewall-cmd --reload && firewall-cmd --query-port=3308/tcp
2.騰訊云安全組開啟
2.使用主從復制
1.IDEA測試連接兩個數據庫的連接
1.主數據庫
2.從數據庫
2.解決中文插入失敗的問題
1.引出問題
2.主服務器中查詢編碼,發現都是latin1
show variables like 'character%';
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
5.重啟mysql容器
docker restart mysql-master
6.啟動失敗了
1.查看mysql日志
docker logs mysql-master
2.因為配置文件中指定的字符集 utf8mb4"
不正確。從錯誤信息來看,字符集名稱后面多了一個引號
3.確實多了個引號,編輯配置文件刪除引號后再次重啟,成功!
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
3.重啟服務使配置生效
docker restart mysql-slave
8.再次插入還是失敗,分別查詢一下主從數據庫的字符集
1.主數據庫
2.從數據庫
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;
2.從數據庫查詢,成功!
use db02;
select *
from test;