数据备份与恢复
备份概述
一、备份方式
按照数据库服务状态分为:
冷备份:在备份时暂停数据库运行和服务,将整个数据库复制到备份设备中
热备份:在备份时不停止数据库的运行和服务
按照备份的数据分为:
物理备份:备份数据库服务器上存储的原始数据和文件,可以直接拷贝和恢复
逻辑备份:备份的是SQL语句,可用于不同版本和不同类型的MySQL数据库之间的数据迁移
二、备份策略
1、完全备份
- 完全备份所有的数据
- 易于管理
2、增量备份
- 每周进行一次完全备份
- 其余每天备份和上次备份的差异部分
3、差异备份
- 每周进行一次完全备份
- 其余每天备份和完全备份的差异部分
三、备份系统三要素
BW 一个工作周期内留给备份系统进行备份的时间长度
RPO 客户可以承受的最大数据丢失量
RTO 客户可以承受的最长停机时间
完全备份与恢复
一、物理备份及恢复
适合线下备份,不适合线上备份
1、备份操作
systemctl stop mysqld
cp -rp /var/lib/mysql /opt/mysql.bak
或
tar -zcf /opt/mysql.tar.gz /var/lib/mysql/*
2、恢复操作
systemctl stop mysqld
rm -rf /var/lib/mysql/*
cp -r /opt/mysql.bak/* /var/lib/mysql/
或
tar -zxf /opt/mysql.tar.gz -C /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
二、逻辑备份及恢复
1、完全备份
mysqldump -uroot -p密码 库名 > /目录/xxx.sql
库名表示方式:
库名 表名列表 备份1张表或多张表所有数据
-B 库名列表 备份1个库或多个库所有数据
--all-databases 或 -A 备份1台服务器所有数据
[root@mysql50 ~]# mkdir /bakdir
# 备份所有库
[root@mysql50 ~]# mysqldump -uroot -p123456 -A > /bakdir/allbak.sql
# 备份1个库
[root@mysql50 ~]# mysqldump -uroot -p123456 -B tarena > /bakdir/tarena.sql
# 备份多个库
root@mysql50 ~]# mysqldump -uroot -p123456 -B db3 db1 > /bakdir/db3_db1.sql
# 备份多张表
[root@mysql50 ~]# mysqldump -uroot -p123456 tarena employees departments > /bakdir/tarena_employees_deparments.sql
# 备份1张表
[root@mysql50 ~]# mysqldump -uroot -p123456 tarena salary > /bakdir/tarena_salary.sql[root@mysql50 ~]# ls /bakdir/
allbak.sql tarena_salary.sql tarena.sql db3_db1.sql tarena_employees_deparments.sql
2、完全恢复
1)命令行恢复
mysql -uroot -p密码 [库名] < /目录/xxx.sql
[root@mysql51 ~]# mysql -p123456mysql> select count(*) from tarena.salary;
mysql> delete from tarena.salary;
mysql> select count(*) from tarena.salary;[root@mysql50 ~]# scp /bakdir/tarena_salary.sql 192.168.88.51:/root
[root@mysql51 ~]# ls
mysql.tar.gz tarena_salary.sql
[root@mysql51 ~]# mysql -uroot -p123456 tarena < /root/tarena_salary.sql
[root@mysql51 ~]# mysql -p123456mysql> select count(*) from tarena.salary;
2)使用数据库里的 source 命令恢复数据
mysql> drop database tarena;
mysql> show databases;
mysql> source /bakdir/tarena.sql;
mysql> show databases;
mysql> drop table tarena.salary;
mysql> use tarena;
mysql> show tables;
mysql> source /bakdir/tarena_salary.sql;
mysql> show tables;
恢复库时库名可以省略
恢复表时需要库名
备份和恢复时,数据库服务必须是运行状态
Mysqldump 备份和恢复数据时会锁表,锁表期间无法对表做写访问,mysqldump适合备份数据量比较小的数据或在数据库服务器访问量少的时候备份。
3、备份缺点
1)物理备份缺点
- 跨平台性差
- 备份时间长、冗余备份、浪费存储空间
2)mysqldump备份缺点
- 效率较低、备份和还原速度慢、锁表
- 备份过程中,数据插入和更新操作被阻塞
增量备份与恢复
备份上次备份后 产生的数据
软件介绍
一款强大的在线热备份工具
备份过程中不锁库表,适合生产环境
由专业组织Percona提供(改进MySQL分支)
一、软件安装
# 免安装解压即可使用[root@mysql50 ~]# yum -y install perl-DBD-MySQL # 安装依赖
[root@mysql50 ~]# tar -xf percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal.tar.gz
[root@mysql50 ~]# mv percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal /usr/local/percona
[root@mysql50 ~]# vim /etc/bashrc # 配置初始配置文件 系统环境变量
export PATH=/usr/local/percona/bin:$PATH # 添加此行
[root@mysql50 ~]# source /etc/bashrc # 使配置生效
[root@mysql50 ~]# man xtrabackup
二、增量备份
1、首次完全备份
xtrabackup --host=127.0.0.1 --user=用户名 --password=密码 --backup --target-dir=备份目录 --datadir=数据库目录
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=123456 --backup --target-dir=/allbak --datadir=/var/lib/mysql
2、增量备份
xtrabackup --host=127.0.0.1 --user=用户名 --password=密码 --backup --target-dir=备份目录 --incremental-basedir=上次备份目录 --data-dir=数据库目录
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=123456 --backup --target-dir=/new2 --incremental-basedir=/allbak --data-dir=/var/lib/mysql
...连接数据库插入数据...
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=123456 --backup --target-dir=/new3 --incremental-basedir=/new2 --data-dir=/var/lib/mysql
...连接数据库插入数据...
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=123456 --backup --target-dir=/new4 --incremental-basedir=/new3 --data-dir=/var/lib/mysql
...连接数据库插入数据...
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=123456 --backup --target-dir=/new5 --incremental-basedir=/new4 --data-dir=/var/lib/mysql
...连接数据库插入数据...
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=123456 --backup --target-dir=/new6 --incremental-basedir=/new5 --data-dir=/var/lib/mysql
...连接数据库插入数据...
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=123456 --backup --target-dir=/new7 --incremental-basedir=/new6 --data-dir=/var/lib/mysql[root@mysql50 ~]# ls -d /allbak/
/allbak/
[root@mysql50 ~]# ls -d /new*
/new2 /new3 /new4 /new5 /new6 /new7
三、增量恢复
1、准备恢复数据
定义合并数据的位置
[root@mysql50 ~]# scp -r /allbak root@192.168.88.51:/opt
[root@mysql50 ~]# scp -r /new* root@192.168.88.51:/opt
[root@mysql51 ~]# ls /opt/
allbak new2 new3 new4 new5 new6 new7
[root@mysql51 ~]# cat /opt/allbak/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 23539361
last_lsn = 23539361
flushed_lsn = 23539361[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/allbak# 验证合并
[root@mysql51 ~]# cat /opt/allbak/xtrabackup_checkpoints
backup_type = log-applied # 此行改变 可以合并数据了
from_lsn = 0
to_lsn = 23539361
last_lsn = 23539361
flushed_lsn = 23539361
2、合并数据
合并的顺序要和备份的顺序一致
[root@mysql51 ~]# cat /opt/allbak/xtrabackup_checkpoints # 合并前查看数据范围
backup_type = log-applied
from_lsn = 0
to_lsn = 23541261
last_lsn = 23541261
flushed_lsn = 23541261[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/allbak --incremental-dir=/opt/new2[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/allbak --incremental-dir=/opt/new3
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/allbak --incremental-dir=/opt/new4
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/allbak --incremental-dir=/opt/new5
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/allbak --incremental-dir=/opt/new6
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/allbak --incremental-dir=/opt/new7[root@mysql51 ~]# cat /opt/new7/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 23543141
to_lsn = 23543161
last_lsn = 23543171
flushed_lsn = 23543161[root@mysql51 ~]# cat /opt/allbak/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 23543161
last_lsn = 23543171
flushed_lsn = 23543161
3、拷贝数据
恢复数据
[root@mysql51 ~]# systemctl stop mysqld.service
[root@mysql51 ~]# rm -rf /var/lib/mysql/*
[root@mysql51 ~]# xtrabackup --copy-back --target-dir=/opt/allbak
[root@mysql51 ~]# chown -R mysql:mysql /var/lib/mysql/
[root@mysql51 ~]# systemctl start mysqld.service
[root@mysql51 ~]# mysql -uroot -p123456
四、恢复步骤
1、准备恢复数据
定义合并数据的位置
2、合并数据
合并的顺序要和备份的顺序一致
3、清空数据库目录
停止数据库服务 并清空数据库目录
4、拷贝数据
恢复数据
5、修改数据库目录所有者/所属组用户为mysql
6、重启数据库服务
差异备份与恢复
备份完全备份后 产生的新数据
一、差异备份
1、首次完全备份
xtrabackup --host=127.0.0.1 --user=用户名 --password=密码 --backup --target-dir=/备份目录 --datadir=/数据库目录
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=123456 --backup --target-dir=/fullbak --datadir=/var/lib/mysql
[root@mysql50 ~]# ls /fullbak/
2、差异备份
xtrabackup --host=127.0.0.1 --user=用户名 --password=密码 --backup --target-dir=/备份目录 --incremental-basedir=/完全备份目录 datadir=/数据库目录
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=123456 --backup --target-dir=/dir2 --incremental-basedir=/fullbak
[root@mysql50 ~]# ls /dir2/...连接数据库插入数据...[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=123456 --backup --target-dir=/dir3 --incremental-basedir=/fullbak
[root@mysql50 ~]# ls /dir3/......
二、差异恢复
1、准备恢复数据
[root@mysql50 ~]# scp -r /fullbak root@192.168.88.51:/root
[root@mysql50 ~]# scp -r /dir2/ root@192.168.88.51:/root
[root@mysql50 ~]# scp -r /dir3/ root@192.168.88.51:/root
[root@mysql51 ~]# cat /root/fullbak/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 23544911
last_lsn = 23544911
flushed_lsn = 23544911[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/root/fullbak[root@mysql51 ~]# cat /root/fullbak/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 23544911
last_lsn = 23544911
flushed_lsn = 23544911
2、合并数据
[root@mysql51 ~]# cat /root/dir3/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 23544911
to_lsn = 23548529
last_lsn = 23548539
flushed_lsn = 23548529[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/root/fullbak --incremental-dir=/root/dir3[root@mysql51 ~]# cat /root/fullbak/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 23548529
last_lsn = 23548539
flushed_lsn = 23548529
3、拷贝数据
[root@mysql51 ~]# systemctl stop mysqld.service
[root@mysql51 ~]# rm -rf /var/lib/mysql/*
[root@mysql51 ~]# xtrabackup --copy-back --target-dir=/root/fullbak
[root@mysql51 ~]# chown -R mysql:mysql /var/lib/mysql
[root@mysql51 ~]# systemctl start mysqld.service
[root@mysql51 ~]# mysql -uroot -p123456
三、恢复步骤
1、准备恢复数据
2、合并数据
3、清空数据目录
4、拷贝数据
5、修改数据库目录所有者/组用户为mysql
6、重启mysql服务
完全+差异
数据量 备份量
周一 完全备份 1G 1G周二 差异备份 1G+2G 2G
周三 差异备份 1G+2G+3G 5G
周四 差异备份 1G+2G+3G+4G 9G
周五 差异备份 1G+2G+3G+4G+5G 14G
周六 差异备份 1G+2G+3G+4G+5G+6G 20G
周日 差异备份 1G+2G+3G+4G+5G+6G+7G 27G
完全+增量
数据量 备份量
周一 完全备份 1G 1G周二 增量备份 1G+2G 2G
周三 增量备份 1G+2G+3G 3G
周四 增量备份 1G+2G+3G+4G 4G
周五 增量备份 1G+2G+3G+4G+5G 5G
周六 增量备份 1G+2G+3G+4G+5G+6G 6G
周日 增量备份 1G+2G+3G+4G+5G+6G+7G 7G
实时备份与恢复
启用mysql服务的binlog日志文件
binlog日志文件保存的是 在数据库服务里执行的数据库命令
除查询之外的所有命令(数据改变记,数据不改变不记)
binlog日志的使用
查看正在使用的binlog日志文件
mysql> show master status;
修改日志文件存放的位置和文件名
[root@mysql52 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
......
log-bin=/mylog/hmy # 添加此行[root@mysql52 ~]# mkdir /mylog
[root@mysql52 ~]# chown -R mysql:mysql /mylog/
[root@mysql52 ~]# getenforce # 不能强制模式[root@mysql52 ~]# systemctl restart mysqld.service
[root@mysql52 ~]# ls /mylog/
hmy.000001 hmy.indexmysql> show master status;
+------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------+----------+--------------+------------------+-------------------+
| hmy.000001 | 156 | | | |
+------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
手动生成日志文件
[root@mysql52 ~]# mysql -e "show master status"[root@mysql52 ~]# systemctl restart mysqld.service [root@mysql52 ~]# systemctl stop mysqld.service
[root@mysql52 ~]# systemctl start mysqld.service [root@mysql52 ~]# mysqldump -B db1 --flush-logs > /root/db1.sqlmysql> flush logs;
数据库服务里对日志管理的命令
mysql> show master status; # 查看正在使用的日志
mysql> show binary logs; # 查看已有的日志文件
mysql> purge master logs to "日志名"; # 删除编号之前的日志
mysql> reset master; # 删除所有日志,重新创建日志mysql> show binlog events in "日志文件名"; # 查看日志文件内容
#
mysql> create database db10;
Query OK, 1 row affected (0.09 sec)mysql> show master status;
+------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------+----------+--------------+------------------+-------------------+
| hmy.000001 | 341 | | | |
+------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)mysql> show binlog events in "hmy.000001";
+------------+-----+----------------+-----------+-------------+--------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------+-----+----------------+-----------+-------------+--------------------------------------+
| hmy.000001 | 4 | Format_desc | 1 | 125 | Server ver: 8.0.26, Binlog ver: 4 |
| hmy.000001 | 125 | Previous_gtids | 1 | 156 | |
| hmy.000001 | 156 | Anonymous_Gtid | 1 | 233 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| hmy.000001 | 233 | Query | 1 | 341 | create database db10 /* xid=53 */ |
+------------+-----+----------------+-----------+-------------+--------------------------------------+
4 rows in set (0.00 sec)
使用日志恢复数据
把查看到的文件内容管道给连接mysql服务的命令执行
mysqlbinlog /目录名/binlog日志文件 | mysql -u用户名 -p密码
[root@mysql50 ~]# mysqldump -uroot -p123456 -B tarena --flush-logs > /root/tarena.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@mysql50 ~]# ls /root/*.sql
/root/tarena.sql
[root@mysql50 ~]# mysql -uroot -p123456 -e 'show master status'
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000021 | 156 | | | |
+---------------+----------+--------------+------------------+-------------------+
[root@mysql50 ~]# mysql -uroot -p123456 -e 'insert into tarena.salary(employee_id,basic) values(2,10200)'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@mysql50 ~]# mysql -uroot -p123456 -e 'show master status'
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000021 | 443 | | | |
+---------------+----------+--------------+------------------+-------------------+
[root@mysql50 ~]#
[root@mysql51 ~]# mysql -uroot -p123456 -e 'drop database tarena'
[root@mysql51 ~]# scp 192.168.88.50:/root/tarena.sql /root/
[root@mysql51 ~]# mysql -uroot -p123456 < /root/tarena.sql
[root@mysql51 ~]# mysql -uroot -p123456 -e 'select count(*) from tarena.salary'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------+
| count(*) |
+----------+
| 8065 |
+----------+
[root@mysql50 ~]# mysql -uroot -p123456 -e 'select count(*) from tarena.salary'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------+
| count(*) |
+----------+
| 8066 |
+----------+
[root@mysql50 ~]# scp /var/lib/mysql/binlog.000021 192.168.88.51:/root
[root@mysql51 ~]# mysqlbinlog /root/binlog.000021
[root@mysql51 ~]# mysqlbinlog /root/binlog.000021 | mysql -uroot -p123456
[root@mysql51 ~]# mysql -uroot -p123456 -e 'select count(*) from tarena.salary'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------+
| count(*) |
+----------+
| 8066 |
+----------+
可以通过执行日志文件里记录的命令恢复数据
mysqlbinlog /目录名/binlog日志文件 | mysql -u用户名 -p密码
相关文章:
数据备份与恢复
备份概述 一、备份方式 按照数据库服务状态分为: 冷备份:在备份时暂停数据库运行和服务,将整个数据库复制到备份设备中 热备份:在备份时不停止数据库的运行和服务 按照备份的数据分为: 物理备份:备份…...
数据库原理及数据库的优化
1、数据库的原理 数据库:持久化存储,存到硬盘 性能:oracl>db2>sqlserver>mysql oracl,db2,sqlserver性能差不多,几十万次每秒,myslq性能差很多,几千次每秒,都…...

C语言第三弹---数据类型和变量
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 数据类型和变量 1、数据类型介绍1.1、整型1.2、浮点型1.3、字符型1.4、布尔类型1.5、各种数据类型的长度1.5.1、sizeof操作符1.5.2、数据类型的长度1.5.3、sizeo…...
[通知]rust跟我学:文件时间属性获得方法文章已上线
大家好,我是带剑书生,开源库get_local_info的作者。目前我的付费专栏已经上线第七篇文章,用于介绍在实现get_local_info过程中,遇到该问题所使用的解决方法,喜欢的朋友可以去订阅了,19.9元,非常…...

基于嵌入式的智能智能通风系统
基于嵌入式的智能智能通风系统 功能说明 通过微信小程序控制窗户的开关状体以及倒计时开关和定时开关,小程序上实时显示当前温度湿度和光照强度。 功能展示 02智能通风系统 Mqtt服务器 http://www.yoyolife.fun/iot:Mqtt服务器,我是在这里注…...

如何编写一个好的测试用例?才能防止背黑锅
如何编写一个好的测试用例?才能防止背黑锅 什么是测试用例?一个好的测试用例包含什么?测试用例的编写思路总结 什么是测试用例? 在这之前,思考一个问题,下面这个简单的QQ登录页面,一共又多少条…...
笨蛋学设计模式行为型模式-观察者模式【14】
行为型模式-观察者模式 8.1观察者模式:arrow_up::arrow_up::arrow_up:8.1.1概念8.1.2场景8.1.3优势 / 劣势8.1.4观察者模式可分为观察者的基本结构: 8.1.5观察者模式8.1.6实战8.1.6.1题目描述8.1.6.2输入描述8.1.6.3输出描述8.1.6.4代码 8.1.7总结 8.1观察者模式⬆️…...

上海智慧岛大数据云计算中心项目正式封顶!
上海智慧岛大数据云计算中心封顶仪式现场 1月15日,云端股份在上海智慧岛大数据云计算中心举行封顶仪式。云之端网络(江苏)股份有限公司(以下称“云端股份”)总经理贡伟力先生,常务副总张靖先生等公司成员&…...

靶场实战(19):OSCP备考之VulnHub HA WORDY
交流技术可以关注公众号 OneMoreThink 或后台添加微信,欢迎提出宝贵建议。 0、总结 0.1、攻击思路 资产发现 主机发现服务发现漏洞发现(获取权限) 80端口/HTTP服务 组件漏洞URL漏洞:RFI、FileUpload提升权限 www-data用户 sudosui…...

大模型学习与实践笔记(九)
一、LMDeply方式部署 使用 LMDeploy 以本地对话方式部署 InternLM-Chat-7B 模型,生成 300 字的小故事 2.api 方式部署 运行 结果: 显存占用: 二、报错与解决方案 在使用命令,对lmdeploy 进行源码安装是时,报错 1.源…...
fpga目前就业形势咋样?
FPGA今年各厂给本科生的薪资大概是15-30K,研究生是20-40K,平均薪资在25k左右, 当然具体薪资还要看去哪个公司,哪个城市,以及个人的学校、专业、能力水平、及包括面试时的表现,运气等,这些都会导…...

Linux7 安装 Oracle 19C RAC 详细图文教程
实战篇:Linux7 安装 Oracle 19C RAC 详细图文教程 本文是按照:https://www.modb.pro/db/154424的思路进行编写 一、安装前规划 安装RAC前,当然要先做好规划。具体包含以下几方面: 节点主机版本主机名实例名Grid/Oracle版本Publi…...

【SpringBoot】SpringBoot 项目初始化方法
github 搜索 springboot 模板 github 搜索 springboot 模板,拉取现成代码。 SpringBoot 官方的模板生成器 SpringBoot 官方的模板生成器(https://start.spring.io/) 在 IDEA 开发工具中生成 这里我修改成阿里的镜像主要是要使用 Java8。 …...
34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
二分查找到目标值然后左右找到坐标 问题在于:找左右坐标的时候时间复杂度不是O(logN) class Solution {public int[] searchRange(int[] nums, int target) {int[] ans {-1, -1};if (nums.length 0) return ans;int l 0, r nums.length;while (l < r) {int…...

Mysql深度分页优化的一个实践
问题简述: 最近在工作中遇到了大数据量的查询场景, 日产100w左右明细, 会查询近90天内的数据, 总数据量约1亿, 业务要求支持分页查询与导出. 无论是分页或导出都涉及到深度分页查询, mysql通过limit/offset实现的深度分页查询会存在全表扫描的问题, 比如offset1000w, limit10…...

【JavaEE进阶】 SpringBoot配置⽂件
文章目录 🍀配置⽂件的作⽤🌴SpringBoot配置⽂件🎋配置⽂件的格式🎄properties配置⽂件🚩properties基本语法🚩读取配置⽂件🚩properties的缺点 🌳yml配置⽂件yml基本语法Ƕ…...
excel 常用函数
求和函数: SUM: 将单个值、单元格引用或区域相加。 案例:SUM(A1:A5) (结果:A1到A5单元格的值求和) SUMIF: 对选中范围内符合指定条件的值求和。 案例:SUMIF(B1:B5, ">50&qu…...

【React基础】– JSX语法
文章目录 认识JSX为什么React选择了JSXJSX的使用 React事件绑定this的绑定问题事件参数传递 React条件渲染React列表渲染列表中的key JSX的本质createElement源码Babel官网查看直接编写jsx代码 虚拟DOM的创建过程jsx – 虚拟DOM – 真实DOM声明式编程 阶段案例练习 认识JSX ◼ …...

SpringBoot 项目中后端实现跨域的5种方式!!!
文章目录 SpringBoot 项目中后端实现跨域的5种方式!!!一、为什么会出现跨域问题二、什么是跨域三、非同源限制四、Java后端 实现 CORS 跨域请求的方式1、返回新的 CorsFilter(全局跨域)2、重写 WebMvcConfigurer(全局跨域)3、使用注解 (局部跨…...

Vue3前端开发,provide和enject的基础练习,跨层级传递数据
Vue3前端开发,provide和enject的基础练习,跨层级传递数据! 声明:provide虽然可以跨层级传递,但是依旧是需要由上向下的方向传递。根传子的方向。 <script setup> import {onMounted, ref} from vue import Base from ./components/Base.vue impor…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

【技巧】dify前端源代码修改第一弹-增加tab页
回到目录 【技巧】dify前端源代码修改第一弹-增加tab页 尝试修改dify的前端源代码,在知识库增加一个tab页"HELLO WORLD",完成后的效果如下 [gif01] 1. 前端代码进入调试模式 参考 【部署】win10的wsl环境下启动dify的web前端服务 启动调试…...