• 第十章 MySQL事务及其日志介绍


    一、数据库升级

    #1.提出方案
    	1)升级的方法
    	2)升级的步骤
    	3)升级的时间
    	4)升级步骤可能会出现的问题
    	5)出现的问题怎么解决,解决时间
    	6)升级后出现的问题
    #2.搭建新的数据库
    #3.备份就数据库数据(如果需要修改存储引擎,才会备份除了系统库的所有库,正常情况就是全部备份)
    	mysqldump -uroot -p -A -R --triggers --single-transaction --master-data=2 > /tmp/full.sql
    #4.将备份的数据库推送大哦新的数据库
    	scp  rsync  硬件  NFS
    #5.导入数据
    	mysql -uroot -p < /tmp/full.sql
    #6.测试数据可用性
    	测试环境或开发环境打一个项目,测试
    #7.修改程序代码,将数据库信息修改为新的数据库地址
    	base.xml	db_host:  db_user:  db_password:
    #8.重新上线
    

    二、InnoDB的事务介绍

    1.事务周期

    1)成功的事务

    begin;
    sql1;
    sql2;
    ... ...
    commit;
    

    2)失败的事务

    begin;
    sql1;
    sql2;
    ... ...
    rollback;
    

    2.事务的特性(ACID)

    Atomic(原子性)
    所有语句作为一个单元全部成功执行或全部取消。
    
    Consistent(一致性)
    如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
    
    Isolated(隔离性)
    事务之间不相互影响。
    
    Durable(持久性)
    事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失。
    

    3.事务的控制语句

    begin;		#开启一个事务
    commit;		#提交一个事务
    rollback;	#回滚一个事务
    
    autocommit	#自动提交
    

    三、事务的日志

    1.redo log

    redo:"重做",记录的是,内存数据页的变化过程
    

    1)作用

    在事务ACID过程中,实现的是 "D" 持久化的作用。
    

    2)工作原理

    #1.修改数据时:
    1)首先数据会从磁盘取出,加载到内存的data buffer page
    2)操作数据,使用update语句修改数据,数据 2 变成 1
    3)id=2变成id=1的变化过程会记录到redo buffer page中
    4)当执行commit后,mysql会将redo buffer page中的变化过程写入磁盘的redo log中
    
    #2.查询时:
    1)执行select查询语句
    2)数据 id=2 会从磁盘加载到data buffer page
    3)并且将redo log中id=2变成id=1的变化过程取出到内存的redo buffer page中
    4)通过data buffer page的数据和redo buffer page的变化过程,得到结果 id=1
    

    2.undo log

    四、事务中的锁

    1.什么是锁

    1.锁 顾名思义就是锁定的意思
    2.作用:在事务ACID特性过程中,“锁”和“隔离级别”一起来实现“I”隔离性的作用
    

    2.锁的类别

    排他锁:在修改一条数据是,其他人不得修改
    共享锁:保证在多事务工作期间,数据查询时不会被阻塞
    
    乐观锁:多事务操作时,数据可以被同时修改,谁先提交,谁修改成功
    悲观锁:多事务操作时,数据只有一个人可以修改
    

    3.多版本并发控制

    1.只阻塞修改类操作(排他锁),不阻塞查询类操作(共享锁)
    2.乐观锁的机制(谁先提交谁为准)
    

    4.锁的粒度

    MyISAM:表级锁
    InnoDB:行级锁
    

    5.事务的隔离级别

    1)四种隔离级别

    1.RU级别:READ UNCOMMITTED(未提交读),允许事务查看其他事务所进行的未提交更改
    2.RC级别:READ COMMITTED,允许事务查看其他事务所进行的已提交更改
    3.RR级别:REPEATABLE READ,允许事务查看其他事务所进行的已提交更改,需要重新登录数据库才能查看到提交的数据
    4.串行化:SERIALIZABLE,将一个事务的结果与其他事务完全隔离
    

    2)数据库专业名词

    #1.脏读:
    执行一个事务,还没有提交就被读取,可是事务回滚了,那么之前读到的数据就是脏数据
    
    #2.幻读:
    当删除一条数据时,刚删除,有别人插入同一条数据,我查看时以为是没有删除
    
    #3.不可重复读
    第一次读取数据和第二次读取数据之间数据被别人修改了,导致第一次读取的数据与第二次读取的数据不同
    

    3)设置隔离级别

    #1.查看隔离级别
    mysql> show variables like '%iso%';
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | tx_isolation  | REPEATABLE-READ |
    +---------------+-----------------+
    1 row in set (0.00 sec)
    
    #2.设置数据库为RU级别
    [root@db01 ~]# vim /etc/my.cnf
    [mysqld]
    transaction_isolation=read-uncommit
    #transaction_isolation=read-commit
    

    五、MySQL日志

    1.错误日志

    1.默认错误日志是开启
    2.默认的路径是MySQL的数据目录 $datadir
    3.默认的名字是 '主机名'.err
    4.查看错误日志
    	mysql> show variables like 'log_error';
    	[root@db01 ~]# mysql -uroot -p123 -e "show variables like 'log_error'"
    5.配置错误日志
    	[root@db01 ~]# vim /etc/my.cnf
    	[mysqld]
    	log_error=/usr/local/mysql/data/mysql.err
    	#log_error=mysql.err
    
    #常用的数据库配置
    [root@db01 ~]# vim /etc/my.cnf
    [mysqld]
    datadir=/usr/local/mysql/data
    basedir=/usr/local/mysql
    port=3306
    socket=/tmp/mysql.sock
    server_id=1
    character-set-server=utf8
    innodb_data_file_path=ibdata1:76M;ibdata2:12M:autoextend
    log_error=/usr/local/mysql/data/mysql.err
    [mysql]
    socket=/tmp/mysql.sock
    

    2.一般查询日志

    1.默认一般查询日志是关闭的
    2.如果开启默认的路径是MySQL的数据目录 $datadir
    3.默认的名字是 '主机名'.log
    4.查看一般查询日志
    	mysql> show variables like "general_log%";
    	[root@db01 ~]# mysql -uroot -p123 -e "show variables like 'general_log%'"
    5.配置错误日志
    	[root@db01 ~]# vim /etc/my.cnf
    	[mysqld]
    	general_log=on
    	general_log_file=/usr/local/mysql/data/db01.log
    	
    #一般情况我们不会开启一般查询日志,因为所有的操作都会被记录,第一不安全,第二会浪费磁盘空间
    

    3.二进制日志

    1.默认二进制日志是关闭的
    2.如果开启默认的路径是MySQL的数据目录 $datadir
    3.一般指定的的名字是 mysql-bin.000001
    4.查看二进制日志
    	mysql> show variables like 'log_bin';
    	[root@db01 ~]# mysql -uroot -p123 -e "show variables like 'log_bin'"
    5.配置二进制日志
    	[root@db01 ~]# vim /etc/my.cnf
    	[mysqld]
    	server_id=1						#在MySQL5.7中,必须配置server_id
    	log_bin=mysql-bin				#在MySQL5.6版本,直接配置就开启了
    

    1)作用

    1.记录已提交的DML事务语句,并拆分为多个事件(event)来进行记录
    2.记录所有DDL、DCL等语句,总之,二进制日志会记录所有对数据库发生修改的操作
    3.可以用恢复数据
    

    2)事件

    1.在binlog中最小的记录单元为event
    2.一个事务会被拆分成多个事件(event)
    
    #事件(event)特性:
    1.每个event都有一个开始位置(start position)和结束位置(stop position)。
    2.所谓的位置就是event对整个二进制的文件的相对位置。
    3.对于一个二进制日志中,前120个position是文件格式信息预留空间。
    4.MySQL第一个记录的事件,都是从120开始的
    

    4.慢日志

  • 相关阅读:
    【应用安全】mssql db_owner权限拿shell
    【应用安全——XSS】input-hidden
    留言板
    Git配置多个SSH-Key
    13.InternalThreadLocalMap
    10.ChannelOutboundBuffer
    9.ChannelHandlerContext
    8.Future&Promise
    7.给大动脉来一刀-NioEventLoop 源码分析
    6.给大动脉来一刀
  • 原文地址:https://www.cnblogs.com/jhno1/p/13902469.html
Copyright © 2020-2023  润新知