MySQL 主从复制部署及验证

MySQL 主从复制部署指南

​ MySQL 主从复制是一种常见的数据复制技术,允许数据从一个 MySQL 数据库服务器(主服务器)复制到一个或多个 MySQL 数据库服务器(从服务器)。

部署步骤

1.环境准备

  • 至少两台服务器(一台主,一台或多台从)
  • 相同版本的 MySQL 服务器(建议 5.7+)
  • 网络互通,防火墙开放 3306 端口

2. 主服务器配置

编辑主服务器的 MySQL 配置文件(通常为 /etc/my.cnf/etc/mysql/my.cnf):

ini配置

mysql配置 复制代码
[mysqld]
server-id = 1                # 唯一服务器ID,主从不能相同
log_bin = mysql-bin          # 启用二进制日志
binlog_format = ROW          # 推荐使用ROW格式
binlog_do_db = your_database # 可选,指定要复制的数据库
# 如果需要复制所有数据库,可以省略 binlog_do_db

重启 MySQL 服务:

shell 复制代码
systemctl restart mysqld

3. 创建复制用户

在主服务器上登录 MySQL,创建用于复制的用户:

sql 复制代码
CREATE USER 'repl'@'%' IDENTIFIED BY 'iflytek';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

4. 获取主服务器状态

在主服务器上执行:

sql 复制代码
SHOW MASTER STATUS;

记录 File 和 Position 值,从服务器配置时需要。

5. 从服务器配置

编辑从服务器的 MySQL 配置文件:

ini配置

sql 复制代码
[mysqld]
server-id = 2                # 不同于主服务器的唯一ID
relay-log = mysql-relay-bin  # 启用中继日志
read_only = 1                # 从服务器设为只读(可选)
sql 复制代码
CHANGE MASTER TO
MASTER_HOST='192.168.56.101',
MASTER_USER='repl',
MASTER_PASSWORD='iflytek',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=747;
mysql配置 复制代码
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='记录的文件名',
MASTER_LOG_POS=记录的位置值;

重启 MySQL 服务:

shell 复制代码
systemctl restart mysqld

6. 配置从服务器连接主服务器

在从服务器上登录 MySQL,执行sql:

sql 复制代码
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='记录的文件名',
MASTER_LOG_POS=记录的位置值;

然后启动复制:

sql

sql 复制代码
START SLAVE;

7. 检查复制状态

在从服务器上执行:

sql

sql 复制代码
SHOW SLAVE STATUS\G

检查 Slave_IO_RunningSlave_SQL_Running 是否都为 Yes

MYSQL主从部署验证

学校管理数据库创建脚本

以下是完整的 SQL 脚本,用于创建学校管理数据库、学生表、老师表和班级表,并为每个表插入三条示例数据:

sql

复制代码
-- 创建数据库
CREATE DATABASE IF NOT EXISTS school_db;
USE school_db;

-- 创建老师表
CREATE TABLE teachers (
    teacher_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    subject VARCHAR(50) NOT NULL,
    hire_date DATE
);

-- 插入老师数据
INSERT INTO teachers (name, subject, hire_date) VALUES
('张老师', '数学', '2018-03-15'),
('李老师', '语文', '2016-09-01'),
('王老师', '英语', '2020-11-22');

-- 创建班级表
CREATE TABLE classes (
    class_id INT AUTO_INCREMENT PRIMARY KEY,
    class_name VARCHAR(50) NOT NULL,
    grade_level VARCHAR(20) NOT NULL,
    head_teacher_id INT,
    FOREIGN KEY (head_teacher_id) REFERENCES teachers(teacher_id)
);

-- 插入班级数据
INSERT INTO classes (class_name, grade_level, head_teacher_id) VALUES
('高一(1)班', '高一', 1),
('高二(3)班', '高二', 2),
('高三(2)班', '高三', 3);

-- 创建学生表
CREATE TABLE students (
    student_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender ENUM('男', '女') NOT NULL,
    birth_date DATE,
    class_id INT,
    FOREIGN KEY (class_id) REFERENCES classes(class_id)
);

-- 插入学生数据
INSERT INTO students (name, gender, birth_date, class_id) VALUES
('张三', '男', '2007-05-12', 1),
('李四', '男', '2006-11-30', 1),
('王小红', '女', '2007-02-18', 1),
('赵明', '男', '2006-08-22', 2),
('钱芳', '女', '2006-04-05', 2),
('孙莉', '女', '2006-09-15', 2),
('周杰', '男', '2005-12-03', 3),
('吴婷', '女', '2005-07-19', 3),
('郑浩', '男', '2005-10-28', 3);

表结构说明

1. 老师表 (teachers)

字段名 类型 描述
teacher_id INT 老师ID(主键)
name VARCHAR(50) 老师姓名
subject VARCHAR(50) 教学科目
hire_date DATE 入职日期

2. 班级表 (classes)

字段名 类型 描述
class_id INT 班级ID(主键)
class_name VARCHAR(50) 班级名称
grade_level VARCHAR(20) 年级(高一/高二/高三)
head_teacher_id INT 班主任ID(外键)

3. 学生表 (students)

字段名 类型 描述
student_id INT 学生ID(主键)
name VARCHAR(50) 学生姓名
gender ENUM('男','女') 性别
birth_date DATE 出生日期
class_id INT 所在班级ID(外键)

数据查询示例

1. 查询所有老师

sql

复制代码
SELECT * FROM teachers;

2. 查询所有班级及其班主任

sql

复制代码
SELECT c.class_id, c.class_name, c.grade_level, t.name AS head_teacher
FROM classes c
JOIN teachers t ON c.head_teacher_id = t.teacher_id;

3. 查询高一(1)班的所有学生

sql

复制代码
SELECT s.student_id, s.name, s.gender, s.birth_date
FROM students s
JOIN classes c ON s.class_id = c.class_id
WHERE c.class_name = '高一(1)班';

4. 查询各班级学生人数

sql

复制代码
SELECT c.class_name, COUNT(s.student_id) AS student_count
FROM classes c
LEFT JOIN students s ON c.class_id = s.class_id
GROUP BY c.class_id;

这个数据库设计包含了基本的学校管理实体(学生、老师、班级)之间的关系,并提供了示例数据。您可以根据实际需求扩展更多字段或表,如课程表、成绩表等。

相关推荐
jiunian_cn25 分钟前
【Redis】hash数据类型相关指令
数据库·redis·哈希算法
冉冰学姐39 分钟前
SSM在线影评网站平台82ap4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm框架·在线影评平台·影片分类
Exquisite.2 小时前
企业高性能web服务器(4)
运维·服务器·前端·网络·mysql
知识分享小能手2 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019数据库的操作(2)
数据库·学习·sqlserver
踩坑小念3 小时前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀
萧曵 丶3 小时前
MySQL 语句书写顺序与执行顺序对比速记表
数据库·mysql
Wiktok4 小时前
MySQL的常用数据类型
数据库·mysql
曹牧4 小时前
Oracle 表闪回(Flashback Table)
数据库·oracle
J_liaty4 小时前
Redis 超详细入门教程:从零基础到实战精通
数据库·redis·缓存
m0_706653235 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python