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 常见的备份方法
-
物理冷备
备份时数据库处于关闭状态,直接打包数据库文件
备份速度快,恢复时也是最简单的 -
专用备份工具mysqldump或mysqlhotcopy
mysqldump常用的逻辑备份工具
mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表 -
启用二进制日志进行增量备份·
进行增量备份,需要刷新二进制日志 -
第三方工具备份
免费的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 二进制日志对备份的意义
- 二进制日志保存了所有更新或者可能更新数据库的操作
- 二进制日志在启动MySQL服务器后开始记录,并在文件达到max binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件
- 只需定时执行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;
#查看内容

相关文章:
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 实现流程…...
什么样的应用程序适合使用Flutter开发桌面?
桌面应用开发的现状 在过去,桌面应用程序的开发通常需要使用特定于操作系统的工具和语言,如C、C#、Java等。这导致了高昂的开发成本和维护困难。尽管有一些跨平台桌面开发工具,如Electron和Qt,但它们在性能、用户体验和开发效率方…...
02强化学习基本概念
强化学习基本概念 前言1、State、Action、Policy等① State② Action③ State transition④ State transition probability⑤ Polity 2、Reward、Return、MDP等① Reward② Trajectory and return③ Discounted return④ Episode⑤ MDP 总结: 前言 本文来自西湖大学…...
笔记2.2:网络应用基本原理
一. 网络应用的体系结构 (1)客户机/服务器结构(Client-Server, C/S) (2)点对点结构(Peer-to-Peer,P2P) (3)混合结构(Hybrid&#x…...
生活垃圾数据集(YOLO版)
文章目录 1、数据集介绍1.1、数据集图片组成2.1、获取数据集方式 2、扩展代码2.1、文件结构树2.2、划分数据集2.3、获取数据集文件名字2.4、文件成功对应检测 3、其他文章 1、数据集介绍 1.1、数据集图片组成 【有害垃圾】:电池(1 号、2 号、5 号&…...
操作系统篇之虚拟内存
虚拟内存是什么? 虚拟内存是计算机操作系统中的一种技术,它将每个进程的内存空间划分成若干个固定大小的页,并通过页面映射技术将这些页与物理内存或磁盘上的页面文件进行交换 虚拟内存能干什么? 扩展了实际物理内存容量:虚拟内存使得每个…...
浅谈SpringMVC的请求流程
目录标题 浅谈SpringMVC的请求流程SpringMVC的介绍SpringMVC的逻辑概念运行图解知识总结 浅谈SpringMVC的请求流程 对于SpringMVC而言重点是了解它的底层运行逻辑,从而可以根据其逻辑来进行实际业务的操作或者是利用原理增强业务的功能性,最终达到项目预…...
2309json.nlohmann数格示例1
参考 示例 下面是一些示例,可让你了解如何使用该类. 除了以下示例之外,你可能还需要: ->检查文档 ->浏览独立示例文件 每个API函数(记录在API文档中)都有相应独立示例文件.如,emplace()函数有一个匹配的emplace.cpp示例文件. 从文件中读取JSON json类提供了操作JSON…...
你知道 delete 删除属性时的一些细节吗?
探究 delete 的一些细节,起源于刚刚做过的一道笔试,原题如下: a 1; const b 2; console.log(delete a); console.log(delete b); // 输出结果是? // 答:true false我可从来没用过 delete 的返回值,但凡…...
Blender入门——快捷键
视角控制 旋转视角:鼠标中键摁住即可旋转平移视角:shift中远近视角:中键滚动 物体控制 移动物体:G旋转物体:R缩放物体:S回复变换:AltG,R,S新建物体:shiftA复制物体:shiftD删除物体&a…...
实例讲解Spring boot动态切换数据源
前言 在公司的系统里,由于数据量较大,所以配置了多个数据源,它会根据用户所在的地区去查询那一个数据库,这样就产生了动态切换数据源的场景。 今天,就模拟一下在主库查询订单信息查询不到的时候,切换数据…...
调整网络时需要注意的事项
这段时间调整网络,涉及的计算机多,Vlan也多,不小心的动作会给自己造成很大的麻烦,因为毕竟我也只是一个网络的初学者,平时虽然是网管,只是作为一项普通的工作。 准备工作做得不细致,可能出现的问…...
OpenCV自学笔记二十二:绘图及交互
一、绘图基础 下面是关于OpenCV绘图基础函数的说明和举例: 1. cv2.line():绘制直线 cv2.line(img, pt1, pt2, color, thickness, lineType) - img: 需要绘制直线的图像。 - pt1: 直线起始点坐标。 - pt2: 直线结束点坐标。 - color: 直线颜色&…...
【自学开发之旅】Flask-会话保持-API授权-注册登录
http - 无状态-无法记录是否已经登陆过 #会话保持 – session cookie session – 保存一些在服务端 cookie – 保存一些数据在客户端 session在单独服务器D上保存,前面数个服务器A,B,C上去取就好了,业务解耦。—》》现在都是基于token的验证。 以上是基…...
数据结构与算法--排序算法复习
目录 1.三种常见的简单排序: 1.1冒泡排序 1.2 选择排序 1.3 插⼊排序 2 常见高级排序算法 2.1 希尔排序 2.2 快速排序 2.3 归并排序 2.4计数排序 先上结论: 1.三种常见的简单排序: 1.1冒泡排序 1.⾸先在未排序数组的⾸位开始&#…...
python随手小练1
题目: 使用python做一个简单的英雄联盟商城登录界面 具体操作: print("英雄联盟商城登录界面") print("~ * "*15 "~") #找其规律 a "1、用户登录" b "2、新用户注册" c "3、退出系统&quo…...
gym_unity学习笔记
最近学了一段时间gym_unity,把一些资料留在这里 实例 实例gym_unity训练RollerBall:https://blog.csdn.net/alibutter/article/details/120908687实例gyn_unity训练3DBall:https://zhuanlan.zhihu.com/p/554927641?utm_id0 源码࿱…...
(三十)大数据实战——HBase集成部署安装Phoenix
前言 Phoenix 是一个开源的分布式关系型数据库查询引擎,它基于 Apache HBase构建。它提供了在 Hadoop 生态系统中使用 SQL查询和事务处理的能力。本节内容我们主要介绍一下Hbase如何集成部署安装Phoenix服务工具,并集成hive框架,能够快速、灵…...
【Python基础】S01E03 元组
P01S03 元组 定义元组元组无法修改定义一个元素的元素 修改元组变量方案一:关联新元组方案二:转换为列表 列表是可修改的,对于处理网站的用户列表或游戏中的角色列表至关重要。然而我们有时候需要创建一系列不可修改的元素,元组可…...
【算法-双指针思想】
双指针思想 双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。 定义快慢指针 快指针: 寻找新数组的元素 ,新数组就是不含有目标元素的数组 慢指针: 指向更新 新数组下…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
