当前位置: 首页 > news >正文

[MySQL排查] “Too many connections“ 错误?数据库最大连接数满了怎么办及优化

更多服务器知识,尽在hostol.com

“糟糕!网站又报数据库连接错误了!” 当你的监控系统开始尖叫,或者用户反馈雪片般飞来,而错误日志里赫然躺着那句熟悉的 Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1040] Too many connections (或者其他语言/驱动报出的类似信息),你可能就知道,MySQL/MariaDB 服务器的“接待能力”又到极限了。

这个 `Too many connections` 错误,就像是你的数据库服务器在举手投降:“各位客官实在太多了,小店的座位(连接数)已经全满了,再也挤不进来了啊!” 它意味着你的应用程序或其他客户端尝试建立新的数据库连接时,因为当前活动连接数已经达到了 MySQL/MariaDB 配置中 max_connections 参数设定的上限,所以新的连接请求被拒绝了。这会导致你的应用无法正常读写数据库,进而可能造成整个业务的中断。

那么,是什么原因导致我们的数据库连接“僧多粥少”呢?仅仅是提高 max_connections 这个“座位上限”就能一劳永逸吗?(剧透一下:通常不能!)这篇指南,我们就来深入剖析这个错误的常见原因,并提供一套从“紧急疏通”到“长效治理”的解决方案和优化思路。

“客满为患”:Too many connections 错误到底在说什么?

在动手解决问题之前,我们先得理解这个错误背后的机制。

MySQL/MariaDB 服务器在启动时,会根据其配置文件(通常是 my.cnfmy.ini,或者在 conf.d/ 目录下的相关 .cnf 文件)中的 max_connections 参数,来设定它能同时接受和处理的客户端连接的最大数量。这个参数就像是给你的“游乐园”设定了一个“最大游客容量”,或者给你的“呼叫中心”设定了“电话线路总数”。

为什么要有这个限制呢?难道不是连接数越多越好吗?

并非如此!每一个进到“游乐园”的“游客”(每一个数据库连接)都需要消耗服务器的“服务资源”(主要是内存,还有一部分 CPU 时间)。如果不对连接数加以限制,当有海量的连接请求(无论是合法的还是恶意的)涌入时,服务器可能会因为内存耗尽、CPU 忙于处理连接本身而无暇顾及真正的查询任务,甚至导致整个数据库服务崩溃。所以,max_connections 本质上是一个**保护数据库服务器自身稳定运行的安全机制**。

当实际并发连接数(可以通过 SHOW GLOBAL STATUS LIKE 'Threads_connected'; 查看)达到了 max_connections 设定的值时,新的连接尝试就会失败,并抛出 "Too many connections" 错误。

第一步:紧急“疏通” – 快速诊断与临时缓解(治标)

当你遇到这个错误,业务可能已经受到影响,首要任务是尽快恢复服务。以下是一些快速诊断和临时缓解的方法:

1.1. 查看当前连接数与 max_connections 设置

首先,你需要登录到你的 MySQL/MariaDB 服务器(如果还能连上的话,不行就得从服务器本地终端操作),看看当前的“客流量”和“最大容量”到底是多少。

使用有足够权限的用户(比如 root 或其他管理员用户)登录:

[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]


mysql -u root -p
# 或者,如果你是从服务器本机且 root 用户使用 socket 认证:
# sudo mysql

登录后,执行以下命令:

[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]


-- 查看当前所有活动连接的详细列表
SHOW FULL PROCESSLIST;-- 查看当前连接数 (Threads_connected)
SHOW GLOBAL STATUS LIKE 'Threads_connected';-- 查看当前配置的最大连接数 (max_connections)
SHOW VARIABLES LIKE 'max_connections';

通过 SHOW FULL PROCESSLIST; 的输出,你可以看到每个连接的来源 IP (Host 列)、连接的用户 (User 列)、当前执行的命令 (Command 列,如果是 Sleep 表示空闲,Query 表示正在执行查询)、以及持续时间 (Time 列) 等。这能帮你初步判断是否有大量空闲连接或者长时间运行的慢查询占用了连接。

对比 Threads_connectedmax_connections 的值。如果前者非常接近或等于后者,那么问题就确认了——连接数确实已满。

1.2. (临时方案) 适当提高 max_connections

如果你的服务器硬件资源(特别是内存)还有富余,并且你判断当前的连接数爆满只是暂时的、或者是由于应用层面的突发请求导致的,那么一个快速的临时缓解方法就是适当提高 max_connections 的值。

重要警告:这通常只是一个“权宜之计”,并不能解决根本问题!盲目地大幅提高 max_connections,而不考虑服务器的实际承受能力(特别是内存),可能会导致服务器因为内存耗尽而变得更慢甚至崩溃。

有两种方式可以修改它:

  • 动态修改 (无需重启,但服务器重启后会失效): 在 MySQL/MariaDB 命令行中执行 (需要 SUPER 权限): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] SET GLOBAL max_connections = 200; -- 将 200 替换为你估算的一个稍大的、合理的值 FLUSH PRIVILEGES; -- 有时需要刷新权限 修改后,新的 max_connections 值会立即生效,但如果 MySQL/MariaDB 服务重启,它会恢复到配置文件中的值。
  • 修改配置文件 (永久生效,但需要重启服务): 找到你的 MySQL/MariaDB 配置文件 (通常是 /etc/mysql/my.cnf, /etc/my.cnf, 或者 /etc/mysql/mariadb.conf.d/50-server.cnf 等),在 [mysqld][mariadb] 段落下找到或添加 max_connections 参数: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]

[mysqld]

# ... 其他配置 ... max_connections = 200 # 将 200 替换为你估算的值 # ... 其他配置 ...

保存配置文件后,重启 MySQL/MariaDB 服务:

[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]


sudo systemctl restart mysql  # 或 mariadb

max_connections 该设多大? 这没有标准答案,它高度依赖于你的服务器有多少可用内存、你的应用类型(长连接还是短连接)、查询的复杂度以及每个连接平均消耗的内存。一个非常粗略的、不精确的估算起点可能是:如果你有 4GB 内存专门给 MySQL 用,也许可以尝试 150-250 个连接。但你必须在调整后密切监控服务器的内存使用情况和性能表现!如果内存不足,增加连接数只会适得其反。

1.3. 找出并“劝退”长时间不活动的连接 (或杀死慢查询)

SHOW FULL PROCESSLIST; 的输出中,如果你看到大量的连接处于 Sleep 状态,并且 Time 值非常大(比如几百秒甚至几千秒),这通常意味着你的应用程序在完成数据库操作后,没有正确地关闭或释放这些连接,导致它们长时间占用着“茅坑”。

或者,如果你看到某些连接处于 Query 状态,但 Time 值也非常大,那说明这些查询执行得太慢了,也长时间占用了连接。

对于这些“赖着不走”的连接,你可以手动“请”它们离开:

[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]


KILL CONNECTION_ID; -- 将 CONNECTION_ID 替换为 SHOW PROCESSLIST 输出中对应的 Id 列的值
-- 如果是想终止一个正在执行的查询而不是整个连接,可以用 KILL QUERY CONNECTION_ID;

警告: 手动 KILL 连接(特别是正在执行查询的连接)可能会导致应用程序中断或数据不一致,请务必谨慎操作,并确认你正在 KILL 的确实是问题连接。

通过这些临时措施,你或许能让数据库暂时恢复服务,但这只是“治标”,接下来我们必须“治本”!

第二步:深挖根源 – 为何连接会“爆满”?(治本之路)

仅仅提高 max_connections 或手动杀连接,就像是给发烧的病人用冰袋降温,能缓解症状,但病根还在。我们需要找出为什么会有这么多连接被占用。

2.1. 应用程序没有正确关闭/释放连接?“用完就扔”的好习惯

这是导致大量 Sleep 连接累积的最常见原因!很多 Web 应用程序(用 PHP, Python, Java, Node.js 等语言编写)在代码逻辑中,打开了数据库连接进行操作,但在操作完成后,**没有显式地关闭这个连接**,或者因为代码中出现异常导致关闭连接的逻辑没有被执行到。这些未关闭的连接就会一直保持在 Sleep 状态,直到达到 MySQL/MariaDB 的 wait_timeout 才会被服务器自动回收。

如何排查与解决:

  • 审查应用程序代码: 仔细检查所有涉及数据库操作的代码路径,确保在完成数据库查询后,通过调用相应语言的数据库连接关闭方法(如 PHP PDO 的 $pdo = null;,mysqli 的 $mysqli->close();)来显式关闭连接。特别注意在 try...catch...finally 结构中,将关闭连接的操作放在 finally 块里,确保即使发生异常也能被执行。
  • 正确使用连接池 (Connection Pooling): 如果你的应用使用了连接池技术(很多现代框架或 ORM 会内置或推荐使用),需要确保连接池的配置是合理的:
    • 连接池的最大连接数 (maxPoolSize 或类似参数) 不宜设置得过大,它应该小于或等于你数据库服务器的 max_connections(并考虑其他应用也可能连接数据库)。
    • 确保应用在从连接池中获取连接使用完毕后,能正确地将连接**归还 (release/return)** 给连接池,而不是简单地“关闭”它(关闭物理连接会导致连接池需要重新创建,效率低)。
    • 检查连接池是否有“泄漏”问题(即连接被借出后没有被归还)。

2.2. 查询效率低下,导致连接长时间被“套牢”?给SQL“松松土”

如果你的数据库查询语句写得很烂(比如没有使用索引导致全表扫描、或者有非常复杂的 JOIN 操作、或者一次性查询过多数据),那么这些查询执行起来就会非常耗时。在查询执行期间,对应的数据库连接会一直处于活动状态,无法被其他请求复用。当这种慢查询很多时,就会迅速占满所有可用连接。

如何排查与解决:

  • 开启并分析慢查询日志 (Slow Query Log): 这是找出慢查询的“照妖镜”。在 MySQL/MariaDB 配置文件 (my.cnf) 中启用它: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]

[mysqld]

slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log # 或者你指定的路径 long_query_time = 2 # 定义超过多少秒的查询算慢查询 (比如2秒) # (可选) 记录没有使用索引的查询 # log_queries_not_using_indexes = 1 修改配置后重启数据库服务。然后定期分析慢查询日志文件(可以使用 mysqldumpslow 工具或 Percona Toolkit 的 pt-query-digest)。 使用 EXPLAIN 分析查询计划: 对于慢查询日志中找到的 SQL 语句,在 MySQL 命令行前加上 EXPLAIN 执行一下 (如 EXPLAIN SELECT * FROM users WHERE email = '...';),查看它的执行计划。重点关注是否用到了索引 (key 列)、扫描了多少行 (rows 列)、是否有文件排序 (Extra 列出现 Using filesort) 或临时表 (Using temporary) 等。 优化 SQL 语句与添加索引: 根据 EXPLAIN 的结果,优化你的 SQL 查询语句(比如避免 SELECT *、拆分复杂查询、改写 JOIN 条件等),并为你查询条件中经常用到的字段(WHERE, JOIN ON, ORDER BY, GROUP BY 涉及的列)创建合适的索引。

优化查询是降低连接占用时间、提升数据库整体性能的核心手段。

2.3. 并发请求量真的过高?“游乐园”是不是该扩建了?

有时候,你的应用代码可能没问题,查询也都优化了,但连接数还是爆满。这可能就是因为**合法的并发访问量**确实太大了,超出了你当前数据库服务器的处理能力和连接数上限。

如何判断与解决:

  • 结合你的 Web 服务器访问日志、应用监控数据,看看在连接数爆满的时段,网站的并发用户数或 API 请求量是不是也达到了一个非常高的峰值?
  • 如果是合法流量导致的,那么你可能需要:
    • 纵向扩展 (Scale Up): 升级你的数据库服务器硬件,增加 CPU、内存(内存对于数据库性能至关重要!),并相应提高 max_connections(在硬件能承受的前提下)。
    • 横向扩展 (Scale Out - 更复杂):
      • 读写分离: 如果是读密集型应用,可以设置主从复制 (Master-Slave Replication),将读请求分发到一台或多台从库上,减轻主库压力。
      • 数据库分片 (Sharding): 将数据分散到多个数据库服务器上,这是应对超大规模数据的终极方案,但架构复杂性极高。
    • 应用层优化: 再次审视应用逻辑,是否可以通过增加缓存(如 Redis, Memcached)、减少不必要的数据库访问、异步处理某些任务等方式,来降低对数据库的并发连接需求。

2.4. wait_timeoutinteractive_timeout 设置不合理?“空闲游客”请及时离场

MySQL/MariaDB 有两个重要的超时参数用来自动回收空闲连接:

  • wait_timeout: 服务器关闭一个**非交互式**连接(比如来自应用程序的连接)前,等待该连接活动的秒数。默认值通常是 28800 秒(8 小时)。
  • interactive_timeout: 服务器关闭一个**交互式**连接(比如你用 mysql 命令行客户端连接)前,等待活动的秒数。默认值通常也是 28800 秒。

如果 wait_timeout 设置得过高,而你的应用程序又存在大量未能正确关闭的空闲连接,那么这些连接就会长时间占据“名额”,导致连接数累积。但如果设置得过低,可能会导致一些合法的、需要保持一段时间空闲的连接(比如某些连接池维持的连接)被意外断开。

如何排查与解决:

  • 查看当前设置:SHOW GLOBAL VARIABLES LIKE '%_timeout';
  • 如果你在 SHOW PROCESSLIST; 中看到大量 Sleep 状态且 Time 值很大的连接,可以考虑适当降低 wait_timeout 的值(比如从 8 小时降到 300 秒或 600 秒)。 [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] SET GLOBAL wait_timeout = 600; (同样,最好也在 my.cnf 中修改以永久生效,并重启服务)。
  • 重要: 降低 wait_timeout 需要你的应用程序能够正确处理连接被服务器断开的情况(比如有自动重连机制,或者连接池能正确回收和重建连接)。

2.5. 短时间内大量新建连接请求 (“连接风暴”)?

比如,当你的应用程序刚刚重启,所有应用实例或进程可能会在短时间内同时尝试向数据库建立大量新的连接,这可能瞬间就冲垮了你的 max_connections 上限。

如何缓解:

  • 在应用程序的启动或重连逻辑中,加入**指数退避 (Exponential Backoff) 和抖动 (Jitter)** 机制,避免所有实例在同一时刻“挤兑”数据库。
  • 使用更智能的连接池,它们通常有控制新建连接速率的机制。

第三步:优化与预防 – 让连接“畅通有序”,告别“客满”

解决了眼前的“连接数爆满”危机后,我们需要建立长效机制,从根本上优化和预防此类问题的再次发生。

3.1. 应用程序层面:连接池的正确使用与连接的优雅关闭

  • 如果你还没有使用连接池,赶紧用起来!几乎所有主流编程语言和框架都有成熟的数据库连接池实现。连接池可以复用已建立的数据库连接,避免了频繁创建和销毁连接带来的开销,也能更好地控制实际并发到数据库的连接数量。
  • 仔细配置连接池的参数:最小连接数、最大连接数(务必小于等于数据库的 max_connections)、连接获取超时、空闲连接回收策略等。
  • 再次强调,确保应用程序代码中,无论正常执行还是发生异常,都能**可靠地关闭数据库连接或将其归还给连接池**。

3.2. SQL 优化与索引:永恒的主题

持续关注并优化慢查询,为查询涉及的列建立合适的索引。查询执行得越快,连接占用的时间就越短,能服务的并发请求就越多。这是提升数据库性能、减少连接压力的最根本方法之一。

3.3. 合理调整 MySQL/MariaDB 相关参数

  • max_connections: 根据你的服务器可用内存、应用特性和预估并发量,设置一个合理的值。不要盲目设得过高。监控 Threads_connected,如果长期远低于 max_connections,说明可能设高了;如果经常接近,说明可能需要提高(但前提是内存允许,并且你已排查了其他原因)。
  • wait_timeout: 设置一个比你应用正常空闲连接所需时间稍长一点的值,及时回收那些“僵尸”连接。
  • thread_cache_size (高级): 这个参数控制 MySQL/MariaDB 缓存多少空闲的线程以备复用。如果你的应用需要频繁地创建和断开连接(短连接模式),并且你观察到 Threads_created 状态变量增长很快,适当增大 thread_cache_size 可能有助于减少新建线程的开销。但它通常不是解决 "Too many connections" 的主要手段,max_connections 和应用层连接管理更关键。

你可以通过 SHOW GLOBAL STATUS LIKE 'Threads%'; 来观察 Threads_connected (当前连接), Threads_running (正在执行查询), Threads_created (已创建线程总数), Threads_cached (缓存中的空闲线程) 等状态,辅助判断。

3.4. 强大的监控与告警:你的“哨兵”

建立完善的数据库监控体系至关重要!你需要实时监控:

  • Threads_connectedmax_connections 的比率。
  • CPU、内存、磁盘 I/O、网络流量等系统资源使用情况。
  • 慢查询数量和频率。
  • 查询的平均延迟和吞吐量 (QPS/TPS)。
  • 数据库错误日志。

使用工具如 Prometheus + mysqld_exporter + Grafana, Zabbix, Percona Monitoring and Management (PMM), 或者云服务商提供的数据库监控服务。并为关键指标(特别是 Threads_connected 接近 max_connections)设置**告警阈值**,在问题发生初期就能收到通知,及时介入。

3.5. (进阶) 考虑读写分离或数据库代理

如果你的应用负载持续非常高,单台数据库服务器确实无法承受,那么就需要考虑更高级的架构了:

  • 读写分离 (Read/Write Splitting): 如果你的应用是读多写少,可以设置 MySQL/MariaDB 主从复制,将大量的读请求分发到一台或多台从库上,大大减轻主库的压力(包括连接数压力)。
  • 数据库代理/中间件 (Database Proxy/Middleware): 像 ProxySQL, MaxScale, Apache ShardingSphere (原 MyCAT 理念的演进) 这样的工具,可以在应用程序和数据库服务器之间引入一个代理层。它们可以提供更高级的连接池管理、负载均衡、读写分离、查询路由、甚至SQL防火墙等功能,帮助你更好地管理和扩展数据库连接。

这些属于更复杂的架构优化,但对于高并发、大规模应用来说是必经之路。

结论:从“堵塞”到“畅通”,理解并驾驭数据库连接的艺术

MySQL/MariaDB 报出 Too many connections 错误,就像是你的数据库在向你发出“求救信号”:“我太忙了,接待不过来了!” 它通常是多种因素交织作用的结果,很少能通过简单地调大一个参数就一劳永逸地解决。

快速的临时缓解(如适当提高 max_connections、手动清理空闲连接)能帮你争取时间,但真正的“长治久安”之道在于:

  • 应用程序层面: 养成良好的数据库连接管理习惯(及时关闭、正确使用连接池)。
  • SQL 层面: 持续优化查询语句,用好索引,让每个查询都尽可能快地完成。
  • 数据库配置层面: 合理设置 max_connections, wait_timeout 等关键参数,使其与你的服务器资源和应用特性相匹配。
  • 监控与预警层面: 建立完善的监控体系,提前发现连接数瓶颈。
  • 架构层面(如有必要): 考虑读写分离、数据库代理等扩展方案。

理解数据库连接的生命周期,并学会从多个层面去诊断和优化,你就能把这个“客满为患”的难题,变成一次提升你系统稳定性和性能的好机会。让你的数据库连接从此“畅通无阻”吧!


还有疑问?常见问题解答 (FAQs)

  1. 问: 每个 MySQL/MariaDB 连接大概会消耗多少服务器内存? 答: 这个没有固定值,会因多种因素而异。每个连接自身会消耗一些基础内存(用于线程堆栈、连接缓冲区等,可能几十KB到几百KB)。此外,如果连接正在执行复杂的查询,需要进行排序、创建临时表等操作,那么该连接在查询执行期间消耗的内存会更多(这部分内存由 sort_buffer_size, join_buffer_size, tmp_table_size 等参数控制,并且是按需分配的)。所以,不能简单地说一个连接就固定消耗多少内存。但总体而言,连接数越多,总的潜在内存消耗就越大。在估算 max_connections 时,务必给服务器留出足够的内存给操作系统和其他服务,以及查询本身可能需要的动态内存。
  2. 问: MySQL/MariaDB 中的 max_user_connections 参数和 max_connections 有什么关系? 答: max_connections 是一个**全局参数**,限制的是整个 MySQL/MariaDB 服务器实例同时允许的总连接数。而 max_user_connections 是一个**针对单个数据库用户账户**的限制,它规定了某一个特定的用户(比如 'webapp'@'localhost')最多能同时建立多少个连接。如果某个用户达到了它自己的 max_user_connections 上限,它再尝试新建连接时也会报错(错误信息通常会包含 "User 'xxx' has already more than 'max_user_connections' active connections")。你可以通过 GRANT ... WITH MAX_USER_CONNECTIONS N 来为用户设置这个限制,或者修改已有用户的限制。所以,即使全局的 max_connections 还没满,单个用户也可能因为达到自己的上限而无法连接。
  3. 问: DDoS 攻击或 CC 攻击会导致 "Too many connections" 错误吗? 答: 非常有可能! 如果你的网站或应用遭受了应用层 DDoS 攻击(如 HTTP Flood, CC 攻击),攻击者可能会在短时间内发起海量的、模拟正常用户行为的请求。如果这些请求最终都需要与数据库进行交互,那么即使单个请求本身可能很简单,但巨大的并发量也会迅速耗尽数据库的可用连接数,导致正常用户也无法连接,从而出现 "Too many connections" 错误。所以,在排查此错误时,结合 Web 服务器的访问日志和网络流量监控,判断是否存在异常的外部请求也是很重要的一环。
  4. 问: 我用的是共享主机或一些限制较多的云数据库服务,可能没有权限修改 max_connectionsmy.cnf 文件,怎么办? 答: 这种情况确实比较棘手。如果你无法直接修改服务器级的配置参数,那么你的优化重点就必须完全放在**应用程序层面**了:1) 极致地优化你的代码,确保每个数据库连接都被及时关闭或归还给连接池。2) 严格控制应用内部的并发数据库操作数量。3) 优化所有 SQL 查询语句,减少它们的执行时间和资源消耗。4) 尽可能使用缓存(应用层缓存、页面静态化等)来减少对数据库的直接访问。如果经过这些优化后,仍然因为连接数限制而遇到瓶颈,那你可能就需要联系你的主机提供商,看看是否可以升级到更高规格的套餐(通常会有更高的连接数限制),或者考虑迁移到更灵活的 VPS 或云服务器环境了。
  5. 问: 从应用性能角度看,是保持少量长连接(通过连接池)更好,还是使用大量按需创建和销毁的短连接更好? 答: 对于绝大多数 Web 应用和后端服务来说,**通过连接池来维护一定数量的长连接通常是性能更优的选择**。原因是:1) 避免频繁建连开销: 数据库连接的建立和销毁本身是有网络和认证开销的,如果每个请求都新建连接,在高并发时这个开销会非常大。连接池通过复用已建立的连接,大大减少了这种开销。2) 控制并发: 连接池可以帮助你有效控制实际到达数据库的并发连接数量,防止应用层无节制地创建连接冲垮数据库。虽然短连接“用完即弃”看起来简单,但它在高并发下的性能通常远不如合理配置的连接池。当然,连接池也需要正确配置和管理,避免连接泄漏或空闲连接占用过多资源(结合数据库的 wait_timeout)。

相关文章:

  • 我的 PDF 工具箱:CodeBuddy 打造 PDFMagician 的全过程记录
  • Jenkins教程
  • C#将1GB大图裁剪为8张图片
  • Ngrok 配置:实现 Uniapp 前后端项目内网穿透
  • vue使用Fabric和pdfjs完成合同签章及批注
  • 解决LeetCode 47. 全排列 II 问题的正确姿势:深入分析剪枝与状态跟踪
  • MySQL的 JOIN 优化终极指南
  • ES(Elasticsearch)的应用与代码示例
  • 股指期货贴水为何会产生成本?
  • WebSocket聊天室的简单制作指南
  • qt文本边框设置
  • 保安员考试报名时,体检项目包含哪些?
  • Spyglass:跨时钟域同步(同步使能)
  • Day 22 训练
  • 软件开发中常见(合规)工具
  • tomcat一闪而过,按任意键继续以及控制台中文乱码问题
  • 第五章:Linux用户管理
  • javascript和vue的不同
  • 五月月报丨MaxKB在教育行业的应用进展与典型场景
  • STM32外设AD-定时器触发 + DMA读取模板
  • 昔日千亿房企祥生集团约2.03亿元债权被拍卖,起拍价8000万元
  • 2000多年前的“新衣”长这样!马王堆文物研究新成果上新
  • 董军同德国国防部长举行会谈
  • 在古老的意大利科莫歌剧院,廖昌永唱响16首中国艺术歌曲
  • 习近平会见哥伦比亚总统佩特罗
  • 美国明尼苏达州发生山火,过火面积超80平方公里