高并发,高性能,高可用MySQL 实战-orm框架原理,怎个给数据上保险
orm框架原理
什么是orm框架
总结:
- orm框架的作用是程序对象与关系型数据库之间的映射
- orm框架可以大大降低程序员的代码开发工作量
- orm框架可以使得代码更安全,更易维护
orm框架是如何设计的
- 经典软件架构
- 分层架构
- 事件驱动架构
- 管道过滤器架构
- 微核架构
- orm框架架构层次
- 接口层:向上支持程序调用
- 处理层:参数映射--->sql生成--->sql执行--->结果处理
- 支撑层:事务管理,连接池管理
- 连接层:数据库连接驱动
总结:orm框架体现了软件架构设计的经典模式,orm框架一般有接口层、处理层、支撑层、连接层,orm框架中有很多优秀的代码,值得阅读
orm框架有哪些常见的问题
-
orm与dao层是什么关系
dao是orm框架的接口层,dao并不等价于orm框架,只是框架的一部分 -
开发同学和DBA误会在哪里
- 在orm框架的加持下,sql不是开发同学直接写的
- 开发往往更注重于业务逻辑,忽视了sql本身的性能
-
如何定位出问题的sql
- 根据代码推断,查看相关日志
- 数据库:查看慢日志
- 网络:监听数据库端口,解析TCP报文
总结:遇到sql性能问题可以从应用、网络、数据库定位
性能差的sql一般可以通过orm的自定义sql解决
怎么给数据上保险
数据库有哪些种类的备份
- 备份的分类维度
-
备份时数据库的状态
hot backup热备,正常运行中直接备份
cold backup冷备,完全停止后备份
warm backup温备,数据库只读 -
备份文件的格式
逻辑备份:输出文本或sql语句
物理备份(裸文件):备份数据库底层文件 -
备份内容
完全备份:备份完整数据
增量备份:备份数据差异
日志备份:备份binlog
-
工具举例
mysqldump: 逻辑、热、全量备份
xtrabackup: 物理、热、全量+增量备份 -
总结
备份方式的分类维度有:状态、格式、内容
备份方式没有绝对的好坏,只是用途不同
如何使用OUTFILE命令进行备份
- OUTFILE
- mysql原生的sql指令
- 最原始的逻辑备份的方式
- 备份的功能和效果取决于如何写sql语句
- outfile的使用方式
- 首先查询mysql的导出路径
show variables like "%secure%";
- 备份命令
select * into outfile "/var/lib/mysql/store-out" from store;
select * into outfile "/var/lib/mysql/store-out2" fields terminated by ',' from store;
- outfile注意事项
- 在InnoDB事务下,可以做到一致性视图
- 修改分隔符fields terminated by
- 修改换行符lines terminated by
- outfile的缺陷
- 输出的文本比较简略
- 很难用来还原,现在一般用来简单导出数据
- 总结:
- outfile是最简单且原生的数据备份工具
- 使用简单,灵活性高
- 不适合数据还原场景,基本用来导出数
如何使用mysqldump进行备份
- outfile如何改进
- 自动发送select语句,不需要手动发送
- 自动开始事务
- 输出insert语句,可以直接用于还原
- mysqldump特点
- 非常常用的逻辑备份工具
- mysql server自带
- 输出的内容为sql语句,平衡了阅读和还原
- sql语句占用空间小
- mysqldump原理
- mysqldump使用一下语句对数据进行备份
select sql_no_cache from t
- sql_no_cache查询出的数据不会进入sql缓存
- mysqldump使用方法
- mysqldump使用一下语句进行数据备份
mysqldump -h ip -P port -u root --databases docker001 --single-transaction > test.sql -p
- 直接直接导出的sql文件即可还原
source test.sql
- mysqldump注意事项
- --single-transaction参数在rr(repeatable read)级别下进行(InnoDB),保证数据备份的一致性
- --all-databases参数备份所有的库
- mysqldump缺点
- 导出逻辑数据,备份较慢
- 还原需要执行sql, 备份也慢
- 总结:
- mysqldump使用简单,可以热备
- sql文件可以直接执行,占用空间小,可以阅读
- 备份还原性能不如物理备份
如何使用mysqldump+binlog增量备份
- mysqldump增量备份思路
- binlog忠实的记录了mysql数据库的变化
- mysqldump全量备份之后,可以用binlog作为增量
- mysqldump全量备份时,切换新的binlog文件
- 从零还原时,采用全量+binlog还原
- mysqldump使用一下语句对数据库进行全量备份
mysqldump -h host -P port -u root --databases docker01 --single-transaction --flush-logs --master-data=2 > test.sql -p
- --flush-logs:备份后切换binlog文件
- --master-data=2: 记录切换后的binlog文件名
- 增量备份
- 需要增量备份时,切换binlog文件
mysqladmin -h host -P port -u root -p flush-logs
然后将所有新增的binlog文件备份
- 还原
- 首先恢复旧的全量数据
source test.sql
- 然后将binlog增量还原至数据库(切记最后一个binlog正在使用的不要还原)
mysqlbinlog binlog.000012 binlog.000013 binlog.000014 | mysql -h host -P port -u root -p
- 总结:
- mysqldump+binlog可以有效对数据进行全量+增量备份
- 两个组件各司其职,是工程实践中的经典做法
- 理论上说可以将数据库恢复至binlog的任意时刻
- 缺点是操作起来比较复杂
如何使用xtrabackup进行物理备份
- 为什么需要物理备份
- 直接备份InnoDB底层数据文件
- 导出不需要转换,速度快
- 工作时对数据库的压力较小
- 更容易实现增量备份
- 直接拷贝裸文件行吗
- 理论上可行,但是有很多问题
- 要同时备份frm元数据文件,ibd文件,binlog文件, redulog文件
- 在不同版本的数据库和操作系统上还原可能有兼容为题
- 必须冷备份,影响业务
- 如何实现物理+热+全量备份
- 思路:利用redu log,备份ibd文件+备份期间的redo log
- 启动redu log监听线程,开始收集redo log
- 拷贝ibd数据文件
- 停止收集redo log
- 加FTWRL锁拷贝元数据frm
- 如何实现物理+热+增量备份
- 思路:与全量级别相同
- 如何确定增量:根据每个页的SLN号,确定变化的页
- 如何实现物理还原
- 思路:mysqld crash崩溃恢复流程相似
- 还原ibd文件,重放redo log
- ibbackup
- 现名mysql enterprise backup, InnoDB官方出品
- 实现了上述的功能,性能优秀
- xtrabackup
- percona公司开发的开源版本,实现了ibbackup的所有功能
- 下载地址:
debian10-xtrabackup - 安装 sudo dpkg -i xxx.deb
- xtrabackup全量使用方法
- 备份
innobackupex --user=root --password=12465 bakdir/
- 数据还原(停掉mysqld)
innobackupex --copy-back bakdir/xxxx-xx-xx/
- xtrabackup增量使用方法
- 增量备份
innobackupex --user=root --password=12465 --incremental bakdir/ --incremental-basedir="/bakdir/xxxx-xx-xx/"
- 增量备份合并至全量备份
innobackupex --apply-log bakdir/xxxx-xx-xx/ --incremental-dir=bakdir/yyyy-yy-yy/
- 总结
- 物理备份是一种高效的备份方式
- xtrabackup采用了备份ibd文件+备份期间redo log方式
- xtrabackup是最常用的mysql物理备份工具
- 物理备份的缺点是备份出来的文件无法直接阅读
mysql备份工具如何知道我们的创新
- mylvmbackup
- 物理、温备
- 利用lvm(logical volume manager)逻辑卷管理器
- 直接备份磁盘数据
- mydumper
- 跟mysqldump类似的工具
- 实现了多线程并发的备份还原
- 速度更快
- zmanda recovery manager
- 功能强大的备份恢复管理工具
- 集成了多种备份工具
- 集成了binlog分析功能
- 总结:
- mylvmbackup:使用lvm备份磁盘
- mydumper: 多线程备份
- zmanda recovery manager: 备份管理工具
如何防患于未然
- 权限隔离
- 给业务应用分配的账号只给DML权限,不给DDL权限
- 开发同学使用只读账号
- DBA平时使用只读账号,特殊时候切换账号
- SQL审计
- DBA在开发环境要审计即将要上线的sql语句
- 开发同学修改在线数据,提交给DBA执行
- inception自动审核工具
- 伪删表
- 删表之前先把表改名字,观察业务是否受影响
- 不直接删表,给表名加特殊后缀,用脚本删除
- 完备流程
- 上线之前备份数据
- 准备生产环境事故预案
- 总结:
- 最小权限规则,收缩权限
- 使用自动或手动的手段审计sql语句
- 删表前伪删除,使用自动工具删除
- 完善上线与运维流程
本章小结
- 数据库有哪些种类的备份
- 备份方式的分类维度有:状态、格式、内容
- 备份方式没有绝对的好处,只是用途不同
- outfile命令
- outfile是最简单且原生的数据库备份工具
- 使用简单,灵活性高
- 不适合数据还原场景,基本用来导出数据
- mysqldump工具, 逻辑备份
- mysqldump使用简单,可以热备,可以增量备份
- sql文件可以直接执行,占空间小,可以阅读
- 备份、还原性能不如物理备份
- xtrabackup工具, 物理备份
- 物理备份是一种高效的备份方式
- xtrabackup采用了备份ibd+备份期间redu log方式
- xtrabackup是mysql最常用的物理备份工具
- 物理备份的缺点就是备份的文件不能直接阅读
- 其它备份工具
- mylvmbackup: 使用lvm备份磁盘
- mydumper: 多线程备份
- zmanda recovery manager: 备份管理工具
- 防患于未然
- 最小权限规则,收缩权限
- 使用自动或手动的手段审计sql语句
- 删表和库时使用伪删除,使用脚本删除
- 完善上线与运维流程