mysql option=3_mysql 添加新启动选项(option)

本文将介绍如何在mysql中添加新的启动选项(option)。

例如 mysqld --node_type=master 。 这个启动命令需要mysql提供对新选项 node_type的支持。

本文将介绍如何添加这个新选项,并且新增一个对应的系统global变量来存储这个参数值, 这个系统变量能够通过mysql语句

"show variables like 'node_type'" 来查询。

1. 添加新选项

修改文件:

/sql/mysqld.h

具体修改:

1.在mysqld.h 中声明 新参数的id :

在mysqld.h的366行(大约), 找到 “enum options_mysqld” 在它的最后添加OPT_NODE_TYPE。

注:这里其实是声明一个全局option的id。

2. 在mysqld.cc中添加新参数定义:

在mysqld.cc的5940行(大约), 找到“struct my_option my_long_options[]= ” 在它的最后一个元素前添加如下参数定义:

{"node_type", OPT_NODE_TYPE, "Identify the the node type as dispatch or execution.",

0, 0, 0, GET_ULONG, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},

注:最后一个元素是结束标识,它必须在最后。 这里添加的参数定义中OPT_NODE_TYPE是上一步在mysqld.h中定义的。

“node_type”是参数的名字,即出现在命令行中的名字。

(上面方式已有经不需要了,在这里也添加option的定义的话可能会与后面sys_vars.cc里面的定义重名,导致mysql编译不过去。 而且如果不是在mysqld.cc 中的get_one_option() 中处理的话不需要在enum options_mysqld中定义)

2.接下来要添加参数的解析与处理:

修改文件:/sql/mysqld.cc(这个不需要了)

/sql/sql_class.h

1. 添加参数对应的全局变量

在mysqld.cc中定义一个新的全局变量ulong node_type=0;并在mysqld.h中声明该变量extern ulong node_type;

注:这个变量用来存储参数值的

(上面方式已有经不需要了)

在 sql_class.h 404行处找到结构体struct system_variables,并在它的最后添上:ulong node_type;

注:这个变量就用来存储 选项node_type的值的地方

2. 添加参数解析

在mysqld.cc的7146行(大约),找到mysqld_get_one_option,在它的后面添加一个case:

case OPT_NODE_TYPE:

char *execu="execution";

char *disp="dispatch";

if(!strcmp(execu, argument))

node_type=0;

else if(!strcmp(disp, argument))

node_type=1;

else

{

sql_print_error("The value for node_type should be 1(dispatch) or 0(execution)!");

return 1;

}

break;

(上面方式已有经不需要了)

case OPT_NODE_TYPE:

if (atoi(argument)==0)

global_system_variables.greatsql_node_type=0;

else if (atoi(argument)==1)

global_system_variables.greatsql_node_type=1;

else

{

sql_print_error(

"Invalid value for node-type! The valid values are 1(dispatch) or 0(execution).");

return 1;

}

break;

注:这里主要做的是匹配参数id,然后限制参数的取值,并为参数对应的变量赋值(上面方式已有经不需要了, 因为用sys_vars.cc的方式定义全局变量的话,这个变量对应的选项不会在这里被检查,所以这段代码不会被执行。)

3. 添加该参数对应的变量为mysql系统global变量

修改文件:/sql/sys_vars.cc

1. 添加global 变量对象

在sys_vars.cc中添加一个变量定义:

static Sys_var_ulong Sys_node_type(

"node_type",

"Identification for the type of the server node ",

READ_ONLY GLOBAL_VAR(node_type), CMD_LINE(REQUIRED_ARG, OPT_NODE_TYPE),

VALID_RANGE(0, UINT_MAX32), DEFAULT(0), BLOCK_SIZE(1));

注:这里的"node_type"是mysql系统global变量的名字,

"READ_ONLY GLOBAL_VAR(node_type)"指明这是只读的global变量,并且关联到mysqld.h中声明的全局变量node_type。

(上面方式已有经不需要了)

static const char *node_type_names[]= {"execution", "dispatch", NullS};

注:定义一个enum取值范围

static Sys_var_enum Sys_node_type_great(

"node_type",

"。。。。。.",

READ_ONLY GLOBAL_VAR(global_system_variables.node_type),

CMD_LINE(REQUIRED_ARG, OPT_NODE_TYPE),node_type_names,

DEFAULT(0),NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(NULL),ON_UPDATE(NULL));

注:“node_type”是系统global变量对象名,它会自动生成对于的名为“node-type”选项(所以第1步中被标识为‘不需要’的代码没有用了),

“node_type_names”指明取值的范围,‘READ_ONLY GLOBAL_VAR(global_system_variables.node_type)’ 表明是全局的只读变量,并且

这个变量的值存储在‘global_system_variables.node_type’。

4. 添加对应的测试用例

添加文件:/mysql-test/suite/sys_vars/t/node_type_basic.test

/mysql-test/suite/sys_vars/t/node_type_basic-master.opt

1. 添加测试用例

node_type_basic.test 中测试新添加的参数是否可以被show出来,并且是不是只读的。代码如下:

--echo show global variables like 'node_type'

show variables like 'node_type';

--error ER_INCORRECT_GLOBAL_LOCAL_VAR

set global node_type=‘

execution

’;

--error ER_INCORRECT_GLOBAL_LOCAL_VAR

set global node_type=‘dispatch’;

注:文件名必须是[系统变量名]_basic.test, 每一个系统变量都必须能够在/mysql-test/suite/sys_vars/t/下找到一个与它名字对应的basic测试用例。否则./mtr --suite=sys_vars 会失败。

2.添加用例环境

node_type_basic-master.opt中设置node_type_basic用例的系统环境。 代码如下

--node-type=dispatch

注:当需要为指定测试用例添加它所需的启动参数设定时,需要将启动参数添加在[用例文件名]-master.opt文件中。

5.执行测试:

在编译后的mysql-test文件夹中运行 ./mtr --suite=sys_vars

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值