mysql项目实战

1.环境搭建

创建两个节点master和slave,先在主节点上操作,从节点后续做主从复制等做准备。

创建好后修改一下配置文件内容,连接final shell 操作更加方便

我下载的是之前的centos镜像好像是不能用了源有问题 安装mysql时候依赖包有问题,后面换了阿里云的镜像就可以了

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

安装mysql后初始化密码准备工作

2.创建基础表和表关系

一共是教师 班级 学生 课程 选课五张表

考虑到多张表id的区分,还是选择用字符串类型  不同的表id用首字母加数字容易区分,所以修改一下字段类型

批量插入数据:(批量插入效率比单条插入更高,减少网络交互)
老师表:
insert into teacher VALUES ('J1','王炯','教授'),('J2','蒋松','讲师'),('J3','梁王','副教授'),('J4','杨旺权','讲师'),('J5','超哥','讲师');

班级表:
insert into class VALUES ('B1','大数据1',40),('B2','大数据2',45),('B3','大数据3',50),('B4','软件开发1',30),('B5','软件开发2',35),('B6','软件开发3',38);

课程表:
insert into course VALUES ('K1','数据库',4,'J2'),('K2','java',4,'J3'),('K3','python',6,'J1'),('K4','英语',2,'J5'),('K5','数学',6,'J4');


学生表:
insert into stu VALUES ('X5','张三','男','B2'),('X4','李四','女','B3'),('X003','王五','男','B4'),('X2','赵六','男','B5'),('X1','王琦','男','B1'),('X6','马超','女','B1'),('X7','刘备','男','B2'),('X8','赵云','女','B6');


选课表:
insert into coustu VALUES ('X1','K2',82),('X2','K5',56),('X2','K3',74),('X3','K1',66),('X3','K2',75),('X4','K5',95),('X4','K4',83),('X5','K1',42),('X5','K4',87),('X7','K1',79);

 建立外键 确保数据一致性:课程表里面有包含教师的id,学生表里面有包含班级的id。所以在课程表和教师表 以及学生表和班级表之间建立外键:

查询选课成绩在80-90分之间的学生信息:

查询某个学生的课程及对应分数信息:

创建存储过程:

delimiter $$
create procedure stuinformation(in stu_name varchar(50))
begin
    select concat('学生 :', stu_name, ' ,课程:', c.name, ',分数:', cs.score)
    from course c 
    join coustu cs on c.id = cs.cid  
    join stu s on s.id = cs.sid 
    where s.name = stu_name;
end $$
delimiter ;

注:如果用声明局部变量,一个学生可以有多门课程信息,而into只能赋给单行单列的结果给局部变量 所以结果有多行会出现报错

不用into变量方式,直接通过多表连接查询拼接结果。

3.导入千万级数据表,为后续优化做准备

用Python生成一个一千万数据量文件,导入到liunx再导入到表。后续做查询优化表

结果:

mysql建表语句:

CREATE TABLE bigdata (
    用户ID INT PRIMARY KEY,
    姓名 VARCHAR(50),
    年龄 INT,
    邮箱 VARCHAR(100),
    手机号 VARCHAR(20)
);

刚开始导入数据的时候总是报错,第一个是检查的local_infile开关是否是打开的,还有检查字段跟文件里的这段是否对应。排除这些问题后还是出现了报错,发现是因为mysql的默认允许导入的路径这里,MySQL 为了安全,通过 secure_file_priv 变量限制 LOAD DATA INFILE(以及 SELECT ... INTO OUTFILE 等操作 )能访问的文件路径,所以这里方把文件放到 secure_file_priv 允许的路径,

解决方法:查看参数的默认路径:SHOW VARIABLES LIKE 'secure_file_priv'
,再把这个数据文件复制到默认路径的目录sudo cp /root/million_users2.csv /var/lib/mysql-files/,把代码里的文件路径做好修改之后就可以正常导入数据了

尝试n多次终于导入成功了

4.创建视图

视图可以为保护用户隐私信息 查询屏蔽不需要的字段,创建一个新用户表,创建两个视图us和us1:

us1视图基于us视图创建,并设置级联检查with cascaded check option,修改视图时候会检查us1的where之后的条件(id>5)以及 us视图where之后的条件(id<20)。满足两个视图的条件才能修改(插入id=21满足us1但未满足us条件)

5.主从复制

首先关闭防火墙服务,我这是自己的机器直接就关闭了  生产环境中可以开放指定的端口号

修改主 从库配置文件my.cnf,重启mysql服务

创建远程连接账号,赋予主从复制权限

创建用户认证出错,mysql_native_password 插件这里未启用。这是旧版本的插件

解决方法:这里改为

caching_sha2_password 插件更安全可用。起初密码设置过于简单,默认的是需要大小写字母 数字加特殊字符

执行主库配置后 io线程没起来

查看锁错误日志:

查看报错信息是因为 mysql 8.0 以上 默认使用的 caching_sha2_password 插件需要安全连接,而当前配置未满足要求。

我还是继续强制启用原来的插件

解决方法:在主库修改配置文件my.cnf中添加:mysql_native_password=ON

重启mysql服务查看插件状态发现已启用

再重新修改用户认证插件为mysql_native_password ,刷新权限

主库查看二进制日志文件位置信息后

从库执行:change replication source to source_host='192.168.88.145',source_user='junfeng',source_password='Ljf123456.',source_log_file='binlog.000006',source_log_pos=610;
配置成功!

验证主从复制:

主库创表插入数据,从库可以看到表信息

6.慢查询日志:查询优化

配置文件my.cnf里面添加这两行,保存重启mysql服务

查看慢查询日志文件位置:

打开两个主节点页面,左边查看慢查询日志文件实时尾部跟踪,右边查询到大于2秒的sql被记录下来

用导入的千万级数据表查询,记录下大于2秒的查询,此时查询用了11.27秒

根据邮箱和姓名建立联合索引后,再执行上一条相同的查询语句,查询速度比原来快11.21秒

7.数据迁移:

当我第二天准备迁移数据时候,查看主从复制状态,sql线程没起来

查看了一下报错原因是因为主从数据不一致,从库的库或者表缺失。昨天是从binlog.000006开始复制的,在这之前主库我建了另一个数据库存放千万数据表的,没有同步过去所以会出现报错

刚好可以把主库的数据库迁移过去再实行同步操作,进行读写分离:

直接用root用户访问会报错:

因为只有主机localhost的访问权限

用之前创建好的junfeng用户,赋予了all privileges权限 访问主机备份文件

压缩文件后传输到从服务器IP地址文件目录下,过程输入本机以及从服务器root登录密码后传输完毕!

从节点文件

解压缩后,在从节点创建对应数据库,导入文件:

导入过程比较久 一度以为是卡死了,打开节点另一个窗口查看mysql进程发现还在正常插入数据中...

一定时间后数据导入完成,验证数据库以及表内容。

重新开启主从复制又出现了报错,sql线程还是没起来,

执行 select * from performance_schema.replication_applier_status_by_worker\G;

查看具体错误信息:意思为在读取二进制日志时候执行的创建email_name这个索引的语句时发现已经存在同名索引。查看确实存在索引

原因是因为刚刚数据导入过来的时候把索引结构也导入了,所以执行复制操作会重复执行创建email_name这个索引的语句,事务执行失败

解决方法:先暂停复制进程,从节点删除email_name索引后 重新启动主从复制

8.mycat中间件安装:

安装jdk和mycat

配置两个mycat文件:schema.xml 和 server.xml

配置完后检查wrapper日志文件尾部信息,显示successfully表示启动成功

登录连接数据库成功:

mycat管理主要配置三个配置文件:schema.xml  server.xml  rule.xml

schema.xml :定义逻辑库,表 与物理库形成映射关系。配置数据节点,数据源等

server.xml:配置用户权限和系统参数,如用户可访问的数据库,读写权限。sql服务端口,管理端口等等

rule.xml:分片规则,数据按照怎样的规则落在各个节点

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值