Install
下载 Gearman User Defined Functions for MySQL 最新版。
[bash]
[root@www gearman-mysql-udf-0.6]# ./configure --libdir=/usr/local/mysql/lib/mysql/plugin/ --with-libgearman-prefix=/usr/local/gearmand/ --with-mysql=/usr/local/mysql/bin/mysql_config
[root@www gearman-mysql-udf-0.6]# make
[root@www gearman-mysql-udf-0.6]# make install
[/bash]
说明:
- 如果 MySQL 是 source code 安装的话,必须使其支持 plugin (加上
--enable-shared配置项,且确保没有--with-mysqld-ldflags=-all-static配置项),否则在后面步骤中创建函数时,会提示创建失败的提示:
[sql]
mysql> CREATE FUNCTION gman_do RETURNS STRING
-> SONAME "libgearman_mysql_udf.so";
ERROR 1126 (HY000): Can't open shared library 'libgearman_mysql_udf.so' (errno: 0 feature disabled)
[/sql]
--libdir确保指向 MySQL server plugin 的目录,即 MySQLplugin_dir的值。
[sql]
mysql> show variables like '%plugin%';
+---------------+-----------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------+
| plugin_dir | /usr/local/mysql/lib/mysql/plugin |
+---------------+-----------------------------------+
1 row in set (0.00 sec)
[/sql]
- 如果 Gearman 不是采用默认配置选项安装的话,还需用
--with-libgearman-prefix指定 Gearman 安装目录。
安装成功的话,在 MySQL plugin 的目录中,应该有如下文件:
[bash]
[root@www gearman-mysql-udf-0.6]# ls -l /usr/local/mysql/lib/mysql/plugin/
total 128
-rwxr-xr-x 1 root root 1059 Oct 31 11:36 libgearman_mysql_udf.la
lrwxrwxrwx 1 root root 29 Oct 31 11:36 libgearman_mysql_udf.so -> libgearman_mysql_udf.so.0.0.0
lrwxrwxrwx 1 root root 29 Oct 31 11:36 libgearman_mysql_udf.so.0 -> libgearman_mysql_udf.so.0.0.0
-rwxr-xr-x 1 root root 111710 Oct 31 11:36 libgearman_mysql_udf.so.0.0.0
[/bash]
修改 plugin 目录的属主和访问权限,登录 MySQL,执行下面查询 :
[sql]
CREATE FUNCTION gman_do RETURNS STRING
SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_high RETURNS STRING
SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_low RETURNS STRING
SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_background RETURNS STRING
SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_high_background RETURNS STRING
SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_low_background RETURNS STRING
SONAME "libgearman_mysql_udf.so";
CREATE AGGREGATE FUNCTION gman_sum RETURNS INTEGER
SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_servers_set RETURNS STRING
SONAME "libgearman_mysql_udf.so";
[/sql]
Run Job
函数创建完后,调用
gman_server_set 来设置 Gearman 的服务器。[sql]
mysql> select gman_servers_set('127.0.0.1:4730,127.0.0.1:4731');
+---------------------------------------------------+
| gman_servers_set('127.0.0.1:4730,127.0.0.1:4731') |
+---------------------------------------------------+
| 127.0.0.1:4730,127.0.0.1:4731 |
+---------------------------------------------------+
1 row in set (0.00 sec)
[/sql]
也可以每个函数设置不同的 Gearman Server,如:
[sql]
mysql> select gman_servers_set('127.0.0.1', 'reverse');
+------------------------------------------+
| gman_servers_set('127.0.0.1', 'reverse') |
+------------------------------------------+
| 127.0.0.1 |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> select gman_servers_set('127.0.0.1:4731', 'wc');
+------------------------------------------+
| gman_servers_set('127.0.0.1:4731', 'wc') |
+------------------------------------------+
| 127.0.0.1:4731 |
+------------------------------------------+
1 row in set (0.00 sec)
[/sql]
服务器设置好后,接着通过查询来执行 JOB:
[sql]
mysql> SELECT gman_do('reverse', host) AS test FROM mysql.user;
+----------------+
| test |
+----------------+
| 1: % |
| 2: 1.0.0.721 |
| 3: 1.0.0.721 | |
| 4: tsohlacol |
| 5: tsohlacol |
+----------------+
5 rows in set (2 min 8.43 sec)
mysql> SELECT gman_do('reverse', 'hello, world!');
+-------------------------------------+
| gman_do('reverse', 'hello, world!') |
+-------------------------------------+
| 8: !dlrow ,olleh |
+-------------------------------------+
1 row in set (0.00 sec)
[/sql]
当查询调用的是
gman_do_background() 时,返回的是 job handle,可用其来查询 job 的状态。[sql]
mysql> SELECT gman_do_background('reverse', 'test1, test2, test3, test4');
+-------------------------------------------------------------+
| gman_do_background('reverse', 'test1, test2, test3, test4') |
+-------------------------------------------------------------+
| H:www:869425 |
+-------------------------------------------------------------+
1 row in set (0.00 sec)
[/sql]
上面例题正常进行的话,除了要启动 JOB Server gearmand外,还需要运行对应的 worker。
gman_do* 开头的函数还提供可选的第三个参数,它们用于做 unique JOB ID。在同时提交多个 JOB 给相同的 unique ID 时,Gearmand 将会在队列中把它们合并到一起,然后一次执行。需要注意的是,Gearmand 仅合并当前在队列中等待/运行 的 JOB,对于已经运行结束的 JOB 的 unique ID ,不会做跟踪处理。
Remove
如果需要移除上述创建的 MySQL UDF,执行下面查询即可:
[sql]
DROP FUNCTION gman_do;
DROP FUNCTION gman_do_high;
DROP FUNCTION gman_do_low;
DROP FUNCTION gman_do_background;
DROP FUNCTION gman_do_high_background;
DROP FUNCTION gman_do_low_background;
DROP FUNCTION gman_sum;
DROP FUNCTION gman_servers_set;
[/sql]
References:
mysql_udf_readme
没有评论:
发表评论