MySQL的日常管理

时间:2022-09-21 21:22:01

1 为初始MySQL账户设置口令

MySQL服务器的所有用户都存放在mysql数据库中的user表中,其中host字段表示允许访问的host地址,user字段表示用户名,password表示密码,刚安装的没有密码这一项,所有管理员应该为password设置一个密码

2 服务器的启动和关停

应该以root以外的一个固定的用户来维护MySQL服务器。

启动mysql              /etc/init.d/mysql start

指定服务器启动选项

服务器启动选项放在【mysqld】选项组内

3 管理MySQL用户账户

作为一名非专业DBA我认为这里不是很重要,平时我们多是对数据库数据的操作和使用,而不是用户,所以说,这里我就先不说了

4 维护日志文件

MySQL服务器可以生成多种日志,他们在故障诊断、改善服务器性能、建立复制机制和崩溃恢复方面等工作中很有用。具体的可以生成出错日志(log-error)、常规查询日志(log)、慢查询日志(log-slow-queries)、二进制(log-bin)和二进制索引文件(log-bin-index)、中继日志(log-relay)和中继日志索引文件(relay-log-index)

  4.1 出错日志 

   在LINUX上,mysqld是不创建出错日志的,他会把错误发送到控制台,可以通过配置文件增加选项组[mysqld]一个log-error来将错误生成到一个文件中(这里最好设置为绝对路径,因为mysql版本不用,对于此选项的处理不同)

   windows下,默认会生成错误日志,名称会命名为hostname.err

   4.2 常规日志

   里面记录的是客户何时连接了服务器、客户向服务器发送的每一条语句以及各种各样的事件。

   4.3 慢查询日志

   慢日志记录这很长时间才能执行完毕的查询

   判断“很长时间”的标准是系统变量long_query_time的值,以秒为单位,默认值是10秒。MySQL5.1.21之前的最小值是1,默认值是10.之后可以有小数部分,最小值可以是0

   还有几个选项会影响到服务器把那些信息写入慢日志

   log-short-format 将导致服务器把较少的信息写入日志

   log-queries-not-using-indexes 导致服务器把在执行时没有用到任何索引的查询记录到慢日志

   log-slow-admin-statements导致服务器把"慢"的系统管理语句如ANALYZE TABLE或者 ALTER TABLE也记录到慢日志

   4.4 二进制日志和二进制日志索引文件

   MySQL 服务器用二进制日志记录数据修改”事件“,如INSERT UPDATE DELETE 等会导致数据发生变化的语句。很明显SELECT不会记录。但比如UPDATE t SET I = I 这样的

   update语句也不会记录到二进制日志里,以为它没有对数据作出真正的改变

   二进制日志可以用于数据库备份和恢复,另外如果想配置主从的话必须启用二进制日志

   二进制日志通过log-bin选项指定,默认用hostname-bin.000001、hostname-bin.00002,如果指定名称的话会按照名称以此类推。如果指定扩展名,会忽略扩展名。二进制 

  文件的最大长度由系统变量max_binlog_size决定

   4.5 中继日志和中继日志索引文件

   主从复制中的从服务器把主服务器的数据修改信心即主服务器的二进制日志在接受到自己的服务器时写入它的中继日志。。。中继日志就像是一个临时文件,里面盛放着排队 

   等待执行的信息

    中继日志和二进制日志非常相似,包括中继日志的名称,最大的长度以及索引名称。

   4.6 日志管理

   日志可能会产品大量的信息,为了不使日志充满硬盘。我们可以使用日志文件过期失效技术,下面讲一下日志失效技术

   4.6.1 轮转一组名称不固定的日志文件

   什么是日志轮转呢?首先我们得明确目的是什么,就是减少硬盘的使用。日志轮转是针对日志信息写入固定文件名的文件中的,如常规日志和慢日志。这些文件如果不设

   定最大值的话就会越变越大,但如果设定的话就只能盛放一定数量的信息,所以我们使用一组轮转的日志来存放最近你想要存放的日志。比如有一个常规日志名称叫做

   routine-log.第一次轮转的时候把名称routine-log改名为routine-log1,并且让服务器新生成一个routine-log日志。第二次的时候将routine-log1改名为routine-log2,routine-log改

  名为routine-log1,并且让服务器新生成一个新routine-log.明白了吗?也就是rouine-log始终是最新的,具体生成多少个由服务器的繁忙程度来定,这样我们就可以分析最新的几

  日志,而降其他的删掉,达到减少使用硬盘的目的。具体的失效就不说了,我也没看明白。

   4.6.2 二进制日志和中继日志文件的时效处理

   这里分两种情况,是否用于主从复制的二进制日志。若是不需用主动复制,则只需设置expire_logs_days这个系统参数即可,若设置了这个参数服务器将自动对那些时间超过

   设置值的二进制日志进行失效操作并更新二进制日志索引文件。这一点是很简单了

   若是需要主从复制,肯定就不能单纯的设置过期时间了,如果因为种种原因日志过期了但从服务器没有执行这些二进制日志怎么办呢?所以这里我们的原则是从服务器执行了

   这些日志之后才能设置失效。这时到从服务器上执行show slave status\G;查看当前正在同步哪一个二进制文件,删除这个二进制日志之前的所有文件即可。

   中继日志不要刻意的删除,因为它就像是临时文件执行完了之后就会自动删除

   4.6.3 让日志失效工作自动完成

    使用定时任务crontab来定时执行脚本,删除或使日志失效

5 调整MySQL服务器

MySQL的一些系统变量会对运行情况产品影响,比如决定索引大小的变量。一些状态变量能让我们及时了系统运行状况,下面我们介绍下这些变量的设置和查看办法

绝大多数系统变量都可以在服务器启动或者选项文件中进行设置。系统变量按照作用范围分为:全局级和会话级。很明显全局变量将影响整个服务器的操作,而会话变量只会影响一个给定的客户连接。有些系统变量会有全局级和会话级两种形式,有些只有一种。

5.1 查看系统变量用show variables.这是最简单的,从MySQL5.0.2开始,可以给show variables语句增加where条件来帮助查询,比如

show variables where variable_name like '%timeout%' and value < 60;

show variables语句优先显示系统变量在会话级的值,若想显示全局级的需指定

show global varialbes;

show session variables;local是session的同义词

变量的值可以用@@global.var_name或者@@local.var_name或者@@session.var_name来查看。比如select @@wait_timeout

5.2 在启动服务器时设置系统变量的值

可以把变量名视为一个选项名直接设置它的值。如mysqld --max_connection=200

也可以在选项文件中设置它的值

【mysqld】

max_connection=200

5.3 通用性系统变量

有些系统变量在优化MySQL服务器时很有用,下面介绍常用的几个

5.3.1 delay_queue_size 这是排队等待插入数据表的选项,加大这个值将使更多的insert delayed语句更快的得到执行

5.3.2 max_allowed_packet  MySQL服务器与客户端之间进行通信时使用的缓冲区的最大长度。默认为1M,最大可设置为1G;如果你的客户经常传一些非常大的文件,比如blob text等,你就需要调整这个参数的大小。

5.3.2 max_connections 服务器语序同时打开状态的最大客户连接数

5.3.3 table_cache  数据表缓存的尺寸。加大这个值,可以同事打开更多的数据表,从而减少文件打开 关闭操作的次数

5.4 查看状态变量的值

show status;

6 存储引擎的配置

6.1 为MySQL服务器挑选存储引擎

默认使用的存储引擎是MyISAM,但我们可以在服务器启动或运行时修改

可以这样修改。1 在选项文件中添加

[mysqld]

default-storage-engine=innodb或者

set global storage-engine=innodb

set session storage-engine=innodb

可以用show engines;来查看数据库有哪些存储引擎可供使用。

6.2 配置MyISAM存储引擎

MyISAM将索引数据放在自己的键缓存区进行管理,键缓冲区是最重要的配置资源之一。键缓存区的基本用途之一是帮助完成基于索引的数据检索和排序。以及索引的创建和修改

在键缓存区里没能找到的所需要的索引值被称为“脱靶值”,必须从硬盘读取。能找到的索引值被称为“命中值”。

某个缓冲块所包含的索引值被使用的越频繁,他在键缓存区里呆的时间就越长。

键缓冲区的尺寸可以通过key_buffer_size来设置。默认是8M.最大可设置为4G.默认为16M

可以有好几个键缓存区

   用户可以对缓存区的总长度、缓冲块的单位长度和缓冲块的丢弃算法进行调控。

   用户可以把一个或多个数据表关联到某个指定的键缓冲区

   用户可以把一个或多个数据表的索引预先加载到某个特定的键缓冲区。

创建多个键缓存区的目的是减少它本身的占用冲突。如果某个或某几个数据表上的访问量很大,为他们分配一个专用的缓存区就不在与其他数据表竞争使用默认缓存区。

键缓存区可以这么设置

my_cache.key_buffer_size = 24M;

创建完一个键缓存之后就可以用CACHE INDEX语句把MyISAM数据表分配给它。如下面是将表member和president分配给键缓存区my_cache

CACHE INDEX member,president IN my_cache;

接下来,如果你愿意,还可以用LOAD INDEX INTO CACHE 语句把数据表的索引提前加载到指定的键缓存中去

LOAD INDEX INTO CACHE membe,president

如果想删除某个现有的键缓存,只需要将他的值设置为零即可。当一个索引缓存被删掉后,指定到这个缓存的所有索引都被重新指向到了默认索引缓存中去。

每个键缓存区都有一组相应的系统变量相关联。这些变量都是想关联的,访问这些变量必须通过键缓存区加变量名的语法来访问,比如cache_name.var_name.

每个键缓存区有以下元素构成

key_buffer_size 键缓存的总长度,以字节为单位。

key_cache_block_size。键缓存快的单位长度,以字节为单位。默认为1024

key_cache_division_limit 它控制缓存块重用算法,默认值为100.如果这个值为100,MySQL将使用“最近最少使用”算法来确定该重新使用哪一个缓存块。如果把这个值设置为小于

100,MySQL将使用“中点插入”算法把这个缓存区切割成“暖链”和“热链”。在使用中点插入的时候,访问最频繁肯定放在热链中,随着某个缓冲块的访问量 的增加或减少,

MySQL服务器将把它挪到热链或者暖链中去。而对缓存块的重新使用和覆盖总是发生在暖链里的缓存块上。

key_cache_age_threshold 如果键缓存区的热链里的某个缓存快在这个变量所设定的时间里没有被访问过,MySQl服务器就将它调整到暖链中去

关于MyISAM的优化

6.2.1 优化索引缓存

通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例 key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。Key_read_requests:从缓存读取索引的请求次数。Key_reads:从磁盘读取索引的请求次数。

6.2.2 优化查询缓存

MySQL提供了查询缓冲机制。使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。

Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,这个值是由于内存过少而导致query_cache_size被删除的条数。加大query_cache_size,尽可能保持这个值0增长

Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小。Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。

此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。

Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多query_cache_type指定是否使用查询缓冲

在 SHOW STATUS 中,你可以监视查询缓存的性能:
变量 含义
Qcache_queries_in_cache 在缓存中已注册的查询数目
Qcache_inserts 被加入到缓存中的查询数目
Qcache_hits 缓存采样数数目
Qcache_lowmem_prunes 因为缺少内存而被从缓存中删除的查询数目
Qcache_not_cached 没有被缓存的查询数目 (不能被缓存的,或由于 QUERY_CACHE_TYPE)
Qcache_free_memory 查询缓存的空闲内存总数
Qcache_free_blocks 查询缓存中的空闲内存块的数目
Qcache_total_blocks 查询缓存中的块的总数目

6.2.3 表缓存table_cache

table_cache指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现 open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。

6.3 配置InnoDB存储引擎

InnoDB默认使用一个共享表空间存储所有数据和结构信息。此外,它也可以配置成把每个数据表用它自己的表空间文件来表示。

忽然想到一个问题,平时我绝大多数用的存储引擎是MYISAM,所以就先不了解InnoDB.了