管理网站的MySQL时,为保证MySQL的平稳运行而需履行的各项职责。
几个应用程序。
MySQL的数据目录里存储者MySQL服务器的数据库,日志文件和其他信息。
MySQL的安装过程会在服务器的数据目录里生成两个数据库。
以下假设你在名为cobra.example.com的机器上运行MySQL服务器,并从这台机器连接该服务器。
假设你已经启动了MySQL服务器。
MySQL安装过程会在mysql数据库的权限表里设置以下两种账户。
MySQL服务器上已有的账户全部列在mysql数据库的user表里,因此你可在那里找到那些初始账户。
默认下,这些账户没有密码。
应为root用户设置密码。
数据目录里的权限表源自何处?
所有平台上,大部分初始账户相同。
主机 | 用户 | 超级用户权限 |
---|---|---|
localhost | root | 全部 |
127.0.0.1 | root | 全部 |
::1 | root | 全部 |
localhost | 无 |
在Unix下,通过运行mysql_install_db来初始化权限表,会得到两个与主机特定相关的账户:
一个是root,一个是匿名用户。
1.以root连接到服务器
2.显示为某主机上某用户设置登录密码
>SET PASSWORD FOR 'root'@'localhost' = PASSWORD('rootpass');
也可用UPDATE语句更新mysql.user表来完成。
>UPDATE mysql.user SET Password=PASSWORD('rootpass') WHERE User='root';
>FLUSH PRIVILEGES;
一般应删除匿名账户。
>DROP USER ' '@'localhost';
启动时加–skip-password可略过密码验证。
% mysql -u root --skip-password
在Unix里,MySQL服务器可通过命令行手动启动。
也可将其作为标准启动过程的一部分在操作系统启动时自动运行。
在Unix里,MySQL服务器的启动过程要实现以下两个目标。
用无特权的登录账户运行服务器
将mysqld设为以无特权的非root用户运行:
% mysqladmin -p -u root shutdown
# chown -R mysql /usr/local/mysql/data
# chgrp -R mysql /usr/local/mysql/data
# chmod -R go-rwx /usr/local/mysql/data
在启动服务器时带上–user=mysql(设用户为mysql),这样以root身份来调用时,会将root切换为mysql来运行。
也可在选项文件中指定。
[mysqld]
user=mysql
如果以非root身份启动服务器,遇到上述会警告(非root不可在运行时更改进程的有效用户ID)。
在Unix里启动服务器
决定使用哪个登录账户来运行MySQL后,如何启动服务器。
% mysql --verbose --help
调用mysqld_safe脚本。
mysqld_safe脚本会调服务器,监视它;在服务器意外中断时,会重启它。
在非BSD风格的Unix版本里,也可通过mysql.server来调用它。
mysqld_safe脚本会将服务器的出错信息和其他诊断输出内容重定向到数据目录下的某个文件,产生一个出错日志;或重定向到syslog,如将错误输出发给文件,则mysqld_safe脚本会设置该文件的所有权,使其归–user选项指定的那个登录账户所有。
当mysqld_safe试图写入出错日志文件时,会因权限不足而失败。
你想通过检查出错日志来弄清问题在哪时,无法找出导致问题原因的信息。
调用mysql.server脚本。
该脚本会通过执行mysqld_safe来启动服务器。
调用时,可用参数start或stop来表明要启动还是停止。
要想协调多个服务器,可用mysqld_multi脚本。
会读取你在其中为多个服务器列出启动参数的那个选项文件。
有了它,你便可对每一个服务器的启动或停止进行控制,或检查它是否在运行。
系统开机时,启动服务。
对BSD风格的系统,在/etc目录常会有几个启动时初始化服务的文件。
通常以rc为开头,并且有可能有一个名为rc.local或类似的文件,专门用于启动本地安装的各种服务。
在基于rc的系统里,可把下面几行添加到rc.local来启动服务器。
if[-x /usr/local/bin/mysqld_safe]; then
/usr/local/bin/mysqld_safe&
fi
对System V风格的系统,可安装mysql.server。(将它复制到位于/etc下的运行级目录里)。
如果运行的是linux系统,且通过RPM包来安装的,到此结束。否则,还需在启动脚本主目录安装此脚本,将对它的链接放到相应的运行级目录里。
许多Linux的变体在/etc/init.d和/etc/rc.d下都有一个目录集。
这类Linux通常有一个用于启动脚本管理的chkconfig 命令。
下面展示如何将mysql.server以mysql名字安装到启动目录里。
# cp mysql.server /etc/init.d/mysql
# chmod +x /etc/init.d/mysql
# chkconfig --add mysql
# chkconfig mysql on
#chkconfig --list mysql
如果没chkconfig,可以使用手动过程。
# cp mysql.server /etc/init.d/mysql
# cd /etc/init.d
# chmod +x mysql
# cd /etc/rc.d/rc3.d
# ln -s /etc/init.d/mysql s99mysql
在任何一个平台里,都有两种主要的指定启动选项的方法,用于调用 MySQL服务器。
获取选项文件位置:
% mysqld --verbose --help
通常,MySQL服务器启动选项都在[mysqld]选项组里。
MySQL服务器程序使用的选项组。
程序 | 程序使用的选项组 |
---|---|
mysqld | [mysqld]、 [server] |
mysqld_safe | [mysqld] 、[server]、 [mysqld_safe] |
mysql.server | [mysqld] 、[server] 、[mysql_server] 、[mysql.server] |
在往选项组里放选项时,要选择在你想要的上下文里会用到的选项组。
MySQL服务器可在多种网络接口上对连接监听。
手动停止服务器。
% mysqladmin -p -u root shutdown
也可以mysql.server stop来停止。
连接不上MySQL服务器下,对其重启。
若通过本地套接字文件建立的连接,套接字文件丢失了。
可改用tcp连接,登录时,用-h 指的本地IP即可,或在选项文件,指定另一套接字文件。
例如
[mysqld]
socket=/usr/local/mysql/mysql.sock
[client]
socker=/usr/local/mysql/mysql.sock
上述修改后,需重启MySQL服务器。
如果因不记得或不知道root密码而不能进行连接的,你得重新获得对服务器的控制。
(1)停止服务器.
在Unix下,让其正常关闭
# kill -TERM PID
强制关闭
#kill -9 PID
在Linux下,ps可能显示多个mysqld进程,它们实际上属于同一个进程的多个线程,只要终止其中任一个即可。
如果用mysql_safe来启动MySQL服务器,它会监视服务器是否异常终止的。
如果用kill -9来终止,mysql_safe会立即重启它。
为此,应先终止mysql_safe,再终止mysqld。
(2)用–skip-grant-tables选项重启MySQL服务器。
禁止用权限表对连接进行验证,以便进行连接时可不用密码,且拥有所有权限。
连接上,应立即执行>FLUSH PRIVILEGES,以便MySQL服务器重新读取权限表,并再次把它们用于访问控制。
FLUSH还会重新启用SET PASSWORD,重新载入权限表后,便可更改root的密码。
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('rootpass');
(3)更改root的密码后,需关闭MySQL服务器,并按正常的启动过程重启它。
现在,可用新密码,以root身份登录了。
系统变量控制着MySQL服务器的运作参数。
用SHOW VARIABLES可显示这些变量。
如果默认值不合适,可更改它们。
有些系统变量适用于性能调整。
MySQL服务器还有一组状态变量,它们提供与MySQL服务器运行时的性能表现相关的信息。
运行时,可用SHOW VARIABLES来显示系统变量。
在运行时所做的更改在MySQL服务器进程终止时会消失。
如果你确定了一个更适合的系统变量值,便可将其设置到某个选项文件中,以便让该值在MySQL服务器重启后可继续使用。
系统变量存在于两个层面上:全局层和特定于会话层。
全局变量会对整个服务器的运作产生影响。
特定与会话的变量只会对服务器如何处理某个给定的客户端连接或会话产生影响。
客户端可在其自己的会话里局部地改变这些变量。
对在两个层面都有值的变量,服务器会使用全局值来初始化会话变量。
在某个会话里,对全局变量的更改并不会影响到客户端相应会话变量的当前值。
一个系统变量可同时拥有全局值和会话值,只拥有一个全局值,或只拥有一个会话值。
查看系统变量值
>SHOW VARIABLES;
>SHOW VARIABLES LIKE '%buffer%';
>SHOW VARIABLES
>WHERE Variable_name LIKE '%timeout%' AND Value < 60;
默认下,SHOW VARIABLES会显示各个会话变量值
如想特定地显示全局变量或会话变量,可在语句中加上限定符GLOBAL或SESSION。
>SHOW GLOBAL VARIABLES;
>SHOW SESSION VARIABLES;
要查询单个变量值,可用 @@GLOBAL.var_name来查询全局变量,使用语法格式 @@SESSION.var_name或者 @@LOCAL.var_name 来查询会话变量。
如果使用不带限定符的@@var_name语法,则当限定符存在时,使用的是会话变量;否则,使用的是全局变量。
@@-语句具有通用性,可用在SET, SELECT或其他SQL语句里:
SELECT @@default_storage_engine AS 'Default storage engine';
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME LIKE '%binlog%';
在服务器启动时设置系统变量
可用命令行选项。
如
% mysqld --max_connections=200
可在选项文件里设置。
[mysqld]
max_connections=200
在服务器启动时,系统变量名称里的短划线和下划线可混合使用。
% mysqld --max-connections=200
对表示缓冲区大小或长度的变量,如果指定的数字没有后缀,其值的单位就是字节;
若后缀为’K’, ‘M’或’G’,则分别表示千字节,兆字节,吉字节。
如:
[mysqld]
max_connections=1K
innodb_buffer_pool_size=16M
有些系统变量无法在启动时设置,如time_zone,但可用–default-time-zone选项。
在运行时设置系统变量
在运行时设置系统变量的语法取决于是设置全局变量还是设置会话变量。
要设置名为var_name的全局变量,可用SET。
如:
SET GLOBAL var_name=value;
SET @@GLOBAL.var_name = value;
SET SESSION var_name=value;
SET @@SESSION.var_name=value;
如没有限定符,SET语句会修改会话变量。
SET var_name=value;
SET @@var_name=value;
在设置全局变量时,必须拥有SUPER权限。
该设置会一直持续到再次发生改变时或服务器退出时。
在设置会话变量,无需特殊权限。
该设置持续到再次发生改变,或当前会话终止。
可在一条SET设置多个变量,彼此用逗号隔开。
此时显式的GLOBAL或SESSION会应用到多个紧随其后的那些自身未包含限定符的变量设置。
SET GLOBAL v1=vall,v2=va12,SESSION v3=val3,v4=val4;
与启动时设置的变量不同,在运行时你不能把名字里的下划线替换为短划线,并且在指定其值时不能用后缀字母’K’,‘M’,‘G’ 。
你可用表达式,可在表达式里引用其他变量的值。
SET GLOBAL read_buffer_size=2*1024*1024
SET SESSION read_buffer_size=2*@@GLOBAL.read_buffer_size
系统变量可被设置为特殊的DEFAULT。
>SHOW STATUS;
状态变量只能由服务器来设置,因此它们对用户来说是只读的,且不能像系统变量那样用SET来修改。
与状态变量也有全局值和特定于会话的值,因此相关的语句也可用限定符GLOBAL或SESSION 。
SHOW GLOBAL STATUS
SHOW SESSION STATUS
如果某个变量只有全局值,则对GLOBAL和SESSION,你将得到相同的值。
与SHOW VARIABLES一样,将子句LIKE或WHERE与SHOW STATUS一起用,可对这些变量的输出进行限制,使它们的名字能与给定的SQL模式匹配,或满足通用的检索条件。
例如,想检查与InnoDB的日志活动相关联的那些状态变量的值,可用如下语句:
>SHOW GLOBAL STATUS LIKE 'innodb%log%';
查询INFORMATION_SCHEMA库的GLOBAL_STATUS表和SESSION_STATUS表,可获得状态变量的信息,且可在计算里使用这些值。
例如:
SET @queries=
(SELECT VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE VARIABLE_NAME LIKE 'Queries');
SET @uptime=
(SELECT VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE VARIABLE_NAME LIKE 'Uptime');
SELECT @queries/@uptime/60 AS 'Queries per minute';
MySQL服务器的架构支持"可插拔",以至于实现服务器某些功能的代码段,可单独编译,存储在外部文件里,根据需要加载。
在MySQL里,插件可实现的功能包括存储引擎、INFORMATION_SCHEMA库的各个表,全文搜索修饰符,复制机制,审计功能,身份认证方法等。
插件接口包含以下几个组成部分:
假如有两个插件库对象文件,都安装在服务器的插件目录里:
通过插件接口,可完成如下操作:
要想在服务器启动时加载插件,可用选项–plugin-load或–plugin-load-add 。
这两个选项的值都是一个列表,由一个或多个分号分隔开的plugin_name=lib_name 或 lib_name说明符构成。
当同时列出插件名和库名时,服务器只会加载该库里的当只列出库名,没列出插件名时,服务器会加载该库里的所有插件。
如:
[mysqld]
plugin-load=my_engine.so;info_tables.so
如只想加载info_tables.so里的LOCKS插件,可用下面内容。
[mysqld]
plugin-load=locks=info_tables.so
插件名的大小写无关紧要。
–plugin-load-add与–plugin-load相似。
–plugin-load选项的每个实例会重置被加载插件的列表
–plugin-load-add不会。
如果多次指定–plugin-load,只有最后一个起作用。
在运行时加载插件,可用INSTALL PLUGIN。
此语句的每个实例都可指定一个插件和包含它的那个库对象文件。
如:
INSTALL PLUGIN my_engine SONAME 'my_engine.so';
INSTALL PLUGIN locks SONAME 'info_tables.so';
INSTALL PLUGIN users SONAME 'info_tables.so';
INSTALL PLUGIN不仅会加载插件,还会在 mysql.plugin表里注册它。
这样服务器在随后的重启中就可自动加载该插件。
可用UNINSTALL PLUGIN在运行时卸载插件。
如:
UNINSTALL PLUGIN users;
INSTALL PLUGIN还能从mysql.plugin表里注销插件,这样服务器在后续的重启中便不会再加载它。
如果某个插件被设计成不允许在运行时卸载,只在服务器关闭时,才可停用,则执行UNSTALL PLUGIN会报错。
INSTALL/UNSTALL PLUGIN需分别对mysql.plugin表有INSERT和DELETE权限。
不管你在服务器启动时加载插件还是运行时加载,都可用SHOW PLUGINS或INFORMATION_SCHEMA库的PLUGINS表来查看存在哪些插件。
如果服务在启动时,加载某个插件的原因是该插件是内建的,注册在mysql.plugin表里的,或该插件是使用选项–plugin-load或–plugin-load-add指定的,则服务器可能会控制它的激活状态。
可在该插件后面加一个选项。
如 --my_engine=ON 或 --my_engine=OFF 可在插件名后紧跟着指定一个可选值。
可用SHOW ENGINES查询INFORMATION_SCHEMA库的ENGINES表。
若让MyISAM为默认的存储引擎,可在服务器选项文件里加入下面内容。
[mysqld]
default_storage_engine=myisam
要想在运行时更改默认存储引擎,可用下面这些语句中的某一条。
SET GLOBAL default_storage_engine=engine_name;
SET SESSION default_storage_engine=engine_name;
要查看全局和当前会话的默认存储引擎,可用下面这句:
SELECT @@GLOBAL.default_storage_engine,@@SESSION.default_storage_engine;
对TEMPORARY表,需用独立变量default_tmp_storage_engine来指定默认引擎.
如果启动服务器时用了–innodb=OFF,就需将
default_storage_engine设为其他某个存储引擎。
InnoDB管理着一个用于存储表内容和其数据字典的
系统表空间。
也允许配置为每个表一个表空间。
配置InnoDB表空间
对存储在系统表空间里的InnoDB表,唯一与之管理的文件便是.frm格式文件。
这个文件存放在InnoDB表所属的数据库的数据库目录里,系统表空间还含有存储着与表结构有关的信息的InnoDB数据字典。
innodb_file_per_table下每个表有自己独立的表空间,
但系统表空间仍然需维护全局数据字典。
1. InnoDB系统表空间配置参数
[mysqld]
innodb_data_file_path=innodata1:4G;innodata2:4G
InnoDB按以下规则组合 innodb_data_home_dir和innodb_data_file_path值,以确定表空间文件的路径名。
2. 配置InnoDB系统表空间
要想对只包含常规文件的系统表空间进行初始化设置,可执行如下:
要想显式地配置表空间,需先停止服务器,删除与InnoDB有关的文件(如表空间文件和日志文件);接着,指定要使用的配置选项,重启服务器。
如果已经创建了某些表,则需在重新配置前,用mysqldump工具把那些表转储出来,在完成配置后再重新加载它们。
把原始分区用作InnoDB系统表空间的组成部分需稍微复杂一些。
好处:
不利:
你的系统备份软件可能只是面向文件系统使用的,而不能面向分区。此时,使用分区会使系统备份变得更加困难。
将原始分区包含在表空间涉及两个操作:
a.初始配置
b.重新配置
如Unix上,想在其上用一个路径名为/dev/rdsk8,大小为200GB的原始分区。
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/rdsk8:200Gnewraw
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/rdsk8:200Graw
3. 重新配置InnoDB系统表空间
初始化InnoDB系统表空间,并开始使用后,便不能再更改其组成文件的大小。
不过,可在现有表空间组成文件列表末尾添加一个新的文件。
>SHOW TABLE STATUS LIKE 'tbl_name';
添加组成文件来扩大InnoDB表空间:
4. 使用单独的InnoDB表空间
[mysqld]
innodb_file_per_table=1
每个新创建的InnoDB表都将有一个.frm格式文件和一个.ibd数据文件。
它们都存放在包含这个表的那个数据库所在的目录里。
如果有必要,InnoDB会自动扩展.ibd文件。
启用或禁用使用单独的表空间会对InnoDB如何创建新表产生影响。
对使用自己的.idb文件进行存储的表,InnoDB会启用其他几项功能。
InnoDB存储引擎的变量
InnoDB也有其自己的日志文件和内存缓冲区,及一些其他的配置参数。
国际化:
软件遵照本地习惯使用的能力。
本地化:
从软件支持的本地习惯列表中选择使用某组特定的习惯。
MySQL的国际化和本地化配置涉及以下几个方面:
MySQL可通过检查系统环境来设置默认时区。
大部分下为服务器主机的本地时区。
也可在启动服务时显示指定时区。
服务器允许每个客户端改写自己的时区。
时区信息保存在下面这两个系统变量里。
[mysqld_safe]
timezone=CST6CDT
>SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;
time_zone可接受三种类型的值,其中一种还需额外的管理动作。
如果你有SUPER权限,则可用GLOBAL来设置全局值。
SET SESSION time_zone='SYSTEM';
SET SESSION time_zone='+00:00';
SET SESSION time_zone='+03:00';
SET SESSION time_zone='-11:00';
SET SESSION time_zone='US/Central';
SET SESSION time_zone='CST6CDT';
SET SESSION time_zone='Asia/Jakarta';
上述通过名字设置时区,需让服务器理解时区的名字,需把操作系统时区文件里的信息加载到mysql数据库的一组表里。
要在带有时区文件的系统里手动填充那些时区表,需确定这些文件的安装目录。
然后,使用mysql_tzinfo_to_sql读取这些文件,根据其内容构造SQL语句,并把这些语句送入mysql程序执行。
如果时区文件位于/usr/share/zoneinfo目录,则把它们加载到mysql数据库的语句如下所示:
% mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -p -u root mysql
默认的字符集和排序规则分别为latin1和latin1_swedish_ci。
要想在服务器启动时更改这些值,可设置系统变量character_set_server和collation_server。
% mysqld --character_set_server=utf8\
--collation_server=utf8_icelandic_ci
如果是根据源代码来建立服务器,可在运行CMake时
通过选项DEFAULT_CHARSET和DEFAULT_COLLATION 来更改这些默认值。
例如:
%cmake -DDEFAULT_CHARSET=utf8\
-DDEFAULT_COLLATION=utf8_icelandic_ci
运行客户端时,可通过–default-character-set来指明它所使用的字符集。
如果在客户端程序的默认位置未找到字符集文件,可用–character-sets-dir来告知客户端程序具体位置。
想知道哪些语言可选用,可查看MySQL安装目录下的share目录。
其中各个子目录的名字正好与各种可用的语言对应。
要知道出错信息的显示语言,可把系统变量lc_messages配置为适当的区域设置。
服务器会将区域设置名称转换为语言名称,并在变量lc_messages_dir指出的目录中查找该语言的子目录,从而找到包含出错信息文件的目录。
如果默认目录不正确,需将lc_message_dir设为正确的路径。
例如:
把出错信息显示为德语,指明出错信息位于/var/mysql/share目录下:
% mysqld --lc_messages=de_DE --lc_messages_dir=/var/mysql/share
单个客户端可在运行时设置lc_messages的会话值,以选择另一种语言。
当同一服务器的不同客户端需以不同于默认值的某种语言显示本地化出错信息时,可用。
MySQL服务器依靠系统变量 lc_time_names来决定如何显示月份和日期名称。
该变量值会对许多时态函数如DAYNAME(),MONTHNAME(),DATE_FORMAT()的结果产生影响。
默认区域设置为en_US。
如果选择一个不同的区域设置,可在服务器启动或运行时设置lc_time_names。
各个客户端可通过在运行时设置lc_time_names的会话值来改写默认值。
对MySQL服务器及运行它的那台机器有控制权限的管理员,可进行一些优化或调整。
例如,可调整与查询处理有关的服务器参数。
[mysqld]
max_allowed_packet=16M
如只是偶尔需以16MB的数据包限制来调mysql或mysqldump,可:
% mysql --max_allowed_packet=16M ...
% mysqldump --max_allowed_packet=16M ...
要想一直使用,可将其添加到选项文件:
[mysql]
max_allowed_packet=16M
[mysqldump]
max_allowed_packet=16M
有些变量控制的资源是按每个客户端来分配的。
如果同时有大量的客户端连接服务器,则加大这些变量的全局值,可能导致服务器的资源占用量急剧上升。
可把read_buffer_size和sort_buffer_size值加大。
分别决定了读取,排序的缓冲区大小。
InnoDB和MyISAM中最为重要的与性能相关的资源。
各个存储引擎表信息缓存一般有不同的名字(InnoDB叫缓冲池,MyISAM叫键缓冲),但每个操作的一般原则相同。
配置InnoDB的缓冲池
InnoDB把它的缓冲池看作一个块列表,该列表被分成新,旧两个子列表,分别含最近被访问较多和较少的缓存块。
InnoDB使用的是中点插入策略,即把当前新的缓存块添加到缓冲池时,会将其放置在旧子列表前面(正好是新子列表尾部)。
默认下,InnoDB会把缓存块插到旧子列表前,接着会在插入之后第一次访问这个缓存块时,将其移动到新子列表前。
新子列表的缓存块随着时间推移,越过旧子列表分界线
旧子列表里的缓存块会逐步老化到列表最后,被丢弃。
下面两系统变量可控制InnoDB缓冲池大小和控制它是否可被分为更小的缓冲池。
有两个系统变量可对InnoDB缓冲池的LRU算法产生影响。
配置MyISAM的键缓冲区
MyISAM在存储表时使用了单独的数据文件和索引文件
处理它们的方式也有所不同。
MyISAM的键缓冲区,默认大小为8MB。
如果你用了大量的MyISAM表,且有多余内存可使用,则把键缓冲区设的大一些,应能在处理索引相关操作时提高MyISAM的性能。
配置缓冲区的方法是,对系统变量key_buffer_size进行设置。
[mysqld]
key_buffer_size=512M
MyISAM键缓冲区在所有MyISAM表之间默认是共享的。
如果缓存中找不到键值,且缓存已满,则产生竞争,此时,需丢弃当前缓存中值,下次需要时,再从磁盘取。
如果某个MyISAM表被使用的频率高,则确保其键保留在内存可带来很多好处。
无论这些键是从一个表里读取,还是从其他一些表里读取,竞争都出现。
可通过把键缓存增大到足以容纳给定表全部索引的方式,来避免同表竞争,但来自其他表的键仍会争抢缓存里空间。
可通过下面几项功能对缓存操作进行更多控制:
创建一个足够大的能完全容纳下一个表的索引的缓存
并将此缓存设置为仅供这个表使用。
在所有键都加载到缓存后,便不再需要任何磁盘I/O。
也不需从缓存中丢弃那些键值,针对该表的键查找也可在内存完成。
另一个常见的策略是,将一组被频繁使用的表分配给一个单独的键缓存,以使它们的索引缓存不会与其他表产生竞争。
要允许对MyISAM键缓存进行配置,服务器需将每一个缓存都与一组系统变量关联一起。
可将这些变量分为多个组成部分,共同组成一个结构化的系统变量。
结构化变量是简单系统变量的扩展,可使用"缓存名+变量名"的语法形式对其访问。
cache_name.var_name
每个缓存结构化变量有下面几个组成部分。
查询缓存有这样几个特点。
>SHOW VARIABLES LIKE 'have_query_cache';
对支持查询缓存的服务器,缓存操作依赖于下面三个系统变量值。
模式 | 含义 |
---|---|
0 | 不缓存 |
1 | 将可缓存的查询缓存 |
2 | 只将以SELECT SQL_CACHE开头的可缓存查询缓存 |
更大的内存,性能更好的磁盘,利用并行,多处理器。
MySQL服务器可生成多种类型日志:
默认下,每个被启用的日志会以文件形式写到数据目录里。
对某些类型的日志,你可选择把它们写到其他地方。
出错日志,可被发送到syslog。
普通查询日志和慢查询日志可被写到mysql数据库的表里。
在Unix里,如果用mysqld_safe脚本来启动服务器,则该脚本会创建出错日志,并告知服务器使用它。
选项 | 用途 |
---|---|
–general_log | 启用普通日志 |
–general_log_file=file_name | 生成日志文件名 |
–log-bin[=file_name] | 启用二进制日志 |
–log-bin-index=file_name | 二进制日志索引文件 |
–log_error[=file_name] | 启用出错日志 |
–log_output[=destination] | 普通查询/慢查询日志存放位置 |
–relay-log[=file_name] | 启用中继日志 |
–relay-log-index=file_name | 中继日志索引文件 |
–slow_query_log | 启用慢查询日志 |
–slow_query_log_file=file_name | 慢查询日志文件名 |
举例:
启用一个名为log.err的出错日志和一个名为qlog的普通查询日志。
[mysqld]
log_error=log.err
general_log
general_log_file=qlog
要显示二进制日志或中继日志文件内容,可用mysqlbinlog。
服务器用出错日志来记录启动,关闭,诊断和出错信息。
Unix里的出错日志
mysqld默认不创建出错日志,但会把诊断输出发送到控制台。
如果你直接调mysqld,可通过设置系统变量log_error将出错输出发到某个文件。
可在命令行或某个选项文件的[mysqld]组里设置这个变量。
如果你启动服务器的方式是调mysql_safe,则服务器会默认创建出错日志,因为mysql_safe在调mysqld时,会把服务器的输出重定向到出错日志。
默认的出错日志文件名为HOSTNAME.err。
要使用另外的出错日志名,可在[mysqld_safe]/[mysqld]设置log_error。
客户端何时连到服务器,客户端发给服务器的每一条SQL语句及其他事件。
启用系统变量general_log来启用。
指定general_log_file来指定名称。
默认名称为HOSTNAME.log。
慢查询还会使得服务器递增其slow-queries状态变量
服务器写入的慢查询日志是文本格式的。
慢查询日志有助于把在重写时可进行改进的查询标识出来。
启用系统变量slow_query_log来启用。
设置slow_query_log_file来指定文件名。
默认为HOSTNAME-slow.log。
记录数据修改"事件"。
二进制日志用途包括数据备份和恢复,且支持服务器间的复制。
要把某个服务器设为主服务器,使其可被复制到从服务器,必须启用二进制日志。
修改事件,按发生顺序写入二进制日志。
事务被提交时,关联的修改才会写入二进制日志。
启用二进制日志的方法是指定–log-bin来启用。
默认文件名HOSTNAME-bin.编号。
启用了二进制日志,服务器还会创建一个附带的二进制日志索引文件。
来列出现有二进制日志文件名字。
如果将二进制日志用于服务器间复制,则在删除某个给定的二进制日志文件前,要先确认其包含的内容已被复制到所有可用的从服务器,并且的确不需要了。
需与复制机制中的从服务器一起使用。
复制从服务器负责接收来自主服务器的数据修改信息,并在接收到它们时将其写到中继日志。
从服务器会将中继日志当作一个保存区,其中存储的事件会被保留到它们被从服务器执行为止。
从服务器上,一个线程负责从主服务器读取事件,写到中继日志;一个线程负责读取中继日志文件,执行其中包含的事件,删除处理完毕的文件。
中继日志和二进制日志共同特点:
指定–relay-log来启用。
默认文件名为HOSTNAME-relay-bin.编号。
启用了普通查询日志或慢查询日志功能时,可选择让服务器把日志输出写入日志文件,写入mysql数据库的日志表,或同时写到这两个地方。
设置general_log来启用普通查询日志。
slow_query_log来启用慢查询日志。
指定日志存储到table时,分别存储到mysql数据库的general_log和slow_log。
日志与数据库备份要综合考虑。
轮换固定名字的日志文件
要让固定名字的日志文件过期,可用日志轮换方法。
一个完成对固定名字的日志文件轮换的shell
#!/bin/sh
#rotate_fixed_logs.sh
#参数1:日志文件名
if [$# -ne 1]; then
echo "Usage:$0 logname" 1>&2
exit 1
fi
logfile=$1
mv $logname.6 $logname.7
mv $logname.5 $logname.6
mv $logname.4 $logname.5
mv $logname.3 $logname.4
mv $logname.2 $logname.3
mv $logname.1 $logname.2
mv $logname $logname.1
mysqladmin flush-logs
二进制日志文件和中继日志文件的过期处理
对二进制日志,有以下两种方法可供选择。
超过7天为过期,会被删除。
[mysqld]
expire_logs_day=7
自动完成日志过期处理
在Unix下,可用cron,建立一个定义有过期调度的crontab文件。
若你想用rotate_fixed_logs.sh来轮换一个名为qlog的普通查询日志,并假设该脚本安装在/home/mysql/bin目录,日志文件放在/var/mysql/data目录。
先以mysql用户身份登录,再编辑mysql用户的crontab文件:
% crontab -e
往里添加一行。
30 4 * * * /home/mysql/bin/rotate_fixed_logs.sh /var/mysql/data/qlog
日志表的过期或轮换
截断表:
USE mysql;
TRUNCATE TABLE general_log;
TRUNCATE TABLE slow_log;
要轮换日志表,需先为它创建一个空副本。
再执行一个原子重命名操作,在一条语句里置换出当前表,用空副本替换它:
USE mysql;
DROP TABLE IF EXISTS general_log_tmp, general_log_old;
CREATE TABLE general_log_tmp LIKE general_log;
RENAME TABLE general_log TO general_log_old,
general_log_tmp TO general_log;
DROP TABLE IF EXISTS slow_log_tmp, slow_log_old;
CREATE TABLE slow_log_tmp LIKE slow_log;
RENAME TABLE slow_log TO slow_log_old, slow_log_tmp TO slow_log;
学习参考资料:
《MySQL技术内幕》第5版