如何禁用 mysql 的 udf 功能

如题所述

背景

在上一篇推文中,我们介绍了 MySQL Group Replication 8.0.16 支持信息碎片化功能来增强大型事务处理能力。

如果您想在组复制中使用该功能,则任何组成员的版本都不能低于 8.0.16!

简单地说就是由于低版本协议上不支持。MySQL 8.0.16 的组通讯开始支持新协议,简称“分段协议”,之前的版本中只有一种“压缩协议”。

如果多个成员想加入复制组,那么在协议匹配上遵循以下原则:

    现有复制组成员和新加入成员版本相同,加入成功。

    低版本成员想加入高版本的组会被驱逐,加入失败。

    高版本的成员想加入低版本的组,单独加入成功,多个加入失败。

    例如:

    一个 MySQL Server 8.0.16 实例可以成功加入使用通信协议版本 5.7.24 的组。

    一个 MySQL Server 5.7.24 实例无法成功加入使用通信协议版本 8.0.16 的组。

    两个 MySQL Server 8.0.16 实例无法同时加入使用通信协议版本 5.7.24 的组。

    两个 MySQL Server 8.0.16 实例可以同时加入使用通信协议版本 8.0.16 的组。

    新增 UDF

    为了能让高版本的复制组更便于加入低版本的成员,MySQL 8.0.16 新增两个 UDF。

    您可以使用两个新的 UDF 命令去管理组通信协议:

    1. group_replication_set_communication_protocol(new_protocol)

    设置组复制通讯协议版本

    SELECT group_replication_set_communication_protocol("8.0.15");

    填入一个所有成员都支持的版本号,即:new_protocol ≤ 所有成员的 MySQL版本。

    new_protocol 格式:major.minor.patch (主版本号.次版本号.发布版本号)例如:8.0.15。

    2. group_replication_get_communication_protocol()

    获取复制中最旧成员的 MySQL 版本号

       SELECT group_replication_get_communication_protocol();    +------------------------------------------------+    | group_replication_get_communication_protocol() |    +------------------------------------------------+    | 5.7.14                                         |    +------------------------------------------------+

    获取的版本号可能与设置的值不一致,但不一致的版本之间组复制协议是一样的。

    返回结果格式:major.minor.patch (主版本号.次版本号.发布版本号)例如:8.0.15。

    以上两个 UDF 对全部组成员有效,主机或从机上均可执行。

    结论

    若想使用信息碎片功能。建议将组复制成员全部升级为 8.0.16。

    若组内成员版本仅有部分为 8.0.16,可以用两个新的函数来让高版本的成员保持与其它成员组协议一致。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-07-24
1)基本用户定义函数是一类代码,对MYSQL服务器功能进行扩充,通过添加新函数,性质就象使用本地MYSQL函数abs()或concat().UDF是用C(或C++)写的。也许还可以用BASIC,.NET或其它什么虽然还没见过有人这么做。
2)从字面上何以知道UDF是很有用的,尤其当需要扩展MYSQL服务器功能时。下表给出了最佳解决方法的比较:
Method Speed Language Development
方法 速度 语言 开发
Stored Procedures slow SQL ~minutes (for small functions)
存储过程 慢 SQL ~分钟(对于小函数)
UDF fast C ~hour
UDF 快 C ~小时
Native Function fast C major pain in the ***
本地函数 快 C 未知
慢的意思是和其它比较时。存储过程和一般SQL语句比仍然是很快的。
对本地函数的一点解释:本质上和UDF没太大区别。但是必须用MYSQL的资源代码来写然后重新编译全部。这将是很大的工作量,必须一边又一边的用最新版的MYSQL来完成这项工作。
3)这部分很简单。当完成了一个UDF,只是使用它就可以了。例如:"SELECT MyFunction(data1, data2) FROM table"
4)编写UDF
现在开发写一个UDF:
建立一个新的shared-library项目(该例中用的VC++ 6.0建立一个标准的DLL)
首先需要一些头文件。这些头文件是标准的头文件和MYSQL服务器的包含目录里的文件
#ifdef STANDARD
/* STANDARD is defined, don't use any mysql functions */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef __WIN__
typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */
typedef __int64 longlong;
#else
typedef unsigned long long ulonglong;
typedef long long longlong;
#endif /*__WIN__*/
#else
#include <my_global.h>
#include <my_sys.h>
#endif
#include <mysql.h>
#include <ctype.h>
static pthread_mutex_t LOCK_hostname;
现在必须决定需要哪类函数。本质上有两种选择:
该函数是聚合函数吗?(后面将学习很多关于聚合函数的内容)
返回类型是什么?有4个选择:
类型 描述
STRING 一个合法的字符串,转换成char*类型
INTEGER 一个普通的整型变量,转换成64位的整型
REAL型 一个俘点数,转换成double型
DECIAML型 这个并没真正的结束,MYSQL将做字符串对待
现在开始讨论关于非聚合函数。必须声明并执行一些MYSQL使用UDF时用到的函数,但首先一些必要的结构必须并确:
UDF_INIT:
类型 名称 描述
<code>
my_bool maybe_null 是1如果函数能返回NULL
unsigned int decimals 针对REAL函数
unsigned long max_length 针对字符串函数
char * ptr 自由指针针对函数的数据
my_bool const_item 0如果结果是独立的

UDF_ARGS:
类型 名称 描述
unsigned int arg_count 成员数量
enum Item_result * arg_type 成员类型的数组
char ** args 指向成员的指针的数组
unsigned long * lengths 成员长度的数组(针对字符串)
char * maybe_null "maybe_null"标记的数组
char ** attributes 指向成员属性的指针的数组
unsigned long * attribute_lengths 属性长度数组

现在看一下该函数:
De-/Initialization:

Collapseextern "C" my_bool MyTest_init(UDF_INIT *initid, UDF_ARGS *args,
char *message)
{

//非常重要的一件事是建立内存
//需要
//需要一个很长的变量来保存检测数
//虽然该例中不需要
longlong* i = new longlong; // 建立变量
*i = 0; // 设初值本回答被网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网