mysql高可用

1、1触发器

6、1触发器 ***触发器有两个指针1、new(更新后的,2、OLD更新前的)

 1、若搜索员工信息的时候,需要把领导的名字展现出来,那么需要增加一列冗余。

ALTER TABLE t_emp ADD ceoname VARCHAR(200);

 

 

 

2、需要将相对应的ceo名字对应更新到新增字段中,用到跨表插入。

UPDATE t_emp a

LEFT JOIN t_dept b ON a.deptId=b.id

LEFT JOIN t_emp c ON b.CEO=c.id

SET a.ceoname=c.name;

 

 

 

3、假如之前门派的掌门人变了,但是ceoname,则还是之前的掌门人名称,则不能对应上。所以就需要mysql引擎了,让冗余跟着数据的变化而变化。

DELIMITER $

 

 

 

create trigger tri_stuInsert2    

after UPDATE ON t_dept

FOR EACH ROW

BEGIN

  UPDATE t_emp a

  LEFT JOIN t_dept b ON a.deptId=b.id

  LEFT JOIN t_emp c ON b.CEO=c.id

  SET a.ceoname=c.name

  WHERE a.deptId=new.id;

END$

DELIMITER ;

 

 

DELIMITER $

 

create trigger tri_stuInsert2    

after UPDATE ON t_dept

FOR EACH ROW

BEGIN

IF new.id<>`OLD.id THEN

  UPDATE t_emp a

  LEFT JOIN t_dept b ON a.deptId=b.id

  LEFT JOIN t_emp c ON b.CEO=c.id

  SET a.ceoname=c.name

  WHERE a.deptId=new.id;

 END IF;

END$

DELIMITER ;

Chuang

弊端:

1、 不利于维护

2、 批量操作的时候,伤性能

3、 写操作很难被java日志追踪。

4、 造成死循环

2、事件

问题描述:在一个表中,很多列都是经过复杂计算得来的,那么请求一次去刷新获取表数据的操作,则需要10秒左右,开发人员该如何优化快速查取到表中数据?

2.1在执行mysql的时候,将搜索到的数据插入到创建的新标当中。

 

 

 

2、根据搜索数据,批量插入,但insert的表要和查的表结构一致。

 

 

 

3、把上面两步封装成存储过程。

 

 

 

DELIMITER $$

CREATE PROCEDURE pro_top_n()

BEGIN

TRUNCATE TABLE t_top_n;

SET @rank=0;

SET @last_deptId=0;

INSERT INTO t_top_n

SELECT

a.* ,

IF(@last_deptId=deptId,@rank:=@rank+1,@rank:=1) AS rk,

@last_deptId:=deptId AS last_deptId

FROM t_emp a

ORDER BY a.deptId ,a.age DESC;

END$$

5、 调用存储过程:

CALL pro_top_n();

小结:此存储过程1、将数据表清空,2将新数据更新到数据表中。

2、2完成定时刷新任务

2.2.1定时器默认关闭,需要打开。

 

 

 

SHOW VARIABLES LIKE '%event_scheduler%';

SET GLOBAL event_scheduler=1;

2.2.2  创建事件,定时去执行存储过程

 

 

 

DELIMITER $$

CREATE EVENT ev_top_flush

ON SCHEDULE

    EVERY 1 MINUTE

ON COMPLETION PRESERVE

  ENABLE

DO

BEGIN

CALL pro_top_n();

END$$

总结:事件一般用于报表。

3、定时备份

问题:每天凌晨2点备份某个数据库脚本,以年月为目录,年月日为文件名,存到某个目录下。

解决:

1、 备份数据脚本。备份工具mysqldump

2、 存储到指定的目录和文件中。

3、 定时执行。

3.1登录mysqldump

格式:mysqldump –u[用户名] –p[密码]  [要导出的数据库]>[导出的文件.sql]

例如:mysqldump -uroot -pshenwenwen603@ guo>/backup/guo20190115.sql

 

 

 

3.2 shell脚本

格式:

#! /bin/bash

DIR=/backup/mysql/`date +%Y%m`

DATABASE=guo

If [ ! -d $DIR ]

then

   mkdir -p $DIR

else

echo “already has dir”

fi

 echo “start to backup”

mysqldump -uroot -pshenwenwen603@ $DATABASE>$DIR'/'$DATABASE`date +%Y%m%d`'.sql'

echo $DIR'/'$DATABASE`date +%Y%m%d`'.sql'

 

 

 

3.2 linux提供的定时 ——>

Crond[s1]    service crond start     service crond status          

crontab[s2]   crontab[s3]  –e

 

 

 

4、主从复制   

主机版本不能高于从机版本

主写从读

1、 每个从机只能有一个mast

2、 每个从机只能有一个唯一的服务器id(service_id默认唯一,不能重复)

3、 每个主机可以有多个从机

 

 

 

https://www.cnblogs.com/superfat/p/5267449.html

4\2

Mycat 1、读写分离 2、数据分片   3、多数据源整合

4、1、1读写分离

关系图

 

1、 安装

下载、上传、解压缩就可以。(注意:解压缩之后,不能立即启动,需要修改三个配置文件,即:1、schema.xml(最为重要的,路由的规则就配置在这个里面),2、server.xml(配置用户名、密码等的参数配置)3、rule.xml(分表的规则))

2、 schema.xml配置

 

3、server.xml

 

3、 启动mycat.

在/user/local/mycat/bin目录下面,执行./mycat console 启动mycat

4、 在linux下面使用mycat登录mysql数据库。

Mysql –uroot –pshenwenwen603@ -h127.0.0.1 –P8066(注意:p必须为大写)

Show databases;

Show tables;

Insert一条数据,名字用@@hostname,最后可以查看是从哪个服务器写进去的,例如:insert into mydb1 values(3,@@hostname);

 

则证明,是从写库写入的。

4、2分库

 

数据量很大的情况下需要分库操作

4、2、1 schemer.xml配置

 

4、2、2数据集市(数据仓库)

问题:若出现不同库之间的表需要进行关联查询,则mycat不支持。

 

数据集市就是将不同的库中的数据都抽取出来,放在数据集市上进行操作。

 

当数据达到上百万需要。

5、 分表

根据时间、地区、id(取模)、

5.1.1Rule配置

 

5.1.2schmer.xml配置

 

5.2分表之垮裤关联

5.2.1字表根据父表生成

 

 

 

5.2.2全局分表:

全局gloable就是每个表都有,要做一起做。

 

 

 

全局序列号生成规则,以防止两边的表生成的id号是一样的。

mycat三种解决方案

1、 本地文件

2、 数据库方式

3、 时间戳(18位)

 

公式:NEXT VALUE FOR MYCATSEQ_GLOBAL

4、利用redis的计数器

5.2.3全局分表:

假如一个库中没有需要的表,则关联的时候会报错,需要有一个虚拟的表,则需要在配置中打开引擎。

1、vim /etc/my.cnf

 

2、

3、创建虚拟表

CREATE TABLE dict_order_type(

id INT AUTO_INCREMENT,

order_type VARCHAR(200),

PRIMARY KEY(id)

)ENGINE=FEDERATED CONNECTION="mysql://root:shenwenwen603@39.106.140.104:3306/orders_0706/customer"

 

之后再进行关联就没任何问题。


 [s1]定时器

 [s2]设定定时的工具

 [s3]设定定时的工具

posted @ 2019-09-18 18:05  左手背右手背  阅读(226)  评论(0编辑  收藏  举报