Linux上MySQL UDF函数开发调试的方法

MySQL UDF函数开发调试的方法 MySQL支持通过动态库文件扩展数据库的功能,开发范例可参考官网上的介绍:https://dev.mysql.com/doc/refman/5.6/en/adding-udf.html ,调试的时候一开始考虑在C的主函数中对函数进行调用,生成可执行文件,执行文件查看结果;但在调试通过后并部署到MySQL的server上的时候,却出现了很多的段错误,因为实际运行环境不一样了,折腾了好久,在此总结一下调试此类UDF的一种方法
环境 开发工具:visual studio code (C语言)
编译工具:gcc
编译环境:red hat enterprise linux server release 6.4 64位
数据库:MySQL 5.6.42 Linux
调试工具:GDB
UDF开发 UDF开发可参考:https://www.cnblogs.com/ghc666/p/8609067.html
官方指引:https://dev.mysql.com/doc/refman/5.6/en/adding-udf.html
demo可参考mysql源代码里面的sql/udf_example.cc(到官网下载source code),里面除了一些UDF的样例,同时还有各个参数使用方法的注释
编译 开发完代码后,将代码xxx.c及其引用到的文件拷贝到服务器上,执行类似以下命令
gcc -g xxx.c -I 链接库/头文件目录 -fPIC -shared -o xxx.so
随后将so文件(windows平台是dll文件)拷贝到服务器上MySQL安装目录的plugin中,登录MySQL执行
CREATE FUNCTION xxx RETURNS STRING SONAME ‘xxx.so’; 即可创建函数
调试 创建函数之后可直接select xxx(‘参数’); 的方式进行测试,但如果代码有问题,此时数据库可能会直接挂掉并断开连接,查看err日志文件只能看到一些地址的信息,并显示指针错误之类的信息,但无法准确定位到出问题的代码,此时可利用GDB进行调试;
MySQL的说明文档上有对于系统crash的debug指引:https://dev.mysql.com/doc/refman/5.6/en/crashing.html,具体步骤:

  1. 关闭正在运行的mysql
  2. 在gdb中启动mysql,输入gdb --args /usr/sbin/mysqld (mysqld的路径可以通过which mysqld查询)
  3. 输入 r --user=root让MySQL运行起来
  4. 另外打开一个窗口,登录到MySQL,创建函数并调用函数,此时在之前gdb的窗口就能实时打印出执行的信息,如果发生了报错也会将详细信息打印,并可用backtrace向前追溯,这样就能定位具体出错的代码了
另外,在代码里面的printf语句此时也能输出到窗口中,可以查看变量的值。gdb调试方法指引:http://f.dataguru.cn/thread-862879-1-1.html
总结 【Linux上MySQL UDF函数开发调试的方法】工具的熟悉太重要,不会使用工具只会将时间浪费在没有效率的尝试上面。MySQL UDF功能虽然强大,但使用起来必须谨慎,如果出现指针的错误,容易导致数据库的crash,具体经验:
  • 尽量避免使用全局变量(满足线程安全)
  • 注意已分配变量的长度要足够
  • 手动分配了内存的变量处理完成后要及时释放
  • 注意对输入的参数进行预判断处理,转换为实际使用的类型

    推荐阅读