MySQL 8.0 Clone Plugin 详解

文章目录

  • 前言
    • 1. 克隆插件安装
    • 2. 克隆插件的使用
      • 2.1 本地克隆
      • 2.2 远程克隆
    • 3. 克隆任务监控
    • 4. 克隆插件实现
      • 4.1 Init 阶段
      • 4.2 File Copy
      • 4.3 Page Copy
      • 4.4 Redo Copy
      • 4.5 Done
    • 5. 克隆插件的限制
    • 6. 克隆插件与 Xtrabackup 的异同
    • 7. 克隆插件相关参数
  • 后记

前言

克隆插件(Clone Plugin)是 MySQL 8.0.17 引入的一个重大特性,可以从本地或者远程克隆数据。

如果在 8.0.17 之前想要给 MySQL 复制拓扑中添加一个新节点,只支持 Binlog 一种恢复方式,如果新节点所需要的 Binlog 在集群中不存在,就只能先借助备份工具进行全量备份恢复,再配置增量同步。这种方式虽然能达到添加新节点的目的,但总归是需要借助外部工具,相对来说是有一定的使用门槛和工作量。

Clone 插件支持本地克隆和远程克隆,可以很方便的帮助我们添加一个新的节点,也可以作为 Innodb 引擎的物理备份工具。

1. 克隆插件安装

可以在配置文件中配置:

[mysqld]
plugin-load-add=mysql_clone.so

或者在 MySQL 中执行:

install plugin clone soname 'mysql_clone.so';

可通过下方 SQL 查询 Clone 插件状态:

-- SQL:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';

-- 输出:
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone       | ACTIVE        |
+-------------+---------------+

如果想要卸载或者重新加载 Clone 插件,可使用下方命令:

uninstall plugin clone;

2. 克隆插件的使用

克隆插件支持本地克隆和远程克隆,接下来我们分别介绍使用方法。

2.1 本地克隆

本地 Clone 的原理可参考下图,它可以将本地的数据文件拷贝到服务器的一个目录中,本地 Clone 只能在实例本地发起。

在这里插入图片描述

本地 Clone 命令的语法如下:

CLONE LOCAL DATA DIRECTORY [=] 'clone_dir';

只需指点克隆路径即可,下面将进行一个具体演示。

a. 创建克隆专用的用户

-- 创建用户
create user backup_clone@'127.0.0.1' identified by 'YouPassword';

-- 授予本地克隆权限
GRANT BACKUP_ADMIN ON *.* TO backup_clone@'127.0.0.1';

-- 授予克隆信息查看权限
GRANT SELECT ON performance_schema.clone_status TO backup_clone@'127.0.0.1';

b. 创建克隆目录

mkdir /data/clone_bak
chown -R mysql:mysql /data/clone_bak

c. 执行克隆命令

CLONE LOCAL DATA DIRECTORY = '/data/clone_bak/20231106';

这里的 /data/clone_bak/20231106 是克隆目录,它需要满足 3 个要求:

  • 克咯目录必须是绝对路径。
  • 其中 /data/clone_bak 必须存在,且 MySQL 对其有写权限。
  • 最后一级目录 20231106 不能存在。

d. 查看克隆目录的内容

ll /data/clone_bak/20231106

# 输出:
总用量 570376
drwxr-x--- 2 mysql mysql        89 116 11:27 #clone
-rw-r----- 1 mysql mysql      4373 116 11:27 ib_buffer_pool
-rw-r----- 1 mysql mysql 524288000 116 11:27 ibdata1
drwxr-x--- 2 mysql mysql        23 116 11:27 #innodb_redo
drwxr-x--- 2 mysql mysql         6 116 11:27 mysql
-rw-r----- 1 mysql mysql  26214400 116 11:27 mysql.ibd
drwxr-x--- 2 mysql mysql        28 116 11:27 sys
-rw-r----- 1 mysql mysql  16777216 116 11:27 undo_001
-rw-r----- 1 mysql mysql  16777216 116 11:27 undo_002

可以直接基于这些数据文件启动 MySQL 实例,相较于 Xtrabackup 克隆插件无须 Prepare 阶段。

2.2 远程克隆

远程克隆的原理可参考下图,克隆角色分为接收者 (recipient) 与捐赠者 (donor),默认情况下使用远程克隆会删除 “接收者” 数据目录中的数据,替换为 “捐赠者” 的克隆数据。当然也可以选择将克隆的数据分配到 “接收者” 的其它目录,避免删除 “接收者” 现有的数据。

在这里插入图片描述
远程克隆的语法如下:

CLONE INSTANCE FROM 'user'@'host':port
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];

参数含义介绍:

  • user:登陆捐赠者实例的用户名。
  • host:捐赠者实例的主机名或 IP。
  • port:捐赠者实例的端口。
  • password:捐赠者实例的密码。
  • clone_dir:不指定 clone_dir 时,会清空接收者实例的 datadir 目录,并将数据放到 datadir 指定路径。如果指定了 data directory,则该路径需要不存在,mysql 服务需要有目录权限。
  • REQUIRE [NO] SSL:指定传输数据是是否使用加密协议。

下面将进行一个具体演示,操作环境介绍:

主机版本角色Clone Pluge
172.16.104.578.0.32捐赠者ACTIVE
172.16.104.568.0.32接收者ACTIVE

a. 在捐赠者实例上创建相关账号并授权

CREATE USER 'donor_user'@'%' IDENTIFIED BY 'password';
GRANT BACKUP_ADMIN on *.* to 'donor_user'@'%';

b. 在接收者实例上创建账号并授权

CREATE USER 'recipient_user'@'%' IDENTIFIED BY 'password';
GRANT CLONE_ADMIN on *.* to 'recipient_user'@'%';

这里 CLONE_ADMIN 权限,隐含有 BACKUP_ADMIN 和 SHUTDOWN 重启实例权限。

c. 在接收者实例上设置捐赠者白名单

SET GLOBAL clone_valid_donor_list = '172.16.104.57:3306';

接收者只能克隆白名单列表内捐赠者的数据,如果有多个实例使用逗号分隔。

d. 在接收者实例上发起远程克隆

CLONE INSTANCE FROM 'donor_user'@'172.16.104.57':3306 IDENTIFIED BY 'password';

获取备份锁(backup lock)备份锁与 DDL 互斥。捐赠者与接收者两个节点的备份锁都要获取。远程克隆结束后,会重启接收者节点。如果克隆命令指定克隆目录 DATA DIRECTORY 则不会重启。

3. 克隆任务监控

MySQL 提供两张表,监控克隆任务及查看任务状态。分别是 performance_schema 下的 clone_status 和 clone_progress 表。

首先看看 clone_status 表,该表记录了克隆操作的状态信息。

root@mysql 15:07:  [(none)]>select * from performance_schema.clone_status\G
*************************** 1. row ***************************
             ID: 1
            PID: 0
          STATE: Completed
     BEGIN_TIME: 2023-11-06 14:57:26.647
       END_TIME: 2023-11-06 14:57:39.406
         SOURCE: 172.16.104.57:3306
    DESTINATION: LOCAL INSTANCE
       ERROR_NO: 0
  ERROR_MESSAGE: 
    BINLOG_FILE: mysql-bin.000001
BINLOG_POSITION: 3185
  GTID_EXECUTED: 1b03028c-76f7-11ee-ac46-faa7cd9c6a00:1-4,
eccc6b43-b0fc-11ed-8e74-fa0e3cc40b00:1-3

其中各字段含义如下:

  • ID:任务 ID。
  • PID:对应 show processlist 中的 ID,如果要终止克隆任务,可以执行 KILL QUERY processlist_id。
  • STATE:克隆操作的状态,包括 Not Started(尚未开始)In Progress(进行中)Completed(成功)Failed(失败)。
  • BEGIN_TIME:克隆任务开始时间。
  • END_TIME:克隆任务结束时间。
  • SOURCE:Donor 实例的地址。
  • DESTINATION:克隆目录。
  • BINLOG_FILE & BINLOG_POSITION & GTID_EXECUTED:克隆操作对应的一致性位点信息,可利用这些信息搭建从库。
  • ERROR_MESSAGE:如果任务失败,该字段会显示报错内容。

接下来查看 clone_progress 表,该表记录克隆任务的进度信息。

select * from performance_schema.clone_progress;
IDSTAGESTATEBEGIN_TIMEEND_TIMETHREADSESTIMATEDATANETWORKDATA_SPEEDNETWORK_SPEED
1DROP DATACompleted2023-11-06 14:57:26.6733852023-11-06 14:57:26.891470100000
1FILE COPYCompleted2023-11-06 14:57:26.8916452023-11-06 14:57:31.875850158324145658324145658328124300
1PAGE COPYCompleted2023-11-06 14:57:31.8761142023-11-06 14:57:31.8823721009900
1REDO COPYCompleted2023-11-06 14:57:31.8825502023-11-06 14:57:31.885697125602560290100
1FILE SYNCCompleted2023-11-06 14:57:31.8858182023-11-06 14:57:32.775465100000
1RESTARTCompleted2023-11-06 14:57:32.7754652023-11-06 14:57:37.769087000000
1RECOVERYCompleted2023-11-06 14:57:37.7690872023-11-06 14:57:39.405806000000

其中各字段含义如下:

  • STAGE:一个克隆任务有 7 个阶段,分别是 DROP DATA、FILE COPY、PAGE COPY、REDO COPY、FILE SYNC、RESTART、RESTART 当前阶段结束后才会开始进入下一阶段。
  • STATE:当前阶段状态。
  • BEGIN_TIME & END_TIME:当前阶段的开始时间和结束时间。
  • THREADS:当前阶段使用的并发线程数。
  • ESTIMATE:预估数据量。
  • DATA:已拷贝的数据量。
  • NETWORK:通过网络传输的数据量。
  • DATA_SPEED:当前任务拷贝的速率。
  • NETWORK_SPEED:当前任务网络传输的速率。

4. 克隆插件实现

在这里插入图片描述

参考来源:YunChe MySQL 实战课程 clone 插件原理

克隆插件可以细分 5 个阶段:

4.1 Init 阶段

初始化一个克隆对象。

4.2 File Copy

拷贝数据文件。在拷贝之前,会将当前的检查点 LSN 记为 CLONE START LSN,同时启动 Page Tracking。

Page Tracking 会跟踪 CLONE START LSN 之后发生修改的页,记录这些页面的元数据信息 tablespace ID 和 page ID。数据文件拷贝结束后,会将当前检查点的 LSN 记为 CLONE FILE END LSN。

File Copy 期间对源文件所有的改动,都会被 Page Tracking 记录,将在 Page Copy 阶段进行 “覆盖” 订正处理。所以不用担心 Copy 期间源文件发生改变问题。

4.3 Page Copy

该阶段的主要目的是订正覆盖 FILE COPY 阶段,源文件有改动的地方,相当于处理 FILE COPY 阶段的增量数据。执行拷贝之前,会基于 tablespace ID 和 page ID 对这些页进行排序,以避免 PAGE COPY 过程中的随机读写。

因为对数据文件的拷贝已经结束,那 PAGE COPY 阶段的增量数据,将通过归档 redo log 来处理。

所以,在 PAGE COPY 阶段启动前,会开启 Redo Archiving 归档线程,将 redo log 的内容按块拷贝到归档文件中。通常来讲,归档线程的拷贝速度会快于 redo log 的生成速度。即便 redo log 生成速度要快于归档线程,在写入 redo log 时,也会等待归档线程完成拷贝,不会覆盖还未拷贝的 redo log。

Page Tacking 中的页面拷贝完成后,会获取实例的一致性位点信息,停止 Redo Archiving 同时将此时的 LSN 记为 CLONE LSN。

4.4 Redo Copy

拷贝归档文件中 CLONE FILE END LSN 与 CLONE LSN 之间的 redo log,通过重用归档 redo log 就可以将数据库恢复到一个一致的时间点 Clone LSN,也就是停止 Redo Archiving 时的那一刻。

4.5 Done

调用 snashot_end() 销毁克隆对象。

5. 克隆插件的限制

在使用 Clone 插件时,需注意有如下限制:

  • 克隆期间,会堵塞 DDL 同样 DDL 也会堵塞克隆命令的执行。不过从 MySQL 8.0.27 开始,克隆命令就不会堵塞捐赠者上的 DDL 了。
  • 克隆插件只会拷贝 innodb 引擎表中的数据,对于其他存储引擎,只会拷贝表结构。
  • 克隆插件不会拷贝配置参数和 Binlog。
  • 捐赠者和接受者的版本需要保持一致。不仅大版本要一样,小版本也要一样。可使用 show variables 命令查看版本。
  • 远程克隆,主机操作系统和位数必须一致,可通过 version_compile_os 与 version_compile_machine 查看。
  • 捐赠者和接收者都需要安装克隆插件。
  • 捐赠者和接受者字符集需要一样,可通过 character_set_server 与 collation_server 查看。
  • 捐赠者和接受者的参数 innodb_page_size 与 innodb_data_file_path 需要一样。
  • 默认情况下,远程 clone 会在完成数据 clone 后,关闭接受者实例。需要有控制进程(如 mysqld_safe 脚本、systemctl 等)来拉起接受者实例。如果缺少控制进程,则接受者实例关闭后,无法自动启动,需要手动拉起。
  • 无论是捐赠者还是接收者,同一时间只能执行一个克隆操作。

推荐阅读:5.6.7.14 Clone Plugin Limitations

6. 克隆插件与 Xtrabackup 的异同

在实现上,两者都有 File Copy 和 Redo Copy 阶段,但克隆插件比 Xtrabackup 多一个 Page Copy 阶段。基于此原因,克隆插件的恢复速度比 Xtrabackup 更快。

Xtrabackup 没有 Redo Archiving 特性,可能会出现未拷贝 redo 被覆盖的情况,不过 8.0 版本也有对应的解决方案,感兴趣可以参考下文。

推荐阅读:Use Physical Backups With MySQL InnoDB Redo Log Archiving

通过克隆出来的实例,可以直接搭建 GTID 复制,相关位点信息也会拷贝,无须额外执行 SET GLOBAL GTID_PURGED 操作。

7. 克隆插件相关参数

  • clone_autotune_concurrency:是否自动调节克隆过程中并发线程数的数量,默认为 ON。如果为 OFF 则线程数等于 clone_max_concurrency 默认为 16 个。

  • clone_buffer_size:本地克隆时,中转缓冲区的大小,默认为 4MB。缓冲区越大,备份速度越快,相应的磁盘 IO 压力也就越大。

  • clone_block_ddl: 由 MySQL 8.0.27 版本新加入的参数,默认为 OFF 表示允许捐赠者在 Clone 期间可以执行 DDL。

  • clone_ddl_timeout: 克隆操作需要获取备份锁,在执行 Clone 命令时,如果此时正好有 DDL 执行,则 Clone 命令会被堵塞,等待获取备份锁。等待时间最长由接收者实例上的 clone_ddl_timeout 来控制,默认为 300 秒。如果超过该参数设置的时间,那么 Clone 任务会抛出异常。如果 Clone 命令正在执行,再执行 DDL 时,此时 DDL 会被备份锁堵塞,不过 DDL 的超时时间,由 lock_wait_timeout 决定,该参数默认为 31536000 秒,既 365 天。

  • clone_donor_timeout_after_network_failure: 在远程克隆时,如果发生网络故障,克隆操作不好马上终止,而是会等待一段时间,等待时间由该参数控制,单位分钟,默认为 5 分钟。

  • clone_delay_after_data_drop: 指定在远程克隆操作开始时立即删除接收方 MySQL Server 实例上的现有数据后的延迟时间。延迟的目的是在从捐赠者 MySQL Server 实例克隆数据之前,为接收方主机上的文件系统提供足够的时间来释放空间。某些文件系统(例如 VxFS)在后台进程中异步释放空间。在这些文件系统上,删除现有数据后过早克隆数据可能会因空间不足而导致克隆操作失败。最大延迟时间为 3600 秒(1 小时)默认设置为 0(无延迟)。

  • clone_max_data_bandwidth: 在远程克隆时,单个线程允许数据最大拷贝速率,单位是 MiB/s。默认为 0 既不限制。如果捐赠者有 IO 瓶颈,可通过该参数限速。

  • clone_max_data_bandwidth: 在远程克隆时,可允许的最大网络传输速率,单位是 MiB/s。默认为 0 既不限制。如果网络带宽存在瓶颈,可通过该参数限速。

  • clone_max_concurrency: 定义远程克隆操作的最大并发线程数。默认值为 16。更多的线程数可以提高克隆性能,但也会减少允许的并发客户端连接数,从而影响现有客户端连接的性能。此设置仅应用于接收方 MySQL 服务器实例。

推荐阅读:5.6.7.13 Clone System Variables

后记

基于 MySQL 8.0 克隆插件,我研发了一套自动化备份系统,可以管理线下所有 MySQL 集群的 Clone 备份和 Binlog 备份。

在这里插入图片描述

感兴趣可以看看,欢迎提问题提需求,欢迎 Pull Requests!

https://github.com/COOH-791/mysql_clone_backup/tree/main

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS点击图片指定对象变色两种方法

要求&#xff1a;点击上面的颜色实现下面的图像变成相同的颜色 难点&#xff1a;对于js函数的this对象不太清楚如何传递 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>changeColor</title>&l…

vite基础学习笔记:13.Dialog 对话框 (用户注册与登录)

说明&#xff1a;自学做的笔记和记录&#xff0c;如有错误请指正 1. Dialog 对话框组件 目标效果&#xff1a;点击“登录/注册”&#xff0c;弹框 &#xff08;1&#xff09;创建全局组件&#xff0c;在官网中查询代码粘贴 &#xff08;2&#xff09; 注册和使用全局组件 &a…

Zotero从安装到使用再到插件下载【适合小白,只看一篇就够!!!】

一、安装 1.安装Zotero 本人安装的是zotero6&#xff0c;全文是基于zotero6功能的介绍&#xff01; 下载地址&#xff1a;Zotero下载 选择 Custom&#xff0c;因为Standard是标准型会默认放置C盘&#xff0c;并且不能更改&#xff01; 选择自己的路径进行安装&#xff01;…

创建asp.net core mvc项目

一、安装vs2019 百度搜索【visual studio社区版下载】&#xff0c;进入微软官网 二、安装环境 运行vs2019,点击“工具”->“获取工具和功能” 三、打开vs2019 1.“文件”->“新建”->“项目”-> “ASP.Net Core Web 应用&#xff08;模型-视图-控制器&#xff09…

Python TCP服务端多线程接收RFID网络读卡器上传数据

本示例使用设备介绍&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) #python通过缩进来表示代码块&#xff0c;不可以随意更改每行前面的空白&#xff0c;否则程序会运行错误&#xff01;&#xff01;&#xff01;如果缩进不…

Git->git简介,git的常用命令,git命令的常用理论

git简介git的常用命令git命令的常用理论 1.git简介 Git是什么&#xff1f; Git是一个开源的分布式&#xff0c;用于敏捷高效地处理任何或小或大的项目 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVSI…

2023-11 | 短视频批量下载/爬取某个用户的所有视频 | Python

这里以鞠婧祎的个人主页为demo https://www.douyin.com/user/MS4wLjABAAAACV5Em110SiusElwKlIpUd-MRSi8rBYyg0NfpPrqZmykHY8wLPQ8O4pv3wPL6A-oz 【2023-11-4 23:02:52 星期六】可能后面随着XX的调整, 方法不再适用, 请注意 找到接口 找到https://www.douyin.com/aweme/v1/web/…

蓝桥云课--1014 第 1 场算法双周赛

2-数树数【算法赛】&#xff08;找规律&#xff09; 一、题目要求 二、思路 由此可以推导出来&#xff0c;当s[i]L时&#xff0c;下一个编号当前编号*2-1&#xff1b;当s[i]R时&#xff0c;下一个编号当前编号*2&#xff1b; 三、代码 #include<bits/stdc.h> #define…

安卓三防手持终端 二维码扫描识别器 pda条码手持机

PDA条码手持机是一种快速的数据采集设备&#xff0c;具备多种数据采集功能并且可以进行二次开发&#xff0c;可以针对性的进行定制服务&#xff0c;满足各种业务需求。因其体积小&#xff0c;易操作、功能全、效率高深受物联网行业的青睐。 条码扫描是PDA重要的功能之一&#…

网络安全(黑客)小白自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

C++|前言

c|前言 一、什么是C二、C发展史三、C的重要性3.1语言的使用广泛度3.2工作领域3.3校招领域 四、如何学习C4.1别人怎么学4.2自己怎么学 一、什么是C 在上回书已经学习了C语言&#xff0c;我们知道C语言是面向过程语言&#xff0c;C语言是结构化和模块化的语言&#xff0c;适合处理…

你觉得哪个软件写verilog体验最好?

最近在媒体上看到一个热点问题&#xff0c;浏览量高达680,003。“你觉得哪个软件写verilog体验最好&#xff1f;”这个问题可以说是IC设计师们最想知道的问题&#xff0c;也是大家工作交流中比较常见的。今天移知教育小编就来为大家分享一下&#xff0c;我对于这个问题的解答。…

登陆认证权限控制(2)—— 基于Spring security 安全框架的权限管理 注解式权限控制 RABC模型

前言 登陆认证&#xff0c;权限控制是一个系统必不可少的部分&#xff0c;一个开放访问的系统能否在上线后稳定持续运行其实很大程度上取决于登陆认证和权限控制措施是否到位&#xff0c;不然可能系统刚刚上线就会夭折。 Spring Security 是一个能够为基于 Spring 的企业应用…

学习Opencv(蝴蝶书/C++)相关——2.用clang++或g++命令行编译程序

文章目录 1. c/cpp程序的执行1.1 cpp程序的编译过程1.2 预处理指令1.3 编译过程的细节2. macOS下使用Clang看cpp程序的编译过程2.1 示例2.1.1 第一步 预处理器-preprocessor2.1.2 第二步 编译器-compiler2.1.3 第三步 汇编器-assembler2.1.4 第四步 链接器-linker2.1.5 链接其他…

【机器学习基础】机器学习概述

目录 前言 一、机器学习概念 二、机器学习分类 三、机器学习术语 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x…

【论文阅读】PSDF Fusion:用于动态 3D 数据融合和场景重建的概率符号距离函数

【论文阅读】PSDF Fusion&#xff1a;用于动态 3D 数据融合和场景重建的概率符号距离函数 Abstract1 Introduction3 Overview3.1 Hybrid Data Structure3.2 3D Representations3.3 Pipeline 4 PSDF Fusion and Surface Reconstruction4.1 PSDF Fusion4.2 Inlier Ratio Evaluati…

MCU平台使用SPI-DirectC实现FPGA在线升级

本文介绍在MCU平台上使用SPI-DirectC实现FPGA的在线升级功能。 对于使用Microchip FPGA若想使用离线方式对FPGA进行Bitstream的烧写,就不得不使用官方提供的DirectC组件(开源,包含JTAG-DirectC和SPI-DirectC),本文是在MCU(32bit)上实现的,采用的是SPI-DirectC组件。 …

分布式数据库·Hive和MySQL的安装与配置

一、版本要求&#xff1a;Hadoop:hadoop-2.10.1、MySQL&#xff1a;mysql-8.0.35、 HIVE&#xff1a;apache-hive-3.1.2、MySQL驱动&#xff1a;mysql-connector-java-5.1.49 安装包网盘链接&#xff1a;阿里云盘分享 安装位置 Hive:master、MySQL:slave1 二、卸载已安装的…

实现第三方app开机自启

添加 <category android:name"android.intent.category.LAUNCHER_APP" />

【数据结构】单链表OJ题(一)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言一、移除链表元素二、寻找链表中间结点三、输出链表倒数第k个结点四、反转单链表五…