MySQL主从复制,读写分离,分库分区等
为什么阿里巴巴《Java开发手册》不建议使用物理外键?使用物理外键会带了什么问题?
在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁。若是在高并发大流量事务场景,使用外键更容易造成死锁。
数据库物理删除和逻辑删除有
物理删除=永久删除,节省存储空间
逻辑删除=数据记录被删除, 但数据本身依然存在
日常开发使用逻辑删除,以防后期会用到数据又恢复不了的情况。
内连接和外连接有什么区别?什么是自连接?
内连接仅返回表之间匹配的数据
外连接返回表之间匹配和不匹配的数据
自连接是一种特殊的连接操作,它将表与自身连接,通常用于表中记录间的比较或关系查询
创建索引时会锁表吗?
Lnnodb不会,
mylsam会,进行时,可读不可写
drop、truncate 和 delete 的区别
drop删除整个数据库对象,如表,视图,索引,快
truncate 删除表中所有数据行,不支持where语句
delete 逐行删除表中数据行。
短时间提高 MySQL 性能的方法
使用索引查询,避免全表查询,优化查询语句。
什么是主备延迟,如何解决延迟问题。
主备延迟,说明备数据库复制主数据库文件滞后。未能及时更新数据实现同步
实现时间同步,优化网络降低延迟。使用多个备数据库实现均衡负载,减少单个压力。
实操题:
以下配置全部基于8.0.26
下载mysql (8.0.26版本)
下载最新首先安装yum 源必须是8.0.26的。不指定mysql源默认下载最新的。
卸载现有的mysql和mariadb依赖包,否则下载8.0.26rpm包会报错,因为版本冲突。报错内容如下
[root@caihua ~]# sudo rpm -ivh mysql-community-libs-8.0.26-1.el7.x86_64.rpm 警告:mysql-community-libs-8.0.26-1.el7.x86_64.rpm: 头V3 DSA/SHA256 Signature, 密钥 ID 5072e1f5: NOKEY 错误:依赖检测失败: mysql-community-client-plugins = 8.0.26-1.el7 被 mysql-community-libs-8.0.26-1.el7.x86_64 需要
以下 是卸载完现有的依赖包之后再再下载rpm包,显示成功。查看版本号也符合要求。
登录到mysql查看版本信息。
使用冷备将从数据库的数据保存到/data目录并测试删除然后恢复
冷备需要先关闭mysql服务,适合线下服务器
ls查看打包成功。
删除mysql存储数据
删除完之后进行恢复,
恢复后登录mysql,显示正常。
使用mysqldump测试将tarena库进行备份,然后测试删除与恢复
看一下mysql有没有tarena库,没有则创建,这边我是新建了一个tarena库,并在里面建了一个为benben的表。
删除terena库
已经删除terena库,重新恢复提示错误NO database selected,没有该库,所以我们这新建一个容纳恢复的库。
这边显示导入成功,第一次导入失败,提示不允许再命令行输入密码,所以我就输入-p,密码后输入,发现可以恢复,进入到数据库中,发现terena的库数据已恢复。
实现mysql的全量备份及增量备份
全量备份如下,安装第三方工具的时候,安装过程可能会包密钥不适应,不适应的情况下去mysql仓库gppchek=0,以下是解决完之后没有报错,安装依赖/解压源码,移动并改名,/把命令添加到系统环境变量
这边可以看到已经备份完成。
2. 以下是增量备份。实现增量备份之前必须有新产生的数据,以完成增量备份,现在需要输入新的数据,
下图可以看见增量备份已经完成,备份过程原图较长,取首尾图方便看,每当产生新的数据,可依此类推,只需重新指定新的增量备份目录。
安装两个mysql,实现主从同步、查看从库同步的情况
在master启用binlog日志,使其slave可以复制。在slave也需server-id
在主上创建一个新的用户,并授权复制。
在slave上指定master服务器信息,开启slave
有点小问题,这边显示我的用户身份认证有问题,根据提示我取master修改用户认证。
搞了十几分钟。记录一下解决过程😫
Master新建的用户,用户 'wgt' 目前使用的是 'caching_sha2_password' 身份验证插件。要更改为 'mysql_native_password'
可以看到直接修改会报错。需要先删除这个用户。
删除先看用户拥有的权限,在删除,这边删除成功。
重新建一个wgt用户,并修改身份认证mysql_native_password ,并授权,再更新!!!
此时master的二进制文件会改变,需要重新查看,以便salve进行指定master。
然后再slave进行指定master
再查看一下信息,显示成功。接下来修改master库,看slave能否同步。
在主新建一个maomao库,在slave进行查看,实现同步成功
使用mycat实现读写分离
安装mycat软件,定义客户端连接mycat,用户名改成mycat
数据库服务器,用户名改一下以防冲突记混
根据mycat定义的数据库配置,mysql添加相应的用户
启动mycat,启动后需要十几秒,才能看到端口开启成功。
登录mycat服务,正常访问。
创建数据源
查询显示一下数据源,与刚才配置的信息吻合。没有问题
添加的数据源以文件的形式保存在安装目录下
在master新建用户,slave可以看到新建用户
创建集群,查看集群信息
创建的集群以文件的形式保存在目录下
修改master负责写访问。SLAVE负责读访问。
修改master,salver策略
发现重启不了,查看日志说叫我master装一个用户并授权,
在mster装完就可以启动了
测试配置 指定xiaoxiao库使用集群
连接mycat服务建表插入记录
在从服务器本机插入记录,数据仅在从服务器有,主服务器没有
主服务器数据不变,日志偏移量不不变
客户端连接mycat服务读/写数据
在主服务器查看数据和日志偏移量
在客户端查看记录
可选题:实现分库分表
创建多个分片数据库
在每个分片数据库中分片表,表结构相同
简单示例:没有应用进行连接。
假设Java应用程序连接数据库,假设使用jdbc连接数据库,需要配置相应的数据库连接信息,分片索引,id计算哈希,模拟数据路由。查询,查询结果,处理数据,输出数据。
import java.sql.*;
public class ShardTest {
public static void main(String[] args) {
// 数据库连接信息
String url = “jdbc:mysql://localhost:3306/shard_0”;
String user = “username”;
String password = “password”;
// 根据用户ID计算哈希值,模拟数据路由
int userId = 123;
int shardIndex = userId % 2; // 假设有两个分片
// 根据分片索引选择对应的分片库
url = “jdbc:mysql://localhost:3306/shard_” + shardIndex;
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement()) {
// 执行 SQL 查询
String query = “SELECT * FROM user WHERE id = ” + userId;
ResultSet rs = stmt.executeQuery(query);
// 处理查询结果
while (rs.next()) {
// 处理每一行数据
int id = rs.getInt(“id”);
String name = rs.getString(“name”);
// 输出数据
System.out.println(“ID: ” + id + “, Name: ” + name);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}