1.MySQL:å¦ä½ç¼åUDF_MySQL
2.CentOS 8部署安装Zabbix6.0
3.技术分享 | MySQL 字段长度限制的核源核分计算方法
4.MySQL 优化器源码入门-内核实现 FULL JOIN 功能
MySQL:å¦ä½ç¼åUDF_MySQL
bitsCN.com
1.ä»ä¹æ¯UDF
UDF顾åæä¹ï¼å°±æ¯User defined Functionï¼ç¨æ·å®ä¹å½æ°ãæ们ç¥éï¼MySQLæ¬èº«æ¯æå¾å¤å 建çå½æ°ï¼æ¤å¤è¿å¯ä»¥éè¿å建åå¨æ¹æ³æ¥å®ä¹å½æ°ãUDF为ç¨æ·æä¾äºä¸ç§æ´é«æçæ¹å¼æ¥å建å½æ°ã
UDFä¸æ®éå½æ°ç±»ä¼¼ï¼æåæ°ï¼ä¹æè¾åºãå为两ç§ç±»åï¼å次è°ç¨ååèéå½æ°ãåè è½å¤é对æ¯ä¸è¡æ°æ®è¿è¡å¤çï¼åè åç¨äºå¤çGroup Byè¿æ ·çæ åµã
2.为ä»ä¹ç¨UDF
æ¢ç¶MySQLæ¬èº«æä¾äºå¤§éçå½æ°ï¼å¹¶ä¸ä¹æ¯æå®ä¹å½æ°ï¼ä¸ºä»ä¹æ们è¿éè¦UDFå¢ï¼è¿ä¸»è¦åºäºä»¥ä¸å ç¹ï¼
1)UDFçå ¼å®¹æ§å¾å¥½ï¼è¿å¾çäºMySQLçUDFåºæ¬ä¸æ²¡æåå¨
2)æ¯åå¨æ¹æ³å ·ææ´é«çæ§è¡æçï¼å¹¶æ¯æèéå½æ°
3)ç¸æ¯ä¿®æ¹ä»£ç å¢å å½æ°ï¼æ´å æ¹ä¾¿ç®å
å½ç¶UDFä¹æ¯æ缺ç¹çï¼è¿æ¯å 为UDFä¹å¤äºmysqldçå å空é´ä¸ï¼ä¸è°¨æ çå å使ç¨å¾å®¹æ导è´mysqld crashæã
3.å¦ä½ç¼åUDF
UDFçAPIå æ¬
name_init()ï¼
å¨æ§è¡SQLä¹åä¼è¢«è°ç¨ï¼ä¸»è¦åä¸äºåå§åçå·¥ä½ï¼æ¯å¦åé åç»ç¨å°çå åãåå§ååéãæ£æ¥åæ°æ¯å¦åæ³çã
name_deinit()
å¨æ§è¡å®SQLåè°ç¨ï¼å¤§å¤ç¨äºå åæ¸ ççå·¥ä½ãinitådeinitè¿ä¸¤ä¸ªå½æ°é½æ¯å¯éç
name()
UDFç主è¦å¤çå½æ°ï¼å½ä¸ºå次è°ç¨åæ¶ï¼å¯ä»¥å¤çæ¯ä¸è¡çæ°æ®ï¼å½ä¸ºèéå½æ°æ¶ï¼åè¿åGroup byåçèéç»æã
name_add()
å¨æ¯ä¸ªåç»ä¸æ¯è¡è°ç¨
name_clear()
å¨æ¯ä¸ªåç»ä¹åè°ç¨
为äºä¾¿äºç解ï¼è¿éç»åºä¸¤ç§UDFç±»åçAPIè°ç¨å¾ï¼
ä¸é¢å°å°±ä¸è¿°å 个APIè¿è¡è¯¦ç»ç讲解ï¼
1). name_init
ååï¼
my_boolname_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
UDF_INITç»æä½å¦ä¸ï¼
å段
ç±»å
æè¿°
maybe_null
my_bool
å¦æ为1表示该UDFå¯ä»¥è¿åNULL
decimals
unsigned int
è¿åå¼ä¸ºå®æ°æ¶ï¼è¡¨ç¤ºç²¾åº¦ï¼èå´0~
max_length
unsigned long
对äºè¿åå¼ä¸ºINTEGERç±»åå¼ä¸ºï¼å¯¹äºREALç±»åå¼ä¸ºï¼å¯¹äºå符串类åï¼åå¨å½æ°æé¿åæ°çé¿åº¦
ptr
char
*é¢å¤çæéï¼æ们å¯ä»¥å¨è¿éåé å åãéè¿initdä¼ éç»å ¶ä»API
const_item
my_bool
为1表示å½æ°æ»æ¯è¿åç¸åçå¼
extension
void
*ç¨äºæ©å±ï¼
UDF_ARGSç»æä½å¦ä¸ï¼
å段
ç±»å
æè¿°
arg_count
unsigned int
åæ°ä¸ªæ°
arg_type
enum Item_result
*åæ°ç±»åæ°ç»ï¼è®°å½æ¯ä¸ä¸ªåæ°çç±»åï¼å¯ä»¥æ¯STRING_RESULTãREAL_RESULTãINT_RESULT以åDECIMAL_RESULT
args
char
**åæ ·æ¯ä¸ä¸ªæ°ç»ï¼ç¨äºåå¨å®é æ°æ®ã
STRING_RESULTä¸DECIMAL_RESULTç±»å为char*ï¼INT_RESULTç±»å为long long*ï¼REAL_RESULTç±»å为double*ï¼æè ä¸ä¸ªNULLæé
lengths
unsigned long
*æ°ç»ï¼ç¨äºåå¨æ¯ä¸ä¸ªåæ°çé¿åº¦
maybe_null
char
*该æ°ç»ç¨äºè¡¨ææ¯ä¸ªåæ°æ¯å¦å¯ä»¥ä¸ºNULLï¼ä¾å¦
attributes
char
**æ¯ä¸ªåæ°çåå
attribute_lengths
unsigned long
*æ¯ä¸ªåæ°ååçé¿åº¦
extension
void
*ç¨äºæ©å±ï¼
Messageï¼ç¨äºæå°é误信æ¯ï¼è¯¥æéæ¬èº«æä¾é¿åº¦ä¸ºMYSQL_ERRMSG_SIZEï¼æ¥åå¨ä¿¡æ¯ï¼
2).name_deinit
ååï¼
void name_deinit(UDF_INIT*initid)
该å½æ°ä¼è¿è¡ä¸äºå åéæ¾åæ¸ ççå·¥ä½ï¼å¨ä¹åæ们æå°initid->ptrï¼æ们å¯ä»¥å¨è¯¥åºå·è¿è¡å åçå¨æåé ï¼è¿éå°±å¯ä»¥ç´æ¥è¿è¡å åéæ¾ã
3).name()
ååï¼é对ä¸åçè¿åå¼ç±»åï¼æä¸åçå½æ°ååï¼
è¿åå¼ç±»å
å½æ°åå
STRING or DECIMAL
char *name(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
INTEGER
long long name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
REAL
double name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
å½è¿åå¼ä¸ºSTRINGç±»åæ¶ï¼åæ°resultå¼è¾ä¸ä¸ªbufferæ¥åå¨è¿åå¼ï¼ä½ä¸è¶ è¿åèï¼å¨lengthåæ°ä¸åå¨äºå符串çé¿åº¦ã
æ¯ä¸ªå½æ°ååè¿å æ¬äºis_nullåerroråæ°ï¼å½*is_null被设置为1æ¶ï¼è¿åå¼ä¸ºNULLï¼è®¾ç½®*error为1ï¼è¡¨æåçäºé误ã
4).name_add()åname_clear()
ååï¼
void name_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null,char *error)
void name_clear(UDF_INIT *initid, char *is_null, char *error)
对äºèåç±»åçUDFï¼name_adddåname_clearä¼è¢«åå¤è°ç¨ã
4. 两个ä¾å
ä¸é¢å°ä¸¾ä¸¤ä¸ªç®åçä¾åï¼ä¸ä¸ªå次è°ç¨åå½æ°ï¼ä¸ä¸ªèéç±»åå½æ°ï¼æ¥æè¿°åä¸ä¸ªUDFçè¿ç¨ã
1)æ¥åä¸ä¸ªåæ°ï¼å¹¶è¿å该åæ°çå¼
//åå§å
my_booludf_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
if (args->arg_count != 1){ //æ£æ¥åæ°ä¸ªæ°
strcpy(message,
"udf_intexample() can onlyaccept one argument");
return 1;
}
if (args->arg_type[0] != INT_RESULT){ //æ£æ¥åæ°ç±»å
strcpy(message,
"udf_intexample() argumenthas to be an integer");
return 1;
}
return 0;
}
//æ¸ çæä½
voidudf_int_deinit(UDF_INIT *initid)
{
}
//主å½æ°
long long udf_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
long long num = (*(long long *)args->args[0]); //è·å第ä¸ä¸ªåæ°å¼
return num;
}
2)æ¥åä¸ä¸ªæµ®ç¹æ°ç±»åçåæ°ï¼å¹¶å¯¹æ¯ä¸ªåç»è¿è¡æ±å
//åå§å
my_booludf_floatsum_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
double *total = (double *) malloc (sizeof(double));
if (total == NULL){ //å ååé 失败
strcpy(message,"udf_floatsum:alloc mem failed!");
return 1;
}
*total = 0;
initid->ptr = (char *)total;
if (args->arg_count != 1){ //æ£æ¥åæ°ä¸ªæ°
strcpy(message, "too moreargs,only one!");
return 1;
}
if (args->arg_type[0] != REAL_RESULT){ //æ£æ¥åæ°ç±»å
strcpy(message, "wrongtype");
return 1;
}
initid->decimals = 3; //设置è¿åå¼ç²¾åº¦
return 0;
}
//æ¸ çãéæ¾å¨initå½æ°ä¸åé çå å
voidudf_floatsum_deinit(UDF_INIT *initid)
{
free(initid->ptr);
}
//æ¯ä¸è¡é½ä¼è°ç¨å°è¯¥å½æ°
voidudf_floatsum_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
double* float_total;
float_total = (double*)initid->ptr;
if (args->args[0])
*float_total += *(double*)args->args[0];
}
//æ¯ä¸ªåç»å®æåï¼è¿åç»æ
doubleudf_floatsum(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
double* float_total;
float_total = (double *)initid->ptr;
return *float_total;
}
//å¨è¿è¡ä¸ä¸ä¸ªåç»åè°ç¨ï¼è®¾ç½®initid->ptræåçå¼ä¸º0ï¼ä»¥ä¾¿ä¸ä¸æ¬¡åç»ç»è®¡
voidudf_floatsum_clear(UDF_INIT *initid, char *is_null, char *error)
{
double *float_total;
float_total = (double *)initid->ptr;
*float_total = 0;
}
3) Mysql-udf-/statuses/user_timeline/.json?count=1&source=')
UDFå ·æé常é«çèªç±åº¦ï¼ä½ å¯ä»¥ç¼åä½ ä»»ä½æ³è¦å®ç°çåè½å½æ°ï¼çè³å¯ä»¥å¼ç¨MySQLå æ ¸ç代ç ååéã
å½ç¶ï¼UDFä¹æçå±éæ§ï¼å¦ä¸ï¼
a) å¨mysqlåºä¸å¿ é¡»æfunc表ï¼å¹¶ä¸å¨‑‑skip‑grant‑tableså¼å¯çæ åµä¸ï¼UDFä¼è¢«ç¦æ¢ï¼
b) å½UDFæææ¶ï¼æå¯è½ä¼å¯¼è´mysqld crashæï¼
c) ææçUDFçå½æ°å¿ é¡»æ¯çº¿ç¨å®å ¨çï¼å¦æéè¦ç¨å ¨å±åéï¼éè¦å äºæ¥ï¼å°½éå¨name_initä¸åé èµæºï¼å¹¶å¨name_deinitä¸éæ¾
d) éè¦æinsertæé
ä½è zhaiwx
bitsCN.com
CentOS 8部署安装Zabbix6.0
一、检查Linux内核版本 通过执行命令`uname -a`,源码可直接查看系统内核版本信息。及内 使用`cat /etc/redhat-release`命令,核源核分适用于查看Redhat系Linux系统的源码版本信息。 二、及内外汇网站 源码切换CentOS 8源至阿里源 鉴于CentOS 8已停止维护,核源核分建议将源切换至阿里源以获取更新。源码 需注释掉`mirrorlist`与`baseurl`,及内并在相应文件中加入`baseurl`指向阿里源的核源核分内容。具体路径如下:CentOS-AppStream.repo文件的源码`baseurl= mirrors.aliyun.com/cent...`
CentOS-Base.repo文件的`baseurl= mirrors.aliyun.com/cent...`
CentOS-Extras.repo文件的`baseurl= mirrors.aliyun.com/cent...`
清除yum缓存,重新生成缓存。及内 三、核源核分transient底层源码安装和配置MySQL数据库 安装MySQL数据库,源码使用yum工具管理包。及内 通过修改`/etc/yum.repos.d/mysql-community.repo`文件中的`baseurl`为清华源或阿里源。 执行初始配置命令,修改root用户密码。 四、安装Zabbix 6.0 完成MySQL安装后,使用yum安装Zabbix。 五、创建Zabbix初始数据库 安装Zabbix后,根据指示创建用于Zabbix的数据库。 六、php记录源码启动Zabbix Server与Agent 确保Zabbix Server和Agent进程正常启动。 七、登录Zabbix 通过访问`.../zabbix`,使用用户名`Admin`与密码`zabbix`进行登录。 本文由 mdnice 多平台发布技术分享 | MySQL 字段长度限制的计算方法
本文由kay撰写,擅长Oracle、MySQL、PostgresSQL等领域,专注于Oracle和MySQL性能优化、数据库架构设计、故障修复、数据迁移和恢复,关系卡源码热衷于研究MySQL内核源码,并拥有Oracle OCP认证。目前在江苏国泰新点软件有限公司担任DBA技术团队成员。
一、MySQL限制回顾
之前在《MySQL Text字段的限制》一文中提及了MySQL在Server层和InnoDB层的限制,但未详细阐述限制计算方法。本文将对MySQL的两个限制进行补充说明:1. MySQL Server层限制单条记录大小不超过字节;2. InnoDB层限制不能超过innodb_page_size的一半,以默认K设置为例,限制为。下文内容基于MySQL 5.7.进行说明。
二、Server层限制的乐趣iapp源码计算方法
2.1 计算过程
若MySQL Server层面限制,则会返回特定报错信息。关键代码路径在于`pack_header`中,具体在于判断`reclength`值是否大于。因此,了解`reclength`的计算过程至关重要。
2.2 小结
根据上述计算方式,MySQL Server层计算长度的公式为:`total_length <= `。满足此条件即可通过MySQL Server层的检查。
三、InnoDB层限制的计算方法
3.1 计算过程
InnoDB层面限制的报错信息中,关键代码路径在于判断`page_rec_max`值。根据源码定义,`srv_page_size`默认值为1<<即,配置也是。而`UNIV_PAGE_SIZE_MAX`值为1<<即。因此,`srv_page_size`不等于`UNIV_PAGE_SIZE_MAX`。计算`page_rec_max`值为`page_get_free_space_of_empty(comp) / 2`。进一步分析,一条记录实际长度(`rec_max_size`)的计算公式如下。
3.2 小结
在InnoDB层计算长度的公式为:`rec_max_size < `。满足此条件即可通过InnoDB层的检查。
四、总结
1. 必须同时满足MySQL Server层和InnoDB层的限制条件,才能成功创建表。
2. 遇到上述报错情况时,多数原因在于varchar等字段设置过大。建议对字段逐步缩小或使用text替代。
MySQL 优化器源码入门-内核实现 FULL JOIN 功能
本文以实现MySQL内核的FULL JOIN功能为目标,深入解析了MySQL源码的优化器工作流程。首先,作者通过环境和知识准备,明确将重点放在Server执行流程的探索上,从语法规则的修改开始,如在`sql_yacc.yy`中添加新支持,以及在`parse_tree_nodes.cc`中处理FULL JOIN的语法树解析和打印。接着,作者逐步解析了词法、语法分析后的Query_expression、Query_block和Query_term结构,并在关键函数中设置了断点以跟踪执行流程。
在探索了JOIN的优化工作流程后,作者选择在hypergraph_optimizer中实现FULL JOIN,该部分涉及RelationalExpression、JoinHypergraph的构建和AccessPath的生成。尽管过程复杂,但作者通过逐步调试和修改,成功在HashJoinIterator中添加了对FULL JOIN的支持,包括添加新数据成员和状态标记,以及在LEFT JOIN后执行ANTI JOIN流程。
在测试阶段,作者确认了FULL JOIN功能的正确性,通过在代码关键位置的断点观察,确认了FULL OUTER_JOIN的出现,并展示了改造后的迭代器结构。整个过程中,作者强调了在实现过程中面临的挑战和对MySQL历史的参考,最终决定以最少改动的方式完成任务,以保持代码的简洁和性能。
通过这个项目,作者不仅深入理解了MySQL源码,还实现了FULL JOIN功能,为读者提供了一个从零开始实现新功能的实例。