MySQL详解六:备份与恢复

文章目录

  • 1. 数据库备份的分类
    • 1.1 从物理和逻辑上分类
      • 1.1.1 物理备份
      • 1.1.2 逻辑备份
    • 1.2 从数据库的备份策略角度上分类
      • 1.2.1 完全备份
      • 1.2.2 差异备份
      • 1.2.3 增量备份
    • 1.3 常见的备份方法
  • 2. MySQL完全备份
    • 2.1 完全备份简介
    • 2.2 优点与缺点
    • 2.3 实现物理冷备份与恢复
      • 2.3.1 实现流程
      • 2.3.2 前置准备
      • 2.3.3 实现物理冷备份
    • 2.4 使用mysqldump备份数据库
    • 2.5 使用source命令恢复数据库
    • 2.6 使用mysql命令恢复数据库
  • 3. MySQL增量备份与恢复
    • 3.1 使用完全备份所带来的问题
    • 3.2 增量备份简介
    • 3.3 特点
    • 3.4 增量备份与日志的关系
      • 3.4.1 二进制日志对备份的意义
    • 3.5 增量恢复方法类别
      • 3.5.1 一般恢复
      • 3.5.2 基于位置恢复
      • 3.5.3 基于时间点恢复
    • 3.6 增量备份
      • 3.6.1 开启二进制日志功能
      • 3.6.2 实现增量备份
      • 2.6.3 一般恢复
      • 3.6.4 端点恢复
        • 3.6.4.1 基于位置恢复
        • 3.6.4.2 基于时间点恢复

1. 数据库备份的分类

1.1 从物理和逻辑上分类

1.1.1 物理备份

对数据库操作系统的物理文件(如:数据文件、日志文件等)的备份

1.1.2 逻辑备份

对数据库逻辑组件(如:表等数据库对象)的备份

1.2 从数据库的备份策略角度上分类

1.2.1 完全备份

每次对数据库进行完整的备份
在这里插入图片描述

1.2.2 差异备份

  • 备份自从上次完全备份之后修改的文件
  • 仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单
    在这里插入图片描述

1.2.3 增量备份

  • 只有在上次完全备份或增量备份后被修改的文件才会备份
  • 仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂

在这里插入图片描述

1.3 常见的备份方法

  1. 物理冷备
    备份时数据库处于关闭状态,直接打包数据库文件
    备份速度快,恢复时也是最简单的

  2. 专用备份工具mysqldump或mysqlhotcopy
    mysqldump常用的逻辑备份工具
    mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

  3. 启用二进制日志进行增量备份·
    进行增量备份,需要刷新二进制日志

  4. 第三方工具备份
    免费的MySQL热备份软件Percona XtraBackup

2. MySQL完全备份

2.1 完全备份简介

  • 是对整个数据库、数据库结构和文件结构的备份
  • 保存的是备份完成时刻的数据库
  • 是差异备份与增量备份的基础

2.2 优点与缺点

  • 优点
    备份与恢复操作简单方便

  • 缺点
    数据存在大量重复
    占用大量备份空间
    备份与恢复时间长

2.3 实现物理冷备份与恢复

2.3.1 实现流程

关闭MySQL数据库 > 使用tar命令直接打包数据库文件夹 > 直接替换现有MySQL目录

2.3.2 前置准备

mysql1 :192.168.67.100
mysql2 :192.168.67.101
mysql -uroot -pabc123
#登录数据库

在这里插入图片描述

create datbbase scj;
#新建数据库use scj;
#进入数据库create table scj1 (id int, name varchar(10), age int, sex char(2), hobby varchar(50));
#新建表show tables;
#查看数据库

在这里插入图片描述

#添加数据
insert into scj1 values (1, '张三', 22, '男', 'java');
insert into scj1 values (2, '李四', 23, '男', 'shell');
insert into scj1 values (3, '王五', 24, '男', '云计算');
insert into scj1 values (4, '赵四', 25, '男', 'url');
insert into scj1 values (5, '尼古拉斯', 26, '男', 'html');
insert into scj1 values (6, '日川钢板', 27, '男', 'css');

在这里插入图片描述

create table scj2 like scj1;
insert into scj2 (select * from scj1);
#克隆一个名为scj2的表show tables from scj;
#查看是否创建成功

在这里插入图片描述

2.3.3 实现物理冷备份

quit
#退出数据库
systemctl stop mysqld
#关闭数据库
cd /usr/local/mysql/data
#前往mysql默认日志目录下

~~~

mkdir /opt/backup
#创建备份日志文件目录tar zcvf /opt/backup/mysql_full_$(date -d "-1 day" +%Y.%m.%d).tar.gz ./data/
#打包压缩上一天的data目录到/opt/backup目录下,并标上日期
#拓展
date +%Y/%m/%d
#只显示当前日期date +%Y-%m01
#显示当月第一天date -d "+1 day" +%Y/%m/%d
#显示明天date -d "-1 day" +%Y/%m/%d
#显示昨天date -d "1 day ago" +%Y/%m/%ddate -d "$(date +%Y%m01) -1 day" +%Y/%m/%d
#显示上月最后一天date -d "(date -d "1 mouth" +%Y%m01) -1 day" +%Y/%m/%d
#显示当月最后一天

在这里插入图片描述

cd /optscp mysql_full_2023.09.18.tar.gz 192.168.67.101:/opt
#将打包的data目录远程拷贝到另一台mysql主机的opt目录下

在这里插入图片描述

在这里插入图片描述

#前往mysql2
systemctl stop mysqld
#关闭mysql服务cd /usr/local/mysql
mv data/ data.bak
#将现data目录改名为data.bakmv  mysql_full_2023.09.18.tar.gz /usr/local/mysql/
#将此压缩包转移到mysql用户目录下tar xf mysql_full_2023.09.18.tar.gz
#解压缩mysql1的data目录

在这里插入图片描述

systemctl start mysqld
#打开mysql服务

在这里插入图片描述

mysql -uroot -pabc123
#进入数据库
show databases;
#查看现有数据库show tables from scj;
#查看库中现有数据库select * from scj.scj1;
#查看表内容

在这里插入图片描述

2.4 使用mysqldump备份数据库

#基本格式
mysqldump -u [用户名] -p[密码] --databases 库名1 [库名2]> /备份路径/备份文件名.sql	
#导出的就是数据库脚本文件#完全备份一个或多个完整的库(包括其中所有的表)
mysqldump -uXXX -p[XXX] 库名 > XXX.sql
#备份指定库中的所有表数据(不包含创建库的操作)mysqldump -uroot -pabc123 scj > /opt/backup/scj.sql
#只备份表和表中的内容,并没有备份库cd /opt/backup
ls

在这里插入图片描述

cat scj.sql |egrep -v "^--|^/\*|^$"
#过滤出需要的信息

在这里插入图片描述

mysqldump -uroot -pabc123 --databases scj > /opt/backup/scj_full.sql
#备份一个完整的库到/opt/backup目录下

在这里插入图片描述

cat scj_full.sql |egrep -v "^--|^/\*|^$"
#过滤出需要的信息

在这里插入图片描述

mysqldump -u [用户名] -p[密码] --all-databases > /备份路径/备份文件名.sqlmysqldump -u root -pabc123 --all-databases > /opt/all_full.sql
#完全备份 MySQL 服务器中所有的库

在这里插入图片描述

cat all_full.sql |grep "^CREATE DATABASE"

在这里插入图片描述

mysqldump -u root -p[密码] 库名 [表名1] [表名2]> /备份路径/备份文件名.sql
#备份指定库中的一个或多个表数据(不包含创建库的操作)mysqldump -u root -pabc123 scj scj2 > /opt/backup/scj_scj2.sql
#备份scj库中scj2表cat scj_scj2.sql |egrep -v "^--|^/\*|^$"
#查看备份内容信息

在这里插入图片描述

2.5 使用source命令恢复数据库

#记得提前备份

在这里插入图片描述

#模拟环境
#先登录mysql
mysql -uroot -pabc123mysql>drop databases scj;
#删除scj库

在这里插入图片描述

source /opt/backup/scj_full.sql
#恢复完整的scj库#注:一定要用绝对路径

在这里插入图片描述
在这里插入图片描述

#也可以只用表数据进行恢复
create database scj;
#创建新scj库use scj;
#进入scj库source /opt/backup/scj.sql
#恢复库中表数据#因为scj.sql中不包含有创建库的操作,所以可以在任意一个库中导入表数据

2.6 使用mysql命令恢复数据库

#基本格式
mysql -uXXX -pXXX [库名] < XXX.sql          #如果sql文件只包含表的备份,要指定库名cat XXX.sql | mysql -uXXX -pXXX [库名]
mysql -uroot -pabc123 scj < scj.sql
#需要提前创建库mysql -uroot -pabc123  < scj_full.sql
#直接恢复完整的数据库
mysql -uroot -pabc123 -e "drop database scj;"
#-e 执行命令后退出数据库mysql -uroot -pabc123 -e "show databases;"
#查看是否删除完成

在这里插入图片描述

mysql -uroot -pabc123  < scj_full.sqlmysql -uroot -pabc123 -e "show databases;"
#查看是否恢复完成

在这里插入图片描述

3. MySQL增量备份与恢复

3.1 使用完全备份所带来的问题

  • 备份数据中有重复数据
  • 备份时间与恢复时间过长

3.2 增量备份简介

是自上一次备份后增加和变化的文件或内容

3.3 特点

  • 没有重复数据,备份量不大,时间短
  • 恢复需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复

3.4 增量备份与日志的关系

  • MySQL没有提供直接的增量备份方法
  • 可通过MySQL提供的二进制日志间接实现增量备份

3.4.1 二进制日志对备份的意义

  1. 二进制日志保存了所有更新或者可能更新数据库的操作
  2. 二进制日志在启动MySQL服务器后开始记录,并在文件达到max binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件
  3. 只需定时执行flushlogs方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份

3.5 增量恢复方法类别

3.5.1 一般恢复

  • 将所有备份的二进制日志内容全部恢复

3.5.2 基于位置恢复

  • 数据库在某一时间点可能既有错误的操作也有正确的操作
  • 可以基于精准的位置跳过错误的操作

3.5.3 基于时间点恢复

跳过某个发生错误的时间点实现数据恢复

3.6 增量备份

3.6.1 开启二进制日志功能

vim /etc/my.cnf
#编辑配置文件#添加
log-bin=mysql-bin
binlog_format = MIXED				#可选,指定二进制日志(binlog)的记录格式为 MIXED
server-id = 1#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT

在这里插入图片描述

systemctl restart mysqld
#重新启动服务ls /usr/local/mysql/data

在这里插入图片描述

#因为二进制文件内容默认是二进制字符,人是看不懂的
#所以使用mysqlbinlog命令
mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000001
#以base64方式进行解码,按行进行读取编码,显示详细内容,指定mysql-bin.000001文件

在这里插入图片描述

#除了可以用重启来刷新mysql二进制文件,还可以使用mysqladmin命令来刷新二进制文件mysqladmin -uroot -pabc123 flush-logs
#再次生成新的二进制日志文件

在这里插入图片描述

cat mysql-bin.index
#该文件保存着所有的二进制文件的序列号

在这里插入图片描述

3.6.2 实现增量备份

#模拟环境
select * from scj.scj1
#事先准备表

在这里插入图片描述

#当天二进制文件是没有操作数据的
cat /usr/local/mysql/data/mysql-bin.000003  
#查看最新二进制日志文件

在这里插入图片描述

#首先实现完全备份
mkdir /opt/backupcd /opt/backup
mkdir full bin
#full目录做完全备份,bin做增量备份

在这里插入图片描述

vim /opt/mysqlquan.sh     
#编写完全备份脚本  
#!/bin/bash  
mysqldump -u root -p123456 --all-databases > /bak/all_$(date +%F).sql  chmod 700 /opt/mysqlquan.sh 
#添加属主的权限

在这里插入图片描述

vim /opt/binlog.sh 
#编写增量备份脚本
#!/bin/bash  
filename=$(sed -n '$p' /usr/local/mysql/data/mysql-bin.index | awk -F '/' '{print $2}') 
#使用sed命令打印二进制日志文件最后一行内容作为filename变量的值 
mv /usr/local/mysql/data/$filename /bak/binlog_$(date +%F)
#将二进制日志移动到备份目录下,并将移动后的文件名称加上日期  
mysqladmin -uroot -pabc123 flush-logs  
#生成新的二进制日志文件  chmod 700 /opt/binlog.sh 
#添加属主的权限

在这里插入图片描述

crontab -e
#做计划任务

在这里插入图片描述
在这里插入图片描述

mysqldump -uroot -pabc123 scj scj1 > /opt/backup/full/scj_scj1-$(date +%Y.%m.%d).sql
#将scj库下scj1表备份到/opt/backup/full下

在这里插入图片描述

mysqladmin -uroot -pabc123 flush-logs
#重新生成一个二进制文件

在这里插入图片描述

#进入数据库
#插入两条数据
insert into scj.scj1 values (7, '小黑子', 25, '男', '黑坤坤');
insert into scj.scj1 values (8, '小仙女', 18, '女', '打拳');select * from scj.scj1;
#查看内容

在这里插入图片描述

mysqladmin -uroot -pabc123 flush-logs
#保存上一个文件并生成新一个文件

在这里插入图片描述

mv -f mysql-bin.000004 /opt/backup/bin/mysql-bin.000004-$(date -d '1 day' +_%Y.%m.%d)

在这里插入图片描述

#进入数据库
#插入两条数据
insert into scj.scj1 values (9, 'giao桑', 28, '男', 'giao');
insert into scj.scj1 values (10, '翠花', 18, '女', '看打拳');select * from scj.scj1;
#查看内容

在这里插入图片描述

mysqladmin -uroot -pabc123 flush-logs
#保存上一个文件并生成新一个文件

在这里插入图片描述

mv -f mysql-bin.000005 /opt/backup/bin/mysql-bin.000005-$(date -d '1 day' +_%Y.%m.%d)

在这里插入图片描述

#进入数据库
#模拟被删库跑路了
drop databbase scj;

在这里插入图片描述

2.6.3 一般恢复

#现在进行恢复
create database scj;
#新建库
mysql -uroot -pabc123 scj < /opt/backup/full/scj_scj1-2023.09.20.sql
#首先恢复基础表数据

在这里插入图片描述

#进入数据库
select * from scj.scj1
#查看表内容

在这里插入图片描述

#恢复第二次输入的内容
mysqlbinlog --no-defaults /opt/backup/bin/mysql-bin.000004-_20230921 | mysql -uroot -pabc123

在这里插入图片描述

#进入数据库
select * from scj.scj1
#查看表内容

在这里插入图片描述

#恢复第三次输入的内容
mysqlbinlog --no-defaults /opt/backup/bin/mysql-bin.000005-_2023.09.22 | mysql -uroot -pabc123

在这里插入图片描述

3.6.4 端点恢复

#将二进制文件转译
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000004-_20230921 > mysql-bin-2023.09.21mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000005-_2023.09.22 > mysql-bin-2023.09.22

在这里插入图片描述
在这里插入图片描述

3.6.4.1 基于位置恢复
#基本格式
mysqlbinlog --no-defaults --start-position='位置点' --stop-position='位置点' 二进制日志文件 | mysql -uXXX -pXXX
#示例
#只恢复小黑子那一段#进入数据库清空表数据
truncate table scj.scj1;

在这里插入图片描述

vim /opt/backup/bin/vim mysql-bin-2023.09.21
#查看具体位置点

在这里插入图片描述

mysqlbinlog --no-defaults --start-position='293' --stop-position='526' /opt/backup/bin/mysql-bin.000004-_20230921 | mysql -uroot -pabc123
#将具体的位置点传往数据库服务器
#注:要使用二进制文件,不要用编码后的二进制文件

在这里插入图片描述

#前往数据库
select * from scj.scj1;
#查看内容

在这里插入图片描述

3.6.4.2 基于时间点恢复
#基本格式
mysqlbinlog --no-defaults --start-datetime='YYYY-mm-dd HH:MM:SS' --stop-datetime='YYYY-mm-dd HH:MM:SS' 二进制日志文件 | mysql -uXXX -pXXX
#示例
#只恢复小仙女那一段#进入数据库清空表数据
truncate table scj.scj1;

在这里插入图片描述

vim /opt/backup/bin/vim mysql-bin-2023.09.21
#查看具体时间点

在这里插入图片描述

mysqlbinlog --no-defaults --start-datetime='2023-09-20 0:37:43' --stop-datetime='2023-09-20 0:40:35' /opt/backup/bin/mysql-bin.000004-_20230921 | mysql -uroot -pabc123
#将具体时间点范围内的数据传往数据库服务器内

在这里插入图片描述

#前往数据库
select * from scj.scj1;
#查看内容

在这里插入图片描述

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

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

相关文章

MongoDB(一) windows 和 linux 之 Ubuntu 安装

数据库分类 一、关系型数据库&#xff08;RDBMS&#xff09; mysql 、Oracle、DB2、SQL Server 关系数据库中全都是表 二、非关系型数据库&#xff08;NO SQL&#xff09; MongoDB、Redis 键值对数据库 文档数据库MongoDB 下载 mongoDB https://www.mongodb.com/try/downloa…

渗透中 POC、EXP、Payload、Shellcode 的区别

渗透中 PoC、Exp、Payload、Shellcode 的区别 不同含义&#xff1a; POC Proof of Concept中文意思是“观点证明”。这个短语并非仅仅在漏洞报告中使用&#xff0c;甲方在项目招标过程中也常常要求乙方提供POC&#xff0c;即证明你的方案或者产品能达到声称的功能或性能&…

Tomcat部署、优化、以及操作练习

一.Tomcat的基本介绍 1.1.Tomcat是什么&#xff1f; Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;T…

详细解释HiveSQL执行计划

一、前言 Hive SQL的执行计划描述SQL实际执行的整体轮廓&#xff0c;通过执行计划能了解SQL程序在转换成相应计算引擎的执行逻辑&#xff0c;掌握了执行逻辑也就能更好地把握程序出现的瓶颈点&#xff0c;从而能够实现更有针对性的优化。此外还能帮助开发者识别看似等价的SQL其…

内存函数 memcpy 和 memmove 的讲解和模拟实现

目录 一.什么是 memcpy 函数 模拟思路 代码实现 二.什么是 memmove 函数 模拟思路 代码实现 一.什么是 memcpy 函数 我们打开 cplusplus 官网查看&#xff1a; memcpy - C Reference (cplusplus.com) 官方文本显示&#xff1a; 内存复制块 将 num 字节的值从源指向的位置…

去耦电路设计应用指南(一)MCU去耦设计介绍

&#xff08;一&#xff09;MCU去耦设计介绍 1. 概述2. MCU需要去耦的原因2.1 去耦电路简介2.2 电源噪声产生的原因2.3 插入损耗2.4 去耦电路简介 参考资料来自网上&#xff1a; 1. 概述 我们经常看到单片机或者IC电路管脚常常会放置一个或者多个陶瓷电容&#xff0c;他们主要…

安防监控视频云存储平台EasyNVR对接EasyNVS时,一直不上线该如何解决?

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。 近期有用户在使用安防视频平台EasyNVR对接上级平台EasyNVS时&#xff0c;出现了一直不上线…

mysql事务测试

mysql的事务处理主要有两种方法1、用begin,rollback,commit来实现 begin; -- 开始一个事务 rollback; -- 事务回滚 commit; -- 事务提交 2、直接用set来改变mysql的自动提交模式 mysql默认是自动提交的&#xff0c;也就是你提交一个sql&#xff0c;它就直接执行&#xff01;我…

Windows 基于Visual Studio 开发Qt 6 注意事项

前提条件&#xff1a; 1、Visual Studio 2022 社区版(免费版) 2、Qt-6.5.1版本 Qt Vistual Studio Tools下载 先打开Visual Studio 2022 社区版 &#xff1a; 点击扩展-》管理拓展按钮后&#xff0c;在搜索框中输入Qt&#xff0c;点击这里第一个扩展安装。 Qt Visual Stud…

计算机毕设 图像识别-人脸识别与疲劳检测 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业…

云计算战略:选择适合你业务的云平台

文章目录 云计算的概述选择云平台的关键因素1. 业务需求2. 预算3. 性能要求4. 数据隐私和合规性 示例&#xff1a;选择适合的云平台业务需求预算性能要求数据隐私和合规性 代码示例&#xff1a;使用云平台服务结论 &#x1f389;欢迎来到云计算技术应用专栏~云计算战略&#xf…

Linux下ThinkPHP5实现定时器任务 - 结合crontab

实例一&#xff1a; 1.在/application/command创建要配置的PHP类文件&#xff0c;需要继承Command类&#xff0c;并重写configure和execute两个方法&#xff0c;例如: <?php namespace app\command; use think\console\Command; use think\console\Input; use think\cons…

uvm源码解读-sequence,sequencer,driver三者之间的握手关系1

1.start item 1.start_item();sequencer.wait_for_grant(prior);this.pre_do(1);需要指出&#xff0c;这里明确说明了wait_for_grant和send_request之间不能有任何延迟&#xff0c;所以在mid_do这个任务里千万不能有任何延迟。 task uvm_sequencer_base::wait_for_grant(uvm…

OpenCV实现图像边缘检测(sobel算子、laplacian算子、Canny边缘检测)

边缘检测原理 1&#xff0c;Sobel算子 1.1代码实现 import cv2 as cv import numpy as np import matplotlib.pyplot as plt from pylab import mplmpl.rcParams[font.sans-serif] [SimHei]img cv.imread("lena.png",0)#计算sobel卷积结果 x cv.Sobel(img,cv.CV_…

MySQL数据库详解 二:数据库的高级语言和操作

文章目录 1. 克隆表 ---- 将数据表的数据记录生成到新的表中1.1 方式一&#xff1a;先创建新表&#xff0c;再导入数据1.2方式二&#xff1a;创建的时候同时导入 2. 清空表 ---- 删除表内的所有数据2.1 delete删除2.2 truncate删除&#xff08;重新记录&#xff09;2.3 创建临时…

【刷题篇】回溯算法(深度优先搜索(一))

文章目录 无重复字符串的排列组合员工的重要性图像渲染被围绕的区域 无重复字符串的排列组合 无重复字符串的排列组合。编写一种方法&#xff0c;计算某字符串的所有排列组合&#xff0c;字符串每个字符均不相同。 class Solution { public:void DFS(string &s,vector<s…

记一次失败的pip使用经历

python如何使用pip工具下载第三方库&#xff1f; 首先&#xff0c;安装并配置好python和pip的环境&#xff0c;特别注意pip放在python的script文件下&#xff0c;有pip和pip3两种&#xff0c;选择pip3版本。如下图所示。 然后打开命令行窗口&#xff0c;检查python和pip工具是…

Android之MediaCodec::PostAndAwaitResponse消息原理(四十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

Python异步编程并发执行爬虫任务,用回调函数解析响应

一、问题&#xff1a;当发送API请求&#xff0c;读写数据库任务较重时&#xff0c;程序运行效率急剧下降。 异步技术是Python编程中对提升性能非常重要的一项技术。在实际应用&#xff0c;经常面临对外发送网络请求&#xff0c;调用外部接口&#xff0c;或者不断更新数据库或文…

Vue 的组件加载顺序和渲染顺序

1、结论先行 组件的加载顺序是自上而下的&#xff0c;也就是先加载父组件&#xff0c;再递归地加载其所有的子组件。 而组件渲染顺序是按照深度优先遍历的方式&#xff0c;也就是先渲染最深层的子组件&#xff0c;再依次向上渲染其父组件。 2、案例 下面是一个简单的示例代…