本文将介绍如何在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