选项文件(Option Files)/配置文件(Configuration Files)的使用
1.选项文件的概念及作用
大多数MySQL程序能从选项文件(有时称为配置文件)中读取启动选项.运行程序时,为了不必在命令行输入常用选项,选项文件为确定这些常用选项提供了一个方便的途径.
为了决定程序是否读取选项文件,可以--help选项运行该程序.(对mysqld,使用--verbose和--help,二者缺一不可.)如果读取选项文件,返回的帮助信息会指示它将寻找哪个文件,以及遵从的选项组.
--注:
带有--no-defaults选项运行的mysql程序不会读取.mylogin.cnf外的选项文件.很多选项文件为文本编辑器创建的纯文本文件.但包含登录路径选项的.mylogin.cnf文件则是个例外,该文件为mysql_config_editor工具创建的加密文件.“登录路径(login path)”为一个只允许某些选项的选项组,例如:host,user,password,port和socket等.客户端程序通过--login-path选项确定从.mylogin.cnf读取登录路径.为了确定其他登录路径文件名,可以设置MYSQL_TEST_LOGIN_FILE环境变量,mysql-test-run.pl测试工具会使用该变量,但mysql_config_editor和mysql客户端,像:mysql,mysqladmin等,也可以识别使用该变量.
2.选项文件查找顺序
mysql将会按照下面列出的顺序寻找并读取存在的选项文件,如果不存在,可以使用合适的工具进行创建.
Windows上,mysql程序按照下面的顺序寻找选项文件,并从中读取启动选项(从前向后按序寻找和读取).
1)%WINDIR%\my.ini, %WINDIR%\my.cnf 全局选项
2)C:\my.ini, C:\my.cnf 全局选项
3)BASEDIR\my.ini,BASEDIR\my.cnf 全局选项
4)defaults-extra-file --defaults-extra-file选项确定的文件
5)%APPDATA%\MySQL\.mylogin.cnf 登录路径选项(仅客户端)
%WINDIR%表示windows系统目录的位置,其一般为c:\windows,可以用以下命令确定%WINDIR%环境变量的确切位置:
C:\> echo %WINDIR%
%APPDATA%表示windows应用数据目录,可以用以下的命令确定%APPDATA%环境变量的确切位置:
C:\> echo %APPDATA%
BASEDIR表示mysql基安装目录.当用mysql installer安装mysql5.7时,其典型为“C:\PROGRAMDIR\MySQL\MySQL 5.7 Server”目录,这里PROGRAMDIR表示程序目录(通常为windows英文版的程序文件).
Unix和类Unix系统上,mysql程序按照下面列出的顺序寻找选项文件,并从中读取启动选项(从前向后按序寻找和读取)
--注:
Unix平台上,mysql忽略拥有通用写权限的配置文件.这主要出于安全考虑.
1)/etc/my.cnf 全局选项
2)/etc/mysql/my.cnf 全局选项
3)SYSCONFDIR/my.cnf 全局选项
4)$MYSQL_HOME/my.cnf 针对服务器特定的选项(仅服务器)
5)defaults-extra-file --defaults-extra-file选项确定的文件
6)~/.my.cnf 针对用户特定的选项
7)~/.mylogin.cnf 针对用户特定的登录路径(login path)选项(仅客户端)
前述中,“~”表示当前用户的主目录($HOME的值).
SYSCONFDIR表示编译mysql时SYSCONFDIR选项指定的目录.默认时,其为编译时指定安装目录下的etc目录.
MYSQL_HOME为指向包含服务器特定mysql.cnf文件所在目录的环境变量.如果没有设置MYSQL_HOME,且通过mysqld_safe程序启动mysql,则mysqld_safe将其设定为BASEDIR,也就是mysql的安装基目录.
虽然DATADIR可能因为平台或安装方法不同的不同,但其通常为/usr/local/mysql/data. 该值为编译mysql时指定的数据目录位置,而非启动mysql时--datadir选项指定的位置.运行时指定--datadir不会影响服务器处理任何选项前寻找和读取的选项文件.
3.选项文件语法及填写规则
如果某个选项在选项文件中被指定了多次,则以最后一次为准,但对mysqld来说有个特例,处于安全考虑,--user选项则以第一次指定值为准,这样可以防止选项文件中指定的用户被命令行覆盖掉.
下述选项文件的语法使用手工编辑的文件.但不包括.mylogin.cnf,其通过mysql_config_editor创建和加密.运行mysql程序时可以在命令行指定的任何长选项,都可以在选项文件中指定.为了得到某个程序可用选项,使用--help选项运行该程序.(mysqld得用--verbose和--help两个选项).
选项文件中确定选项的语法和命令行语法类似.但选项文件中,需要去掉选项名前面的两个破折号且每行只确定一个选项.例如:命令行的--quick和--host=localhost选项,在选项文件中应该分别在独立行中确定为quick和host=localhost.为了在选项文件中确定
--loose-opt_name,应该写为loose-opt_name.
选项文件中的空行将被忽视.非空行可以为如下格式:
• #comment, ;comment
注释行以#或;开始.一个#注释也可以在一行中间开始.Comment lines start with # or ;. A # comment can start in the middle of a line as well.
• [group]
group为程序或想为其设置选项的组的名字.group行后,任何设置选项行将会应用于被命名的group,直到选项文件末尾或另一个group行被设置.选项group名大小写不敏感.
• opt_name
--opt_name命令行选项的等同物.
• opt_name=value
命令行--opt_name=value的等同物. 选项文件中,"="旁边可以有空格,但命令行则不行.其后的值可以选择是否用单引号或双引号括起来,当选项值中包含"#"等特殊字符时会用到.
选项名和值前后的空格将被自动删掉.其中,可以在选项值中用转义序列 \b, \t, \n, \r, \\, 和\s等表示空格,tab键,新行,回车,反斜杠和空格等.选项文件中,下列转义规则将适用:
• 反斜杠后跟一个有效序列字符被转换成序列表示的字符.例如:\s被转换成空格.
• 反斜杠后不跟有效转义序列字符将保持不变.例如:\S依然为\S.
前述规则意味着文本反斜杠可以用\\表示,或当后面不跟一个有效转义序列字符时用\表示.
选项文件中的转义序列规则与SQL语句中文本串中的转义序列规则不同.
后者上下文中,如果"x"不是一个有效的转义序列字符,\x将变为"x"而非\x.选项文件值的转义规则尤其与windows路径名相关,其用\作为一个路径名分隔符.如果后面跟一个转义序列字符,windows路径名分隔符必须被写成\\.否则,可以写成\\或\.或者,/也可以用作windows路径名且将被认作\.假设像在选项文件中用“C:\Program Files\MySQL\MySQL Server 5.7”做基目录.可以有多个方法.例如:
basedir="C:\Program Files\MySQL\MySQL Server 5.7"
basedir="C:\\Program Files\\MySQL\\MySQL Server 5.7"
basedir="C:/Program Files/MySQL/MySQL Server 5.7"
basedir=C:\\Program\sFiles\\MySQL\\MySQL\sServer\s5.7
如果选项group名和程序名相同,该group中的选项将用于该程序.例如:[mysqld]和[mysql]groups将会分别应用于mysqld服务器和mysql客户端程序.
[client]选项group将被mysql发布版本中提供的所有客户端(但不包括mysqld)读取.
[client]group使得用户可以为所有的客户端确定选项.例如:[client]适于用来指定连接服务器的口令.(但要确定只有你可以存取该选项文件,以防口令泄露.除非某个选项能被所有客户端程序使用,否则,不要讲该选项放于[client]group.如果某个程序不能识别该选项,当你运行时将显示错误信息后退出.选项文件中,应该将更通用的选项组放在前面,而更特定的组放在后面.例如:[client]group更通用,因为所有客户端程序将读取,而[mysqldump]group只被mysqldump读取.后面确定的将会覆盖前面确定的同个选项的值,因此,按照先[client]后[mysqldump]的顺序将使mysqldump特定选项覆盖[client]选项.下面为一个典型的全局选项文件:
[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M
[mysqldump]
quick
下面为一个典型的用户选项文件:
[client]
# The following password will be sent to all standard MySQL clients
password="my password"
[mysql]
no-auto-rehash
connect_timeout=2
为了创建确定mysql版本系列mysqld服务器读取的选项groups,使用[mysqld-5.6], [mysqld-5.7]等名字的groups.下面的group指示mysql 5.7.x版本的servers使用sql_mode设置:
[mysqld-5.7]
sql_mode=TRADITIONAL
4.嵌套包含选项文件方法及指令
选项文件中可以使用!include指令来包含其他选项文件,以及!includedir搜索特定目录作为选项文件.例如:为了包含/home/mydir/myopt.cnf文件,用如下指令:
!include /home/mydir/myopt.cnf
为了搜索/home/mydir目录和读取发现的选项文件,用如下指令:
!includedir /home/mydir
mysql并不保证该目录中选项文件被读取的顺序.
--注:
unix操作系统上,任何被发现及用!includedir指令包含的任何文件都必须有以“.cnf”结尾的文件名.windows,该指令将检查带".ini"或"cnf"扩展名的文件.
被包含选项文件的内容与任何其他选项文件类似.即,其应该包含选项groups,每个group以[group]行开始,以指示这些选项将应用的程序.
当被包含文件被处理时,仅当前程序正寻找的groups中的那些选项被用.其他group将被忽略.假设my.cnf文件包含如下行:
!include /home/mydir/myopt.cnf
且假设/home/mydir/myopt.cnf如下所示:
[mysqladmin]
force
[mysqld]
key_buffer_size=16M
如果my.cnf被mysqld处理,仅/home/mydir/myopt.cnf中的[mysqld] group被用.如果文件被mysqladmin处理,则仅[mysqladmin]group被用.如果文件被其他程序处理,则/home/mydir/myopt.cnf中的选项都不被用.
如果一个选项文件包含!include或!includedir指令,当选项文件被处理时,无论指令出现于文件的什么位置,指令指示的文件都将被处理.
----------------------------------------------------------
《高性能SQL调优精要与案例解析》
blog1:http://www.cnblogs.com/lhdz_bj
blog2:http://blog.itpub.net/8484829
blog3:http://blog.csdn.net/tuning_optmization