存档

文章标签 ‘服务器安全’

Win 2008安装IIS7时提示安装失败,错误代码0×80070643解决方案

2015年5月7日 没有评论

经过各种百度发现,这可能是微软产品的一个安装策略问题,原因就不深究了,简单说下解决方案:
1、禁用WAS,即Windows进程激活服务功能(Windows Process Activation Service)。在开始,运行,输入:
dism.exe /online /disable-Feature /featurename:WAS-WindowsActivationService
2、卸载II7,并重启计算机。
3、再次重新安装IIS7。注意重启完后。进入后需要卸载II7,有个过程,一定要点时间等跳出对话完成卸载II7。
4、启用WAS,在开始,运行,输入:
dism.exe /online /enable-Feature /featurename:WAS-WindowsActivationService
dism.exe /online /enable-Feature /featurename:NetFxEnvironment

Apache错误:(20014)Internal error: Error retrieving pid file logs/httpd.pid

2015年5月2日 没有评论

今天在虚拟机上打开apache出现如下错误:

[root@www.vps12.com ~]# service httpd start

(20014)Internal error: Error retrieving pid file logs/httpd.pid

Remove it before continuing if it is corrupted.

其实这个错误就是因为Apache目录下的 logs 子目录下的 httpd.pid 文件内容是空的。这个文件是记录进程ID的文件。因为这个文件是空的,就无法启动,实在是超雷人。你随便写点数字进去,再启动Apache,就可以成功了。

[root@www.vps12.com ~]# echo 1234 > /usr/local/apache2/logs/httpd.pid

[root@www.vps12.com ~]# service httpd start

解决方法:An error occurred on the server when processing the URL. Please contact the system administrator

2015年4月16日 没有评论

在WINDOWS7或SERVER2008上安装了IIS7.5,调试ASP程序时出现以下错误:

An error occurred on the server when processing the URL. Please contact the system administrator

解决方法如下:

设置方法一:

以管理员身份运行CMD,将目录定位到%windir%\system32\inetsrv\,然后执行appcmd set config -section:asp -scriptErrorSentToBrowser:true。
%windir%\system32\inetsrv\appcmd set config -section:asp -scriptErrorSentToBrowser:true

设置方法二:

打开IIS7的asp设置,展开“调试属性”选项,“将错误发送到浏览器”这项默认的是False,改为True,然后点右侧的应用!如图所示:

最安全简单的sql2000数据库日志文件清除或者减小办法

2015年4月9日 没有评论

相信很多使用sql2000,mssql的朋友都对日志文件过大严重影响数据库运行想过办法吧.

数据文件只有1G,但长期的数据库日志文件却有10G了,因为数据比较重要,有些手段又不好使用.

现在我找到一个快速而且不用第三方软件,最佳最安全的针对减小数据库日志文件的办法.

因为使用收缩数据库并不好使用.收缩日志文件也没有多大效果.笔者这里介绍一个最安全的减小mssql数据库日志文件的方法:

1.首先,请大家备份一次数据库,这非常简单,也是一种好习惯;

2.在需要收缩日志文件大小的数据库上点”属性”,再点”选项”,将故障还原里的”完全”改为”简单”

3.再右右数据库,”所有任务”中的”收缩数据库”

4.点右下角的”文件”,进入后,在右上角选数据库文件为”xxxx_log”,表示,准备收缩日志文件

5.就用默认的”收缩操作”—”压缩页,然后截断文件中的可用空间”

确定,这时你可以直接查看物理路径中的你需要收缩减小的相应log文件,是不是只有不到1M大小了.

这表示,你的日志文件已经安全清除了.

然后,重新回到第二步,将”简单”改为”完全”,这样,除了日志文件已缩小外,就与你以前的数据库没有任何区别了.包括你的所有设置!

建议:

为了防止日志文件无限扩大,需要将日志文件作一些限制.

方法是:数据库上右键点”属性”,点,”事务日志”,里面设置,将文件增长限制为xxxxMB,这要看你日常对数据库的操作情况了,一般设为1G是比较合适的,每隔一段时间进行一次本文所说的收缩数据库的方法,就能很好的维护了数据库,特别针对懒人,同时也备份了一次数据库!

解决linux系统CentOS 6.x下调整home和根分区大小(默认安装完成时)

2015年4月1日 没有评论

解决linux系统CentOS下调整home和根分区大小:目标:将VolGroup-lv_home缩小到20G,并将剩余的空间添加给VolGroup-lv_root,1.首先查看磁盘使用情况…
目标:将VolGroup-lv_home缩小到20G,并将剩余的空间添加给VolGroup-lv_root

1.首先查看磁盘使用情况

1
[root@localhost ~]# df -h
1
2
3
4
5
6
文件系统 容量 已用 可用 已用% 挂载点
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 154G 7.9G 139G 6% /
tmpfs 1.9G 100K 1.9G 1% /dev/shm
/dev/sda1 485M 69M 391M 15% /boot
/dev/mapper/VolGroup-lv_home 299G 984M 283G 1% /home

2、卸载/home

1
[root@localhost ~]# umount /home
1
2
umount /home 如果提示无法卸载,则是有进程占用/home,使用如下命令来终止占用进程:
[root@localhost ~]# fuser -m /home

3、调整分区大小

1
[root@localhost ~]# resize2fs -p /dev/mapper/VolGroup-lv_home 20G

如果提示运行“e2fsck -f /dev/mapper/VolGroup-lv_home”,则执行相关命令:

1
[root@localhost ~]# e2fsck -f /dev/mapper/VolGroup-lv_home

然后重新执行命令:

1
[root@localhost ~]# resize2fs -p /dev/mapper/VolGroup-lv_home 20G

注:resize2fs 为重新设定磁盘大小,只是重新指定一下大小,并不对结果有影响,需要下面lvreduce的配合

4、挂载上/home,查看磁盘使用情况

1
2
[root@localhost ~]# mount /home
[root@localhost ~]# df -h

5、设置空闲空间
使用lvreduce指令用于减少LVM逻辑卷占用的空间大小。可能会删除逻辑卷上已有的数据,所以在操作前必须进行确认。记得输入 “y”

1
[root@localhost ~]# lvreduce -L 20G /dev/mapper/VolGroup-lv_home

注:lvreduce -L 20G的意思为设置当前文件系统为20G,如果lvreduce -l 20G是指从当前文件系统上减少20G
使用lvreduce减小逻辑卷的大小。注意:减小后的大小不能小于文件的大小,否则会丢失数据。

可以使用vgdisplay命令等查看一下可以操作的大小。也可以是用fdisk -l命令查看详细信息。

1
[root@localhost ~]# vgdisplay

注:vgdisplay为显示LVM卷组的元数据信息

6.把闲置空间挂在到根目录下

1
[root@localhost ~]# lvextend -L +283G /dev/mapper/VolGroup-lv_root

注:lvextend -L +283G为在文件系统上增加283G

1
[root@localhost ~]# resize2fs -p /dev/mapper/VolGroup-lv_root

ps:这里-p命令运行完后,如果上1t左右的或是几百gb的硬盘要很长时间。一定要等他跑完。

7、检查调整结果

1
2
[root@localhost ~]# df -h
[root@localhost ~]# init 6

以上就可以完美的解决空间分配的问题。唯一需要注意的是。运行时间比较长,如果中断的话就有非常大的风险。不过按以上操作完成不需要担心。试过n次。没问题。

安装CentOS 出现Disk sda contains BIOS RAID metadata解决方法

2015年1月14日 没有评论

在安装CentOS 6系统的时候,当进到检测硬盘的时候,总是过不去,报错如下: Disk sda contains BIOS RAID metadata, but is not part of any recognized BIOS RAID sets. Ignoring disk sda 。

如下图显示:

 

解决办法1:
硬盘显示偶尔/dev/sda,偶尔/dev/sdb。。
从提示看貌似以前该硬盘做过RAID。。但问题是,这是个新的硬盘这样提示。该提示导致系统无法认到硬盘,没法继续安装系统。
后来经过一番Google,安装系统时,输入linux nodmraid就可以继续安装了。。
linux nodmraid命令的意思是关掉阵列。

进入安装选择菜单时

按TAB键,会进入到Linux的命令行模式,然后在启动命令行的后面添加nodmraid(注意前面先加个空格)并按ENTER。

接下进入安装的过程就会发现硬盘找到了。

>vmlinuz initrd=initrd.img nodmraid

要想在后续安装系统时不会出现以上提示,以下是彻底解决方法:
把硬盘放到另外一台机器上
# dmraid -rE /dev/sdb
no raid disks and with names: “/dev/sdb”
不行啊。网上搜索一下,有朋友给出一个更加简单的办法,用parted
网上搜索一下,有朋友给出一个更加简单的办法,用parted
# parted /dev/sdb –script mklabel gpt
# parted /dev/sdb –script — mkpart primary 0 -1
Warning: The resulting partition is not properly aligned for best performance.
# parted /dev/sdb –script print
Model: ATA TOSHIBA MK1002TS (scsi)
Disk /dev/sdb: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number Start  End  Size  File system Name  Flags
1  17.4kB 1000GB 1000GB        primary处理完,放回原来的机器,居然就没问题,顺利装完系统。
如果是这样,在急救模式下,运行parted,也是应该没问题。

如果还不行,最后一招就是DD
dd if=/dev/null of=/dev/sda bs=512 count=1
解决办法2(推荐):

其实多数情况下这种提示我们进入bios下面的 Advanced Options 里按图片选择 这个AHCI 就可以了。

 

Linux 下用 smartd 监测硬盘状况

2015年1月14日 没有评论

和处理器、内存比较,硬盘是服务器上最慢的子系统、是最容易出现性能瓶颈的地方,也是最脆弱的部分。因为硬盘离处理器距离最远而且访问硬盘要涉及到一些机械操作,比如转轴、寻轨等,而机械是容易出故障的。作为 VPS 服务商和系统管理员来说,最害怕的就是硬盘出毛病,所以监测硬盘的健康状况、提前预警是件很重要的事情。我们 PC 服务器上差不多1.5年都会有硬盘坏掉,坏掉前一点征兆都没有,SUN 服务器上的情况要好得到,很多 SATA/SCSI 硬盘运行了5年都没问题,看样子品牌服务器还是贵得有理由的。VPSee 前段时间看过 Google 发表的一篇论文:Failure Trends in a Large Disk Drive Population 也证实了我们的经历,结论是所有坏掉的硬盘中只有60%可以被 S.M.A.R.T. 检测到,也就是说 S.M.A.R.T. 的测试结果只有60%是正确的,所以我们还不能完全依赖 S.M.A.R.T. 的监测结果。

目前市面上所有的硬盘都具有 S.M.A.R.T. (Self-Monitoring, Analysis and Reporting Technology) 特性,smartmontools 就是利用这一特性监测硬盘的软件包,包含 smartctl 和 smartd 两个程序,前者是前台命令行工具、后者是后台运行程序,smartmontools 不是 Linux 的专利,也支持 BSD, Solaris 等系统。

安装 smartmontools

在 CentOS 5.x 下安装:

# yum install kernel-utils
在 CentOS 6.x/Fedora 下安装:

# yum install smartmontools
在 Debian/Ubuntu 下安装:

# apt-get install smartmontools
使用 smartmontools

在使用 smartmontools 测试之前先检查一下硬盘是否具有 SMART 特性:

# smartctl -i /dev/sda

=== START OF INFORMATION SECTION ===
Device Model: SEAGATE ST32500NSSUN250G 0741B58YP8
Serial Number: 5QE58YP8
Firmware Version: 3.AZK
User Capacity: 250,056,000,000 bytes
Device is: Not in smartctl database [for details use: -P showall]
ATA Version is: 7
ATA Standard is: Exact ATA specification draft version not indicated
Local Time is: Thu Jul 22 22:39:07 2010 SAST
SMART support is: Available – device has SMART capability.
SMART support is: Enabled
如果上面 SMART support 是 Disabled 状态的话,需要开启 SMART 的支持:

# smartctl -s on /dev/sda

=== START OF ENABLE/DISABLE COMMANDS SECTION ===
SMART Enabled.
检查硬盘状况,如果下面的结果不是 PASSED 的话你需要立刻警觉起来,马上备份所有数据,硬盘随时都可能出问题(不过值得注意的是就算结果是 PASSED 并不意味着硬盘100%就安全,PASS 不能代表没问题,没 PASS 代表一定有问题):

# smartctl -H /dev/sda

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
做个快速自检:

# smartctl -t short /dev/sda

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: “Execute SMART Short self-test routine immediately in off-line mode”.
Drive command “Execute SMART Short self-test routine immediately in off-line mode” successful.
Testing has begun.
Please wait 1 minutes for test to complete.
Test will complete after Thu Jul 22 22:51:00 2010

Use smartctl -X to abort test.
执行上面的自检命令后等待一段时间,可以通过下面命令来看进度和结果:

# smartctl -l selftest /dev/sda

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Short offline Completed without error 00% 20949 -
# 2 Short offline Completed without error 00% 20947 -

要做长时间自检的话(很耗时,建议放在凌晨时间段做):

# smartctl -t long /dev/sda
查看出错日志:

# smartctl -l error /dev/sda

=== START OF READ SMART DATA SECTION ===
SMART Error Log Version: 1
No Errors Logged
配置 smartmontools

在 CentOS/Fedora 下:

# vi /etc/smartd.conf
# /etc/init.d/smartd restart
在 Debian/Ubuntu 下:

# vi /etc/default/smartmontools
# vi /etc/smartd.conf
# /etc/init.d/smartmontools restart
可以通过修改以上的 smartmontools 的配置文件来定期对硬盘做健康检查,就像给人定期体检一样,体检过了并不代表就没病(很多疾病用体检的设备都查不到),所以这也符合 Google 的硬盘报告所说的情况,所有坏掉的硬盘中只有60%可以被 S.M.A.R.T. 检测到(所有生病的人中只有60%能在体检的时候发现)。

iis7 下动态压缩(gzip压缩)的压缩率更改办法

2014年11月11日 没有评论

iis7下默认压缩率是静态压缩: 0, 动态压缩: 7

一般认为: 压缩率9是性价比最好的压缩率

怎么改变默认的压缩率呢? 运行以下命令即可:

%windir%\system32\inetsrv\appcmd.exe set config -section:httpCompression -[name='gzip'].dynamicCompressionLevel:9
%windir%\system32\inetsrv\appcmd.exe set config -section:httpCompression -[name='gzip'].staticCompressionLevel:9

命令运行后, 必须重启IIS, 新的压缩率才开始生效

apache支持下载docx,pptx,rar等文件

2014年10月25日 没有评论

apache web服务器的站点,下载pptx,docx,xlsx文件,却被浏览器当作zip文件保存。

这不是浏览器的问题,而是apache不认docx,pptx,,xlsx等Microsoft Office 2007+的文件格式,而这些文件本身是zip压缩文件,所以被apache当作zip压缩文件发给浏览器了。

做个形像一点的比喻:浏览器请求一个url路径,这个路径指向一个.pptx文件,apache从web服务器的目录(磁盘上)查到这个文件,但它不知道这个文件是什么类型(注意:文件类型并不是由文件名后缀决定的,而是文件本身内容所决定),于是它通过分析这个文件内容,发现这个文件像是个zip压缩档,文件大小为12345字节,于是它给浏览器说:“嘿,你请求的是个zip压缩文件,它的大小为12345个字节,文件名是 abcd.pptx 。下面是这个文件的内容,请接收”

浏览器收到消息后,得知apache要发给自己一个zip压缩档,于是一边弹出对话框、询问用户是直接打开、还是保存到硬盘,一边把apache接下来发回的数据保存到缓冲区(或者保存到硬盘的临时目录里),等用户做好选择后,采取相应的打开或是保存的操作。

形象的说明,并不是十分准确的,但大体过程如此。

那现在的问题在于apache因为不认识这个pptx文件,那我们要教会apache,让它知道。我们可以通过mime.types文件让告诉它:

修改mime.types文件,在其中加上

application/vnd.ms-word.document.macroEnabled.12 docm
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
application/vnd.ms-powerpoint.template.macroEnabled.12 potm
application/vnd.openxmlformats-officedocument.presentationml.template potx
application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam
application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm
application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
application/vnd.ms-excel.addin.macroEnabled.12 xlam
application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb
application/vnd.ms-excel.sheet.macroEnabled.12 xlsm
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
application/vnd.ms-excel.template.macroEnabled.12 xltm
application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx
这样的一部分代码,这里包含了ms office相关的很多文件类型。

mime.types文件位置

那mime.types文件在什么位置呢?

对于windows版本的apache,它在apache安装目录下的conf子目录里,典型位置为 X:\Program Files\Apache Group\Apache2\conf\mime.types

而linux版本下,通常位于/etc/mime.types, 如redhat/centos/fedora都是如此,debian/ubuntu系列应该也在这里,个人没有亲自查证。

不过centos并不推荐在这里修改,参看这里 http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-apache-config.html TypesConfig一小节

Instead of editing /etc/mime.types, the recommended way to add MIME type mappings is to use the AddType directive.

建议不要去修改 /etc/mime.types ,添加MIME type的推荐方法是使用apache的 AddType 指令.

AddType application/vnd.ms-word.document.macroEnabled.12 docm
AddType application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
AddType application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
AddType application/vnd.ms-powerpoint.template.macroEnabled.12 potm
AddType application/vnd.openxmlformats-officedocument.presentationml.template potx
AddType application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam
AddType application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm
AddType application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
AddType application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm
AddType application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
AddType application/vnd.ms-excel.addin.macroEnabled.12 xlam
AddType application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb
AddType application/vnd.ms-excel.sheet.macroEnabled.12 xlsm
AddType application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
AddType application/vnd.ms-excel.template.macroEnabled.12 xltm
AddType application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx
可以把这些指令加到apache的配置文件里,该指令在apache里出现过N次,不需多说,照着加进去就对了。

rar怎么支持呢?其实也很容易。找一下zip然后在zip支持下加一条一样的。把zip改成rar重启apache就可以了。

MySQL 配置优化

2014年10月25日 没有评论

安装MySQL后,配置文件my.cnf在 /MySQL安装目录/share/mysql目录中,该目录中还包含多个配置文件可供参考,有my-large.cnf ,my-huge.cnf, my-medium.cnf,my-small.cnf,分别对应大中小型数据库应用的配置。win环境下即存在于MySQL安装目录中的.ini文件。

下面列出了对性能优化影响较大的主要变量,主要分为连接请求的变量和缓冲区变量。

1. 连接请求的变量:

1) max_connections
MySQL的最大连接数,增加该值增加mysqld 要求的文件描述符的数量。如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。

数值过小会经常出现ERROR 1040: Too many connections错误,可以过’conn%’通配符查看当前状态的连接数量,以定夺该值的大小。

show variables like ‘max_connections’ 最大连接数

show status like ‘max_used_connections’响应的连接数

如下:

mysql> show variables like ‘max_connections‘;

+———————–+——-+

| Variable_name | Value |

+———————–+——-+

| max_connections | 256  |

+———————–+——-+

mysql> show status like ‘max%connections‘;

+———————–+——-+

| Variable_name  | Value |

+—————————-+——-+

| max_used_connections | 256|

+—————————-+——-+

max_used_connections / max_connections * 100% (理想值≈ 85%)

如果max_used_connections跟max_connections相同 那么就是max_connections设置过低或者超过服务器负载上限了,低于10%则设置过大。

2) back_log
MySQL能暂存的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用。如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。

back_log值指出在MySQL暂时停止回答新请求之前的短时间内有多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。

当观察你主机进程列表(mysql> show full processlist),发现大量264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大back_log 的值了。

默认数值是50,可调优为128,对于Linux系统设置范围为小于512的整数。

3) interactive_timeout
一个交互连接在被服务器在关闭前等待行动的秒数。一个交互的客户被定义为对mysql_real_connect()使用CLIENT_INTERACTIVE 选项的客户。

默认数值是28800,可调优为7200。

2. 缓冲区变量

全局缓冲:

4) key_buffer_size
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。

key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。

举例如下:

mysql> show variables like ‘key_buffer_size‘;

+——————-+————+

| Variable_name | Value |

+———————+————+

| key_buffer_size | 536870912 |

+———— ———-+————+

key_buffer_size为512MB,我们再看一下key_buffer_size的使用情况:

mysql> show global status like ‘key_read%‘;

+————————+————-+

| Variable_name  | Value |

+————————+————-+

| Key_read_requests| 27813678764 |

| Key_reads   | 6798830 |

+————————+————-+

一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:

key_cache_miss_rate =Key_reads / Key_read_requests * 100%,设置在1/1000左右较好

默认配置数值是8388600(8M),主机有4GB内存,可以调优值为268435456(256MB)。

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

通过检查状态值Qcache_*,可以知道query_cache_size设置是否合理(上述状态值可以使用SHOW STATUS LIKE ‘Qcache%’获得)。如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。

与查询缓冲有关的参数还有query_cache_type、query_cache_limit、query_cache_min_res_unit。

query_cache_type指定是否使用查询缓冲,可以设置为0、1、2,该变量是SESSION级的变量。

query_cache_limit指定单个查询能够使用的缓冲区大小,缺省为1M。

query_cache_min_res_unit是在4.1版本以后引入的,它指定分配缓冲区空间的最小单位,缺省为4K。检查状态值Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多,这就表明查询结果都比较小,此时需要减小query_cache_min_res_unit。

举例如下:

mysql> show global status like ‘qcache%‘;

+——————————-+—————–+

| Variable_name | Value  |

+——————————-+—————–+

| Qcache_free_blocks  | 22756  |

| Qcache_free_memory  | 76764704 |

| Qcache_hits      | 213028692 |

| Qcache_inserts     | 208894227 |

| Qcache_lowmem_prunes | 4010916 |

| Qcache_not_cached | 13385031 |

| Qcache_queries_in_cache | 43560 |

| Qcache_total_blocks | 111212  |

+——————————-+—————–+

mysql> show variables like ‘query_cache%‘;

+————————————–+————–+

| Variable_name      | Value  |

+————————————–+———–+

| query_cache_limit      | 2097152 |

| query_cache_min_res_unit  | 4096   |

| query_cache_size      | 203423744 |

| query_cache_type      | ON  |

| query_cache_wlock_invalidate | OFF  |

+————————————–+—————+

查询缓存碎片率= 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%,命中率很差,可能写操作比较频繁吧,而且可能有些碎片。

每个连接的缓冲

6) record_buffer_size
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。

默认数值是131072(128K),可改为16773120 (16M)

7) read_rnd_buffer_size
随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。

一般可设置为16M

8) sort_buffer_size
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。

默认数值是2097144(2M),可改为16777208 (16M)。

9) join_buffer_size
联合查询操作所能使用的缓冲区大小

record_buffer_size,read_rnd_buffer_size,sort_buffer_size,join_buffer_size为每个线程独占,也就是说,如果有100个线程连接,则占用为16M*100

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

1G内存机器,推荐值是128-256。内存在4GB左右的服务器该参数可设置为256M或384M。

11) max_heap_table_size
用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变,即set @max_heap_table_size=#

这个变量和tmp_table_size一起限制了内部内存表的大小。如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。

12) tmp_table_size
通过设置tmp_table_size选项来增加一张临时表的大小,例如做高级GROUP BY操作生成的临时表。如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果,建议尽量优化查询,要确保查询过程中生成的临时表在内存中,避免临时表过大导致生成基于硬盘的MyISAM表。

mysql> show global status like ‘created_tmp%‘;

+——————————–+———+

| Variable_name   | Value |

+———————————-+———+

| Created_tmp_disk_tables | 21197 |

| Created_tmp_files   | 58  |

| Created_tmp_tables  | 1771587 |

+——————————–+———–+

每次创建临时表,Created_tmp_tables增加,如果临时表大小超过tmp_table_size,则是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数,比较理想的配置是:

Created_tmp_disk_tables / Created_tmp_tables * 100%

默认为16M,可调到64-256最佳,线程独占,太大可能内存不够I/O堵塞

13) thread_cache_size
可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以这个变量值。

通过比较 Connections和Threads_created状态的变量,可以看到这个变量的作用。

默认值为110,可调优为80。

14) thread_concurrency
推荐设置为服务器 CPU核数的2倍,例如双核的CPU, 那么thread_concurrency的应该为4;2个双核的cpu, thread_concurrency的值应为8。默认为8

15) wait_timeout
指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。

3. 配置InnoDB的几个变量

innodb_buffer_pool_size

对于InnoDB表来说,innodb_buffer_pool_size的作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。

根据MySQL手册,对于2G内存的机器,推荐值是1G(50%)。

innodb_flush_log_at_trx_commit

主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为0、1、2三个。0,表示当事务提交时,不做日志写入操作,而是每秒钟将log buffer中的数据写入日志文件并flush磁盘一次;1,则在每秒钟或是每次事物的提交都会引起日志文件写入、flush磁盘的操作,确保了事务的ACID;设置为2,每次事务提交引起写入日志文件的动作,但每秒钟完成一次flush磁盘操作。

实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。

根据MySQL手册,在允许丢失最近部分事务的危险的前提下,可以把该值设为0或2。

innodb_log_buffer_size

log缓存大小,一般为1-8M,默认为1M,对于较大的事务,可以增大缓存大小。

可设置为4M或8M。

innodb_additional_mem_pool_size

该参数指定InnoDB用来存储数据字典和其他内部数据结构的内存池大小。缺省值是1M。通常不用太大,只要够用就行,应该与表结构的复杂度有关系。如果不够用,MySQL会在错误日志中写入一条警告信息。

根据MySQL手册,对于2G内存的机器,推荐值是20M,可适当增加。

innodb_thread_concurrency=8

推荐设置为 2*(NumCPUs+NumDisks),默认一般为8