mysql 升级

http://repo.mysql.com/
在linux上先查看系统的版本号,根据版本号对应下载
more /etc/redhat-release

rpm -Uvh http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm

yum -y upgrade mysql
mysql_upgrade



重新启动Mysql,检查字符集:
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

修改所有表和字段的字符集
ALTER TABLE tbl_name CONVERT TO CHARACTER SET character_name [COLLATE ...] 如:
ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

//批量修改所有表和字段的字符集
SELECT
CONCAT('alter table ',table_name,' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM
INFORMATION_SCHEMA.tables
WHERE
TABLE_SCHEMA='database_name'



一、首先将我的 mysql5.1 卸载。
    0、停掉mysqld 进程
     
Java代码  收藏代码

    service mysqld stop 


    1、rpm 删除
      ->查看系统安装的mysql版本
      
Java代码  收藏代码

    rpm -qa |grep mysql 

 
      ->删除 相应的server /client 包
      
Java代码  收藏代码

    rpm -e mysql-client-{你的版本} 


     
Java代码  收藏代码

    rpm -e mysql-server-{你的版本} 


       以上命令分别删除mysql 客户端和服务器端

    2、删除老版本的头文件和库文件
       ->查看文件都放到哪了
       
Java代码  收藏代码

    find / -name mysql 


      ->删除相应的文件
     
Java代码  收藏代码

    rm -rf /var/lib/mysql/     --这只是个例子,诸如此类的文件都干掉 



二、安装
   其实我是看的官方文档:yum方式快速安装
大概说下思路吧,英文好的就不要看我罗嗦了。原文罗嗦了很多了。^_^。

   1、首先配置yum 源.官方把配置源的步骤打成了rpm 包了,请下载与你的环境对应的rpm包。

  
Java代码  收藏代码

    rpm -Uvh mysql-community-release-el6-5.noarch.rpm  

    rpm -Uvh http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm

    执行这句的结果是:在/etc/yum.repo.d/ 下面 生成了如下图的两个源:  


  2、查看可以安装的rpm
Java代码  收藏代码

    yum repolist enables|grep mysql 
     
    yum search mysql   


   3、安装

Java代码  收藏代码

    yum install mysql-community-server 


   4、配置
     ->修改mysqld 服务启动的默认等级
     

   5、启动mysqld服务
Java代码  收藏代码

    service mysqld start 

scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/myhome/env/mysql/data --user=mysql

    这中间有好多问题;
     查看mysql配置文件:vim /etc/my.conf
     找到日志文件放在哪里了,打开日志文件,看报啥错。。具体问题具体分析吧。




# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
[client]
password        = mysql!@#
port            = 3306
default-character-set=utf8

[mysqld]
port            = 3306
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
#(注意linux下mysql安装完后是默认:表名区分大小写,列名不区分大小写; 0:区分大小
写,1:不区分大小写) 
lower_case_table_names=1
##(设置最大连接数,默认为 151,MySQL服务器允许的最大连接数16384; ) 
max_connections=2000
wait_timeout=30
table_open_cache = 2048
thread_cache_size = 256
thread_concurrency = 8



socket=/var/lib/mysql/mysql.sock

datadir=/myhome/env/mysql/data

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysql]
default-character-set = utf8

[mysqld_safe]
#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-error=/myhome/env/mysql/log/mysqld.log



show variables like '%collation%';

show variables like '%char%';


================================
Mysql性能调优(my.cnf参数篇)
MySQL的合理优化,直接影响到DB的速度和承载量!
MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识,同时还需要长时间的观察统计并且根据经验进行判断,然后设置合理的参数。

本主题调优针对于my.cnf配置来做详细的参数说明
示例配置如下:
#cat my.cnf
# MySQL client library initialization.
[client]
port            = 3306
socket          = /tmp/mysql.sock
character-set-server = utf8

# The MySQL server
[mysqld]
init_connect = 'set names utf8' //设定连接mysql数据库时使用utf8编码,以让mysql数据库以utf8运行
  >show variables like 'character%'\G; 可查询mysql字符相关
init_connect = 'SET autocommit=0' //关闭自动提交模式,就认为用户总是以事务方式操作
character-set-server = utf8
port            = 3306
socket          = /tmp/mysql.sock
basedir         = /opt/justone/mysqldM/mysql
datadir         = /opt/justone/mysqldM/mysql/data
skip-locking //避免MySQL的外部锁定,减少出错几率增强稳定性。
#skip-networking //开启该选项即彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!
skip_name_resolve //禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!
#back_log = 384 //监听队列中所能保持的连接数即保存了在MySQL连接管理器线程处理之前的连接。
  back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。
  如果一个短时间内有很多连接,则需要增大该参数的值,来指定到来的TCP/IP连接的侦听队列的大小。
  不同的操作系统在这个队列大小上有它自己的限制。试图设定back_log高于你的操作系统的限制将是无效的。
  默认值为50。对于Linux系统推荐设置为小于512的整数。系统值由ulimit -a查看。
max_connections = 2000 //允许的同时客户的数量。增加该值即增加mysqld要求的文件描述符的数量。
  注:该值过小,客户端会经常有Too many connections 错误。
wait_timeout=10 //指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。
max_connect_errors = 500 //如同一主机有超出该参数值个数的中断错误连接,则该主机将被禁止连接。
  如需对该主机进行解禁,执行:FLUSH HOST;
table_open_cache = 2048 //所有线程打开表的数量
max_allowed_packet = 16M //一个查询语句包的最大尺寸,信息交换中使用信息包的允许大小(如:导入表)
    用客户端工具如sqlyog异地cp数据库出错时,可考虑加大此值。
max_heap_table_size = 256M //HEAP数据表(内存表)的最大长度(默认设置是16M);
  超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里。
sort_buffer_size = 512K //查询排序时所能使用的缓冲区大小。
  该参数对应的分配内存是每连接独占,如有100个连接,实际分配的排序缓冲区大小为100×512K=50MB。
  所以,对于内存在4GB左右的服务器推荐设置为6-8M。
join_buffer_size = 1M //联合查询操作所能使用的缓冲区大小,该参数对应的分配内存也是每连接独享.
thread_cache_size = 8 //可以复用的保存在线程缓存中的线程的数量.内存G*8即2G设为16
  数据库的每一个连接都要使用自己的线程。线程创建需要时间,所以如果这个连接关闭时并不需要关闭这个线程,服务器会把它保存在自己的线程缓存中,以便下一个连接使用。
thread_concurrency = 8 //该参数取值为服务器逻辑CPU数量×2
bulk_insert_buffer_size = 8M //指定 MyISAM 类型数据表表使用特殊的树形结构的缓存。
  使用整块方式(bulk)能够加快插入操作( INSERT … SELECT, INSERT … VALUES (…), (…), …, 和 LOAD DATA INFILE) 的速度和效率。该参数限制每个线程使用的树形结构缓存大小,如果设置为0则禁用该加速缓存功能。注意:该参数对应的缓存操作只能用户向非空数据表中执行插入操作!默认值为 8MB。
query_cache_size = 64M //指定MySQL查询缓冲区的大小。
  可以通过在MySQL控制台执行以下命令观察:
  > SHOW VARIABLES LIKE '%query_cache%';
  > SHOW STATUS LIKE 'Qcache%';
  Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况;
  Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲;
  Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。
default-storage-engine = InnoDB //新数据表的默认数据表类型 默认设置是MyISAM
lower_case_table_names = 1 //MySQL实现不区分大小写
transaction_isolation = REPEATABLE-READ //设置所有连接的默认事务隔离级
tmp_table_size = 256M //临时HEAP数据表的最大长度
  默认设置是32M; 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。
slow_query_log = 1
log = /opt/justone/mysqldM/mysql/logs/mysql.log
long_query_time = 2
log-slow-queries = /opt/justone/mysqldM/mysql/logs/slowquery.log
# Replication related settings
server-id = 1 //设定为master
log-bin=mysql-bin //产生的log以mysql-bin开头
binlog_cache_size = 8M //为binary log指定在查询请求处理过程中SQL 查询语句使用的缓存大小。
  如果频繁应用于大量、复杂的SQL表达式处理,则应该加大该参数值以获得性能提升。
binlog_format=mixed //日志格式,亦可自定义。

InnoDB和MyISAM类型区别
  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。
  基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
  MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
  InnoDB注意的地方:
  1.InnoDB不支持FULLTEXT类型的索引。
  2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
  3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
  4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
  5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
  6.InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “�a%”

# MyISAM Specific options
key_buffer_size = 32M //索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写)
  索引块是缓冲的并且被所有的线程共享。如果你使它太大,系统将开始换页并且真的变慢了。
  默认数值是8388600(8M),MySQL主机有2GB内存,可设为402649088(400MB)。
  注意:该参数值设置的过大反而会是服务器整体效率降低!
read_buffer_size = 256K //读查询操作所能使用的缓冲区大小,该参数对应的分配内存也是每连接独享.
read_rnd_buffer_size = 256K //针对按某种特定顺序(如ORDER BY子句)输出的查询结果(默认256K)
  加速排序操作后的读数据,提高读分类行的速度。
myisam_sort_buffer_size = 128M //myisam引擎的sort_buffer_size
myisam_max_sort_file_size = 10G //类似于上
myisam_recover //自动检查和修复无法正确关闭MyISAM表
#skip-innodb //去掉innodb支持
#skip-bdb //去掉bdb事务型表支持

# INNODB Specific options ***
innodb_additional_mem_pool_size = 16M //InnoDB用来存储数据字典和其他内部数据结构的内存池大小。
  应用程序里的表越多就应该分配越多的内存,如果innodb用光了这个内存就会向系统内存要。
  并且写入警告日志,根据MySQL手册,对于2G内存的机器,推荐值是20M。
  缺省值是1M。通常不用太大,只要够用就行,与表结构的复杂度有关系。
#innodb_buffer_pool_size = 6G //指定大小的内存来缓冲数据和索引。
  对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。
  根据MySQL手册,对于2G内存的机器,推荐值是1G(50%)
innodb_buffer_pool_size = 512M
innodb_data_file_path = ibdata1:10M:autoextend //用来容纳InnoDB为数据表的表空间:
  可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出;
  表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。
  例如,ibdata1:1G;ibdata2:1G:autoextend:max:2G的意思是:
    表空间文件ibdata1的最大长度是1GB,ibdata2的最大长度也是1G,但允许它扩充到2GB。
  除文件名外,还可以用硬盘分区的设置名来定义表空间,此时必须给表空间的最大初始长度值加上newraw关键字做后缀,给表空间的最大扩充长度值加上raw关键字做后缀(例如/dev/hdb1:20Gnewraw或/dev/hdb1:20Graw); MySQL 4.0及更高版本的默认设置是ibdata1:10M:autoextend。
innodb_file_io_threads = 4 //IO操作(硬盘写操作)的最大线程个数(默认设置是4)。
innodb_file_per_table = 1 //为每一个新数据表创建一个表空间文件而不是把数据表都集中保存在中央表空间里
  如果系统中表的个数不多,并且没有超大表,使用该参数可以使得各个表之间的,维护相对独立。
innodb_thread_concurrency = 16 //InnoDB驱动程序能够同时使用的最大线程个数(默认设置是8)。
innodb_flush_log_at_trx_commit = 1 //InnoDB记录日志的方式。
  如果设置为1,则每个事务提交的时候,MySQL都会将事务日志写入磁盘。
  如果设置为0或者2,则大概每秒中将日志写入磁盘一次。
  实际测试发现,该值对插入数据的速度影响非常大
    设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。
  建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。
  在存在丢失最近部分事务的危险的前提下,可以把该值设为0。
innodb_log_buffer_size = 8M //日志缓存的大小
  默认的设置在中等强度写入负载以及较短事务的情况下,一般可以满足服务器的性能要求。
  如果更新操作峰值或者负载较大就应该加大这个值。8-16M即可。
innodb_log_file_size = 256M //日志组中每个日志文件的大小 在高写入负载尤其是大数据集的情况下很重要。
  这个值越大性能就越高,但恢复时时间会加长。默认是5M。 Javaeye推荐innodb_log_file_size = 64M
  需要注意的是 修改完以后要STOP服务 接着删除原来的日志ib_logfile0和ib_logfile1,然后启动服务.
  整体性能分析报告> show engine innodb status\G;
innodb_log_files_in_group = 3 //日志组中的日志文件数目,推荐使用3
innodb_max_dirty_pages_pct = 90 //最大脏页的百分数
  当系统中脏页所占百分比超过这个值,INNODB就会进行写操作以把页中的已更新数据写入到磁盘文件中。
innodb_flush_method = O_DIRECT //InnoDB日志文件的同步办法(仅适用于UNIX/Linux系统)。
  O_DIRECT跳过了操作系统的文件系统Disk Cache,让MySQL直接读写磁盘。
innodb_lock_wait_timeout = 120 //事务获得资源超时设置,默认50s
  如果某个事务在等待n秒(s)后还没有获得所需要的资源,就使用ROLLBACK命令放弃这个事务。
  这项设置对于发现和处理未能被InnoDB数据表驱动程序识别出来的死锁条件有着重要的意义。
  但是不能对表锁导致的死锁进行自动监测。

[mysqldump]
quick //不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。
  不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项
max_allowed_packet = 16M

[mysql]
no-auto-rehash //不自动补齐命令,设置auto-rehash为自动补齐。默认TAB补齐
#safe-updates //仅仅允许使用键值的 UPDATE 和 DELETE

[myisamchk] //MyISAM表维护的一个非常实用的工具。
  可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。
  myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。
key_buffer_size = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M

[mysqlhotcopy]
interactive-timeout //把一个数据传输的最大时间量设置为默认的28800秒

[mysqld_safe]
open-files-limit = 8192 //每个进程的可打开文件数量.
  确认你已经将系统限制设定的足够高 #ulimit -HSn 65536

另:服务器硬件对MySQL性能的影响
  a) 磁盘寻道能力(磁盘I/O)
    目前高转速SCSI硬盘(7200转/秒)理论上每秒寻道7200次,物理特性,无法改变.
    MySQL每秒钟都在进行大量、复杂的查询操作,对磁盘的读写量可想而知。
    磁盘I/O是制约MySQL性能的最大因素之一.如:日均访问100Wpv的论坛.
    由于磁盘I/O的制约,MySQL的性能会非常低下,可以考虑以下几种解决方案:
      使用RAID-0+1磁盘阵列
        注意不要尝试使用RAID-5,MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快;
      抛弃传统的硬盘,使用速度更快的闪存式存储设备。
        经过Discuz!公司技术工程的测试,使用闪存式存储设备可比传统硬盘速度高出6-10倍左右。
  b) CPU 对于MySQL应用,推荐使用S.M.P.架构的多路对称CPU,例如:两颗Intel Xeon 3.6GHz的CPU。
  c) 服务器内存建议不要小于2GB,推荐使用4GB以上的物理内存。
Msyql

参数调优针对

my.cnf

文件进行优化:

[mysqld]
skip-locking(取消文件系统的外部锁)
skip-name-resolve(不进行域名反解析注意由此带来的权限/授权问题)
key_buffer_size = 256M(分配给MyISAM索引缓存的内存总数)

对于内存在4GB左右的服务器该参数可设置为256M或384M。


注意:该参数值设置的过大反而会是服务器整体效率降低!

 
  max_allowed_packet = 4M

(允许最大的包大小)



  thread_stack = 256K

(每个线程的大小)



  table_cache = 128K

(缓存可重用的线程数)



  back_log

=

384

(临时停止响应新请求前在短时间内可以堆起多少请求,如果

你需要在短时间内允许大量连接,可以增加该数值)



  sort_buffer_size = 2M(

分配给每个线程中处理排序

)

  read_buffer_size = 2M

(读取的索引缓冲区大小)



  join_buffer_size = 2M

(分配给每个线程中处理扫描表连接及索引的内存)



  myisam_sort_buffer_size = 64M



myisam

引擎排序缓冲区的大小)



  table_cache = 512

(缓存数据表的数量,避免重复打开表的开销)



  thread_cache_size = 64

(缓存可重用线程数,见笑创建新线程的开销)



  query_cache_size = 64M

(控制分配给查询缓存的内存总量)



  tmp_table_size = 256M(

指定

mysql

缓存的内存大小

)

  max_connections = 768

(最大连接数)指

mysql

整个的最大连接数



max_connect_errors = 10000(

最大连接错误数据

)

  wait_timeout = 10

(超时时间,可以避免攻击)



  thread_concurrency = 8

(根据

cpu

数量来设置)



  skip-bdb

禁用不必要的引擎



  skip-networking

(关闭

mysql tcp/ip

连接方式)



  Log-slow-queries = /var/log/mysqlslowqueries.log

  long_query_time = 4

(设定慢查询的时间)



  skip-host-cache(

提高

mysql

速度的

)

  open_files_limit = 4096(

打开文件数)



interactive_timeout = 10(

服务器在关闭它前在一个交互连接上等待行动的秒



)

max_user_connections = 500

(最大用户连接数)

  

 

Mysql

内存使用公式:实际物理内存计算公式

key_buffer_size +

(read_buffer_size + sort_buffer_size)*max_connections 

MAX_QUERIES_PER_HOUR

用来限制用户每小时运行的查询数量:



mysql> grant all on dbname

。* to db@localhost identified by “123456”

with max_connections_per_hour 5;





db

用户在

dbname

的数据库上控制用户每小时打开新连接的数量为

5

个)



MAX_USER_CONNECTIONS

限制有多少用户连接

MYSQL

服务器:



mysql> grant all on dbname

。* to db@localhost identified by “123456”

with max_user_connections 2;





db

用户在

dbname

的数据库

账户一次可以同时连接的最大连接数为

2







MAX_UPDATES_PER_HOUR

用来限制用户每小时的修改数据库数据的数量:



mysql> grant all on dbname

。* to db@localhost identified by “123456”

with max_updates_per_hour 5;





db

用户在

dbname

的数据库上控制用户每小时修改更新数据库的次数为

5

次)



MAX_USER_CONNECTIONS

用来限制用户每小时的修改数据库数据的数量:



mysql> grant all on dbname



* to db@loc

alhost identified by “123456”



With

MAX_QUERIES_PER_HOUR 20





mysql

单个用户的最大连接数





db

用户在

dbname

的数据库上控制

用户每小时的连接数



20

个)


=======================================================



2.



+---------------------+-----------+ 



3.



| Variable_name       | Value     | 



4.



+---------------------+-----------+ 



5.



| max_heap_table_size |

134217728





6.



| tmp_table_size      |

134217728





7.



+---------------------+-----------+ 





需要增加

tmp_table_size 



7,open table

的情况





1.



mysql> show global status like

'open%tables%'





2.



+---------------+-------+ 



3.



| Variable_name | Value | 



4.



+---------------+-------+ 



5.



| Open_tables   |

1024

  | 



6.



| Opened_tables |

1465

  | 



7.



+---------------+-------+ 





Open_tables

表示打开表的数量,

Opened_tables

表示打开过的表数量,

如果

Opened_tables

数量过大,

说明配置中



table_cache(5.1.3

之后这个值叫做

table_open_cache)

值可能太小,我们查询一下服务器

table_cache



 

1.



mysql> show variables like

'table_cache'





2.



+---------------+-------+ 



3.



| Variable_name | Value | 



4.



+---------------+-------+ 



5.



| table_cache   |

1024

  | 



6.



+---------------+-------+ 





Open_tables / Opened_tables * 100% =69%

理想值





>= 85%



 

Open_tables / table_cache * 100% = 100%

理想值



(<= 95%) 



8,

进程使用情况

 

1.



mysql> show global status like

'Thread%'





2.



+-------------------+-------+ 



3.



| Variable_name     | Value | 



4.



+-------------------+-------+ 



5.



| Threads_cached    |

31

    | 



6.



| Threads_connected |

239

   | 



7.



| Threads_created   |

2914

  | 



8.



| Threads_running   |

4

     | 



9.



+-------------------+-------+ 







如果我们在

MySQL

服务器配置文件中设置了

thread_cache_size



当客户端断开之后,

服务器处理此客户的线程将会缓存起来以响应

下一个客户而不是销毁

(前提是缓存数未达上限)



Threads_created

表示创建过的线程数,

如果发现

Threads_created

值过大的话,

表明



MySQL

服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中

thread_cache_size

值,查询服务器



thread_cache_size

配置:

 

1.



mysql> show variables like

'thread_cache_size'





2.



+-------------------+-------+ 



3.



| Variable_name     | Value | 



4.



+-------------------+-------+ 



5.



| thread_cache_size |

32

    | 



6.



+-------------------+-------+ 





9,

查询缓存

(query cache)



1.



mysql> show global status like

'qcache%'





2.



+-------------------------+----------+ 



3.



| Variable_name           | Value    | 



4.



+-------------------------+----------+ 



5.



| Qcache_free_blocks      |

2226

     | 



6.



| Qcache_free_memory      |

10794944





7.



| Qcache_hits             |

5385458

  | 



8.



| Qcache_inserts          |

1806301

  | 



9.



| Qcache_lowmem_prunes    |

433101

   | 



10.



| Qcache_not_cached       |

4429464

  | 



11.



| Qcache_queries_in_cache |

7168

     | 



12.



| Qcache_total_blocks     |

16820

    | 



13.



+-------------------------+----------+ 





Qcache_free_blocks

:缓存中相邻内存块的个数。数目大说明可能有碎片。

FLUSH QUERY CACHE

会对缓存中的碎片进行整理,从

而得到一个空闲块。

 

Qcache_free_memory

:缓存中的空闲内存。

 

Qcache_hits

:每次查询在缓存中命中时就增大

 

Qcache_inserts

:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。

 

Qcache_lowmem_prunes

:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果

这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。

(

上面的

free_blocks



free_memory

可以告诉您属于哪种情况)

 

Qcache_not_cached

:不适合进行缓存的查询的数量,通常是由于这些查询不是



SELECT

语句或者用了

now()

之类的函数。

 

Qcache_queries_in_cache

:当前缓存的查询(和响应)的数量。

 

Qcache_total_blocks

:缓存中块的数量。

 

我们再查询一下服务器关于

query_cache

的配置:

 

1.



mysql> show variables like

'query_cache%'





2.



+------------------------------+----------+ 



3.



| Variable_name                | Value    | 



4.



+------------------------------+----------+ 



5.



| query_cache_limit            |

33554432





6.



| query_cache_min_res_unit     |

4096

     | 



7.



| query_cache_size             |

33554432





8.



| query_cache_type             | ON       | 



9.



| query_cache_wlock_invalidate | OFF      | 



10.



+------------------------------+----------+ 





各字段的解释:

 

query_cache_limit

:超过此大小的查询将不缓存

 

query_cache_min_res_unit

:缓存块的最小大小

 

query_cache_size

:查询缓存大小

 

query_cache_type

:缓存类型,决定缓存什么样的查询,示例中表示不缓存



select sql_no_cache

查询

 

query_cache_wlock_invalidate

:当有其他客户端正在对

MyISAM

表进行写操作时,如果查询在

query cache

中,是否返回

cache



果还是等写操作完成再读表获取结果。

 



query_cache_min_res_unit

的配置是一柄



双刃剑



,默认是

4KB

,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,

就容易造成内存碎片和浪费。

 



查询缓存碎片率



= Qcache_free_blocks / Qcache_total_blocks * 100% 



如果查询缓存碎片率超过

20%

,可以用

FLUSH QUERY CACHE

整理缓存碎片,或者试试减小

query_cache_min_res_unit

,如果你

的查询都是小数据量的话。

 



查询缓存利用率



= (query_cache_size – Qcache_free_memory) / query_cache_size * 100% 



查询缓存利用率在

25%

以下的话说明

query_cache_size

设置的过大,可适当减小;查询缓存利用率在

80

%以上而且

Qcache_lowmem_prunes > 50

的话说明

query_cache_size

可能有点小,要不就是碎片太多。

 



查询缓存命中率



= (Qcache_hits – Qcache_inserts) / Qcache_hits * 100% 



示例服务器



查询缓存碎片率







20.46

%,查询缓存利用率







62.26

%,查询缓存命中率







1.94

%,命中率很差,可能写操作比较

频繁吧,而且可能有些碎片。

 



10,

排序使用情况





1.



mysql> show global status like

'sort%'





2.



+-------------------+----------+ 



3.



| Variable_name     | Value    | 



4.



+-------------------+----------+ 



5.



| Sort_merge_passes |

2136

     | 



6.



| Sort_range        |

81888

    | 



7.



| Sort_rows         |

35918141





8.



| Sort_scan         |

55269

    | 



9.



+-------------------+----------+ 





Sort_merge_passes

包括两步。

MySQL

首先会尝试在内存中做排序,

使用的内存大小由系统变量



Sort_buffer_size

决定,

如果它的

大小不够把所有的记录都读到内存中,

MySQL

就会把每次在内存中排序的结果存到临时文件中,等



MySQL

找到所有记录之后,再

把临时文件中的记录做一次排序。这再次排序就会增加



Sort_merge_passes

。实际上,

MySQL

会用另一个临时文件来存再次排序的

结果,所以通常会看到



Sort_merge_passes

增加的数值是建临时文件数的两倍。因为用到了临时文件,所以速度可能会比较慢,增





Sort_buffer_size

会减少



Sort_merge_passes





创建临时文件的次数。但盲目的增加



Sort_buffer_size

并不一定能提高速度,





How fast can you sort data with MySQL?

(引自

http://qroom.blogspot.com/2007/09/mysql-select-sort.html



 



另外,增加

read_rnd_buffer_size(3.2.3



record_rnd_buffer_size)

的值对排序的操作也有一点的好处,参见:

http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is- read_rnd_buffer_size/ 







11.

文件打开数

(open_files)



1.



mysql> show global status like

'open_files'





2.



+---------------+-------+ 



3.



| Variable_name | Value | 



4.



+---------------+-------+ 



5.



| Open_files    |

821

   | 



6.



+---------------+-------+ 



7.



 



8.



mysql> show variables like

'open_files_limit'





9.



+------------------+-------+ 



10.



| Variable_name    | Value | 



11.



+------------------+-------+ 



12.



| open_files_limit |

65535





13.



+------------------+-------+ 





比较合适的设置:

Open_files / open_files_limit * 100% <= 75



 

正常

 



12,

表锁情况





1.



mysql> show global status like

'table_locks%'





2.



+-----------------------+---------+ 



3.



| Variable_name         | Value   | 



4.



+-----------------------+---------+ 



5.



| Table_locks_immediate |

4257944





6.



| Table_locks_waited    |

25182

   | 



7.



+-----------------------+---------+ 





Table_locks_immediate

表示立即释放表锁数,

Table_locks_waited

表示需要等待的表锁数,如果



Table_locks_immediate /

Table_locks_waited > 5000

,最好采用

InnoDB

引擎,因为

InnoDB

是行锁而

MyISAM

是表锁,对于高并发写入的应用

InnoDB

效果

会好些

.



13.

表扫描情况





1.



mysql> show global status like

'handler_read%'





2.



+-----------------------+-----------+ 



3.



| Variable_name         | Value     | 



4.



+-----------------------+-----------+ 



5.



| Handler_read_first    |

108763

    | 



6.



| Handler_read_key      |

92813521

  | 



7.



| Handler_read_next     |

486650793





8.



| Handler_read_prev     |

688726

    | 



9.



| Handler_read_rnd      |

9321362

   | 



10.



| Handler_read_rnd_next |

153086384





11.



+-----------------------+-----------+ 









各字段解释参见

http://hi.baidu.com/thinkinginlamp/blog/item/31690cd7c4bc5cdaa144df9c.html

,调出服务器完成的查询请求次数:

 

1.



mysql> show global status like

'com_select'





2.



+---------------+---------+ 



3.



| Variable_name | Value   | 



4.



+---------------+---------+ 



5.



| Com_select    |

2693147





6.



+---------------+---------+ 





计算表扫描率:

 

表扫描率







Handler_read_rnd_next / Com_select 



如果表扫描率超过

4000

,说明进行了太多表扫描,很有可能索引没有建好,增加

read_buffer_size

值会有一些好处,但最好不要超过

8MB



 
 
                                                             

猜你喜欢

转载自ssydxa219.iteye.com/blog/2113090