栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

MySQL运维篇

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MySQL运维篇

文章目录
  • 数据库三大范式是什么?
    • 第二范式和第三范式的区别
  • bin log/redo log/undo log
    • bin log和redo log有什么区别?
  • 大表怎么优化?
  • MySQL主从同步
    • 主从同步原理
    • 为什么要做主从同步?
    • MySQL 主从同步延时问题
      • 原因
      • 解决
  • 分库分表
    • 数据拆分方式
    • 分区表
    • 分区表类型


数据库三大范式是什么?
第一范式:原子性,表中每个字段都不能再分。
第二范式:满足第一范式并且表中的非主键字段都依赖于主键字段。
第三范式:满足第二范式并且表中的非主键字段必须不传递依赖于主键字段。

自己理解

  • 第一范式:确保数据库表字段的原子性
  • 第二范式:首先要满足第一范式,另外包含两部分内容
1.	表必须有一个主键
2.	非主键列必须完全依赖于主键,而不能只依赖于主键的一部分
  • 第三范式:首先要满足第二范式,另外非主键列必须直接依赖于主键,不能存在传递依赖
即不能存在:非主键列A依赖于非主键列B,非主键列B依赖于逐渐的情况
第二范式和第三范式的区别

第二范式依据的是非主键列是否完全依赖于主键,还是依赖于主键的一部分
第三范式依据是非主键列是直接依赖于主键,还是直接依赖于非主键

bin log/redo log/undo log

MySQL日志主要包括查询日志、慢查询日志、事务日志、错误日志、二进制日志等。

  • bin log:二进制日志
    是MySQL数据库级别的文件,记录对MySQL数据库执行修改的所有操作,不会记录select和show语句,主要用于恢复数据库和同步数据库。
  • redo log:重做日志
    是innodb引擎级别,用来记录innodb存储引擎的事务日志,不管事务是否提交都会记录下来,用于数据恢复。当数据库发生故障,innoDB存储引擎会使用恢复到发生故障前的时刻,以此来保证数据的完整性。将参数设置为1,那么在执行commit时会将同步写到磁盘。
  • undo log:回滚日志
    除了记录外,当进行数据修改时还会记录,用于数据的撤回操作,它保留了记录修改前的内容。通过可以实现事务回滚,并且可以根据回溯到某个特定的版本的数据,实现MVCC。
bin log和redo log有什么区别?
  • bin log 会记录所有日志记录,包括InnoDB、MyISAM等存储引擎的日志;
    redo log 只记录innoDB自身的事务日志。
  • bin log只在事务提交前写入到磁盘,一个事务只写一次;
    redo log在事务进行过程,会有不断写入磁盘。
  • bin log是逻辑日志,记录的是SQL语句的原始逻辑;
    redo log是物理日志,记录的是在某个数据页上做了
大表怎么优化?
  • 限定数据的范围。比如:用户在查询历史信息的时候,可以控制在一个月的时间范围内;
  • 读写分离: 经典的数据库拆分方案,主库负责写,从库负责读;
  • 通过分库分表的方式进行优化,主要有垂直拆分和水平拆分。
MySQL主从同步

数据是一个应用至关重要的一部分;
从目的出发,主从同步有那么点备份的意思;
主库(Master)将自己库中的写入同时同步给自己的从库(Slave),当主库发生某些不可预知的状况,导致整个服务器无法使用时,由于从库中也有一份数据,所以数据可以做到快速恢复,不造成或者减少造成数据的损失。

主从同步原理
  • Master 数据库只要发生变化,立马记录到bin log 日志文件中
  • Slave数据库生成两个线程:I/O线程、SQL线程
    • 启动一个I/O thread连接Master数据库,请求Master变化的二进制日志,将获取到的二进制日志,保存到自己的Relay log (中继日志)日志文件中。同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件
    • SQL 线程定时检查Realy log是否变化,变化那么就更新数据
为什么要做主从同步?
  • 高可用,主从复制实现了数据的热备份,可以有效避免单点故障导致的数据丢失。
  • 高性能,可以用来实现读写分离,提高MYSQL服务的并发性能
MySQL 主从同步延时问题 原因
  • MySQL的主从复制都是单线程的操作,主库对所有DDL和DML产生的日志写进binlog,由于binlog是顺序写,所以效率很高。Slave的SQL Thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是随即的,不是顺序的,成本高很多。
  • 另一方面,由于SQL Thread也是单线程的,当主库的并发较高时,产生的DML数量超过slave的SQL Thread所能处理的速度,或者当slave中有大型query语句产生了锁等待那么延时就产生了。
解决
  • 分库,将一个主库拆分为多个主库,每个主库的写并发就减少了几倍,此时主从延迟可以忽略不计。
  • 打开 MySQL 支持的并行复制,多个库并行复制。如果说某个库的写入并发就是特别高,单库写并发达到了 2000/s,并行复制还是没意义。
  • 重写代码
分库分表 数据拆分方式
  • 垂直拆分: 根据业务的维度,将原本一个库中的表拆分多个表,每个库中表与原有的结构不同
  • 水平拆分: 根据分片算法,将一个库拆分成多个库,每个库依旧保留原有的结构
分区表
  • 分区表就是将一个大表分成若干个小表。
  • 当查询条件的数据分布在某一个分区的时候,查询引擎只会去某一个分区查询,而不是遍历整个表。在管理层面,如果需要删除某一个分区的数据,只需要删除对应的分区即可。
  • 改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。
分区表类型
  • RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。这些区间要连续且不能相互重叠
  • LIST分区:类似于按RANGE分区,区别在于给定的不是连续范围,是离散的值。
  • HASH分区:根据用户自定义的表达式的返回值进行分区,返回值不能是负数。
  • KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/940309.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号