Mysql

  • mysql
    Mysql,  技术,  服务组件

    Mysql集群部署(MHA)

    MySQL高可用方案中,MHA(Master High Availability)是一个相对成熟的解决方案,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。 该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。 mysql主从部署 参见 Mysql集群部署(主从复制) 配置公钥互信 创建mha管理节点 目前容器和ip对应关系为: mysql-master 172.17.0.2 mysql-slave-1 172.17.0.3 mysql-slave-1 172.17.0.4 mysql-mha-manager 172.17.0.5 设置所有容器的root密码, 配置互信时需要: MHA部署 增加文件脚本/usr/local/bin/master_ip_failover: 进入容器 mysql-mha-manager 创建mha配置文件 /etc/mha-manager.cnf: 配置文件校验 其他命令 masterha_check_ssh…

  • mysql
    Mysql,  技术,  服务组件

    Mysql集群部署(主从复制)

    基础环境准备 # 获取centos镜像,注:以下镜像为整合了 ansible 的centos镜像,可以解决大量的依赖问题 docker pull ansible/centos7-ansible 容器中安装基础工具 启动容器: 进入容器: 安装Mysql 记住生成的临时用户名和密码,保存下来,之后会用到 编辑配置文件 查看my.cnf 文件位置 ./mysql –help | grep my.cnf 这个实际上就是mysql尝试去读取配置文件的路径顺序,没有找到话,mysql会走默认配置 所以,看下这几处位置是否有配置文件,有的话,编辑该文件,没有的话,直接在第一读取位置,创建配置文件,如: 创建 /etc/my.cnf 配置文件。 /etc/my.cnf: 添加mysqld服务到系统 启动mysql 将mysql命令添加到服务 登录mysql 使用之前随机生成的密码 修改root密码 使支持远程连接…

  • mysql
    Mysql,  技术,  服务组件

    明确mysql整型字段取值范围

    mysql中存储整数,有很多种类型供选择,选择合适的类型,无论是对存储空间的合理使用,检索性能的提高等都有很好的便利,下面就由我们来一起明确下。 数据类型 字节数 有符号 无符号 unsigned tinyint 1 -128~127 (-2^8 ~ 2^8 – 1) 0~255 (2^9 – 1) smallint 2 -32,768~32,767 (-2^15 ~ 2^15 – 1) 0~65535 (2^16 – 1) mediumint 3 -8,388,608~8,388,607(-2^23…

  • mysql
    Mysql,  技术,  服务组件

    sql任务重试方案

    定时执行相应的sql任务,是工作中常遇到的场景。通常用在统计相关的任务,这些sql语句中,通常都含有相对的时间函数,如now()等, 如: 上面这个sql语句的的结果为 上一个小时内新增的数据量,但如该sql语句18点执行失败,19点进行手工重试时,就会有问题了,因为18点执行时统计的是17点的数据,而若19点进行重试,重新执行该语句,则统计的是18点的数据。 方案 自定义业务场景常用的时间函数,然后对伪sql解析为具体的可执行sql, 并将该可执行sql记录下来,之后重试则执行该记录下来的sql。 举例说明: {@date}: 表示当前日期,e.g. 20200831, ,支持加减,如前一天:{@date-1} => 20200830,后一天:{@date+1} => 20200901 {@date_timestamp}: 表示当前时间戳, e.g. 1598864224, 支持加减,如前10分钟:{@date_timestamp-600},后1个小时:{@date_timestamp+3600} {@date_minute_timestamp}: 表示当前分钟时间戳, 如2020-08-31 16:50:55按照2020-08-31 16:50:00,转换为1598863800, 同样支持加减,如前一分钟: {@date_minute_timestamp-1},后一分钟: {@date_minute_timestamp+1} {@date_hour_timestamp}: 表示当前小时时间戳,同样支持加减,如前一小时: {@date_hour_timestamp-1},后一小时: {@date_hour_timestamp+1}…

  • mysql
    Mysql,  技术,  服务组件

    mysql多表组合查询

    背景 因业务数据量太大,所以正常业务场景仅支持进一个月的数据, 数据表: tb, 历史30天前的数据,一次存入备份表tb_202006,tb_202005,。。。 现,需求,后台不仅支持tb表的查询,还要根据时间范围查询备份表的数据 解决 通过union语句,将多表数据累加在一起,统一order, limit。 业务场景中,根据筛选的时间范围,确定需要累加的所有数据表,然后进行sql组装即可

  • mysql
    Mysql,  技术,  服务组件

    mysql order by主键速度慢问题

    背景 今天遇到一个奇怪的问题,就是明明是order by id(主键)但却速度奇慢。 排查 针对这个sql, 做了一下explain, 发现其并没有走主键索引,而是走了其他的索引 总结 mysql(innodb) 选择使用的索引时,有各种的优化选择策略,并不一定会符合我们的预期。而order by主键,这个可能是我们最常用到的一个不符合预期的情境,所以,以后在程序开发中,使用order by时,最好explain一下,看是否使用到了自己预期的索引。 如果mysql自主选择的索引不符合预期的话,一方面可以通过调整where条件,查询字段等方式进行尝试,使其使用预期的索引,另一方面,则可以使用FORCE INDEX的方式,强制mysql使用我们预期的索引

  • mysql
    Mysql,  技术,  服务组件

    mysql模糊查询like优化

    在业务场景中,经常会用到like模糊查询。但是大家都知道,like是用不到索引的,所以当数据量非常大时,速度会非常慢。 此时,用以下mysql的内建函数,可以在一定程度上优化模糊查询的速度,替代like instr(title,'手册')>0  相当于  title like '%手册%' (主要是这一种情况效率提高明显) instr(title,'手册')=1  相当于  title like '手册%' instr(title,'手册')=0  相当于  title not like '%手册%' 通过以上函数,可以一定程度上加快模糊查询的速度

  • mysql
    Mysql

    mysql字段长度限制

    背景 今天线上出现一个问题,文本太长,而数据库中的字段长度不够,导致内容被截断。 于是,很容易想到解决办法,修改字段长度呗,但出乎预料的是,遇到了以下报错: 原因: mysql属于关系型,行式数据库, 规定单行长度不能超过65535,如需存储超过65535长度的数据,则需使用TEXT或BLOB,这里所说的字段长度指的是,一条记录所有字段的长度之和。 解决: 正常的解决方案是,修改字段类型为text或blob, 但因为具体的业务场景,此次仅是将该字段在允许范围内稍微加大了些