? ? ? ?mysql的配置文件my.cnf里是由一个个的option组成的([***])。各个部分的作用大致如下:
[client] -- 这部分的配置是mysql自带的client回去读取的部分,可以配置port/password/socket等
port=3306
socket=/tmp/mysql.sock
[mysql] -- 这部分配置mysql command tool会读取的部分
no-auto-rehash
[mysqld]--这部分是mysql server使用到的,比如这个页面里面的参数以及存储引擎自己的参数。
max_connections=100
innodb_buffer_pool_size=2G
key_buffer_size=32M
[mysql_safe]--下面这些都是特定的客户端工具使用到的($MYSQL_HOME/bin/下),看名字就可以明白了。
[mysqldump]
[mysqlhotcopy]
[myisamchk]
...每个工具都可以有自己的option...
具体每个option可以使用那些参数,可以是用 --help查询,比如mysql --help
参数如何生效?
? ? ? ?以我们最常使用的mysql command tool为例,当我们习惯的输入mysql -uroot -p 之后,它是如何读取my.cnf的呢。代码很简单,调用路径如下(5.1.58):
main.cc(bin/mysql.cc) -->load_defaults(mysys/default.c) -->my_load_defaults(mysys/default.c)
? ? ? ?函数load_defaults的第二个入参为load_default_groups, mysql.cc中是这样定义的:
static const char *load_default_groups[]= { "mysql","client",0 };
? ? ? ?load_defaults函数对这个入参的注释为:“groups?Which [group] entrys to read.”。这下明确了,mysql command tool 会去读取my.cnf中"[mysql]"和"[client]"部分。(除非指定--no-defaults)。
? ? ? ?在my_load_defaults函数里,有这么一段:
/* Check if the user doesn't want any default option processing --no-defaults is always the first option */ if (*argc >= 2 && !strcmp(argv[0][1],"--no-defaults")) { /* remove the --no-defaults argument and return only the other arguments */ uint i; if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (*argc + 1)*sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); res[0]= **argv; /* Copy program name */ for (i=2 ; i < (uint) *argc ; i++) res[i-1]=argv[0][i]; res[i-1]=0; /* End pointer */ (*argc)--; *argv=res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ if (default_directories) *default_directories= dirs; DBUG_RETURN(0); }
? ? ? ?当使用了--no-defaults参数(如果使用,必须作为第一个option出现,这个是对所有的client都适用的)并且输入参数>=2时,mysql command tool不会去加载my.cnf中对应的option。
? ? ? ?其它的client则类似,比如mysqlbinlog会去读取"[mysqlbinlog]"和"[client]";mysqldump会去读取"[mysqldump]"和“[client]”...
?
参考链接:
http://dev.mysql.com/doc/refman/5.5/en/option-files.html