8:MySQL-服务器管理2

- 存储引擎配置
1.选择存储引擎
可用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管理着一个用于存储表内容和其数据字典的
系统表空间.
也允许配置为每个表一个表空间.
1.配置InnoDB表空间
对存储在系统表空间里的InnoDB表,
唯一与之管理的文件便是.frm格式文件.
这个文件存放在InnoDB表所属的数据库的数据库目录里,
系统表空间还含有存储着与表结构有关的信息的InnoDB数据字典.
innodb_file_per_table下每个表有自己独立的表空间,
但系统表空间仍然需维护全局数据字典.
a.InnoDB系统表空间配置参数
innodb_data_home_dir
用于定义构成表空间的所有组成文件的父目录
默认值为服务器数据目录
innodb_data_file_path
用于定义位于InnoDB主目录下的那些表空间组成文件的规格
每个规格包含文件名,文件大小,某些其他可能选项
表空间各组成文件的总大小不得小于10MB

默认下,InnoDB会在服务器的数据目录里创建一个名为ibdata1,
大小为10MB的自扩展文件,并把它作为表空间.
如要在数据目录里创建一个表空间-由两个大小皆为4GB,
名字分别为innodata1和innodata2的文件构成.
文件配置如下:
[mysqld]
innodb_data_file_path=innodata1:4G;innodata2:4G
InnoDB按以下规则组合
innodb_data_home_dir和innodb_data_file_path值,
以确定表空间文件的路径名.
1.如未指定innodb_data_home_dir,
默认值为服务器数据目录路径名,	
且InnoDB会把innodb_data_file_path里的文件名解释为
相对于该数据目录的.
2.如innodb_data_home_dir不空,
则InnoDB会把它解释为innodb_data_file_path里所有文件规格
所在的目录,
且会把这些文件名解释为相对于innodb_data_home_dir值的.
3.如显式将innodb_data_home_dir设置为空,
则InnoDB会把innodb_data_file_path里的所有文件规格当做绝对路径名
b.配置InnoDB系统表空间
要想对只包含常规文件的系统表空间进行初始化设置,可执行如下:
1.把相应的设置行添加到选项文件里
2.确认将被创建的各个表空间组成文件所在的目录都已存在.
InnoDB只创建文件,不创建目录.
3.确认那些表空间组成文件都不存在
4.启动服务器.

要想显式地配置表空间,
需先停止服务器,
删除与InnoDB有关的文件[如表空间文件和日志文件]
接着,指定要使用的配置选项,
重启服务器.

如已经创建了某些表,
则需在重新配置前,用mysqldump工具把那些表转储出来,
在完成配置后再重新加载它们.

把原始分区用作InnoDB系统表空间的组成部分
需稍微复杂一些
好处
1.可轻易创建非常巨大的表空间
分区组成可扩展到整个分区,
而常规的文件组成会受到操作系统所允许的最大文件大小的限制
2.可保证每个原始分区在磁盘上都拥有一个完全连续的空间.
常规文件受文件系统碎片影响.
为减少常规文件碎片,InnoDB存储引擎初始化表空间时,
会尽量向有关文件写入足够多的零,
迫使操作系统把空间一次性全部分配给常规文件.
3.原始分区通过消除文件系统管理层来减少开销.

不利:
有些系统备份软件只针对文件备份,
将原始分区包含在表空间涉及两个操作
a.初始配置
b.重新配置
如Unix上,
想在其上用一个路径名为/dev/rdsk8,大小为200GB的原始分区
a.使用带有newraw后缀的大小值来初始配置原始分区
该后缀告诉InnoDB,该文件是一个需要初始化的原始分区
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/rdsk8:200Gnewraw
b.启动服务器
c.在InnoDB初始化分区之后,停止服务器
d.重新配置分区规格,把后缀newraw改为raw
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/rdsk8:200Graw
e.再次启动服务器
InnoDB现在看到的后缀是raw
而非newraw
它会假定这个分区已被初始化
且可按读/写方式来使用此表空间

如把原始分区指定为InnoDB表空间的一部分,
则需确保对其设置了访问权限,
以便服务器可对它进行读/写
还需确保这个分区未被用作其他用途

在建立初始表空间时,
如因为InnoDB不能创建某个必要的文件导致启动失败,
则检查出错日志.
再删除创建的所有文件,修正配置错误,
重启服务器.
c.重新配置InnoDB系统表空间
初始化InnoDB系统表空间,并开始使用后,
便不能再更改其组成文件的大小.
不过,可在现有表空间组成文件列表末尾添加一个新的文件.
>SHOW TABLE STATUS LIKE 'tbl_name';

添加组成文件来扩大InnoDB表空间:
1.停止正运行的服务器
2.如表空间的最后一个组成是自扩展文件,则需先将其规格改为固定大小,然后在其后添加另一个文件.
需先确定此文件当前大小,
3.把新组成的规格添加到现有文件列表末尾.
如新组成是一个常规文件,需保证它还不存在.如是一个原始分区,[需先用newraw+启动+停止+改为raw+再次启动]
4.重启服务器
d.使用单独的InnoDB表空间
[mysqld]
innodb_file_per_table=1
每个新创建的InnoDB表都将有一个.frm格式文件和一个.ibd数据文件.
它们都存放在包含这个表的那个数据库所在的目录里.
如有必要,InnoDB会自动扩展.ibd文件.
启用或禁用使用单独的表空间会对InnoDB如何创建新表产生影响.
对使用自己的.idb文件进行存储的表,InnoDB会启用其他几项功能
1.对未被其他表以外键形式进行引用的表
TRUNCATE TABLE执行速度更快,且可重新申请磁盘空间
但存储在系统表空间的表不具备此特点
2.单个文件单个表空间下可用Barracuda文件格式
可在运行时,临时更改innodb_file_per_table, innodb_file_format
- InnoDB存储引擎的变量
InnoDB也有其自己的日志文件和内存缓冲区,及一些其他的配置参数
1.innodb_buffer_pool_size
缓冲池大小
2.innodb_log_buffer_size
3.innodb_log_group_home_dir
InonDB有其自己的日志文件,
如服务器启动时不存在,会被自动创建.
日志文件的名字都是以ib_作为开头
默认下,在数据目录里创建它们
要想显式指定InnoDB写入日志文件的目录路径名
可用innodb_log_group_home_dir
Innodb不会创建目录
4.innodb_log_file_size/innodb_log_files_in_group
当InnoDB的日志被写满时,
InnoDB会把缓冲区里的信息写入磁盘
innodb_log_file_size可更改日志文件大小
innodb_log_files_in_group可更改日志文件的个数
两者相乘为日志文件总大小,不可超过4GB

如已创建了日志文件,并想更改它们的大小,
则需完全关闭服务器,
以使InnoDB能彻底处理好正进行中的事务.
再删除那些日志文件,
重新配置,
重启服务器

全球化问题

国际化:
软件遵照本地习惯使用的能力
本地化:
从软件支持的本地习惯列表中选择使用某组特定的习惯

MySQL的国际化和本地化配置涉及以下几个方面:
1.服务器默认时区
2.默认字符集和排序规则
3.显示诊断和出错信息所使用的语言
4.月份和日期名称的区域设置
- 配置时区支持
MySQL可通过检查系统环境来设置默认时区
大部分下为服务器主机的本地时区
也可在启动服务时显示指定时区
服务器允许每个客户端改写自己的时区

时区信息保存在下面这两个系统变量里
1.system_time_zone
是服务器在启动时确定的在服务器主机上实际使用的时区
如把环境变量TZ设为期望的时区
则会对服务器在启动时如何设置system_time_zone产生影响
Unix里,
另一种设置时区的方法是在mysqld_safe的启动脚本里指定一个--timezone选项
最好是把这个选项放到某个选项文件的[mysqld_safe]选项组里,
尤其在你通过mysql.server脚本间接调mysqld_safe时候
如指定美国中部时间
[mysqld_safe]
timezone=CST6CDT
2.time_zone
是MySQL服务器的默认时区
默认下,值为SYSTEM,表示使用system_time_zone设置
服务器在运行时会使用全局的time_zone值为每一个连接上的客户端设置会话级的time_zone值.使其成为客户端的默认时区.
任何客户端可通过设置会话级time_zone来重新设置自己的会话级时区.
有SUPER权限的管理用户可设置全局的time_zone变量
要确定当前的全局和会话级时区值,可用
>SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;

time_zone可接受三种类型的值,
其中一种还需额外的管理动作
如你有SUPER权限,则可用GLOBAL来设置全局值.
1.要使用system_time_zone
可把time_zone设为SYSTEM
SET SESSION time_zone='SYSTEM';
2.要想指定相对于UTC的偏移值
可用带正负号的小时和分钟格式
SET SESSION time_zone='+00:00';
SET SESSION time_zone='+03:00';
SET SESSION time_zone='-11:00';
3.要想引用区域设置,可用命名时区
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服务器及运行它的那台机器有控制权限的管理员,
可进行一些优化或调整.
如
可调整与查询处理有关的服务器参数
- 用于服务器调整的通用型系统变量
1.back_log
在处理当前连接时,
排队等待连接的最大请求数
2.max_connections
服务器支持的最大客户端并发连接数
3.table_open_cache
当服务器打开表文件时,
会试图将它们保持在打开状态
以减少必须要完成的文件打开操作和文件关闭操作数量.
它会在一个表缓存里存放与所有打开文件有关的信息.
如服务器访问了大量表,
则这个表缓存可能会被填满,服务器会关闭一些最近未打开的表
4.table_definition_cache
如增大table_open_cache还需考虑增大table_definition_cache
它控制着存储表定义的缓存大小
5.open_files_limit
如增大max_connections或table_open_cache
服务器会需要更多的文件描述符
突破单个进程文件描述符限制的解决办法是:
为MySQL主服务器建立一个或多个从服务器
所有的更新都被导向主服务器,但来自客户端的单纯的检索请求,
可分散到所有的服务器
6.max_allowed_packet
用于客户端通信的那个缓冲区的最大大小可增大
默认缓冲区大小为1MB
允许的最大值为1GB
这变量不是一个与性能密切相关的参数,
但把这个值调大,
可防止在处理更大的数据包时发生错误

数据包缓冲区的内存只在需要时才分配
客户端mysql和mysqldump都有自己的max_allowed_packet
如客户端向服务器发送了很长的语句
则可能需同时在服务器端和客户端增加这个变量的值
如启动服务器时将包的大小限制为16MB
[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叫键缓冲].
但每个操作的一般原则相同.
1.开始时,
缓存为空
2.服务器在语句执行期间需检查表的信息时,
会检查该信息是否已经读入缓存
如已读入,则服务器会查询内存中的值.
否则,存储引擎表会把内容从磁盘读到缓存
3.如缓存在必须读入新值时已满,
需丢弃旧的信息
以便为新信息腾出空间
默认下,
每个存储引擎基于最近最少使用来确定要丢弃的缓存块
4.如丢弃的缓存块未被修改过,它的内容直接被新读入值覆盖.
否则,需将已修改内容写回.
如缓存中找不到请求值,
需从磁盘读入.

- 配置InnoDB的缓冲池
InnoDB把它的缓冲池看作一个块列表
该列表被分成新,旧两个子列表
分别含最近被访问较多和较少的缓存块.
InnoDB使用的是中点插入策略,
即把当前新的缓存块添加到缓冲池时,
会将其放置在旧子列表前面[正好是新子列表尾部]
默认下,InnoDB会把缓存块插到旧子列表前,
接着会在插入之后第一次访问这个缓存块时,
将其移动到新子列表前.

新子列表的缓存块随着时间推移,
越过旧子列表分界线
旧子列表里的缓存块会逐步老化到列表最后,被丢弃.
下面两系统变量可控制InnoDB缓冲池大小和控制它
是否可被分为更小的缓冲池
1.innodb_buffer_pool_size
分配给缓冲池的总内存,单位字节.
一般原则是使用系统内存的70%~80%
2.innodb_buffer_pool_instances
默认下,
此变量值为1,且只有一个单独的缓冲池
如innodb_buffer_pool_size至少为1GB
且将innodb_buffer_pool_instance设成大于1
则InnoDB会把这个缓冲池处理成许多小的缓冲池实例
每个独立运作.
InnoDB会把从磁盘读到的缓存块随机分配给某个给定的缓冲池实例
这会减少竞争

有两个系统变量可对InnoDB缓冲池的LRU算法产生影响
1.innodb_old_blocks_pct
缓冲池的旧子列表所占的百分比
影响新子列表中的缓存块变化为旧子列表中缓存块的速度
2.innodb_old_blocks_time
一个缓存块在第一次访问后,
下次访问前,
需在旧子列表里待多少毫秒才能移到新子列表

- 配置MyISAM的键缓冲区
MyISAM在存储表时使用了单独的数据文件和索引文件
处理它们的方式也有所不同
1.为缓存从数据文件读到的数据行
或写到数据文件的数据行
MyISAM依托操作系统,
使用它的文件系统缓存机制
2.为处理索引文件
MyISAM维护了一个键缓冲区,
用它来执行基于索引的检索和排序擦做,
及索引的创建和修改操作
MyISAM的键缓冲区,默认大小为8MB
如你用了大量的MyISAM表,
且有多余内存可使用
则把键缓冲区设的大一些,
应能在处理索引相关操作时提高MyISAM的性能

配置缓冲区的方法是,
对系统变量key_buffer_size进行设置
[mysqld]
key_buffer_size=512M
MyISAM键缓冲区在所有MyISAM表之间默认是共享的
如在缓存中找不到键值
且缓存已满,
则产生竞争
此时,需丢弃当前缓存中值,
下次需要时,再从磁盘取
如某个MyISAM表被使用的频率高,
则确保其键保留在内存可带来很多好处

无论这些键是从一个表里读取,还是从其他一些表里读取,
竞争都出现
可通过把键缓存增大到足以容纳给定表全部索引的方式,
来避免同表竞争
但来自其他表的键仍会争抢缓存里空间.
可通过下面几项功能对缓存操作进行更多控制
1.可使用默认的单个键缓存
也可创建多个缓存
2.可控制总的缓存大小
缓存块大小
缓冲区丢弃算法
3.可将表分配给某些特定的缓存
并把表索引预加载到其中的某个缓存

创建一个足够大的能完全容纳下一个表的索引的缓存
并将此缓存设置为仅供这个表使用
在所有键都加载到缓存后,
便不再需要任何磁盘I/O
也不需从缓存中丢弃那些键值
针对该表的键查找也可在内存完成.

将一组被频繁使用的表分配给一个单独的键缓存
以使它们的索引缓存不会与其他表产生竞争
要允许对MyISAM键缓存进行配置,
服务器需将每一个缓存都与一组系统变量关联一起
可将这些变量分为多个组成部分
共同组成一个结构化的系统变量
结构化变量是简单系统变量的扩展,
可使用"缓存名+变量名"的语法形式对其访问.
cache_name.var_name
每个缓存结构化变量有下面几个组成部分
1.key_buffer_size
键缓存总大小
2.key_cache_block_size
键缓存的块大小
默认下,缓存块大小为1024字节
3.key_cache_limit
对缓冲区重用算法产生影响
如设置为它的默认值100
则键缓存会使用最近最少使用策略来决定重用哪些缓存缓冲区
4.key_cache_age_threshold
- 使用查询缓存
1.某条给定的SELECT语句首次执行时,
服务器记住其文本及返回结果.
返回结果不确定时,不会缓存
表被修改时,指向它的缓存查询被丢弃.

>SHOW VARIABLES LIKE 'have_query_cache';
对支持查询缓存的服务器,缓存操作依赖于下面三个系统变量值
1.query_cache_type
决定了查询缓存的操作模式
0		不缓存
1		将可缓存的查询缓存
2		只将以SELECT SQL_CACHE开头的可缓存查询缓存
2.query_cache_size
决定了分配给缓存的内存数量,单位字节
3.query_cache_limit
被缓存的结果集大小的最大值
大于此值的查询结果不被缓存

- 硬件优化
更大的内存,性能更好的磁盘,利用并行,多处理器
- 服务器日志
MySQL服务器可生成多种类型日志
1.出错日志
记录包括服务器的启动,关闭,问题或异常条件有关的消息
2.普通查询日志
记录包括客户端连接,从客户端收到的SQL语句和其他杂项
3.慢查询日志
可帮你把那些可能需重写,以求获得更好性能的语句识别出来.
4.二进制日志及二进制索引文件
这种日志由一个或多个文件构成
记录由UPDATE, DELETE, INSERT, CREATE TABLE, DROP TABLE, GRANT等语句所做的修改.
写到二进制日志里的内容都是一些以二进制格式编码的数据修改"事件"
二进制日志文件都伴随有一个索引文件,
其中列出了当时存在的那些二进制文件.
二进制日志用途:
1.服务器崩溃后,
可与备份一起配合完成表的恢复
先根据备份文件恢复数据库
再用mysqlbinlog将二进制日志的内容转换为文本语句
并使用备份后修改数据库的那些语句作为客户端mysql的输入
把数据库恢复到崩溃时状态
它形成了复制的基础.
存储在二进制日志里的数据修改事件可被传输到复制从服务器
- 中继日志及中继日志索引文件
如服务器是一个复制从服务器
它会维护一个中继日志
其中包含的是从主服务器接收到的需要被执行的数据修改事件记录
中继日志文件的格式与二进制日志文件的格式相同
它有一个索引文件
其中列出的是从服务器上存在的日志文件.

默认下,每个被启用的日志会以文件形式写到数据目录里.
对某些类型的日志,你可选择把它们写到其他地方
1.出错日志,可被发送到syslog
2.普通查询日志和慢查询日志可被写到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
- 出错日志
服务器用出错日志来记录启动,关闭,诊断和出错信息.
1.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.编号
启用了二进制日志,服务器还会创建一个附带的二进制日志索引文件
来列出现有二进制日志文件名字

如将二进制日志用于服务器间复制,
则在删除某个给定的二进制日志文件前,
要先确认其包含的内容已被复制到所有可用的从服务器
且的确不需要了.
- 中继日志
需与复制机制中的从服务器一起使用
复制从服务器负责接收来自主服务器的数据修改信息
并在接收到它们时将其写到中继日志
从服务器会将中继日志当作一个保存区
其中存储的事件会被保留到它们被从服务器执行为止

从服务器上,
一个线程负责从主服务器读取事件,写到中继日志
一个线程负责读取中继日志文件,
执行其中包含的事件,删除处理完毕的文件.

中继日志和二进制日志共同特点:
1.服务器按编号顺序创建中继日志文件
2.有一个索引文件,列出当前存在的所有中继日志文件集合
3.中继日志文件格式与二进制日志文件相同

指定--relay-log来启用
默认文件名为HOSTNAME-relay-bin.编号
- 使用日志表
启用了普通查询日志或慢查询日志功能时,
可选择让服务器把日志输出写入日志文件,
写入mysql数据库的日志表,或同时写到这两个地方.
设置general_log来启用普通查询日志
slow_query_log来启用慢查询日志
指定日志存储到table时,
分别存储到mysql数据库的general_log和slow_log
- 日志管理
1.日志轮换法
适用于文件名固定的日志文件
2.使用期限
超期日志自动删除
3.与复制有关的过期
复制从服务器按编号创建中继日志文件
会在处理完它们后将其删除
来设置max_relay_log_size调节最大大小
4.日志表截短/轮换法

日志与数据库备份要综合考虑
- 轮换固定名字的日志文件
要让固定名字的日志文件过期,
可用日志轮换方法
qlog
qlog.1
qlog.2
// 一个完成对固定名字的日志文件轮换的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
- 二进制日志文件和中继日志文件的过期处理
对二进制日志
1.
未将二进制日志用于服务器复制时
基于日志文件的使用期限[按最后一次修改时间]来决定是否过期
2.基于日志文件是否仍在使用

[mysqld]
expire_logs_day=7 // 超过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
每天早上4点半运行此脚本
- 日志表的过期或轮换
截断表
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;

猜你喜欢

转载自blog.csdn.net/x13262608581/article/details/112057343