故障分析 | 命令行登录 MySQL 报 Segmentation fault 故障解决

解决mysql8.0.18报Segmentation fault错的问题 报错如下: 显示完下面信息之后,就显示: Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Segmentation fault (core dumped) 解决办法: 1、通过命令locate terminal.c查找到我们的这个文件 [root@loca... 阅读详情

作者:林浩

DBA ,专注于 MySQL ,擅长问题分析解决。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


前段时间遇到一个 mysql 客户端 crash 的问题,这个 mysql 客户端是自己源码编译产生的。

为了解决这个问题,查阅了很多资料,涉及终端 ncurses 编程、进程的地址空间(堆和栈)、cmake、gcc 编译等,遇到不少“陷阱”,好在算是比较好的解决了这个问题。

环境:centos8.4 gcc8.4.1 mysql8.0.21 x86_64

问题描述:对 mysql8.0.21 源码进行 make,由于一开始没安装 ncurses 库,在链接时遇到错误 undefined reference to,后来安装了该库,再次 make 成功。于是将 mysqld 启动,再用 mysql -u root -p 连接,输好密码回车后 mysql 客户端发生 Segmentation fault。

第一次 make 时有编译警告(第二次 make 时不会有,因为.o 文件在第一次 make 时已经生成),摘要如下:

/opt/resource/mysql-8.0.21/extra/libedit/libedit-20190324-3.1/src/terminal.c: In function ‘ter
minal_set’:
/opt/resource/mysql-8.0.21/extra/libedit/libedit-20190324-3.1/src/terminal.c:877:6: warning: i
mplicit declaration of function ‘tgetent’; did you mean ‘getenv’? [-Wimplicit-function
-declaration]
  i = tgetent(el->el_terminal.t_cap, term); 
       ^~~~~~~
       getenv
/opt/resource/mysql-8.0.21/extra/libedit/libedit-20190324-3.1/src/terminal.c:899:15: warning:
implicit declaration of function ‘tgetflag’; did you mean ‘tigetflag’? [-Wimplicit-functi
on-declaration]
   Val(T_am) = tgetflag("am"); 
                ^~~~~~~~
                tigetflag
/opt/resource/mysql-8.0.21/extra/libedit/libedit-20190324-3.1/src/terminal.c:908:15: warning:
implicit declaration of function ‘tgetnum’; did you mean ‘tigetnum’? [-Wimplicit-fun
ction-declaration]
    Val(T_co) = tgetnum("co"); 
                ^~~~~~~
                tigetnum
/opt/resource/mysql-8.0.21/extra/libedit/libedit-20190324-3.1/src/terminal.c:917:19: warning:
implicit declaration of function ‘tgetstr’; did you mean ‘tigetstr’? [-Wimplicit-functio
n-declaration]
        char *tmp = tgetstr(strchr(t->name, *t->name), &area); 
                    ^~~~~~~
                    tigetstr
/opt/resource/mysql-8.0.21/extra/libedit/libedit-20190324-3.1/src/terminal.c:917:19: warning:
initialization of ‘ char * ’ from ‘ int ’ makes pointer from integer without a cast
[-Wint-conversion]

分析过程:

centos8.4 默认不能生成 core 文件,为了能临时生成 core 文件,需要对操作系统做如下配置:

# echo "core-%t.%p" > /proc/sys/kernel/core_pattern

意思是在执行程序的当前目录生成 core- 为前缀,再带上时间戳和进程号的 core 文件,比如:core-1637149273.2955 ,其中 1637149273 是时间戳,2955 是进程号。

修改 core_pattern 文件内容后,再次使 mysql 客户端发生 Segmentation fault ,于是就有了 core 文件了。

gdb 查看 core 文件的函数堆栈信息如下:

gdb bin/mysql ~/core-1637149273.2955
(gdb) bt
#0 0x00000000004e4eed in terminal_alloc (el=0x286eee0, t=<optimized out>, cap=0x52a9
aaa0 <error: Cannot access memory at address 0x52a9aaa0>)
  at /opt/resource/mysql-8.0.21/extra/libedit/libedit-20190324-3.1/src/terminal.c:350
#1 0x00000000004e5da7 in terminal_set (el=el@entry=0x286eee0, term=<optimized out>,
term@entry=0x0)
  at /opt/resource/mysql-8.0.21/extra/libedit/libedit-20190324-3.1/src/terminal.c:900
#2 0x00000000004e5ee1 in terminal_init (el=el@entry=0x286eee0) at /opt/resource/mysql
-8.0.21/extra/libedit/libedit-20190324-3.1/src/terminal.c:297
#3 0x00000000004ea220 in el_init_internal (prog=0x7ffd52a9c6c9 "./mysql", fin=0x7fcd6f9
c09c0 <_IO_2_1_stdin_>,
  fout=0x7fcd6f9c16e0 <_IO_2_1_stdout_>, ferr=0x7fcd6f9c1600 <_IO_2_1_stderr_>, fdin=
0, fdout=fdout@entry=1, fderr=2, flags=128)
  at /opt/resource/mysql-8.0.21/extra/libedit/libedit-20190324-3.1/src/el.c:139
#4 0x00000000004e22d5 in rl_initialize () at /opt/resource/mysql-8.0.21/extra/libedit/libedi
t-20190324-3.1/src/readline.c:297
#5 0x00000000004e2b55 in read_history (filename=filename@entry=0x286eec0 "/root/.my
sql_history")
  at /opt/resource/mysql-8.0.21/extra/libedit/libedit-20190324-3.1/src/readline.c:1359
#6 0x000000000040924a in main (argc=<optimized out>, argv=<optimized out>) at /opt/r
esource/mysql-8.0.21/client/mysql.cc:1403

来看看 terminal.c 350 行附近的内容:

看这行的内容应该是内存地址非法访问造成 crash 的。再来看看 terminal.c 900 行附近的内容:

从第 900 行来看,应该是 tgetstr 函数返回值有问题。tgetstr 是 ncurse 库中的一个函数,为了更好的解决这个问题,有必要来了解一些终端编程的基本概念。

输入:man 3 tgetstr 来查看该函数的使用帮助,如下所示,我们可以知道终端能力有 3 种,分别是布尔值、数字值和字符串值,而该函数是用来获取字符串值的终端能力。同时,我们也可以知道,这个函数是给使用 termcap 库的应用使用的,后台会转换为 terminfo 库中的值。termcap 和 terminfo 都是描述终端能力的库,termcap 出现的比较早,已经被 terminfo 取代,但为了兼容性,termcap 的接口仍然保留。

在 centos6 中可以使用:cat /etc/termcap 来查看所有终端的能力,/etc/termcap 是一个 ASCII 文件,这个文件在 centos7 和 8 中已不存在。在 centos6/7/8 中可以使用:infocmp 来查看当前终端的能力,位于/usr/share/terminfo,terminfo 数据库保存的是编译后的内容。

这里引用一段 tgetstr 的使用说明(来源: https://www.gnu.org/software/termutils/manual/termcap-1.3/html_node/termcap_5.html ):

tgetstr

Use tgetstr to get a string value. It returns a pointer to a string which is the capability v
alue, or a null pointer if the capability is not present in the terminal description. There
are two ways tgetstr can find space to store the string value:

You can ask tgetstr to allocate the space. Pass a null pointer for the argument area, and tgetstr will use malloc to allocate storage big enough for the value. Termcap will never free this storage or refer to it again; you should free it when you are finished with it. This method is more robust, since there is no need to guess how much space is needed. But it is supported only by the GNU termcap library.

You can provide the space.Provide for the argument area the address of a pointer variable of type char *. Before calling tgetstr, initialize the variable to point at available space. Then tgetstr will store the string value in that space and will increment the pointer variable to point after the space that has been used. You can use the same pointer variable for many calls to tgetstr. There is no way to determine how much space is needed for a single string, and no way for you to prevent or handle overflow of the area you have provided. However, you can be sure that the total size of all the string values you will obtain from the terminal description is no greater than the size of the description (unless you get the same capability twice). You can determine that size with strlen on the buffer you provided to tgetent. See below for an example. Providing the space yourself is the only method supported by the Unix version of termcap.

从下图中,我们可以看到第 900 行的 area 指向了 buf,是上面英文提到的第 2 种用法,也即调用方分配好存储。

在 terminal.c 中加上打印来看看 buf、area 和 tgetstr 的值的变化情况:

char buf[TC_BUFSIZE];
printf("buf addr:%p\n", buf);

... 

for (t = tstr; t->name != NULL; t++) {
     /* XXX: some systems' tgetstr needs non const */
     //terminal_alloc(el, t, tgetstr(strchr(t->name, *t->name),
     // &area));
     char *tmp = tgetstr(strchr(t->name, *t->name), &area);
     printf("area:%p\n", area);
     printf("tgetstr ret val:%p\n", tmp);
     terminal_alloc(el, t, tmp);
}

打印结果如下:

buf addr:0x7ffe0ec93660

area:0x7ffe0ec93664(第 1 次 for 循环)

tgetstr ret val:0xec93660(第 1 次 for 循环)

可以发现第 1 次 for 循环 tgetstr 的返回值是 buf 被截断低 4 个字节后的值,按道理应该和 buf 的值一样,所以会产生内存非法访问的错误,导致 segmentation fault。

问题到这里,令人百思不得其解,为什么就被截断了呢?

这时想起了编译时报的警告错误(写在文章开头): implicit declaration of function ,这个警告是缺少函数原型声明导致的,也就是第一次编译的时候没有安装依赖的 ncurse 库,从而缺少头文件 term.h ,从而缺少 tgetstr 的函数原型声明。那么这个警告和函数返回值截断有没有关系呢?

通过下面的程序来测试一下,

foo.h

#ifndef __FOO_H__
#define __FOO_H__
void foo();
#endif

foo.c

#include <stdlib.h>
#include <stdio.h>
void foo()
{
char buffer[1024];
printf("buffer:%p\n", buffer);
  char *str = bar(buffer);
  printf("str:%p\n", str);
  printf("sizeof pointer:%d\n", sizeof(str));
  printf("sizeof int:%d\n", sizeof(int));
}

bar.c

#include <stdio.h>
char *bar(char *buffer)
{
  char *buf = buffer;
  printf("buf:%p\n", buf);
  return buf;
}

main.c

#include "foo.h"
int main(int argc, char *argv[])
{
  foo();
  return 0;
}

编译 foo.c 时报了如下警告 implicit declaration of function,

$ gcc foo.c -c -o foo.o
foo.c: In function ‘foo’:
foo.c:7:15: warning: implicit declaration of function ‘bar’ [-Wimplicit-function-declaration]
   char *str = bar(buffer); 
                ^~~

foo.c:7:15: warning: initialization of ‘char *’ from ‘int’ makes pointer from integer
without a cast [-Wint-conversion]

执行结果:

$ ./main
buffer:0x7ffd563a8720
buf:0x7ffd563a8720
str:0x563a8720
sizeof pointer:8
sizeof int:4

通过输出结果不难看出,对于返回指针的 bar()函数,其返回值被截断,只保留了低 32 位。这里对于 64 位系统有“陷阱”,在 64 位系统中,由于 int 是 4 字节,指针是 8 字节,存在被截断的问题,容易导致程序 crash,32 位系统应该不存在该问题,所以在 64 位系统上要注意该编译警告带来的潜在问题,另外,就是养成一个良好的编译习惯,最好不要有警告。

解决方法:

从该警告“implicit declaration of function”来看是由于缺少函数的原型声明,从 man 手册里知道 tgetstr 函数在 term.h 中有原型声明,只要 terminal.c 中 include 了这个头文件就可以了。在 terminal.c 中有如下代码,也就是说预编译 if 条件没成立。

在目录:extra\libedit\libedit-20191231-3.1\src 中打开 CMakeLists.txt,发现有如下内容:

也就是说由于第一次 make 时没有安装 ncurse 依赖库,导致缺少 term.h,导致 HAVE_TERM_H 没有被定义。所以怎么解决这个问题也就比较清楚了。

1.安装好 ncurses 库

sudo yum install -y ncurses-devel

2.清理 cmake 缓存:这一步很必要,如果不清理缓存,cmake 还是会认为没有相应头文件 term.h。进到相应的二进制目录,执行:rm CMakeCache.txt; rm -rf CMakeFiles

3.重新 cmake 和 make

不再出现编译警告“implicit declaration of function”,mysql 输入用户名和密码后也不再 crash 了。

以上是我的解决方法,我们也来看看其他的处理方法,这种方法在网上能搜到很多,即:编辑文件 terminal.c,把 terminal_set 方法中的 char buf[TC_BUFSIZE]; 这一行注释,再把 area = buf;改为 area = NULL;。

为什么这种方法可以呢?我们来分析一下。

这其实是那段 tgetstr 英文用法的第一种,由 tgetstr 函数自己去 malloc 一块足够大小的内存,tgetstr 函数返回 malloc 出来的内存地址,那么同样的问题来了,编译警告“implicit declaration of function”会导致 tgetstr 函数返回值被截断为低 4 个字节,为什么 mysql 客户端此时不会 crash 呢?

这里涉及到 linux 系统中进程的地址空间里的堆(Heap)和栈(Stack)的概念,malloc 分配出来的内存是放在堆上,terminal_set 方法中的 char buf[TC_BUFSIZE]是放在栈上。堆从进程的地址空间的低地址开始往高地址分配,栈从进程的地址空间的高地址开始往低地址分配。也就是说,堆的地址比栈的地址要低,我们来看一下打印出来的指针内容,

buf addr:0x7ffd8cc1e1a0

area:(nil)(第 1 次 for 循环)

tgetstr ret val:0x23e72fa(第 1 次 for 循环)

我们看到 tgetstr 函数的返回值 0x23e72fa 没有 32 位,也即证实了堆从进程的地址空间的低地址开始分配,既然没到 32 位,那么截断后的内容没有改变。

在 mysql 的官网,我们可以找到这个问题: https://bugs.mysql.com/bug.php?id=58497 。好了,总结到此完毕。

完美解决❗❗❗在Linux环境下导入MySQLdb库导致的Segmentation fault (core dumped)问题 在Linux环境下导入MySQLdb库导致的Segmentation fault (core dumped)问题,同时也解决了ModuleNotFoundError: No module named 'MySQLdb'的问题。 阅读详情

相关推荐

从赛题到实战:一份面向高职“区块链技术应用”赛项的食品溯源系统全栈部署与运维指南

本文为高职院校学生备战“区块链技术应用”技能大赛提供了一份详实的食品溯源系统全栈部署与运维指南。内容涵盖从理解赛题业务逻辑、绘制技术蓝图,到搭建4节点FISCO BCOS联盟链、部署管理平台与智能合约,再到核心运维技能与前后端联调测试的完整流程,旨在帮助参赛者将赛题转化为可运行的实战项目,全面提升区块链全栈开发与运维能力。

weixin_29172201的博客 647

命令行登录mysql报Segmentation fault故障解决

对mysql8.0.21源码进行make,在链接时遇到错误,少了ncurses库,后来就装了该库,再次make成功。于是将mysqld启动,再用mysql -u root -p连接,输好密码回车后mysql客户端发生Segmentation fault。

linhao19841211_2的专栏 4036

别再只怪贴片厂了!从MLCC内部裂纹,看懂物料质量与工艺应力的博弈

本文深入分析了MLCC内部裂纹的失效原因,提供了从裂纹形态学到生产全流程的失效风险地图的完整分析框架。通过实战案例和检测技术组合,帮助工程师精准锁定MLCC失效背后的真凶,优化物料质量和工艺应力管理。

weixin_33122947的博客 289

mysql8.0.36通过源码编译安装完成后,登录数据库时候,报错“segmentation fault“

通过源码编译安装完成后,登录数据库时候,报错"segmentation fault"将其中的char buf[TC_BUFSIZE] 注释掉。1、在源码解压文件中,找到terminal.c源码文件。3、重新cmake、make、make install。将area变量值修改为area = NULL。4、重启mysqld服务,再次连接,正常。说明:速度很快,只需要几分钟。

石榴花上的博客 815

060、模型蒸馏:把扩散模型压进单步的魔法

《端侧文生图模型蒸馏实战:从32步到1步的优化之道》摘要:针对边缘设备部署难题,本文分享了扩散模型蒸馏的核心经验。通过重构损失函数(感知损失+对抗训练+KL散度)、优化采样轨迹截取策略和改造学生模型架构,成功将Stable Diffusion压缩至单步推理。关键发现包括:小批量训练更有效、标签平滑保障生成多样性、双模型策略平衡质量与速度。在Cortex-A53芯片上实现300ms内生成,内存占用控制在200MB以下。特别强调工业部署需权衡压缩率与稳定性,建议保留迭代模式开关以适配不同场景需求。

2601_95651806的博客 149

化工过程设计软件:Aspen Plus二次开发_(2).二次开发概述

假设我们需要创建一个自定义的换热器模型,该模型能够计算两个物流之间的热交换量,并根据传热系数和换热面积进行调整。ACM 模型代码示例!自定义换热器模型!参数:传热系数 U (W/m^2·K)!换热面积 A (m^2)!热物流 T_hot_in (K), T_hot_out (K), F_hot (kmol/h)!冷物流 T_cold_in (K), T_cold_out (K), F_cold (kmol/h)!模型输入!U - 传热系数!A - 换热面积!

kkchenjj的博客 367

mysql命令行登陆报Segmentation fault

有定义,但需要定义了__sun,导致在编译时找不到tgetstr的声明,编译器默认了其返回值时int,导致类型转换错误。怀疑是tgetstr函数没有声明,找不到其类型,默认用int进行了cast 成char*,导致出现问题,查看。修改方式,将条件编译#ifdef __sun注释,重新make && make install,问题解决。重新用make进行编译,出现了warning,,,用上面的方法最终解决。terminal.h中。

weixin_47215601的博客 501

Python爬虫实战:绕过Cloudflare反爬的最新技术与完整代码详解

在互联网数据采集领域,越来越多的网站开始部署CDN和安全防护服务,其中 Cloudflare 是最为广泛使用的防护方案之一。它不仅为网站提供DDoS防护,还能通过JS挑战、验证码和行为分析来识别并拦截爬虫。这给爬虫工程师带来了极大挑战——如何在不违反网站服务条款的情况下,实现有效的数据采集?本文将分享Python领域绕过Cloudflare反爬的最新技术方法,结合最新流行库与自动化浏览器,帮助你攻克这一难题。绕过Cloudflare反爬不是一蹴而就,需结合多技术、多策略,持续迭代。

2201_76125261的博客 2627

mysql报Segmentation fault错误

[root@localhost bin]# ./mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.6.24 Source distribution Copyright (

Poirot的博客 5310

【OpenCV实战】简洁易懂的车牌号识别Python+OpenCV实现“超详解”(含代码)

简洁易懂的车牌号识别Python实现(含代码)1、整体思路2、代码详解 1、整体思路 2、代码详解

qq_40784418的博客 9万+

Python爬虫实战:研究Pandas,构建车质网各车型数据采集和分析系统

研究结果表明,通过网络爬虫技术可以有效地获取公开的汽车投诉数据,这些数据经过适当的清洗和处理后,可以揭示出丰富的汽车质量信息。)作为国内专业的汽车质量投诉受理平台,自 2010 年成立以来,已累计接收消费者投诉信息超过 200 万条,这些数据包含了车型、投诉时间、投诉问题、处理状态等多维度信息,具有极高的分析价值。:通过对车质网数据的分析,能够挖掘出有价值的汽车质量信息,为消费者购车提供参考,为汽车厂商改进产品质量和服务提供依据,同时也能为相关监管部门提供数据支持。

ylfhpy的博客 937

mysql段错误,MySQL 5.6.27登录出错:段错误 (Segmentation fault)解决.附安装及配置

如果系统是最小化安装的,需先安装GCC环境及MYSQL依懒的ncursesyum install -y gcc* ncurses-devel安装Zlibwget http://zlib.net/zlib-1.2.8.tar.gztar zxf zlib-1.2.8.tar.gz -C /usr/local/src/cd /usr/local/src/zlib-1.2.8/CFLAGS="-fPIC...

weixin_30512965的博客 1002

YOLOv5入门实践(2)——手把手教你利用labelimg标注数据集

YOLOv5入门实践第2步,手把手教你使用labelimg标注数据集

路人贾的博客 1万+

mysql segmentation fault_mysql Segmentation fault的问题,求教

intUserByEmail(charstr1[],intclient){charbuffer[500];MYSQLdb;/*connector*/MYSQL_RES*result;/*resultbuffer*/MYSQL_ROWrow;/*onerowoftheresult*/inti;/*初始化mysql*/if(mysql_...int UserByEmail(char str1[],in...

weixin_34730055的博客 655

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Mac 里使用Terminal 工具编译.cpp和.c文件

g++ 编译 .cpp文件,示例如下:       gcc 编译.c文件,示例如下:            

cici2013的专栏 1698

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

mysql segmentation fault_mysql查询后出现 Segmentation fault

#include #include int main(void){MYSQL mysql;MYSQL_RES *res;MYSQL_ROW row;char *query;int t,r;mysql_init(&mysql);if (!mysql_real_connect(&mysql,"localhost","content","content","content",0,NULL...

weixin_39844549的博客 447

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

如何解决"make: *** [all] Segmentation fault (core dumped)“这个问题?

今天遇到这个问题,这是在Linux下面经常会遇到的问题:make: *** [all] Segmentation fault (core dumped)?记录下来一来帮助需要之人,二来记录自己的成长历程。 一、关于core文件产生问题? 1.ulimit -a | grep 'core file size'(判断能不能产生core文件)如果不能继续下面 2.ulimit -c unlimit

雪一梦的博客 1万+

Segmentation Fault错误

首先,你的Segmentation Fault错误必须要能重现(废话…)。 然后,依参照下面的步骤来操作: (1)无论你是用Makefile来编译,还是直接在命令行手工输入命令来编译,都应该加上 -g 选项。 (2)一般来说,在默认情况下,在程序崩溃时,core文件是不生成的(很多Linux发行版在默认时禁止生成核心文件)。所以,你必须修改这个默认选项,在命令行执行: ...

drbinzhao的专栏 8724

mysql segmentation fault_命令行登录mysql报Segmentation fault错误是怎么回事

bash[root@localhost bin]# ./mysql -uroot -pEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 8Server version: 5.6.24 Source distributionCopyright (c) ...

weixin_42468901的博客 571

make 编译报错:internal compiler error: Segmentation fault

compiler error: Segmentation fault # 编译Kudu源码... ### https://kudu.apache.org/docs/installation.html#build_from_source ### mkdir -p build/release cd build/release ../../build-support/enable_devtoolset.sh \ ../../thirdparty/installed/common/bin/cmake \ -

qq_15138049的博客 7641

mysql导入sql文件的时候报错Segmentation fault

今天用crontab定时同步一个用户的数据,发现脚本执行失败了 错误日志如下: begin imp exam at: 2014-05-06 00:00:38 /mysql/task/imp_exa...

cnktbkanb141909486的博客 748

mysql执行命令报segmentation fault 错误

admin@xxx:/tmp$ ./mysql -uxxx -pxxx -h172.16.x.xWelcome to the MySQL monitor. Commands end with ; or \g.Your MyS...

congchenjin2969的博客 831

ODBC连接MySQL数据库查询报Segmentation fault错误的解决方案

安装odbc yum install unixODBC-devel mysql-connector-odbc 配置mysql数据库连接 /etc/odbc.ini [freeswitch] DRIVER = MySQL SERVER = 127.0.0.1 PORT = 3306 DATABASE = freeswitch USER = root PASSWORD = 12...

Alan-zzx的博客 1622

tpcc_mysql测试出现Segmentation fault (core dumped)错误解决方法

今天在使用tpcc测试的时候遇到一个报错: abc:~/tpcc-mysql$ ./tpcc_start -h 192.130.109.13 -P 2345 -utpcc -ptpcc -w 100 -c 50 -r 600 -l 3600 -i 10 -f tpcc_tokurptf *************************************** *** ###easy###

2781
上一篇: 故障分析 | MySQL 启动遭遇 Permission denied 失败案例一则
下一篇: 故障分析 | MySQL 节点宕机分析一例
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值