mysql的事务和存储引擎+备份

news2024/12/21 5:54:07

mysql的事务和存储引擎+备份

  • 一. mysql的事务
    • 1.1 mysgl支持事务四种隔离级别
    • 1.2 事务控制语句
    • 1.3 行锁和死锁
      • 1.3.1 行锁
      • 1.3.2 死锁
      • 1.3.3 如何避免死锁的发生
  • 二. msyql的备份和还原以及日志管理
    • 2.1 数据库备份的分类
    • 2.2 备份策略
      • 2.2.1 物理冷备份(全量)
      • 2.2.2 mysqldump的备份和恢复(热备份)
      • 2.2.3 对于数据的备份和恢复
      • 2.2.4 基于位置的恢复
      • 2.2.5 基于时间点恢复
    • 2.3 日志管理

一. mysql的事务

mysql的存储引擎innodb自带了事务的特性

  • 原子性
  • 一致性
  • 持久性
  • 隔离性

隔离性:每个事物执行的过程是独立的,互相不能被干扰。并发事务之间是独立的

  1. 脏读
    A事务在访问数据并且修改了数据,但是修改的结果没有提交到数据库
    B事务也访问了这条数据,而且看到了未提交的结果
  2. 不可重复读
    在一个事务之内,多次读同一数据。
    这A事务没有结束时,另一个B事务也访问该数据,由于在A事务中两次读取数据,在中间B事务修改了数据,导致A事务两次查询的结果是不一致的,这就是不可重复读
  3. 幻读
    A事务对数据进行了修改,B事务也对数据进行了修改,A事务发现数据还是有没有修改的数据,产生了幻觉。
    事务的隔离级别:

1.1 mysgl支持事务四种隔离级别

  1. 未提交读,允许脏读,可以看到未提交的修改 read uncommitted
  2. 提交读,read committed 提交读,只允许看到修改提交之后的数据
  3. 可重复读:mysgl的默认隔离级别,一个事务,在执行两次select语句,保证得到相同的结果
    Repeatable read
  4. 串行读:后一个事务必须等待前一个完成之后才能继续,在这个过程中表会完全锁住,读写都会阻塞。
set global transaction isolation level Read Uncommitted;
set session transaction isolation level Read Uncommitted;

#刷新生效
mysql> flush privileges;

show session variables like'%isolation%';

1.2 事务控制语句

  • BEGIN:显示开始一个事务
  • commit:提交事务,所有的修改都是永久性的。
  • rollback:对事务进行回滚,返回到上一次的操作,只能回滚正在进行未提交的修改。
  • savepoint 名称:在事务当中创建一个回滚点,回滚到指定的位置,一个事务中可以有多个回滚点。
    savepoint 在一个事务当中是一个临时的标记,在事务执行过程中的一个回滚点,多个回滚点,是按照顺序进行的,前面的回滚点一旦执行,后续的回滚点就回失效。
#创建表
create table cost (
id int(5) PRIMARY key,
name char(10),
money int(10)
);
insert into cost values(1,"test1",1000)
insert into cost values(2,"test2",1000)
select * from cost;

在这里插入图片描述

begin;   #开始一个事务
UPDATE cost set money=money+100 where id= 1;

在这里插入图片描述

#COMMIT;  
#提交后无法回滚
ROLLBACK;   #回滚

在这里插入图片描述

#savepoint回滚
begin;
update cost set money=money+200 where id= 1;
savepoint s1;
UPDATE cost set money=money+200 where id= 2;
savepoint s2;
insert into cost values(3,"test3",1000);
select * from cost;

rollback to s1;

在这里插入图片描述

1.3 行锁和死锁

1.3.1 行锁

innodb通过给索引加锁来实现行级的锁定。

  • 如果没有索引,会使用隐藏的聚簇索引来是来实现锁定。
  • 如果A事务对索引字段进行操作,就会触发聚簇索引,锁定整行,B事务对这个行进行的操作就会被锁住。
create table if not exists  student(
    id int(5) PRIMARY KEY,
    name char(8),
    age int(3),
    sex char(2) 
);
alter table student add index name index(name);

insert into student values(1,'小明',18,'男');
insert into student values(2,'小红',19,'女');
insert into student values(3,'小刚',19,'男');
insert into student values(4,'小绿',17,'女');
insert into student values(5,'小黑',20,'男');

select * from student;

#另外一个终端
mysql> begin;
mysql> delete from student where name="小明";


update student set age =20 where id = l;

在这里插入图片描述

mysql> commit;  #提交则会立即完成

在这里插入图片描述

1.3.2 死锁

两个事物相互等待对方的资源,形成了一个环路导致的。

#终端
mysql> begin;
mysql> delete from student where id = 5;
#触发行锁

#客户端
begin;
select * from student where id=1 for update;
for update:设置一个排他锁,在当前事务未提交前,禁止事务的写入和更新操作。

#终端
mysql> delete from student where id = 1;
#触发排他锁

#客户端
update student set name =  'abc' where id = 5;

在这里插入图片描述

死锁发生会自定选择一个事务当中的语句进行执行,直接终止其中的一个事务,回滚另外一个事务,以解除死锁(随机的)
在这里插入图片描述

1.3.3 如何避免死锁的发生

  1. 按照固定的顺序对表和行进行访问
  2. 大事务拆成小事务,业务允许的情况下
  3. 调整事务的默认隔离级别,如果业务允许,隔离级别越低越好。
  4. 要给表添加合适的索引(不是经常需要访问的字段,最好不要设置索引)

二. msyql的备份和还原以及日志管理

备份的目的就是灾难恢复

2.1 数据库备份的分类

1、物理备份
冷备份:关闭数据库进行备份的,全量备份。

2、逻辑备份:
热备份:数据库可以正常运行,不影响数据库的操作,在这个条件可以实现备份和恢复

2.2 备份策略

  • 全量备份
  • 增量备份
  • 冷备份只能进行全量备份,逻辑备份既可以实现全量,也可以实现增量。
  • mysqldump,常用的逻辑备份的工具,mysgl自带的。

2.2.1 物理冷备份(全量)

/usr/local/mysql/data

#压缩
tar -Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/
#解压opt下的压缩包
cd /opt/usr/local/mysql
cp -a data/ /usr/local/mysql/

2.2.2 mysqldump的备份和恢复(热备份)

musqldump是针对库和表的全量和增量,是热备份。
把备份的库和表,以文件的形式导出,再从导出的文件进行恢复。

#库的备份,多个库之间用空格隔开
mysqldump -u root -p123456 --databasess 库名 另一个库 > /opt/01.sql

#库的恢复
mysql -u root -p123456 < /opt/01.sql
#表的备份,多个表之间用空格隔开
mysqldump -u root -p123456 库名 表名 另一个表 > /opt/03.sql
#表的恢复
mysql -u root -p123456 库名 < /opt/03.sql
#不进入操作
mysql -u root -p123456 -e 'select * from 库名.表名'

2.2.3 对于数据的备份和恢复

全量备份,热备份
使用mysql的二进制日志的方式来是备份,对数据的全量或者是增量

先要开启二进制日志的功能

vim /etc/my.cnf
#添加
log-bin=mysql-bin
#开启二进制日志的功能,二进制文件的名称mysql-bin.000001
binlog_format=MIXED
#二进制日志的记录格式:
      1、ROW  基于行
      记录每一行的数据,准确,但是恢复效率的低
      2、STATEMENT 基于sql语句
      按照顺序对sql语句进行记录,高并发的情况下,sql的记录顺可能会出错,可能会导致数据的记录有偏差,虽然恢复的效率比较高
      3、MIXED  混合
      正常情况下使用STATEMENT,高并发自动切换ROW的记录方式。

systemctl restart mysqld

#二进制文件存放在data中
cd /usr/local/mysql/data
#解析查看日志
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001

#恢复所有执行过的操作,包括错误的
mysqlbinlog --no-defaults mysql-bin.000001 | mysql -u root -p123456
#所以需要断点操作

#二进制文件的刷新(断点)
mysqladmin -u root -p123456 flash-logs

#断点是按天来执行的,可以按天对数据库进行增量的备份。

2.2.4 基于位置的恢复

mysqlbinlog --no-defaults --start-position='1338' mysql-bin.000005 | mysql -u root -p123456
从指定位置开始恢复数据,一直恢复到文件的结尾。

mysqlbinlog --no-defaults --stop-position='1338' mysql-bin.000005 | mysql -u root -p123456
从开始恢复到结束位置

mysqlbinlog --no-defaults --start-position='2364' --stop-position='3235' mysql-bin.000005 | mysql -u root -p123456
从指定位置开始,到指定的位置结束

2.2.5 基于时间点恢复

#同步时间
ntpdate ntp.aliyun.com 

mysqlbinlog --no-defaults --start-datetime='2024-12-20 13:47:17' mysql-bin.000005 | mysql -u root -p123456
从指定时间开始恢复数据,一直恢复到文件的结尾。

mysqlbinlog --no-defaults --stop-datetime='2024-12-20 13:47:38' mysql-bin.000005 | mysql -u root -p123456
从开始恢复到结束时间

mysqlbinlog --no-defaults --start-datetime='2024-12-20 13:47:17' --stop-datetime='2024-12-20 13:47:38' mysql-bin.000005 | mysql -u root -p123456
从指定时间开始,到指定的时间结束

2.3 日志管理

vim /etc/my.cnf

og-error=/usr/local/mysql/date/mysql_error.log
#记录mysql在启动,停止或者是运行时,产生错误的日志
general_log=ON general_log_file=/usr/local/mysql/data/mysql_general.log
#开启mysql在使用过程中的记录日志
slow_query_log=ON slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log 
long_query_time=5
#开启慢查询日志,用来记录所有查询的时间超过long_query_time=5的记录,查询的执行时间超过5秒钟就会记录。
不注明,默认是10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2263095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

raid 状态查看 storcli64

场景 当磁盘报错的时候使用该命令排查 fdisk -l /dev/sdb fdisk: cannot open /dev/sdb: Input/output error进一步使用 smartctl 排查 smartctl -a /dev/sdb 输出 smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-144-generic] (local build) Copyright (C) 2002-19, B…

[搜广推]王树森推荐系统——双塔模型

内容概览 矩阵补充模型 矩阵补充模型输入用户ID 和 物品ID&#xff0c;利用embedding把 用户ID 和 物品ID 映射成向量&#xff0c;输出向量的内积&#xff08;一个实数&#xff09;&#xff0c;内积越大说明用户对这个物品越感兴趣 详见[搜广推]王树森推荐系统——矩阵补充&a…

96 vSystem

vSystem系统 1 技术背景 网络虚拟化旨在构建出一套与网络底层物理拓扑相互独立的逻辑网络环境&#xff0c;提供给不同需求的用户使用。基于这种思想&#xff0c;诞生出了 VLAN 技术和 VPN 技术。近年来&#xff0c; 随着以 VMM&#xff08;Virtual Machine Monitor&#xff0c…

低代码软件搭建自学的第一天——熟悉PyQt

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 学习计划第 1 步&#xff1a;环境搭建1.1 安装 Python1.2 安装 PyQt安装命令&#xff1a;验证安装&#xff1a; 第 2 步&#xff1a;PyQt 基础知识2.1 创建第一个窗…

【mac 终端美化】oh my zsh

快捷的mac终端美化方法。 以下是效果图&#xff0c;比较朴素&#xff0c;但是相比默认方案会好看一些&#xff0c;也能明显查看输入的命令&#xff0c;不会和输出混在一起。 下载主题 访问网址&#xff1a;https://iterm2colorschemes.com/&#xff0c;下载网页的压缩包并解…

移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备

移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备 一、前提条件 确保路由器硬件支持&#xff1a; OpenWrt 路由器需要足够的存储空间和 CPU 性能来运行 Tailscale。确保设备架构支持 Tailscale 二进制文件&#xff0c;例…

【笔记】深度学习模型评估指标

推荐链接&#xff1a; &#xff08;0&#xff09;多分类器的评价指标 &#xff08;1&#xff09;泛化误差的评价方法&#xff1a;【机器学习】模型评估与选择&#xff08;留出法、交叉验证法、查全率、查准率、偏差、方差&#xff09; &#xff08;2&#xff09;机器学习&…

Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表

文章目录 Linux性能监控命令_nmon 安装与使用安装解压创建nmono目录解压到nmono目录当中切换到sources目录下解压 配置环境变量创建软链接到 /usr/bin/ 目录下打开 配置文件 配置环境变量在底部增加如下注册 使用使用说明监控监控CPU监控内存监控磁盘监控网络监控文件系统 后台…

串口通信控制LED灯

做这个东西的目的是锻炼一下自己的编程能力以及系统思维能力 首先&#xff0c;清楚自己要干什么&#xff0c;正点原子大家应该都看过&#xff0c;系统框图是一个比较重要的东西&#xff0c;引导我们去设计和思考。 下面先给出系统框图&#xff1a; 模块划分好后&#xff0c;结构…

WPF+MVVM案例实战与特效(四十五)- 打造优雅交互:ListBox 的高级定制与行为触发(侧边菜单交互面板)

文章目录 1、引言2、案例效果3、案例实现1、依赖安装2、文件创建3、代码实现1、依赖引用与上下文2、个性化视觉效果:自定义 ItemContainerStyle3、页面样式与布局完整代码4、ViewModel 逻辑实现5、子界面代码:3、实现效果4、源代码获取5、总结1、引言 在WPF应用程序开发中,…

分享两个爬虫练习网站+一个python游戏网站

目录 第一个网站第二个Python游戏网站 第一个网站 网站一 第二个 网站二 Python游戏网站 网站三

空天地遥感数据识别与计算--数据分析如何助力农林牧渔、城市发展、地质灾害监测等行业革新

在科技飞速发展的时代&#xff0c;遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究&#xff0c;空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而&#xff0c;对于许多专业人士而言&#xff0c;如何高效地处…

C++中的进程虚拟内存布局

进程虚拟内存布局 进程虚拟内存布局&#xff1a; .text&#xff08;代码段&#xff09;&#xff1a;存放的是程序源代码编译后的机器指令&#xff0c;是只读的。 .rodata&#xff08;只读数据段&#xff09;&#xff1a;存放的是程序中的只读数据&#xff0c;一般是程序里面的…

鸿蒙开发-ArkTS 创建自定义组件

在 ArkTS 中创建自定义组件是一个相对简单但功能强大的过程。以下是如何在 ArkTS 中创建和使用自定义组件的详细步骤&#xff1a; 一、定义自定义组件 使用Component注解&#xff1a;为了注册一个组件&#xff0c;使其能够在其他文件中被引用&#xff0c;你需要使用Component…

计算机网络B重修班-期末复习

[TOC] (计算机网络B重修班-期末复习&#xff09; 一、单选 &#xff08;20题&#xff0c;1分/题&#xff0c;共20分&#xff09; 二、判断 &#xff08;10题&#xff0c;1分/题&#xff0c;共10分&#xff09; 三、填空 &#xff08;10题&#xff0c;1分/题&#xff0c;共10…

SSH连接成功,但VSCode连接不成功

环境 在实验室PC上连接服务器234 解决方案&#xff1a;在VSCode中重新添加远程主机 删除旧的VSCode Server 在远程主机上&#xff0c;VSCode会安装一个‘vscode-server’服务来支持远程开发&#xff0c;有时旧的‘vscode-server’文件可能会导致问题&#xff0c;删除旧的&am…

揭开 Choerodon UI 拖拽功能的神秘面纱

01 引言 系统的交互方式主要由点击、选择等组成。为了提升 HZERO 系统的用户体验、减少部分操作步骤&#xff0c;组件库集成了卓越的拖拽功能&#xff0c;让用户可以更高效流畅的操作系统。 例如&#xff1a;表格支持多行拖拽排序、跨表数据调整、个性化调整列顺序&#xff1…

面试题整理9----谈谈对k8s的理解1

谈谈对k8s的理解 1. Kubernetes 概念 1.1 Kubernetes是什么 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统&#xff0c;其服务、支持和工具的…

Elasticsearch:什么是信息检索?

信息检索定义 信息检索 (IR) 是一种有助于从大量非结构化或半结构化数据中有效、高效地检索相关信息的过程。信息&#xff08;IR&#xff09;检索系统有助于搜索、定位和呈现与用户的搜索查询或信息需求相匹配的信息。 作为信息访问的主要形式&#xff0c;信息检索是每天使用…

【深度学习】 零基础介绍卷积神经网络(CNN)

CNN学习 零基础介绍写个CNN最简单的代码一. 概述二. 搭建CNN1. 输入层2. 卷积层3. 激活层4. 池化层5. 全连接层6. 网络搭建小结7. 损失函数8. 梯度下降9. 反向传播10. 模型评估与正则化11. 尝试搭建自己的第一个CNN 三. 经典CNN结构四. 猫狗识别项目实践1. Paddle实现版本&…