MySQL Mysqldump 一致性备份与大数据库备份 与 PG MYSQL 到底谁是NO.1

这开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内,可以解决你的问题。加群请联系 liuaustin3 ,(共1830人左右 1 + 2 + 3 + 4 +5) 4群(340+ 到350将关闭自由申请),另欢迎 OpenGauss 的技术人员加入。

5f342f6d063831d81f362ca4c8b63906.png

我其实是想郑重其事的回答以下在上个礼拜分享会后,一个人最后对我的一个问题,问题是, PG 和 MYSQL 到底那个是 NO.1 ,当时我的语气不是很好,因为我觉得很无聊,在此表示道歉,但观点我是不变的。

作为一个技术人员,不是对自己的技术有要求,而是成天的讨论 PG 第一还是 MYSQL 第一,我不觉得是光彩的事情,这只能说明一件事情,你无能,提出这个问题的人,很可能在技术上是 physically challenged individual.

你在问这个问题的时候,其实你在告诉别人,这两个数据库你必然有一个你不会,不管是PG 或是 MYSQL 。为什么不能提高自己,两个都会呢?我想那时的你,不会在提出这样问题,因为你有自信,告诉任何人,"Who cares about which one is NO.1? I can operate both of them." That's all.

6e689a684e8a9c83d92aedf0a91d9c6c.png

a95b3a32af240449b20ee8c239a12774.png

——————————————————————————————

技术正文

道完歉,最近在重新的review PostgreSQL和MySQL在内置备份这个层面的功能,pg_dump , mysqldump ,实话实说mysqldump 的确无法和PG的 pg_dump 的功能比较。这主要是从这几个方面来进行

1 备份的速度

2 备份的多线程

3 备份命令中直接带有压缩的功能
4 备份命令直接支持数据一致性备份,并且是在并发备份模式下(不需要带参数)

但是咱们还是得实话实说,MYSQL的市场占有率就是高,两手都要抓,两手都要硬。

当然MySQL 的MySQLDUMP从早期的5.0中,当时我使用的是是没有 --single-transaction 的这个一致性的支持是到了mysql5.1.1.0中才有的功能。当时只能只用 --lock-tables 来进行数据库的备份。

在备份中MySQL 是要通过 --single-transaction 来进行数据库的备份,如果不使用这个参数,那么你对数据库的操作,只能要导出,不能叫备份,因为此时你没有这个参数的加持,你的备份中的表输出的数据都不在一个时间点,所以没有这个参数的备份是失败的。

这里我们简单用一个备份,并跟踪整个备份的过程来看看到底备份一个数据库中经历了什么。

f6ac30538ddf62448d73061685a772b9.png

2023-12-30T15:22:50.379211-00:00     8 Connect root@localhost on  using Socket
2023-12-30T15:22:50.379506-00:00     8 Query /*!40100 SET @@SQL_MODE='' */
2023-12-30T15:22:50.379631-00:00     8 Query /*!40103 SET TIME_ZONE='+00:00' */
2023-12-30T15:22:50.379739-00:00     8 Query /*!80000 SET SESSION information_schema_stats_expiry=0 */
2023-12-30T15:22:50.379925-00:00     8 Query SET SESSION NET_READ_TIMEOUT= 86400, SESSION NET_WRITE_TIMEOUT= 86400
2023-12-30T15:22:50.380446-00:00     8 Query SHOW VARIABLES LIKE 'gtid_mode'
2023-12-30T15:22:50.391288-00:00     8 Query FLUSH /*!40101 LOCAL */ TABLES
2023-12-30T15:22:50.391924-00:00     8 Query FLUSH TABLES WITH READ LOCK
2023-12-30T15:22:50.392361-00:00     8 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2023-12-30T15:22:50.392899-00:00     8 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2023-12-30T15:22:50.393304-00:00     8 Query SHOW BINARY LOG STATUS
2023-12-30T15:22:50.393518-00:00     8 Query UNLOCK TABLES
2023-12-30T15:22:50.393714-00:00     8 Query SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE ENGINE = 'ndbcluster' AND FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE ENGINE = 'ndbcluster' AND FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('test'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
2023-12-30T15:22:50.404327-00:00     8 Query SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('test')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
2023-12-30T15:22:50.406627-00:00     8 Query SHOW VARIABLES LIKE 'ndbinfo\_version'
2023-12-30T15:22:50.411160-00:00     8 Init DB test
2023-12-30T15:22:50.411488-00:00     8 Query SAVEPOINT sp
2023-12-30T15:22:50.411854-00:00     8 Query show tables
2023-12-30T15:22:50.416006-00:00     8 Query show table status like 'test'
2023-12-30T15:22:50.417961-00:00     8 Query SET SQL_QUOTE_SHOW_CREATE=1
2023-12-30T15:22:50.418353-00:00     8 Query SET SESSION character_set_results = 'binary'
2023-12-30T15:22:50.418666-00:00     8 Query show create table `test`
2023-12-30T15:22:50.426797-00:00     8 Query SET SESSION character_set_results = 'utf8mb4'
2023-12-30T15:22:50.427208-00:00     8 Query show fields from `test`
2023-12-30T15:22:50.431178-00:00     8 Query show fields from `test`
2023-12-30T15:22:50.432739-00:00     8 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`
2023-12-30T15:22:50.433439-00:00     8 Query SET SESSION character_set_results = 'binary'
2023-12-30T15:22:50.433681-00:00     8 Query use `test`
2023-12-30T15:22:50.433969-00:00     8 Query select @@collation_database
2023-12-30T15:22:50.434119-00:00     8 Query SHOW TRIGGERS LIKE 'test'
2023-12-30T15:22:50.439390-00:00     8 Query SET SESSION character_set_results = 'utf8mb4'
2023-12-30T15:22:50.439750-00:00     8 Query SET SESSION character_set_results = 'binary'
2023-12-30T15:22:50.440197-00:00     8 Query SELECT COLUMN_NAME,                       JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"')                FROM information_schema.COLUMN_STATISTICS                WHERE SCHEMA_NAME = 'test' AND TABLE_NAME = 'test'
2023-12-30T15:22:50.441997-00:00     8 Query SET SESSION character_set_results = 'utf8mb4'
2023-12-30T15:22:50.442242-00:00     8 Query ROLLBACK TO SAVEPOINT sp
2023-12-30T15:22:50.442521-00:00     8 Query RELEASE SAVEPOINT sp
Query FLUSH /*!40101 LOCAL */ TABLESQuery FLUSH TABLES WITH READ LOCKQuery SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READQuery START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */Query SELECT @@GLOBAL.GTID_EXECUTEDQuery SHOW BINARY LOG STATUSQuery UNLOCK TABLES

这里在备份中可以分为几个过程

1 如上面的显示的,他需要对表执行read lock,此时获得一个全局锁,为备份做一个完整的准备,此时数据库的表将变为只读的状态,并且马上针对备份的SESSION 设置为repeatable read 的状态,方便准备在备份期间为数据表备份中的数据一致性进行准备,然后建立事务,获取当前的GTID的号并查看当前的BINLOG 当前的文件是那个。然后解锁全局。

Query   SAVEPOINT sp
Query show tables
Query show table status like 'test'
Query SET SQL_QUOTE_SHOW_CREATE=1
Query SET SESSION character_set_results = 'binary'
Query show create table `test`
Query SET SESSION character_set_results = 'utf8mb4'
Query show fields from `test`
Query show fields from `test`
Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`
Query SET SESSION character_set_results = 'binary'
Query use `test`
Query select @@collation_database
Query SHOW TRIGGERS LIKE 'test'
Query SET SESSION character_set_results = 'utf8mb4'
Query SET SESSION character_set_results = 'binary'
Query SELECT COLUMN_NAME,                       JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"')                FROM information_schema.COLUMN_STATISTICS                WHERE SCHEMA_NAME = 'test' AND TABLE_NAME = 'test'
Query SET SESSION character_set_results = 'utf8mb4'
Query ROLLBACK TO SAVEPOINT sp
Query RELEASE SAVEPOINT sp

而后面就开始针对表进行备份,这里会先建立一个当前事务的 savepoint 方便后面进行rollback, 在建立了savepoint后开始针对表的创建语句,字符集以及数据信息进行获取这里都在上面的备份的过程中有体现,并通过系统表获得表中的字段,然后rollback 到设置savepoint的点,整个数据库的备份完成。

在mysqldump 源代码中的这部分就是上面展示的操作部分,建立save point 并且针对数据库宗所有的表进行获取,并循环方式的对表进行逐一的备份。

if (flush_logs) {if (mysql_refresh(mysql, REFRESH_LOG))DB_error(mysql, "when doing refresh");/* We shall continue here, if --force was given */elseverbose_msg("-- dump_all_tables_in_db : logs flushed successfully!\n");}if (opt_single_transaction && mysql_get_server_version(mysql) >= 50500) {verbose_msg("-- Setting savepoint...\n");if (mysql_query_with_error_report(mysql, nullptr, "SAVEPOINT sp")) return 1;}while ((table = getTableName(0))) {char *end = my_stpcpy(afterdot, table);if (include_table(hash_key, end - hash_key)) {dump_table(table, database);if (opt_dump_triggers && mysql_get_server_version(mysql) >= 50009) {if (dump_triggers_for_table(table, database)) {if (path) my_fclose(md_result_file, MYF(MY_WME));maybe_exit(EX_MYSQLERR);}}

下面的这部分是针对备份中在建立SAVE POINT 后备份表完成后,对数据库执行 rollback savepoint的操作,并且执行release savepoint的工作。

if (opt_single_transaction && mysql_get_server_version(mysql) >= 50500) {verbose_msg("-- Rolling back to savepoint sp...\n");if (mysql_query_with_error_report(mysql, nullptr,"ROLLBACK TO SAVEPOINT sp"))maybe_exit(EX_MYSQLERR);}}if (opt_single_transaction && mysql_get_server_version(mysql) >= 50500) {verbose_msg("-- Releasing savepoint...\n");if (mysql_query_with_error_report(mysql, nullptr, "RELEASE SAVEPOINT sp"))return 1;}

这样设计的有点通过创建事务点的方式可以保证在备份数据库表的情况下,不阻塞DDL的操作。

通过在此整理这部分的内容

1 在使用--single-transaction 对数据库备份时,如果数据库的表的数量多,数据量大的情况下,并且备份线程在RR的模式下,会在此期间将大量正在运行的事务的snapshot版本,放置在UNDO LOG中进行保存,如果此时业务繁忙,并且备份的时间在  save point  ----  rollback savepoint之间的时间过长,则需要注意undo log 表空间应该有足够的空间来进行存储这段时间无法被purge 的事务信息。

2 在备份中存在FLUSH TABLES WITH READ LOCK 的主要原因是系统担心在备份获取binlog信息的时刻,此时数据库进行DDL操作,而进行锁控制,此时是不能进行DDL操作的。

同时基于大库在使用MYSQLDUMP备份中失败的可能性中,需要注意如下的部分

1 增加innodb_undo_logs 的数量增加在undo表空间中日志文件的数量,提高并发性

2 在进行读锁的加载时,会对一些高并发的业务的MYSQL数据库中的DML 操作在进行备份中加锁之间的互斥性。

所以这里建议在较大的数据库备份中,不使用mysqldump来进行数据备份,并且如果是数据导出的情况下,不要使用 single-transaction参数。

这里我们在此操作备份,并去掉 --single_transaction 参数可以从下面的跟踪信息中发现 

1  系统在数据备份中不在设置 RR 的隔离级别,这里默认已经使用了 RC

2  在备份中不存在设置 SAVE POINT的情况

3  最后在对数据进行导出的时候,我个人从源代码和操作过程看,MySQL在导出数据时没有lock table 的操作,这点相对于PG 要更好,减少冲突的可能性。

相关PG的pg_dump 的分析也在前两天发出,有兴趣可以查看PG的PG_DUMP 有什么优点和特点

dc0fc835d6d4bce125db4be59a0ae31f.png

2023-12-30T16:43:41.860155-00:00           10 Connect   root@localhost on  using Socket
2023-12-30T16:43:41.860568-00:00           10 Query     /*!40100 SET @@SQL_MODE='' */
2023-12-30T16:43:41.861053-00:00           10 Query     /*!40103 SET TIME_ZONE='+00:00' */
2023-12-30T16:43:41.861413-00:00           10 Query     /*!80000 SET SESSION information_schema_stats_expiry=0 */
2023-12-30T16:43:41.861663-00:00           10 Query     SET SESSION NET_READ_TIMEOUT= 86400, SESSION NET_WRITE_TIMEOUT= 86400
2023-12-30T16:43:41.862033-00:00           10 Query     SHOW VARIABLES LIKE 'gtid_mode'
2023-12-30T16:43:41.865299-00:00           10 Query     FLUSH /*!40101 LOCAL */ TABLES
2023-12-30T16:43:41.866062-00:00           10 Query     FLUSH TABLES WITH READ LOCK
2023-12-30T16:43:41.866303-00:00           10 Query     SHOW BINARY LOG STATUS
2023-12-30T16:43:41.866803-00:00           10 Query     SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE ENGINE = 'ndbcluster' AND FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE ENGINE = 'ndbcluster' AND FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('test'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
2023-12-30T16:43:41.871592-00:00           10 Query     SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('test')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
2023-12-30T16:43:41.874070-00:00           10 Query     SHOW VARIABLES LIKE 'ndbinfo\_version'
2023-12-30T16:43:41.877178-00:00           10 Init DB   test
2023-12-30T16:43:41.877564-00:00           10 Query     show tables
2023-12-30T16:43:41.880012-00:00           10 Query     show table status like 'test'
2023-12-30T16:43:41.882630-00:00           10 Query     SET SQL_QUOTE_SHOW_CREATE=1
2023-12-30T16:43:41.883007-00:00           10 Query     SET SESSION character_set_results = 'binary'
2023-12-30T16:43:41.883134-00:00           10 Query     show create table `test`
2023-12-30T16:43:41.883536-00:00           10 Query     SET SESSION character_set_results = 'utf8mb4'
2023-12-30T16:43:41.883816-00:00           10 Query     show fields from `test`
2023-12-30T16:43:41.886349-00:00           10 Query     show fields from `test`
2023-12-30T16:43:41.887888-00:00           10 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`
2023-12-30T16:43:41.888263-00:00           10 Query     SET SESSION character_set_results = 'binary'
2023-12-30T16:43:41.888522-00:00           10 Query     use `test`
2023-12-30T16:43:41.888736-00:00           10 Query     select @@collation_database
2023-12-30T16:43:41.889022-00:00           10 Query     SHOW TRIGGERS LIKE 'test'
2023-12-30T16:43:41.890816-00:00           10 Query     SET SESSION character_set_results = 'utf8mb4'
2023-12-30T16:43:41.891073-00:00           10 Query     SET SESSION character_set_results = 'binary'
2023-12-30T16:43:41.891334-00:00           10 Query     SELECT COLUMN_NAME,                       JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"')                FROM information_schema.COLUMN_STATISTICS                WHERE SCHEMA_NAME = 'test' AND TABLE_NAME = 'test'
2023-12-30T16:43:41.891976-00:00           10 Query     SET SESSION character_set_results = 'utf8mb4'
2023-12-30T16:43:41.893632-00:00           10 Quit
~

这里我们使用的MySQL版本为 8.2.

0c5804dcc156ab2e9bc165b8ddb20cb5.png

41e6cc8578e69320edf0a77ff902625e.png

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

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

相关文章

C/C++ 位段

目录 什么是位段? 位段的内存分配 位段的跨平台问题 什么是位段? 位段的声明与结构是类似的,但是有两个不同: 位段的成员必须是 int、unsigned int 或signed int 等整型家族。位段的成员名后边有一个冒号和一个数字 这是一个…

im6ull学习总结(三-3)freetype

1、Freetype简介 FreeType是一个开源的字体渲染引擎,主要用于将字体文件转换为位图或矢量图形,并在屏幕上渲染出高质量的字体。它提供了一组API,使开发者能够在自己的应用程序中使用和呈现字体。 FreeType最初是作为一个独立项目开发的&…

[Excel]如何找到非固定空白格數列的條件數據? 以月份報價表單為例

在群組中看到上述問題,研判應是一份隨月份變動的產品報價表單,空白欄可能表示該月份價格與上個月份一致。這個問題是需要取得最近一次單價和倒數第二次單價,常用且實務的excel案例值得紀錄。 最近一次單價: INDEX($B2:$G2,1,LARGE(IF(ISBLAN…

SpringSecurity集成JWT实现后端认证授权保姆级教程-环境搭建篇

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥网站…

跨平台开发教学:构建同时支持iOS和Android的教育网校APP

当下,教育行业也逐渐迎来了数字化转型的时代。构建一款支持iOS和Android的教育网校APP,不仅可以提供更好的用户体验,还能扩大应用的覆盖面,满足不同用户群体的需求。 一、选择合适的跨平台开发框架 在开始构建教育网校APP之前&a…

MidTool图文创作-GPT-4与DALL·E 3的结合

GPT-4与DALLE 3的结合 GPT-4是由OpenAI开发的最新一代语言预测模型,它在前代模型的基础上进行了大幅度的改进,不仅在文本生成的连贯性、准确性上有了显著提升,还在理解复杂语境和执行多步骤指令方面表现出了更高的能力。而DALLE 3则是一个创…

构建异地企业网络互联的高效路径

在当今数字化浪潮中,企业的业务拓展已不再受限于地理位置。为了在全球竞争中立于不败之地,越来越多的企业选择在不同城市设立分支机构,构建异地网络,实现高效的协同办公。本文将深入探讨在北上广等经济发达地区,如何通…

Linux部署Yearning并结合内网穿透工具实现公网访问本地web管理界面

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用…

计算机毕业设计——SpringBoot 个人博客管理系统(附源码)

1,绪论 1.1 背景调研 在互联网飞速发展的今天,互联网已经成为人们快速获取、发布和传递信息的重要渠道,它在人们政治、经济、生活等各个方面发挥着重要的作用。互联网上发布信息主要是通过网站来实现的,获取信息也是要在互联网中…

BART论文解读:BERT和GPT结合起来会发生什么?

BART:Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension 主要工作 提出了BART (Bidirectional and Auto-Regressive Transformers), 是一种用于自然语言生成、翻译和理解的序列到序列的预训练方法。它…

C语言编译器(C语言编程软件)完全攻略(第二十七部分:VS安全函数问题(C语言安全函数)是怎么回事?如何解决?)

介绍常用C语言编译器的安装、配置和使用。 二十七、VS安全函数问题(C语言安全函数)是怎么回事?如何解决? 在 VS(Visual Studio)下编译C语言程序,如果使用了 scanf()、gets()、strcpy()、strca…

【Windows】之微软输入法配置小鹤双拼

前言 Windows 自带的输入法微软输入法本身就是个最简洁、最方便的输入法,不需要去安装多余的第三方输入法软件。同时,微软中文拼音输入法支持双拼输入法,但微软自带的双拼输入法不包含小鹤双拼方案的。所以,在这里将会讲解如何配置…

oracle 补齐数字长度 to_char踩坑

oracle的to_char网上找到的说明如下 (1)用作日期转换: to_char(date,格式); select to_date(2005-01-01 ,yyyy-MM-dd) from dual; select to_char(sysdate,yyyy-MM-dd HH24:mi:ss) from dual; (2)处理数字&#xf…

深入理解Vue3中的自定义指令

Vue3是一个流行的前端框架,它引入了许多新特性和改进,其中之一是自定义指令。自定义指令是一种强大的功能,可以让开发者在模板中直接操作 DOM 元素。本文将深入探讨 Vue3中的自定义指令,包括自定义指令的基本用法、生命周期钩子函…

面试之线程状态

1.线程有哪些状态 1.1Java线程的六种状态 Java 线程六种状态 新建 当一个线程对象被创建,但还未调用 start 方法时处于新建状态 此时未与操作系统底层线程关联 可运行 调用了 start 方法,就会由新建进入可运行 此时与底层线程关联,由操作…

leetcode算法题之递归--综合练习(一)

此专题对我们之前所学的关于递归的内容进行一个整合,大家可以自行练习,提升自己的编码能力。 本章目录 1.找出所有子集的异或总和在求和2.全排列II3.电话号码的字母组合4.括号生成5.组合6.目标和7.组合总和8.字母大小写全排列9.优美的排列 1.找出所有子…

数据库的连接

连接数据库 我们使用WinR输入cmd打开运行窗口 输入:sqlplus并回车 输入用户名和密码,我用的是Scott,密码我自己设置的123456,Scott默认的密码是tiger,回车 这种情况表示登录成功 在连接Scott成功的情况下创建一些数据,在我的资源里面有个Oracle数据基础可以下载,直接复制粘…

快速了解云计算与云原生

快速了解云计算与云原生 云计算云原生DevOps容器持续交付微服务 云计算 在讲云原生之前,先来讲讲云计算 其中云原生属于技术架构理念,而云计算提供应用所需的基础资源,云计算是云原生的基础,两者是相辅相成的 云计算简单来说&a…

嵌入式(四)定时器 | 定时器功能 分类 定时器工作模式 寄存器全介绍

文章目录 1 定时器工作原理2 定时器功能3 定时器分类3.1 定时器13.2 定时器23.3 定时器3和定时器43.4 睡眠定时器3.5 看门狗定时器 4 定时器工作模式4.1 自由运行模式4.2 模模式4.3 正计数/倒计数模式 5 定时器1寄存器5.1 计数寄存器5.2 计数控制寄存器 6 定时器的两种使用方式…

网络报文分析程序的设计与实现(2024)

1.题目描述 在上一题的基础上,参照教材中各层报文的头部结构,结合使用 wireshark 软件(下载地址 https://www.wireshark.org/download.html#releases)观察网络各层报文捕获,解析和分析的过程(如下 图所示&a…