1、更新语句MySQL大致执行流程
2、InnoDB 的主要内存结构:缓冲池
执行引擎要执行更新语句的时候,比如id =10 这行数据,会先去查询 id =10 这行数据是否在缓存池里,如果不在 那么会直接从硬盘加载到缓存池中,而且还会对这行数据加独占锁
3、undo 日志的作用
3.1、 如 id =10 这行的name “zhangsan” ,现在更新为 xxx ,那么此时需要把更新前的值"zhangsan" 和id = 10 这些信息写到undo 日志文件中以便事务的回滚。
3.2、写入undo日志后 会更新缓存池中的数据,这是如果mysql 宕机,会导致没存中的数据丢失!
4、redo日志的作用
4.1、redo log 记录对数据库的操作,在写入缓存后在写入redo log 如果在写入redo log mysql 宕机,会导致 内存中数据,和redo log 数据丢失(在未提交先都是会丢失)
4.2、提交事务后 会根据 innodb_flush_log_at_trx_commit配置的策略,将redo log中的日志刷新到磁盘中去。
innodb_flush_log_at_trx_commit 分别可以设置 0 、1 、2
设置0表示:提交事务 不会把redo log 的数据刷新到磁盘中,如果这时候mysql 宕机,会导致 内存中数据和 redo log 日志丢失。
设置1表示: 表示 只要事务提交成功了 磁盘中必须有redo log 的数据
设置2表示:提交事务 会把redo 日志 os cache 而不是直接写入磁盘,可能是1秒后才会把 os cache的数据写入到磁盘中。(存在 事务提交成功,宕机后数据丢失)
综上所述 建议日志刷盘策略设置为1,事务提交后 数据就不会丢失