记一次通过binlog日志恢复MySQL数据库的经历

news2024/10/7 10:19:30

通过binlog日志恢复MySQL数据库的数据

一、起因

起因是我在自己服务器上搭建的博客被黑客攻击,黑客删除了我的数据库并且要求支付比特币才给我恢复。

博客所有的表和数据都被清空,只留下了勒索金额和地址。如图

image-20230517111100245

穷鬼如我当然是:

iamge-20230517001

二、恢复数据

2-1 查看binlog日志

先连接MySQL看看binlog日志是否开启。

# 查看MySQL是否开始binlog日志,结果为ON即已开启。
mysql> show variables like 'log_bin';

幸好,我的MySQL默认开启了binlog日志,也就是接下来用于恢复数据的核心。

# 查看binlog日志列表
mysql> show master logs;
# 查看指定binlog日志
mysql> show binlog events in 'binlog.000001';
+---------------+------+----------------+-----------+-------------+--------------------------------------+
| Log_name      | Pos  | Event_type     | Server_id | End_log_pos | Info                                 |
+---------------+------+----------------+-----------+-------------+--------------------------------------+
| binlog.000001 |    4 | Format_desc    |         1 |         126 | Server ver: 8.0.33, Binlog ver: 4    |
| binlog.000001 |  126 | Previous_gtids |         1 |         157 |                                      |
| binlog.000001 |  157 | Anonymous_Gtid |         1 |         236 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| binlog.000001 |  236 | Query          |         1 |         321 | BEGIN                                |
| binlog.000001 |  321 | Table_map      |         1 |         519 | table_id: 294 (mysql.user)           |
| binlog.000001 |  519 | Update_rows    |         1 |         911 | table_id: 294 flags: STMT_END_F      |
| binlog.000001 |  911 | Xid            |         1 |         942 | COMMIT /* xid=5284 */                |
| binlog.000001 |  942 | Anonymous_Gtid |         1 |        1019 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| binlog.000001 | 1019 | Query          |         1 |        1109 | FLUSH PRIVILEGES                     |
| binlog.000001 | 1109 | Stop           |         1 |        1132 |                                      |
+---------------+------+----------------+-----------+-------------+--------------------------------------+
10 rows in set (0.00 sec)

显然这样查看的结果并不便于我们阅读,也没办法清晰地判断该回滚哪一部分。

那么现在有两个方案:

  • 方案一:直接开始恢复。适用于明确知道恢复时间节点或者位置节点的情况,就无需麻烦地解析binlog日志了。详见2-2

  • 方案二:解析binlog日志。适用于不确定该从什么节点开始恢复的情况,需要将binlog日志解析成便于人类阅读的sql文件,根据sql的内容判断该何时执行。详见2-3

2-2 使用mysqlbinlog命令按照时间或位置节点恢复

分两种情况:

1.MySQL服务运行在Linux服务器中

# 进入Linux服务器
mysqlbinlog --no-defaults  日志的绝对路径\binlog.000001 --start-datetime="2023-2-25 20:17:00" --stop-datetime="2023-05-11 23:59:00"  | mysql -uroot -p123456 blog
# 执行binlog命令
## 按时间节点恢复
mysqlbinlog --no-defaults  /home/zhangheng/software/docker-mysql/3306/data/binlog.000001 --start-datetime="2023-2-25 20:17:00" --stop-datetime="2023-05-17 09:00:00"  | mysql -uroot -p123456 blog
## 按位置节点恢复
mysqlbinlog --no-defaults  /home/zhangheng/software/docker-mysql/3306/data/binlog.000001 --start-position=321 --stop-position=1019  | mysql -uroot -p123456 blog

2.MySQL服务运行在docker部署的容器中

# 1.进入Linux服务器
# 2.进入docker容器
docker exec -it mysql-3306 /bin/bash
# 3.执行binlog命令
mysqlbinlog --no-defaults  /home/zhangheng/software/docker-mysql/3306/data/binlog.000001 --start-datetime="2023-2-25 20:17:00" --stop-datetime="2023-05-17 09:00:00"  | mysql -uroot -p123456 blog
# 注意:如果提示bash: mysqlbinlog: command not found,说明容器中找不到mysqlbinlog服务。那就只有通过另一种方案,即将binlog解析成可阅读的sql后执行了来恢复数据了。详见2-3

2-3 将binlog解析成可阅读的sql后通过sql文件恢复

方案一:离线解析。

适合无需原生sql,使用mysqlbinlog命令按节点恢复的情况。

这种方案是将binlog文件,解析成可阅读的sql后通过阅读sql获取位置节点或者时间节点,然后按照2-2的方法恢复数据。好处是除了MySQL无需安装其它工具。

(1)首先需要确保Linux上安装了MySQL服务

安装步骤详见附:一、Linux安装MySQL服务,已安装请跳过。(这里主要针对此前MySQL是docker容器部署的情况下,服务器需要安装一个MySQL)

(2)使用mysqlbinlog命令将binlog文件解析成可阅读的sql

mysqlbinlog --base64-output=decode-rows -vv --database=blog --stop-datetime="2023-05-11 23:59:00" /home/zhangheng/binlog/binlog.000008 > /home/zhangheng/binlog/sql08.sql

命令参数说明:

  • –base64-output=decode-rows -vv:binlog的模式是ROW模式,默认情况下只能看到一些经过base-64编码的信息,加上这条配置才能解析成可阅读的sql。注意:如果这里只加一个v,解析后的sql文件中只会有被注释的伪SQL,文件并不能执行。加两个v,解析后的SQL文件才会既有编码后的sql(可执行,又有解码后的sql语句(可供阅读)
  • –database=blog:用于指定要恢复数据的数据库
  • –stop-datetime=“2023-05-11 23:59:00”:用于指定要恢复数据的截止时间
  • /home/zhangheng/binlog/binlog.000008:binlog日志所在绝对路径
  • /home/zhangheng/binlog/sql08.sql:输出解析后的的sql文件绝对路径

这一步我遇到了两个坑,详见坑:坑1、坑2。

解析完成后获得sql文件。

(3)通过sql文件恢复数据

  • 情况1:从可阅读的sql文件中找到需要恢复的节点,按2-2中的按节点恢复执行mysqlbinlog命令恢复。

  • 情况2:通过mysql的source方法导入sql文件恢复。登录mysql,执行命令:

# MySQL导入执行sql文件
source xxx.sql

注:我通过情况2导入了sql文件,但发现数据有部分缺失,所以跳转到方案二继续。

方案二:通过工具在线解析。

适合需要生成原生sql,手动执行sql恢复数据的情况。

这种方案需要安装一些工具,麻烦一些,但好处是解析后的sql就是可直接执行的原生SQL,可以灵活执行。

同类型工具有很多, binlog2sql、my2sql等等,这里我选择的是my2sql工具。

(1)Linux安装go语言环境

# 因为my2sql由go语言编写,所以要编译它需要先安装go
# 下载go语言安装包
wget https://golang.google.cn/dl/go1.19.linux-amd64.tar.gz
# 解压安装包
cd /usr/local/src
tar -xzf go1.19.linux-amd64.tar.gz
# 配置环境
vim /etc/profile
# 在最底下添加一行
# GO PATH
export PATH=$PATH:/usr/local/src/go/bin
# 使profile配置立即生效
source /etc/profile
# 查看Go版本
go version
# 若结果显示“go1.19 linux/amd64”,则说明go安装成功

(2)Linux下载并编译my2sql

# 下载my2sql
git clone https://github.com/liuhr/my2sql.git
cd my2sql/
# 编译my2sql
go build .

(3)通过my2sql工具将binlog解析为sql

  • 情况1:MySQL部署在Linux中
# 给编译后的my2sql授权
chmod u+x my2sql

# my2sql解析binlog文件
./my2sql  -user root -password 123456 -host 127.0.0.1 -port 3306 -databases blog -work-type 2sql -start-file binlog.000008 -output-dir /home/zhangheng/tmp
  • 情况2:MySQL部署在Docker中
#把编译后的my2sql 二进制文件复制到docker的MySQL容器的根目录(mysql-3306是我的容器名,此处也可以用容器id)
docker cp /usr/local/bin/my2sql  mysql-3306:/

#进入MySQL容器
docker exec -it mysql-3306  bash
# 给编译后的my2sql授权
chmod u+x my2sql

# my2sql解析binlog文件
./my2sql  -user root -password 123456 -host 127.0.0.1 -port 3306 -databases blog -work-type 2sql -start-file binlog.000008 -output-dir /home/zhangheng/tmp

命令参数说明:

  • -databases blog:用于指定要恢复数据的数据库blog
  • -work-type 2sql:2sql:生成原始sql,rollback:生成回滚sql,stats:只统计DML、事务信息
  • -start-file binlog.000008:起始binlog日志
  • output-dir /home/zhangheng/tmp:输出解析后的的sql文件绝对路径

更多可选择参数详见 link:[https://github.com/liuhr/my2sql]

运行成功后如下图:

image-20230517153605013

(4)恢复数据

解析后指定目录内容如下:

image-20230517153630477

biglong_trx.txt # 事务的统计信息
binlog_status.txt # 事务的统计信息
forward.1.sql # binlog解析之后的sql
...
forward.n.sql # binlog解析之后的sql

然后可以自由选择执行sql

三、提高安全性

被黑客删库后痛定思痛,觉得有必要提高一下我数据库的安全性,毕竟虽然只是用来写写个人博客,但逛我家数据库跟他家逛菜园子似的,也太没面子了。

于是有以下几个方案:

3-1 修改密码

整个复杂的,但记得找个小本本记下来。

ALTER USER 'root'@'localhost'  IDENTIFIED BY 'dnqi3ehQ2783YE$3@&@¥';

3-2 禁止root用户外网访问

host='%'是任意IP访问,host = 'localhost’是仅限本地访问。

update user set host = 'localhost' where user = 'root';

3-3 使用ssl加密连接

# 创建一个新的账户,用于远程访问
create user 'ssl_zh'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 查看用户拥有权限
SHOW GRANTS FOR ssl_zh;
# 给用户分配权限为查询,范围为blog数据库下的所有表
GRANT SELECT ON blog.* TO 'ssl_zh'@'%';
# 收回用户所有权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'ssl_zh'@'%';
# 指定用户只能通过ssl连接
alter user 'ssl_zh'@'%' require ssl;
#刷新权限
flush privileges;

直接通过用户ssl_zh远程登录数据库,发现提示以下内容

Access denied for user 'ssl_zh'@'xx.xx.xx.xx' (using password: YES)

3-3-1 Windows上的数据库客户端通过ssl登录

从MySQL服务器下载这三个客户端证书到本地,连接时指定证书路径

ca.pem, client-key.pen, client-cert.pem

image-20230517172242093

再次连接,连接成功。

image-20230517172440380

3-3-2 Linux上运行的springboot项目通过jdbc连接数据库

情况1:MySQL数据库和springboot项目直接部署在服务器上

情况2:MySQL数据库和springboot项目部署在docker容器里

3-4 新增数据库备份功能

1.任意目录新建脚本

vim backup_mysql.sh

# 设置 MySQL 登录信息
MYSQL_USER="root"
MYSQL_PASSWORD="123456"
MYSQL_DATABASE="blog"
BACKUP_DIR="/home/zhangheng/job/mysqlbackup"
DATE=$(date +%Y-%m-%d)
TIME=$(date +%H-%M-%S)

# 创建备份目录和文件名
mkdir -p $BACKUP_DIR/$DATE
FILENAME=$BACKUP_DIR/$DATE/$MYSQL_DATABASE-$TIME.sql.gz

# 使用 mysqldump 命令备份数据库
mysqldump --user=$MYSQL_USER --password=$MYSQL_PASSWORD --databases $MYSQL_DATABASE | gzip > $FILENAME

# 输出备份完成信息
echo "Backup completed on $(date +%Y-%m-%d %H:%M:%S) for database $MYSQL_DATABASE to $FILENAME."

# 删除超过14天的备份文件
find $BACKUP_DIR/* -mtime +14 -exec rm {} \;

2、为脚本文件添加可执行权限:

chmod +x backup_mysql.sh

3、将脚本文件添加到 crontab 中,以每天凌晨 2 点执行备份任务:

crontab -e

4、在打开的编辑器中,新增以下行:

0 2 * * * /home/zhangheng/job/backup_mysql.sh >/dev/null 2>&1

保存并退出编辑器。现在,脚本将在每天凌晨 2 点执行,并输出一条备份计划信息。

上面的shell脚本做了以下事情:

  1. 获取当前日期和时间。
  2. 使用 mkdir 命令创建备份目录和文件名。
  3. 使用 mysqldump 命令备份数据库,并将结果压缩成 gzip 格式。
  4. 输出一条备份完成信息。
  5. 使用 find 命令查找超过14天的备份文件,并将其删除。

一、Linux安装MySQL服务

# 在 /soft 目录下创建一个空的文件夹 mysql
mkdir /software/mysql
# 进入这个新建的文件夹下
cd /software/mysql

上传下载好的 Linux 下 MySQL 的安装包(安装包下载链接:https://downloads.mysql.com/archives/community/)

image-20230517115450270

# 在当前目录下(mysql)下创建一个 mysql-8.0.23 文件夹
mkdir mysql-8.0.23
# 解压安装包到该目录下
tar -xvf mysql-8.0.23-1.el8.x86_64.rpm-bundle.tar -C mysql-8.0.23
# 解压完成之后切换到 mysql-8.0.26 目录
cd mysql-8.0.23

可以看到解压后的文件都是 rpm 文件,所以需要用到 rpm 包资源管理器相关的指令安装这些 rpm 的安装包

在安装执行 rpm 安装包之前先下载 openssl-devel 插件,因为 mysql 里面有些 rpm 的安装依赖于该插件。

yum install openssl-devel

安装完该插件之后,依次执行以下命令安装这些 rpm 包

rpm -ivh mysql-community-common-8.0.23-1.el8.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.23-1.el8.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.23-1.el8.x86_64.rpm
rpm -ivh mysql-community-devel-8.0.23-1.el8.x86_64.rpm
rpm -ivh mysql-community-client-8.0.23-1.el8.x86_64.rpm
rpm -ivh mysql-community-server-8.0.23-1.el8.x86_64.rpm

在 Linux 中 MySQL 安装好了之后系统会自动的注册一个服务,服务名称叫做 mysqld,所以可以通过以下命令操作 MySQL

  • 启动 MySQL 服务:systemctl start mysqld
  • 重启 MySQL 服务:systemctl restart mysqld
  • 关闭 MySQL 服务:systemctl stop mysqld

rpm 安装 MySQL 会自动生成一个随机密码,可在 /var/log/mysqld.log 这个文件中查找该密码

cat /var/log/mysqld.log

image-20230517120302046

A temporay password is generated for root@localhost: ****密码**** ,账号是 root,有了账号和密码之后就可以连接 MySQL 了。

# 连接 MySQL 
mysql -u root -p
# 修改密码(默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。)
ALTER  USER  'root'@'localhost'  IDENTIFIED BY 'Qwert123?';
# 创建一个新的账户,用于远程访问(mysql 8.0)
create user 'zh'@'%' IDENTIFIED WITH mysql_native_password BY 'Qwert123?';
# 给用户分配权限
grant all on *.* to 'zh'@'%';

卸载

卸载 MySQL 前需要先停止 MySQL

命令:systemctl stop mysqld

停止 MySQL 之后查询 MySQL 的安装文件:rpm -qa | grep -i mysql

卸载上述查询出来的所有的 MySQL 安装包

rpm -e mysql-community-common-8.0.23-1.el8.x86_64.rpm --nodeps
rpm -e mysql-community-client-plugins-8.0.23-1.el8.x86_64.rpm --nodeps
rpm -e mysql-community-libs-8.0.23-1.el8.x86_64.rpm --nodeps
rpm -e mysql-community-devel-8.0.23-1.el8.x86_64.rpm --nodeps
rpm -e mysql-community-client-8.0.23-1.el8.x86_64.rpm --nodeps
rpm -e mysql-community-server-8.0.23-1.el8.x86_64.rpm --nodeps

删除MySQL的数据存放目录

rm -rf /var/lib/mysql/

删除MySQL的配置文件备份

rm -rf /etc/my.cnf.rpmsave

坑1 mysqlbinlog解析后的sql中文变成乱码

问题

执行mysqlbinlog命令后,解析的sql数据部分中文变成乱码。如图所示

image-20230517143134196

原因和解决方案

原因一句话:我在Windows系统执行的mysqlbinlog命令。

为什么要在Windows系统执行呢,因为我Linux上没装MySQL,运行的MySQL是通过docker容器部署在Linux上的。

为了省事(真相是docker容器部署的MySQL里没有mysqlbinlog命令才是最坑爹的啊!明明都给我默认开启了binlog,也记录了binlog日志,但进容器之后发现没有mysqlbinlog命令…我拿着一手的binlog日志没办法下嘴QAQ)

我就把Linux上运行的MySQL服务的binlog日志拷贝到Windows电脑上,试图用Windows电脑上装的MySQL中的mysqlbinlog去将它解析成sql文件,再拿到Linux上近MySQL容器里去执行。

我是说在网上查了半天也没有看到同类问题,可能没有跟我一样傻的大兄弟吧。。

总而言之,要想避免这个问题,去Linux上执行mysqlbinlog命令。

要问MySQL是通过docker容器部署在Linux上的,Linux上没装MySQL怎么办,只能给装一个呗。

坑2 mysqlbinlog解析后的sql语句被注释了

问题

执行mysqlbinlog命令后,解析的sql语句都被注释掉了。如图所示

还是上面那张图,可以看到sql语句没有字段名,而是用每个字段的位置指代了字段,当然这不重要,重要的是sql语句前面都有三个#号,也就是被注释了。进入MySQL后通过source导入sql文件就会发现啥也导不进去。

image-20230517143134196

原因和解决方案

原因一句话:这是伪sql,并不能执行。

真正能执行的是哪一部分呢,是解析之前经过base-64编码的sql,如图所示:

image-20230517145202908

也就是下面这条配置将这些人类无法阅读的编码信息解析成这些带#号的伪sql,相当于对经过base-64编码的sql的注释,恢复数据时网上查到的一些资料告诉我应该这样写:

--base64-output=decode-rows -v

这样将编码后的sql解码成可阅读的sql,但会导致文件执行后没有影响任何数据,因为解码后的sql都被注释了,而解码前的sql并没有保存在sql文件中。

正确的配置应该是

--base64-output=decode-rows -vv

如果这里只加一个v,解析后的sql文件中只会有被注释的伪SQL,文件并不能执行。加两个v,解析后的SQL文件才会既有编码后的sql(可执行,又有解码后的sql语句(可供阅读)

坑3

问题

执行mys

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

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

相关文章

单源最短路的建图

1.热浪 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn)http://ybt.ssoier.cn:8088/problem_show.php?pid1379 很裸的单源最短路问题&#xff0c;n2500,可以用dijksta或者spfa都能过&#xff0c;下面展示spfa的做法 #include<bits/stdc.h> usi…

【蓝桥杯选拔赛真题58】Scratch打气球游戏 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch打气球游戏 一、题目要求 编程实现 二、案例分析 1、角色分析

微信小程序——Git版本管理

一篇文章带你学会微信小程序中的Git版本管理 场景复现微信开发者工具中的Git连接远程仓库配置网络和认证提交工作区更改查看历史查看文件修改历史切换分支创建分支拉取、推送与抓取 微信官方开发文档&#xff1a;微信开放文档 场景复现 最近在前端的学习过程中&#xff0c;接触…

普通二本程序员想进大厂,我需要考研吗?好程序员来答!

最近好程序员看知乎有某网友提问&#xff1a; 1 普通二本&#xff0c;非科班出身&#xff0c;对Java感兴趣 2 已经开始工作半年了&#xff0c;普通技术 java 岗位 3 英语不好&#xff0c;四级没过&#xff0c;最高才 400 4 通过培训进入 java 岗位&#xff0c;基础知识不太好 5…

Python编程环境搭建:Linux(Ubuntu)系统安装Python

Linux 系统是为编程而生的&#xff0c;因此绝大多数的 Linux 发行版&#xff08;Ubuntu、CentOS 等&#xff09;都默认自带了 Python。有的 Linux 发行版甚至还会自带两个版本的 Python&#xff0c;例如最新版的 Ubuntu 会自带 Python 2.x 和 Python 3.x。 打开 Linux 发行版内…

浏览器相关开发事项

文章目录 存储浏览器持久化存储&#xff08;F12->应用->存储&#xff09;浏览器缓存&#xff08;F12->内存&#xff09;浏览器存储管理单位&#xff08;域名/IP为单位&#xff09;区别localStorage VS 浏览器缓存localStorage VS cookies 存储 浏览器持久化存储&…

Linux :: 【基础指令篇 :: (补充):(5)】:: 初步认识并解析文件详细信息内容:文件类型与用户访问权限说明、文件类型分类说明

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 经过了前面内…

如何理解数字化转型模式,适用于哪些企业?

如何理解「数字化转型」模式&#xff0c;适用于哪些企业&#xff0c;有何利弊&#xff1f; 这是一个很大的话题&#xff0c;本篇内容较长&#xff0c;全文6000字&#xff0c;心急的伙伴可先看目录&#xff0c;衷心希望以下内容能给大家带来帮助。&#xff08;如果担心一次看不…

案例分析 | 无代码助力国企数字化转型破旧立新

数字经济已成为国策&#xff0c;国企数字化转型更是排头兵&#xff0c;正成为数字化转型标杆。企业数字化转型是用信息技术全面重塑企业经营管理模式&#xff0c;是企业发展模式的变革与创新&#xff0c;是迈向数字经济时代的必然选择。 2022年9月底&#xff0c;国资委下发了重…

docker-compose启动mysql双机热备互为主从

1、环境准备 IP地址名称192.168.123.78mysql-m192.168.123.82mysql-s 2、安装mysql-m&#xff08;192.168.123.78&#xff09; 创建M主节点&#xff0c;通过下面的docker编排配置创建响应的目录和文件&#xff0c;目录下边创建 docker-compose.yml和my.cnf文件 docker-compo…

机器学习笔记 - 深度相机技术原理路线概览

一、深度相机的应用和原理 机器学习、人工智能、嵌入式视觉和处理技术的进步帮助创新者构建了能够在几乎没有人工监督的情况下导航环境的自主机器。此类设备的示例包括AMR(自主移动机器人),自动拖拉机,自动叉车等。 使这些设备真正自主需要它们能够在没有任何手动…

定时器搭配GPIO做定时扫描按键 -- STM32

STM32学习 定时器&#xff08;TIM&#xff09;定时器工作原理定时器相关参数相关函数和配置参数 通用输入/输出&#xff08;GPIO&#xff09;GPIO原理GPIO相关函数 实现定时扫描按键总结 在STM32F103系列的单片机应用中&#xff0c;定时器&#xff08;TIM&#xff09;和通用输入…

【名词解释】KiB和KB,MiB和MB,GiB和GB 等的区别以及1M带宽到底是多少?

目录 1. KiB和KB&#xff0c;MiB和MB&#xff0c;GiB和GB 2. 宽带速度 3. 单位换算 1. KiB和KB&#xff0c;MiB和MB&#xff0c;GiB和GB KiB和KB&#xff0c;MiB和MB&#xff0c;GiB和GB 等的区别: 1KB(kilobyte)10^31000byte, 1KiB(kibibyte)2^101024byte …

虹科干货 | 虹科Redis企业版数据库的延迟如此之小,proxy功不可没!

在Redis企业版集群的后台发生了许多事件&#xff0c;proxy&#xff08;代理&#xff09;隐藏了数据库客户端的所有活动。 大多数开发人员在构建应用程序时都会从小规模开始&#xff0c;使用简单的Redis开源&#xff08;Redis OSS&#xff09;数据库。在初期阶段&#xff0c;使用…

lnmp安装部署

文章目录 一、安装部署nginx二、安装部署mysql三、安装配置 PHP 解析环境四、部署 Discuz&#xff01;社区论坛 Web 应用 一、安装部署nginx 1、安装依赖包 systemctl stop firewalld setenforce 0 yum -y install pcre-devel zlib-devel gcc gcc-c make2、创建运行用户 use…

设计模式之~解释器模式

简述&#xff1a; 解释器模式&#xff0c;给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。 解释器模式需要解决的是&#xff0c;如果一种特定类型的问题发生的频率足够高&#xff0c;那么可…

基于安全产品DNS隧道流量分析

域名准备 选择哪家的云都没问题&#xff0c;这里我选择的TX云&#xff0c;因为之前注册过了&#xff0c;自己拿来做个流量分析不成问题。 域名添加解析记录 需要准备自己的vps作为DNS隧道的服务端&#xff0c;且需要添加ns记录 iodined 关闭53端口关闭开机自启 systemctl …

数据在内存中存储的真相来了!!!

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

【CMake报错】“检测到_ITERATOR_DEBUG_LEVEL和RuntimeLibrary不匹配” 的解决方案

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

外观模式详解:轻松搞定复杂子系统

一、概述 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为多个子系统中的操作提供一个统一的高层接口&#xff0c;用于访问复杂子系统的功能。其核心思想是通过一个外观类将子系统的复杂操作进行封装&#xff0c;客户端只需与外观类进行…