目录
1、按照课程演示完成tomcat部署安装和配置虚拟主机实现java程序的访问
[3、 总结关系型数据库相关概念,关系,行,列,主键,唯一键。](#3、 总结关系型数据库相关概念,关系,行,列,主键,唯一键。)
4、总结关联类型,1对1,1对多,多对多关系。可以自行设计表进行解释。
5、基于课程演示总结Mysql安装方式,并总结mysql配置文件。
6、掌握如何获取SQL命令的帮助,基于课程演示完成数据库和表的创建等
[7、完成总结DDL, DML的用法,并配上示例。](#7、完成总结DDL, DML的用法,并配上示例。)
8、总结mysql架构原理和总结myisam和Innodb存储引擎的区别。
[9.2.1redo log](#9.2.1redo log)
[9.2.2undo log](#9.2.2undo log)
12、基于课程演示完成mysql备份,完成数据库备份与恢复验证。
[13、根据课程演示完成mysql 主从和读写分离的实验过程](#13、根据课程演示完成mysql 主从和读写分离的实验过程)
1、按照课程演示完成tomcat部署安装和配置虚拟主机实现java程序的访问
1.1ubantu主机部署java环境
apt install openjdk-11-jdk -y
1.2定制环境变量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export JAVA_BIN=$JAVA_HOME/bin
export PATH=$JAVA_BIN:$PATH
1.3加载环境变量
source /etc/profile.d/java.sh
1.4获取软件
mkdir /data/softs -p; cd /data/softs
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.97/bin/apache-tomcat-9.0.97.tar.gz
链接已失效,需要自行下载安装包后上传,就算找到可用连接,下载速度也是非常慢
1.5解压软件
mkdir /data/server
1.6定制软连接
ln -s /data/server/apache-tomcat-9.0.97 /data/server/tomcat
1.7定制系统环境变量
vim /etc/profile.d/tomcat.sh
export CATALINA_BASE=/data/server/tomcat
export CATALINA_HOME=/data/server/tomcat
export CATALINA_TMPDIR=$CATALINA_HOME/temp
export CLASSPATH=$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar
export PATH=$CATALINA_HOME/bin:$PATH
加载变量
source /etc/profile.d/tomcat.sh
1.8启动tomcat
catalina.sh start

关闭tomcat
catalina.sh stop
1.9定制服务脚本
1.9.1创建用户
useradd -r -s /sbin/nologin tomcat
1.9.2赋予权限
chown -R tomcat:tomcat /data/server/tomcat
chown tomcat:tomcat -R /data/server/tomcat/*
1.9.3编写脚本
vim /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
# Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
ExecStart=/data/server/tomcat/bin/startup.sh
ExecStop=/data/server/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
1.9.4加载服务配置
systemctl daemon-reload
1.9.5启动
systemctl start tomcat
2、JVM原理总结,GC,内存分配等
2.1JVM原理
JVM,全称Java Virtual Machine,即Java虚拟机。它是一个运行在计算机上的程序,主要职责是运行Java字节码文件。
JVM是一种规范,本身是一个虚拟计算机,直接和操作系统进行交互,不直接与硬件交互。操作系统可以帮助JVM完成与硬件的交互工作。
Java借助JVM实现了平台无关性,即"write Once,Run Anywhere(编写一次,到处运行)"的跨平台特性。
2.2GC
在堆内存中如果创建的对象不再使用,仍占用着内存,此时即为垃圾,需要进行垃圾回收,从而释放内存空间给其它对象使用。
这个时候,JVM将调用垃圾回收机制来回收内存空间。 堆内存里面经常创建、销毁对象,内存也是被使用、被释放。
如果不妥善处理,一个使用频繁的进程,可能会出现虽然有足够的内存容量,但是无法分配出可用内存空间,因为没有连续成片的内存了,内存全是碎片化的空间。 所以需要有合适的垃圾回收机制,确保正常释放不再使用的内存空间,还需要保证内存空间尽可能的保持一定的连续。
2.3内存分配
优先在 Eden 区分配:大多数对象优先在新生代 Eden 区分配,当 Eden 区满时触发 Minor GC
大对象直接进入老年代:超过 -XX:PretenureSizeThreshold 阈值的对象直接分配到老年代
长期存活对象进入老年代:对象经历一定次数(默认 15 次)GC 后仍存活,晋升到老年代
动态年龄判断:Survivor 区中相同年龄对象的总大小超过 Survivor 空间的 50%,年龄≥该值的对象直接进入老年代
空间分配担保:Minor GC 前,老年代会先检查是否有足够空间容纳新生代存活对象,否则提前触发 Major GC
3、 总结关系型数据库相关概念,关系,行,列,主键,唯一键。
3.1关系型数据库
关系型数据库是基于关系模型构建的数据库,通过二维表结构组织和存储数据,以行和列的形式体现数据间的关联关系,典型代表包括 MySQL、Oracle、SQL Server 等。其核心设计思想是将现实世界中的实体及实体间关系抽象为表结构,通过结构化查询语言(SQL)进行数据操作。
3.2行
又称记录(Record),是表中的一条完整数据条目,代表一个具体的实体实例。
3.3列
又称字段(Field),是表中的一个数据维度,代表实体的某一属性。
3.4主键
用于唯一标识表中每一行的一个或多个列的组合,是表的核心约束。
3.5唯一键
确保表中某一列或列组合的值具有唯一性的约束,但允许存在一个 NULL 值(部分数据库支持)。
4、总结关联类型,1对1,1对多,多对多关系。可以自行设计表进行解释。
4.1一对一关系
表 A 中的一条记录仅对应表 B 中的一条记录
-- 用户表(user)
CREATE TABLE user (
user_id INT PRIMARY KEY, -- 主键
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL
);
-- 用户详情表(user_detail)
CREATE TABLE user_detail (
detail_id INT PRIMARY KEY,
user_id INT UNIQUE, -- 唯一外键,关联用户表
real_name VARCHAR(50),
address VARCHAR(200),
phone VARCHAR(20),
FOREIGN KEY (user_id) REFERENCES user(user_id)
);
4.2一对多关系
表 A 中的一条记录可对应表 B 中的多条记录,而表 B 中的一条记录仅对应表 A 中的一条记录
-- 部门表(department)
CREATE TABLE department (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50) NOT NULL,
location VARCHAR(100)
);
-- 员工表(employee)
CREATE TABLE employee (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50) NOT NULL,
salary DECIMAL(10, 2),
dept_id INT, -- 外键,关联部门表
FOREIGN KEY (dept_id) REFERENCES department(dept_id)
);
4.3多对多关系
表 A 中的一条记录可对应表 B 中的多条记录,反之表 B 中的一条记录也可对应表 A 中的多条记录
-- 学生表(student)
CREATE TABLE student (
student_id INT PRIMARY KEY,
student_name VARCHAR(50) NOT NULL,
grade INT
);
-- 课程表(course)
CREATE TABLE course (
course_id INT PRIMARY KEY,
course_name VARCHAR(50) NOT NULL,
teacher VARCHAR(50)
);
-- 学生选课中间表(student_course)
CREATE TABLE student_course (
student_id INT,
course_id INT,
score DECIMAL(5, 2), -- 可选:记录选课成绩
PRIMARY KEY (student_id, course_id), -- 联合主键
FOREIGN KEY (student_id) REFERENCES student(student_id),
FOREIGN KEY (course_id) REFERENCES course(course_id)
);
5、基于课程演示总结Mysql安装方式,并总结mysql配置文件。
5.1Mysql安装方式
5.1.1包管理方式安装
配置好仓库源,用包管理器进行安装
apt install mysql-server -y
5.1.2二进制源码安装
下载适合系统的二进制安装文件,创建 mysql 组和用户,解压文件并设置权限,执行mysql/bin/mysqld --initialize初始化,指定配置文件路径等,将相关文件添加为系统服务并设置开机自启动。
5.2mysql配置文件
vim /etc/my.cnf.d/mysql-clients.cn
[mysql]
# 设置mysql命令行客户端的全局选项
[mysql_upgrade]
# 用于mysql_upgrade工具的配置。mysql_upgrade用于检查并升级MySQL表的格式。
[mysqladmin]
# 为mysqladmin工具配置选项。mysqladmin用于执行管理任务,如检查服务器状态、创建和删除数据库
等。
[mysqlbinlog]
# 配置mysqlbinlog工具,它用于处理二进制日志文件,这些文件记录了数据库的所有更改。
[mysqlcheck]
# 为mysqlcheck工具设置选项,该工具用于检查、修复、优化和分析表。
[mysqldump]
# 配置mysqldump工具,它用于生成数据库的备份。
[mysqlimport]
# 为mysqlimport工具设置选项,该工具用于从文本文件导入数据到表中。
[mysqlshow]
# 配置mysqlshow工具,它用于显示数据库、表、列或索引的信息。
[mysqlslap]
# 为mysqlslap工具配置选项,该工具用于模拟和测试MySQL服务器的负载。
6、掌握如何获取SQL命令的帮助,基于课程演示完成数据库和表的创建等
6.1获取SQL命令的帮助
使用help命令
6.2完成数据库和表的创建
create database db1;
CREATE TABLE IF NOT EXISTS user (
user_id INT AUTO_INCREMENT PRIMARY KEY, -- 自增主键,唯一标识用户
username VARCHAR(50) NOT NULL UNIQUE, -- 用户名非空且唯一
password VARCHAR(100) NOT NULL, -- 密码非空
email VARCHAR(100) UNIQUE, -- 邮箱唯一(允许NULL)
phone VARCHAR(20), -- 手机号
create_time DATETIME DEFAULT CURRENT_TIMESTAMP, -- 创建时间默认当前时间
last_login_time DATETIME, -- 最后登录时间
status TINYINT DEFAULT 1 COMMENT '1=启用,0=禁用' -- 状态字段+注释
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 存储引擎+字符集
7、完成总结DDL, DML的用法,并配上示例。
7.1DDL语法
7.1.1创建
bash
-- 1.1 创建数据库
CREATE DATABASE IF NOT EXISTS mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
-- 1.2 创建表(含完整约束)
CREATE TABLE IF NOT EXISTS user (
user_id INT AUTO_INCREMENT PRIMARY KEY, -- 自增主键
username VARCHAR(50) NOT NULL UNIQUE, -- 非空唯一
password VARCHAR(100) NOT NULL, -- 非空
email VARCHAR(100) UNIQUE, -- 邮箱唯一
age TINYINT CHECK (age > 0 AND age < 150), -- 检查约束
create_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 默认当前时间
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 1.3 创建索引
CREATE INDEX idx_username ON user(username); -- 普通索引
CREATE UNIQUE INDEX uk_email ON user(email); -- 唯一索引
CREATE FULLTEXT INDEX ft_desc ON product(desc); -- 全文索引(MyISAM引擎)
-- 1.4 创建视图(虚拟表,基于查询结果)
CREATE VIEW v_active_users AS
SELECT user_id, username, age FROM user WHERE status = 1;
7.1.2修改
bash
-- 2.1 添加字段
ALTER TABLE user ADD COLUMN phone VARCHAR(20);
ALTER TABLE user ADD COLUMN address VARCHAR(200) AFTER username; -- 指定位置
-- 2.2 修改字段
ALTER TABLE user MODIFY COLUMN phone VARCHAR(25) NOT NULL; -- 修改类型和约束
ALTER TABLE user CHANGE COLUMN address user_addr VARCHAR(255); -- 修改字段名和类型
-- 2.3 删除字段
ALTER TABLE user DROP COLUMN phone;
-- 2.4 添加约束
ALTER TABLE user ADD PRIMARY KEY (user_id); -- 主键(已存在则忽略)
ALTER TABLE user ADD UNIQUE (phone); -- 唯一键
ALTER TABLE user ADD FOREIGN KEY (dept_id) REFERENCES dept(dept_id); -- 外键
-- 2.5 修改表属性
ALTER TABLE user ENGINE=InnoDB; -- 更改存储引擎
ALTER TABLE user CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 修改字符集
7.1.3删除
bash
-- 3.1 删除表
DROP TABLE IF EXISTS user; -- 删除表及数据
DROP TABLE IF EXISTS user, order_info; -- 批量删除
-- 3.2 清空表数据(保留表结构)
TRUNCATE TABLE user; -- 速度比DELETE快,不可回滚
7.2DML语法
7.2.1插入
bash
-- 1.1 插入完整记录
INSERT INTO user (username, password, email, age)
VALUES ('张三', '123456', '[email protected]', 25);
-- 1.2 批量插入
INSERT INTO user (username, password, email)
VALUES
('李四', 'abcdef', '[email protected]'),
('王五', 'qwerty', '[email protected]');
-- 1.3 从查询结果插入
INSERT INTO user (username, email, age)
SELECT username, email, age FROM old_user WHERE age > 18;
-- 1.4 插入或更新(ON DUPLICATE KEY UPDATE)
INSERT INTO user (user_id, username, email)
VALUES (1001, '赵六', '[email protected]')
ON DUPLICATE KEY UPDATE email = '[email protected]'; -- 若user_id=1001存在则更新email
7.2.2查询
bash
-- 2.1 基础查询
SELECT user_id, username, age FROM user WHERE age > 30;
-- 2.2 多表关联查询(内连接、左连接)
SELECT u.username, o.order_id, o.amount
FROM user u
JOIN order_info o ON u.user_id = o.user_id -- 内连接
LEFT JOIN order_product op ON o.order_id = op.order_id; -- 左连接
-- 2.3 分组与聚合
SELECT dept_id, COUNT(*) AS user_count, AVG(age) AS avg_age
FROM user
GROUP BY dept_id
HAVING user_count > 10 AND avg_age < 40;
-- 2.4 子查询
SELECT username, age FROM user
WHERE age > (SELECT AVG(age) FROM user); -- 查询年龄大于平均年龄的用户
7.2.3更新
bash
-- 3.1 单表更新
UPDATE user SET age = age + 1 WHERE username LIKE '张%'; -- 所有张姓用户年龄+1
UPDATE user SET email = '[email protected]' WHERE email IS NULL; -- 补全空邮箱
-- 3.2 多表关联更新
UPDATE user u
JOIN order_info o ON u.user_id = o.user_id
SET u.is_vip = 1 WHERE o.total_amount > 10000; -- 消费超1万的用户设为VIP
7.2.4删除
bash
-- 4.1 单表删除
DELETE FROM user WHERE age < 18; -- 删除未成年人记录
DELETE FROM user LIMIT 100; -- 最多删除100条(防误删)
-- 4.2 多表关联删除
DELETE u FROM user u
JOIN order_info o ON u.user_id = o.user_id
WHERE o.create_time < '2023-01-01'; -- 删除2023年前无订单的用户
8、总结mysql架构原理和总结myisam和Innodb存储引擎的区别。
8.1mysql架构原理
mysql采用插件式架构,核心功能分为四组
8.1.1连接层
负责处理客户端连接请求,支持 TCP/IP、Unix Socket 等连接方式
包含连接池管理、权限验证(基于 user 表的用户认证)
处理客户端协议解析(如 MySQL Protocol)
8.1.2服务层
查询解析器:将 SQL 语句解析为抽象语法树(AST)
查询优化器:分析执行计划,选择最优索引和表连接方式
查询缓存:缓存 SELECT 结果(5.7 版本后默认禁用,8.0 版本移除)
内置函数:实现数学、字符串、日期等函数逻辑
事务管理:处理 ACID 事务(由存储引擎实现具体逻辑)
8.1.3存储引擎层
插件式架构核心,不同引擎实现独立的数据存储逻辑
标准接口:read_row、write_row、delete_row等
常见引擎:InnoDB(默认)、MyISAM、Memory、Archive 等
8.1.4系统层
操作系统交互:文件 IO、内存分配
磁盘存储管理:数据文件、日志文件的物理读写
进程 / 线程管理:处理多连接并发请求
8.2myisam和innodb的区别

9、总结事务ACID事务特性,总结事务日志工作原理。
9.1事物ACID特性
9.1.1原子性
事务作为最小执行单元,要么全部完成,要么全部回滚,不存在中间状态
9.1.2一致性
事务执行前后,数据库从一个合法状态转换到另一个合法状态
9.1.3隔离性
多个事务并发执行时,相互之间不可见,避免数据不一致
9.1.4持久性
事务提交后,数据变更永久保存,即使发生系统崩溃也不丢失
9.2事物日志工作原理
9.2.1redo log
保证事务的持久性,记录数据修改后的新状态
9.2.2undo log
实现事务原子性
9.2.3协同工作
Redo Log 通过预写机制确保数据不丢失,Undo Log 通过版本控制和回滚机制保障事务原子性与隔离性。两者配合 InnoDB 的 WAL 机制和检查点策略,在保证事务可靠性的同时,最大化提升数据库性能。
10、总结mysql日志类型,并说明如何启动日志。
10.1mysql日志类型
10.1.1错误日志
主要记录 MySQL 服务器启动和停止过程中的信息、服务器在运行过程中发生的故障和异常情况等。
错误日志功能默认开启且无法禁止。默认情况下,错误日志存储在 MySQL 数据库的数据文件夹下,名称默认为mysqld.log(Linux 系统)或hostname.err(mac 系统)。如果需要指定文件名,可在my.cnf或my.ini中配置log - error=(path/(filename)),修改配置后需重启 MySQL 服务。
10.1.2通用日志
记录所有到达 MySQL 服务器的 SQL 语句
编辑my.cnf(或my.ini)配置文件,在[mysqld]部分添加general_log = 1开启通用日志,添加general_log_file = /path/to/your/log/file.log指定日志文件的路径,然后重启 MySQL 服务。
10.1.3慢查询日志
用于记录执行时间超过特定阈值的 SQL 语句,有助于优化数据库性能。
编辑配置文件,在[mysqld]部分添加slow_query_log = 1,slow_query_log_file = /path/to/your/slow/log/file.log指定慢查询日志文件路径,long_query_time = n(n为慢查询的时间阈值,单位为秒),最后重启 MySQL 服务。
10.1.4二进制日志
记录所有修改数据库数据的 DML 和 DDL(select 语句除外)语句,以二进制形式保存,描述数据的更改,用于数据恢复和主从复制等。
编辑配置文件,在[mysqld]部分添加log - bin = /path/to/your/binlog/file,重启 MySQL 服务。
11、总结二进制日志的不同格式的使用场景。
11.1statment
特点:直接记录原始 SQL 语句
使用场景
1、简单查询与静态数据操作
当 SQL 语句完全确定(如UPDATE users SET status=1 WHERE id=123),且无触发器、函数依赖时,可显著降低日志存储成本。
2、开发测试环境
对数据一致性要求较低的场景(如开发调试、临时报表生成),可通过SET sql_log_bin=0临时禁用日志,或直接使用 STATEMENT 格式减少日志量。
11.2row
特点:记录每行数据的具体变化
使用场景
1、金融级强一致性需求
在支付系统、账户管理等场景中,必须确保主从数据完全同步。
2、高并发写入与大表操作
当表包含百万级数据且频繁更新时,ROW 格式能精准记录变更,避免因 STATEMENT 格式的全表扫描导致的复制延迟。
12、基于课程演示完成mysql备份,完成数据库备份与恢复验证。
12.1MySQL备份
13、根据课程演示完成mysql 主从和读写分离的实验过程
13.1主节点配置
13.1.1安装软件
bash
yum install mysql-server -y
13.1.2准备目录并修改权限
bash
mkdir -pv /data/mysql/logbin
bash
chown -R mysql:mysql /data/mysql/
13.1.3修改配置文件
bash
vim /etc/my.cnf.d/mysql-server.cnf
添加如下内容
bash
server-id=177 #指定server-id
log_bin=/data/mysql/logbin/mysql-bin #指定二进制文件路径
default_authentication_plugin=mysql_native_password # 避免出现认证问题
重启服务
bash
systemctl restart mysqld.service
13.1.4创建账号并授权
bash
create user repluser@'10.0.0.%' identified by '123456';
grant replication slave on *.* to repluser@'10.0.0.%';
flush privileges;
13.2从节点配置
13.2.1安装软件
bash
yum install mysql-server -y
13.2.2准备目录并修改权限
bash
mkdir -pv /data/mysql/logbin
bash
chown -R mysql:mysql /data/mysql/
13.2.3修改配置文件
bash
vim /etc/my.cnf.d/mysql-server.cnf
bash
server-id=183 #指定server-id
log_bin=/data/mysql/logbin/mysql-bin #指定二进制文件路径
default_authentication_plugin=mysql_native_password # 避免出现认证问题
重启服务
bash
systemctl restart mysqld.service
13.2.4配置主从
bash
CHANGE MASTER TO MASTER_HOST='10.0.0.12', MASTER_USER='repluser',
MASTER_PASSWORD='123456', MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=849;
13.2.5启动同步
bash
start slave;
13.3测试同步效果
13.3.1主节点写入数据
创建数据库
bash
create database db1;
use db1;
创建数据表
bash
create table `student`(
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`age` tinyint unsigned DEFAULT NULL,
`gender` enum('M','F') DEFAULT 'M',
PRIMARY KEY (`id`)
)ENGINE=InnoDB;
写入数据
bash
insert into student (name,age,gender)values('user1',10,'M'),('user2',20,'F'),('user3',30,'M');
13.3.2从节点验证
可以看到此时从节点已经有数据