MySQL主從復(fù)制有那些好處
1、做數(shù)據(jù)的熱備亿傅,作為后備數(shù)據(jù)庫媒峡,主數(shù)據(jù)庫服務(wù)器故障后,可切換到從數(shù)據(jù)庫繼續(xù)工作葵擎,避免數(shù)據(jù)丟失谅阿。
2酬滤、架構(gòu)的擴展签餐。業(yè)務(wù)量越來越大,I/O訪問頻率過高盯串,單機無法滿足氯檐,此時做多庫的存儲,降低磁盤I/O訪問的頻率体捏,提高單個機器的I/O性能冠摄。
3、讀寫分離几缭,使數(shù)據(jù)庫能支撐更大的并發(fā)河泳。
MySQL復(fù)制過程
master將改變記錄到二進制日志(binary log)。這些記錄過程叫做二進制日志事件奏司,binary log events乔询;
slave將master的binary log events拷貝到它的中繼日志(relay log)樟插;
slave重做中繼日志中的事件韵洋,將改變應(yīng)用到自己的數(shù)據(jù)庫中。MySQL復(fù)制是異步的且串行化的
操作之前需要注意的地方
- master和slave都在一臺linux上黄锤,IP是192.168.10.11
- master 端口為33065搪缨;slave端口為33066
- 工程目錄是 /data/docker/mysql
- 默認創(chuàng)建了test庫
- 兩個mysql的賬號密碼均為 root
- 我這里使用的mysql版本是mysql5.7
搭建過程
1、目錄結(jié)構(gòu)
2鸵熟、編輯 docker-compose.yml
version: '2'
services:
mysql-master:
image: "docker.io/mysql:5.7"
environment:
- "MYSQL_ROOT_PASSWORD=root"
- "MYSQL_DATABASE=test"
volumes:
- "./master/data:/var/lib/mysql"
- "./master/my.cnf:/etc/mysql/my.cnf"
links:
- mysql-slave
ports:
- "33065:3306"
restart: always
hostname: mysql-master
mysql-slave:
image: "docker.io/mysql:5.7"
environment:
- "MYSQL_ROOT_PASSWORD=root"
- "MYSQL_DATABASE=test"
volumes:
- "./slave/data:/var/lib/mysql"
- "./slave/my.cnf:/etc/mysql/my.cnf"
ports:
- "33066:3306"
restart: always
hostname: mysql-slave
3副编、編輯master的配置文件
vi /data/docker/mysql/master/my.cnf
binlog-do-db=test 指定需要主從備份的數(shù)據(jù)庫為test庫
[mysqld]
## server_id,一般設(shè)置為IP流强,注意要唯一
server_id=1
log_bin=mysql-bin
## 需要主從復(fù)制的數(shù)據(jù)庫
binlog-do-db=test
## 復(fù)制過濾:也就是指定哪個數(shù)據(jù)庫不用同步(mysql庫一般不同步)
binlog-ignore-db=mysql
## 為每個session分配的內(nèi)存痹届,在事務(wù)過程中用來存儲二進制日志的緩存
binlog_cache_size=1M
## 主從復(fù)制的格式(mixed,statement,row呻待,默認格式是statement。建議是設(shè)置為row队腐,主從復(fù)制時數(shù)據(jù)更加能夠統(tǒng)一)
binlog_format=row
## 二進制日志自動刪除/過期的天數(shù)蚕捉。默認值為0,表示不自動刪除柴淘。
expire_logs_days=7
## 跳過主從復(fù)制中遇到的所有錯誤或指定類型的錯誤迫淹,避免slave端復(fù)制中斷。
## 如:1062錯誤是指一些主鍵重復(fù)为严,1032錯誤是因為主從數(shù)據(jù)庫數(shù)據(jù)不一致
slave_skip_errors=1062
4敛熬、編輯slave的配置文件
vi /data/docker/mysql/slave/my.cnf
binlog-do-db=test 指定需要主從備份的數(shù)據(jù)庫為test庫
[mysqld]
## 設(shè)置server_id,一般設(shè)置為IP第股,注意要唯一
server_id=2
## 需要主從復(fù)制的數(shù)據(jù)庫
replicate-do-db=test
## 復(fù)制過濾:也就是指定哪個數(shù)據(jù)庫不用同步(mysql庫一般不同步)
binlog-ignore-db=mysql
## 開啟二進制日志功能应民,以備Slave作為其它Slave的Master時使用
log_bin = mysql-bin
## 為每個session 分配的內(nèi)存,在事務(wù)過程中用來存儲二進制日志的緩存
binlog_cache_size=1M
## 主從復(fù)制的格式(mixed,statement,row炸茧,默認格式是statement)
binlog_format=row
## 二進制日志自動刪除/過期的天數(shù)瑞妇。默認值為0,表示不自動刪除梭冠。
expire_logs_days=7
## 跳過主從復(fù)制中遇到的所有錯誤或指定類型的錯誤辕狰,避免slave端復(fù)制中斷。
## 如:1062錯誤是指一些主鍵重復(fù)控漠,1032錯誤是因為主從數(shù)據(jù)庫數(shù)據(jù)不一致
slave_skip_errors=1062
## relay_log配置中繼日志
relay_log=replicas-mysql-relay-bin
## log_slave_updates表示slave將復(fù)制事件寫進自己的二進制日志
log_slave_updates=1
## 防止改變數(shù)據(jù)(除了特殊的線程)
read_only=1
5蔓倍、設(shè)置目錄文件權(quán)限
在/data/docker/mysql下執(zhí)行授權(quán)
chmod 644 -R *
6、啟動mysql服務(wù)
docker-compose up
啟動成功盐捷!
7偶翅、在master里準備數(shù)據(jù),創(chuàng)建test表碉渡;并插入三條數(shù)據(jù)
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(11) NOT NULL COMMENT 'id',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (1);
INSERT INTO `test` VALUES (2);
INSERT INTO `test` VALUES (3);
SET FOREIGN_KEY_CHECKS = 1;
8聚谁、在master中查看binlog的版本參數(shù)
show master status;
File 和 Position兩個參數(shù)會在下面用到
9、在slave中執(zhí)行命令
change master to master_host='192.168.10.11',master_port=33065,master_user='root',master_password='root',master_log_file='mysql-bin.000003',master_log_pos=1259;
- master_host master的ip
- master_port master的端口
- master_user master 用戶名
- master_password master 密碼
- master_log_file master中此時的File 參數(shù)
- master_log_pos master中此時的Position 參數(shù)
salve中啟動主從復(fù)制
start slave;
查看從機的復(fù)制狀態(tài)
show slave status;
Waiting for master to send event 即等待主服務(wù)器發(fā)送事件滞诺;現(xiàn)在到master里新增一條記錄
下面兩個參數(shù)都是YES形导,則說明主從配置成功!Slave_IO_Running:Yes和Slave_SQL_Running:Yes
INSERT INTO `test`.`test`(`id`) VALUES (4);
slave再次執(zhí)行
show slave status;
提示slave中test表不存在习霹,難道m(xù)ysql在主從復(fù)制過程中只是同步變更朵耕,而之前master中已經(jīng)存在的表結(jié)構(gòu)和表數(shù)據(jù)不會被同步?那么就先將master中的表結(jié)構(gòu)和數(shù)據(jù)一起復(fù)制到slave中淋叶,然后進行insert:
同步成功Q植堋!
10、同步停止方式
slave 中執(zhí)行
stop slave;
注意事項
1处嫌、在停止一次主從復(fù)制后如果需要再次啟用栅贴,需要再次到master中執(zhí)行show master status; 生成最新的File 和 Position
2、開啟同步后熏迹,master中已經(jīng)存在的表結(jié)構(gòu)和表數(shù)據(jù)不會被同步到slave中筹误;將master中的數(shù)據(jù)遷移至slave,之后就可以實現(xiàn)同步了