• 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

    42

    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]设定定时的工具

    想要飞得更高,就该忘记地平线!
  • 相关阅读:
    emoji表情,直接存入数据库报错,,出现java.sql.SQLException: Incorrect string value: 'xF0x9Fx98x8ExF0。。。。。。
    Springmvc的服务端数据验证-----Hibernate Validator
    HashMap
    Treeset的两种排序方法(自然排序和比较器排序)
    Java设计模式之适配器模式
    Java中的三种工厂模式
    构造方法私有化_骰子
    Java中equals的覆盖
    HttpClient请求
    JAVA的单例模式与延时加载
  • 原文地址:https://www.cnblogs.com/shenwen/p/11544212.html
Copyright © 2020-2023  润新知