基于rsync\unlink 等一套本机备份跨机备份历史备份清理shell 脚本
一 摘要
本文主要介绍一套本地备份、跨机器备份、历史备份清理脚本,使用场景如数据库备份等
二 环境
linux 系列系统 基本都支持,个别命令可能需要微调。
2.1 实验环境
[root@localhost rsync]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
三 脚本介绍
介绍脚本主要功能模块及目录结构
3.1 脚本目录结构
[root@projun002 data]# cd scripts/
[root@projun002 scripts]# tree
.
├── backup
│ ├── backup_mysql.sh
│ └── backup_nginx.sh
├── delete
│ ├── delete_dockercompse.sh
│ ├── delete_jira.sh
│ ├── delete_mysql.sh
│ ├── delete_nginx.sh
│ └── deleteoldfile.sh
├── logs
│ ├── backup_mysql.INFO.2024-06-26.log
│ ├── backup_mysql.INFO.2024-06-27.log
└── rsync├── push_rsync_devopsapp.sh├── push_rsync_gitlabtar.sh├── push_rsync_jira.sh└── rsync_tools.sh
/scripts/backup/ 主要存放本机备份脚本;
/scripts/rsync/ 主要存放跨机备份脚本;
/scripts/delete/ 主要存放删除本机历史备份和日志文件脚本;
/scripts/logs/ 主要存放日志文件;
3.2 以备份mysql 为例介绍脚本及使用办法
3.2.1 /scripts/backup/backup_mysql.sh
该脚本里基于mysqldump 备份数据库,既可以备份基于容器部署的mysql,也可以部署基于rpm 包安装的数据库;
注意几点:备份好后,一定要验证是否能顺利恢复。
因为mysql 配置不同,备份命令也要基于自己的配置修改
比如default-character-set=utf8 ,您的库不是utf-8,那就要改了。
#!/bin/bash# 数据库连接信息DB_HOST="127.0.0.1"DB_PORT="3306"DB_USER="root"DB_PASSWD="test"# 时间格式化,如 20211216DATE="`date +%Y%m%d%H%M%S`"
# 备份文件目录DIR_BACKUP="/data/backup/devopsapp/mysqldata"#备份应用
APP_NAME="mysql"
#脚本根目录
SCRIPT_DIR="/data/scripts/"DIR_LOG="${SCRIPT_DIR}/logs"FILE_LOG="${DIR_LOG}/backup_${APP_NAME}.INFO.`date +%F`.log"# 备份数据库名DATABASES=("jira mysql")# mysql docker id
MYSQL_DOCKER_ID=`docker ps -a | grep devopsappmysql | awk '{print $1}'`# 测试目录, 目录不存在则自动创建# test -d ${DIR_LOG} || echo passwd | sudo -S mkdir -p ${DIR_LOG}test -d ${DIR_LOG} || mkdir -p ${DIR_LOG}
test -d ${DIR_BACKUP} || mkdir -p ${DIR_BACKUP}# ------------------- 2021-12-16_17:40:48 Start -------------------echo -e "\n----------------- $(date +%F\ %T) Start -----------------"echo -e "\n================= $(date +%F\ %T) Start =================" >> ${FILE_LOG}# 遍历数据库名for database in ${DATABASES[@]}; do # 打印备份的数据库名echo "----------- Current backup database: [ ${database} ] ------------"echo "-------------- Backed-up database: [ ${database} ] --------------" >> ${FILE_LOG}docker exec -i ${MYSQL_DOCKER_ID} sh -c " mysqldump --opt --single-transaction --master-data=2 --default-character-set=utf8 -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASSWD} -B ${database} | gzip > ${DIR_BACKUP}/mysqlbackup_${database}_${DATE}.sql.gz"done# 备份指定的数据库# mysqldump --opt --single-transaction --master-data=2 --default-character-set=utf8 -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASSWD} -B ${DATABASES} | gzip > ${DIR_BACKUP}/mysql_backup_${DATE}.sql.gz# docker 版本
#docker exec -i ${MYSQL_DOCKER_ID} sh -c " mysqldump --opt --single-transaction --master-data=2 --default-character-set=utf8 -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASSWD} -B ${DATABASES} | gzip > ${DIR_BACKUP}/mysql_backup_${DATE}.sql.gz"# # 备份全部数据库# mysqldump --opt --single-transaction --master-data=2 --default-character-set=utf8 -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASSWD} -A | gzip > ${DIR_BACKUP}/mysql_backup_${DATE}.sql.gzecho "------- Backup file created: [ mysql_backup_${DATE}.sql.gz ]"echo "------- Backup file created: [ mysql_backup_${DATE}.sql.gz ]" >> ${FILE_LOG}
3.2.2 /data/scripts/rsync/push_rsync_mysql.sh
该脚本主要是将备份备份文件通过rsync 方式传到另一台机器实现跨机器备份
#!/bin/bash
####
#基于rsync 或者scp 实现跨物理机数据传输
#date:20240415 authro:weibi2
####应用名称
APP_NAME=mysql
# 远程主机 主机信息
DEST_HOST=10.3.170.73
DEST_USER=root
#需要到push 主机手工新建该目录
DEST__DIR="/data/backup/76server/mysqldata"# 本机信息SCRIPT_DIR="/data/scripts"
#备份日志文件目录
LOG_DIR="${SCRIPT_DIR}/logs"
#rsync 日志文件
LOG_FILE="${LOG_DIR}/rsync_${APP_NAME}.`date +%F`.log"#源目录 ,同步文件所在目录
#注意最后一个下划线
SRC_DIR="/data/backup/devopsapp/mysqldata/"# 若日志目录不存在则新建
test -d ${LOG_DIR} || mkdir -p ${LOG_DIR} #rsync -avzP -e "ssh -p 22" /data/yunweipro/devopsapp/jira/data/export/ root@10.3.170.73:/data/backup/devopsapp/jira/export/nohup rsync -avzP -e "ssh -p 22" ${SRC_DIR} ${DEST_USER}@${DEST_HOST}:${DEST__DIR} >> ${LOG_FILE} 2>&1 &
3.2.3 /data/scripts/rsync/rsync_tools.sh
该脚本是一个工具脚本用于启动、停止、查看跨机脚本
#!/bin/bash
LOG_DIR="/data/scripts/logs/"
LOG_FILE="${LOG_DIR}rsync_tools_`date +%F`.log"
# 若日志目录不存在则新建
test -d ${LOG_DIR} || mkdir -p ${LOG_DIR}case "$1" instart)/data/scripts/rsync/push_rsync_mysql.sh && echo "start push_rsync_mysql.sh" | tee -a $LOG_FILEecho "STARTING rsync_tool...";; stop)#killall rsync && echo " kill all rsync " >> $LOGFILEPIDS=`ps -ef | grep -v grep | grep -v rsync_tools | grep rsync | awk '{print $2}'`for pid in $PIDSdokill -9 $pid && echo "kill $pid" >> $LOG_FILEdoneecho "STOP ALL rsync";;status)ps -ef | grep -v grep | grep rsync;;restart)$0 stop$0 start;; *)echo "Usage: $0 {start|stop|restart|status}"exit 1;;
esac
启动命令
[root@localhost rsync]# ./rsync_tools.sh start
start push_rsync_mysql.sh
STARTING rsync_tool...
[root@localhost rsync]# ./rsync_tools.sh status
root 14273 14233 0 15:47 pts/0 00:00:00 less push_rsync_devopsapp.sh
root 14443 14233 0 16:01 pts/0 00:00:00 less rsync_mysql.2024-07-22.log
root 14504 1 99 16:04 pts/1 00:00:05 rsync -avzP -e ssh -p 22 /data/backup/devopsapp/mysqldata/ root@10.3.170.73:/data/backup/76server/mysqldata
root 14507 14504 20 16:04 pts/1 00:00:01 ssh -p 22 -l root 10.3.170.73 rsync --server -vlogDtprze.iLsfxC --partial . /data/backup/76server/mysqldata
root 14508 14288 0 16:04 pts/1 00:00:00 /bin/bash ./rsync_tools.sh status
3.2.4 /data/scripts/delete/delete_mysql.sh
该脚本用于删除本机历史备份
该脚本详细介绍 请看基于unlink 和黑白名单实现删除脚本(日志清理、历史备份清理)
#!/bin/bash# 时间格式化,如 20211216120101
DATE="`date +%Y%m%d%H%M%S`"
#DATE="`date +%Y%m%d`"# 备份app 名称
# 需根据实际需要修改
APP_NAME="devopsapp"# 文件名称过滤词,正则匹配
# 需根据实际需要修改
#FILE_NAME_MATCH_KEY_WORD="'*'"# 备份文件目录,待删除文件所在的目录
# 需根据实际需要修改
DIR_BACKUP="/data/backup/${APP_NAME}"# 存放待删除文件名称,删除操作日志
DIR_LOG="${DIR_BACKUP}/logs"# 存放删除操作日志
DELETE_FILE_LOG="${DIR_LOG}/${APP_NAME}deletefile.${DATE}.log"#存放待删除文件清单
DELETE_FILE_LIST="${DIR_LOG}/${APP_NAME}deletefile.${DATE}.list"#黑名单 ,以黑名单开头的文件 均不能删除
BLACK_LIST=("/root" "/bin" "/dev" "/etc" "/lib" "/lib64" "/media" "/mnt" "/opt" "/proc" "/root" "/run" "/sbin" "/srv" "/sys" "/usr" "/var")#白名单,只有白名单开头的文件才能删除
# 需根据实际需要修改
WHITE_LIST=("/iflytek" "/data/backup")# 文件保留天数
# 需根据实际需要修改
DAY=8# 待删除文件名称正则匹配echo -e "\n----------------- $(date +%F\ %T) Start -----------------"## 若日志目录不存在则新建
test -d ${DIR_LOG} || mkdir -p ${DIR_LOG}echo -e "\n================= $(date +%F\ %T) Start =================" >> ${DELETE_FILE_LOG}# 查找待删除文件,并存入DELETE_FILE_LIST
# '*' 根据需要修改 正则匹配
find ${DIR_BACKUP} -type f -mtime +${DAY} -iname 'mysql*' >> ${DELETE_FILE_LIST}
#find ${DIR_BACKUP} -type f -mtime +${DAY} | grep ${FILE_NAME_MATCH_KEY_WORD} >> ${DELETE_FILE_LIST}# 遍历待删文件清单 while read rows
doecho ${rows} waiting to delete >> ${DELETE_FILE_LOG}# 如果文件名是/ , 直接退出脚本# /* 通过黑白名单 过滤if [[ ${rows} == "/" ]]; thenecho ${rows} illeagal, refuse to delete,please check you script >> ${DELETE_FILE_LOG}break;else# 黑名单判断for blackListElement in "${BLACK_LIST[@]}"doif [[ ${rows} == ${blackListElement}* ]];thenecho ${rows} in blacklist ${blackListElement},refuse to delete this file >> ${DELETE_FILE_LOG} BLACK_LIST_FLAG="YES"breakelseBLACK_LIST_FLAG="NOT"fidone #结束黑名单判断#白名单 判断for whileListElement in "${WHITE_LIST[@]}"doif [[ ${rows} == ${whileListElement}* ]];thenWHITE_LIST_FLAG="YES"breakelseWHITE_LIST_FLAG="NOT"fidone # 结束白名单循环fi # 根目录判断echo ${row} BLACK_LIST_FLAG IS ${BLACK_LIST_FLAG} >> ${DELETE_FILE_LOG} echo ${row} WHITE_LIST_FLAG IS ${WHITE_LIST_FLAG} >> ${DELETE_FILE_LOG} if [[ ${BLACK_LIST_FLAG} == "NOT" ]] && [[ ${WHITE_LIST_FLAG} == "YES" ]];then# 执行删除操作unlink ${rows} && echo ${rows} delete success >> ${DELETE_FILE_LOG}echo ${rows} deletefidone < ${DELETE_FILE_LIST}echo -e "\n----------------- $(date +%F\ %T) END -----------------"echo -e "\n================= $(date +%F\ %T) END =================" >> ${DELETE_FILE_LOG}
3.2.5 配置crontab 定时执行命令
本机备份
跨机备份
删除本机历史备份
[root@localhostdelete]# crontab -l
0 3 * * * /data/scripts/backup/backup_mysql.sh
0 5 * * * /data/scripts/rsync/rsync_tools.sh start
4 22 * * * /data/scripts/delete/delete_mysql.sh
3.2.6 删除跨机历史备份
在远程机上配置定时任务,执行清理脚本
该脚本一定要慎重执行!黑白名单一定要配置
#!/bin/bash# 时间格式化,如 20211216120101
DATE="`date +%Y%m%d%H%M%S`"
#DATE="`date +%Y%m%d`"# 备份app 名称
# 需根据实际需要修改
APP_NAME="devopsapp"# 文件名称过滤词,正则匹配
# 需根据实际需要修改
#FILE_NAME_MATCH_KEY_WORD="'*'"# 备份文件目录,待删除文件所在的目录
# 需根据实际需要修改
DIR_BACKUP="/data/backup/${APP_NAME}"# 存放待删除文件名称,删除操作日志
DIR_LOG="${DIR_BACKUP}/logs"# 存放删除操作日志
DELETE_FILE_LOG="${DIR_LOG}/${APP_NAME}deletefile.${DATE}.log"#存放待删除文件清单
DELETE_FILE_LIST="${DIR_LOG}/${APP_NAME}deletefile.${DATE}.list"#黑名单 ,以黑名单开头的文件 均不能删除
BLACK_LIST=("/root" "/bin" "/dev" "/etc" "/lib" "/lib64" "/media" "/mnt" "/opt" "/proc" "/root" "/run" "/sbin" "/srv" "/sys" "/usr" "/var")#白名单,只有白名单开头的文件才能删除
# 需根据实际需要修改
WHITE_LIST=("/iflytek" "/data/backup")# 文件保留天数
# 需根据实际需要修改
DAY=8# 待删除文件名称正则匹配echo -e "\n----------------- $(date +%F\ %T) Start -----------------"## 若日志目录不存在则新建
test -d ${DIR_LOG} || mkdir -p ${DIR_LOG}echo -e "\n================= $(date +%F\ %T) Start =================" >> ${DELETE_FILE_LOG}# 查找待删除文件,并存入DELETE_FILE_LIST
# '*' 根据需要修改 正则匹配
find ${DIR_BACKUP} -type f -mtime +${DAY} -iname '*' >> ${DELETE_FILE_LIST}
#find ${DIR_BACKUP} -type f -mtime +${DAY} | grep ${FILE_NAME_MATCH_KEY_WORD} >> ${DELETE_FILE_LIST}# 遍历待删文件清单 while read rows
doecho ${rows} waiting to delete >> ${DELETE_FILE_LOG}# 如果文件名是/ , 直接退出脚本# /* 通过黑白名单 过滤if [[ ${rows} == "/" ]]; thenecho ${rows} illeagal, refuse to delete,please check you script >> ${DELETE_FILE_LOG}break;else# 黑名单判断for blackListElement in "${BLACK_LIST[@]}"doif [[ ${rows} == ${blackListElement}* ]];thenecho ${rows} in blacklist ${blackListElement},refuse to delete this file >> ${DELETE_FILE_LOG} BLACK_LIST_FLAG="YES"breakelseBLACK_LIST_FLAG="NOT"fidone #结束黑名单判断#白名单 判断for whileListElement in "${WHITE_LIST[@]}"doif [[ ${rows} == ${whileListElement}* ]];thenWHITE_LIST_FLAG="YES"breakelseWHITE_LIST_FLAG="NOT"fidone # 结束白名单循环fi # 根目录判断echo ${row} BLACK_LIST_FLAG IS ${BLACK_LIST_FLAG} >> ${DELETE_FILE_LOG} echo ${row} WHITE_LIST_FLAG IS ${WHITE_LIST_FLAG} >> ${DELETE_FILE_LOG} if [[ ${BLACK_LIST_FLAG} == "NOT" ]] && [[ ${WHITE_LIST_FLAG} == "YES" ]];then# 执行删除操作unlink ${rows} && echo ${rows} delete success >> ${DELETE_FILE_LOG}echo ${rows} deletefidone < ${DELETE_FILE_LIST}echo -e "\n----------------- $(date +%F\ %T) END -----------------"echo -e "\n================= $(date +%F\ %T) END =================" >> ${DELETE_FILE_LOG}
相关文章:
基于rsync\unlink 等一套本机备份跨机备份历史备份清理shell 脚本
一 摘要 本文主要介绍一套本地备份、跨机器备份、历史备份清理脚本,使用场景如数据库备份等 二 环境 linux 系列系统 基本都支持,个别命令可能需要微调。 2.1 实验环境 [rootlocalhost rsync]# cat /etc/centos-release CentOS Linux release 7.9.2…...

使用nginx实现一个端口和ip访问多个vue前端
前言:由于安全组要求,前端页面只开放一个端口,但是项目有多个前端,此前一直使用的是一个前端使用单独一个端口进行访问,现在需要调整。 需要实现:这里以80端口为例,两个前端分别是:p…...

Linux云计算 |【第一阶段】SERVICES-DAY5
主要内容: 源码编译安装、rsync同步操作、inotify实时同步、数据库服务基础 实操前骤:(所需tools.tar.gz与users.sql) 1.两台主机设置SELinnx和关闭防火墙 setenforce 0 systemctl stop firewalld.service //停止防火墙 sy…...

IP第一次综合实验
一、实验拓扑 二、实验要求 1、R6为ISP,接口IP地址均为公有地址,该设备只能配置地址之后不能冉对其进行任何配置 2、R1-R5为局域网,私有Ip地址192.168.1.0/24,请合理分配 3、R1、82、R4,各有两个环回IP地址;R5,R6各…...
Could not load dynamic library ‘cudart64_100.dll‘
python代码报错 Could not load dynamic library cudart64_100.dll; dlerror: cudart64_100.dll not found 2024-07-22 14:19:21.931639: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine…...

四大引用——强软弱虚
目录 一、强引用 二、软引用 三、弱引用 四、虚引用 一、强引用 强引用是在程序代码之中普遍存在的,类似于“Object obj new Object()”,obj变量引用Object这个对象,就叫做强引用。当内存空间不足,Java虚拟机宁愿抛出OutOfMe…...

MySQL--索引(2)
InnoDB 1.索引类型 主键索引(Primary Key) 数据表的主键列使用的就是主键索引。 一张数据表有只能有一个主键,并且主键不能为 null,不能重复。 在 mysql 的 InnoDB 的表中,当没有显示的指定表的主键时,InnoDB 会自动先检查表中是…...
JVM类加载机制详解
Java在运行期才对类进行加载到内存、连接、初始化过程。这使得Java应用具有极高的灵活性和拓展性,可以依赖运行期进行动态加载和动态连接。 主要加载哪些?Java中的数据类型分为基本数据类型和引用数据类型,基本数据类型由虚拟机预先定义&…...

【MATLAB实战】基于UNet的肺结节的检测
数据: 训练过程图 算法简介: UNet网络是分割任务中的一个经典模型,因其整体形状与"U"相似而得名,"U"形结构有助于捕获多尺度信息,并促进了特征的精确重建,该网络整体由编码器,解码器以及跳跃连接三部分组成。 编码器由…...

Elasticsearch基础(五):使用Kibana Discover探索数据
文章目录 使用Kibana Discover探索数据 一、添加样例数据 二、数据筛选 三、保存搜索 使用Kibana Discover探索数据 一、添加样例数据 登录Kibana。在Kibana主页的通过添加集成开始使用区域,单击试用样例数据。 在更多添加数据的方式页面下方,单击…...

爬取百度图片,想爬谁就爬谁
前言 既然是做爬虫,那么肯定就会有一些小心思,比如去获取一些自己喜欢的资料等。 去百度图片去抓取图片吧 打开百度图片网站,点击搜索xxx,打开后,滚动滚动条,发现滚动条越来越小,说明图片加载…...

HTTP 缓存
缓存 web缓存是可以自动保存常见的文档副本的HTTP设备,当web请求抵达缓存时,如果本地有已经缓存的副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。使用缓存有如下的优先。 缓存减少了冗余的数据传输缓存环节了网络瓶颈的问题…...
设计模式实战:图形编辑器的设计与实现
简介 本篇文章将介绍如何设计一个图形编辑器系统,系统包括图形对象的创建、组合、操作及撤销等功能。我们将通过这一项目,应用命令模式、组合模式和备忘录模式来解决具体的设计问题。 问题描述 设计一个图形编辑器系统,用户可以创建并操作图形对象,将多个图形对象组合成…...

.NET 情报 | 分析某云系统添加管理员漏洞
01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失…...
vue检测页面手指滑动距离,执行回调函数,使用混入的语法,多个组件都可以使用
mixin.ts 定义滑动距离的变量和检测触摸开始的方法,滑动方法,并导出两个方法 sendTranslateX.value > 250 && sendTranslateY.value < -100是向上滑动,满足距离后执行回调函数func,并在一秒内不再触发,一…...
opencv 优势
OpenCV(开源计算机视觉库)是一个广泛使用的计算机视觉和机器学习软件框架。它最初由Intel开发,后来由Itseez公司维护,最终于2015年成为非营利组织OpenCV.org的一部分。OpenCV的目的是实现一个易于使用且高效的计算机视觉框架,支持实时视觉应用。 以下是关于OpenCV的一些关…...

1-如何挑选Android编译服务器
前几天,我在我的星球发了一条动态:入手洋垃圾、重操老本行。没错,利用业余时间,我又重新捣鼓捣鼓代码了。在接下来一段时间,我会分享我从服务器的搭建到完成Android产品开发的整个过程。这些东西之前都是折腾过的&…...
【JS逆向课件:第十六课:Scrapy基础2】
ImagePipeLines的请求传参 环境安装:pip install Pillow USER_AGENT Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.109 Safari/537.36需求:将图片的名称和详情页中图片的数据进行爬取&a…...
使用 PowerShell 自动化图像识别与鼠标操作
目录 前言功能概述代码实现1. 引入必要的程序集2. 定义读取文件行的函数3. 定义加载图片的函数4. 定义查找小图像在大图像中的位置的函数5. 定义截取全屏的函数6. 定义模拟鼠标点击的函数7. 定义主函数 配置文件示例运行脚本结语全部代码提示打包exe 下载地址 前言 在日常工作…...

组队学习——支持向量机
本次学习支持向量机部分数据如下所示 IDmasswidthheightcolor_scorefruit_namekind 其中ID:1-59是对应训练集和验证集的数据,60-67是对应测试集的数据,其中水果类别一共有四类包括apple、lemon、orange、mandarin。要求根据1-59的数据集的自…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...