解决Default storage engine (InnoDB) is not available导致mysql无法启动的

一次为了修改mysql的root用户密码,就启用了本机启动模式,可再次启用mysql时,却揭示:Default storage engine (InnoDB) is not available ,mysql无法启动,后搜索网络,得知应该是配置文件有错,这里提示:“060827  1:12:22 [ERROR] Default storage engine (InnoDB) is not available”
打开my.ini或my.cnf文件,找到default-storage-engine这一行,把它改成default-storage-engine=MyISAM。

MySQL特异功能之:Impossible WHERE noticed after reading const tables

用EXPLAIN看MySQL的执行计划时经常会看到Impossible WHERE noticed after reading const tables这句话,意思是说MySQL通过读取“const tables”,发现这个查询是不可能有结果输出的。比如对下面的表和数据:

  create table t (a int primary key, b int) engine = innodb;
insert into t values(1, 1);
insert into t values(3, 1);

执行“EXPLAIN select * from t where a = 2”时就会输出“Impossible WHERE noticed after reading const tables”。

不 明白所谓的“const tables”是什么意思,对MySQL在查询优化时竟然可以发现一个查询不可能输出结果更是感觉不可思议。按数据库中“传统”的做法,查询优化时只会访 问模式定义和统计信息,而据我所知,数据库中使用的各种统计信息如EquiDepth、MaxDiff柱状图,MCV,属性的最大值、最小值等都不可能精 确到能够断言在上述的表中不存在“a = 2”的记录。

今天看MySQL Internal手册时才总算弄明白,原来MySQL并没有什么神奇之处,这个Impossible WHERE noticed after reading const tables的结论并不是通过统计信息做出的,而是真的去实际访问了一遍数据后,发现确实没有“a = 2”的行才得出的。

当查询中对某个表指定了主键或非空唯一索引上的等值条件,从而使得最多只可能产生一条命中结果(只对该表而言)时,MySQL在EXPLAIN之前会优先根据这一条件查找出对应的记录,并用记录的实际值替换查询中所有用到来自该表的属性的地方。一个更复杂的例子如下:

  explain select * from t as t1, t as t2 where t1.a = 1 and t2.a = t1.b + 1;

的输出结果为(由于排版关系省略了一些输出内容):
+----+...+-----------------------------------------------------+
| id | ... | Extra |
+----+...+-----------------------------------------------------+
| 1 | ... | Impossible WHERE noticed after reading const tables |
+----+...+-----------------------------------------------------+

MySQL得出上述查询不会输出结果的步骤如下:
1、首先根据t1.a = 1条件找到一条记录(1,1);
2、将上述记录中b的值1替换查询中的t1.b,即将上述查询转化为等价的“explain select 1, 1,t2.a, t2.b from t as t2 where t2.a = 1 + 1”;
3、优化器计算常量表达式的值,即计算1+1得出结果为2;
4、优化器根据t2.a = 2条件查找,发现没有命中记录;
5、优化器最终打断出上述查询不可能输出结果。

说 白了,这个“Impossible WHERE noticed after reading const tables”就不再神秘了。但从这件事,我更加感觉到MySQL是个“怪怪”的数据库,有很多地方跟惯常的做法不太一样。很多数据库会在联接时将指定了 唯一索引等值条件的表优先执行,作为查询执行的第一步,但据我所知只有MySQL将这一步骤提前到查询优化的第一步来做。这么做到底在什么情况下才有好处 好像是个很微妙的问题,对于本文中给出的这两个例子,在优化时还是执行时做这一步开销都没什么区别。不过这么做好像没什么坏处。

这么会导 致一个“怪怪”的现象,那就是EXPLAIN有时候也会被阻塞。比如“EXPLAIN select * from t where a = 2 lock in share mode”,同时又有另一个事务插入了一条a = 2的记录而没有提交时,EXPLAIN就会在那里等锁。

用mrtg监控网络设备端口流量

被监控设备必须支持snmp协议,因为mrtg就是通过snmp协议来获取该设备的端口流量信息。如何在一个网络设备上启用snmp协议呢?

在配置模式下执行如下命令:3550(config)#snmp-server community public ro,启用snmp协议。启用后才能使用mrtg进行监控。

我中心用一台linux服务器监控三台网络设备的流量,其服务器地址为10.66.100.100/16,三台交换机的任一VLAN地址分别为 192.168.3.253,172.19.96.2,10.70.0.1。现为了叙述方便,仅选取10网段的交换机为例进行说明。其他设备方法相同,不 再赘述。

在执行mrtg的各步操作前,linux系统中必须先安装apache服务,用于网页发布。

I、Apache服务的安装

因为mrtg是以网页的形式来显示被监测设备的端口流量信息的,所以必须先安装apache服务。现将安装过程中的几个问题描述如下:

下载apache-2.0.44-2.i586.rpm软件包,安装时系统显示"libssl.so.0  is  needed  by  apache-2.0.44-2.i586.rpm",说明安装apache服务时需要该函数库。

下载openssl-compat-0.9.6m-8.i586.rpm软件包,安装后系统不再出现上述提示,但提示缺少libdb.so.3文件,下载db2-2.4.14-8.i585.rpm软件包,安装后可以正常安装apache2.0。

II、启动Apache服务

在"控制面板"'"服务"项中选中httpd项,进行各种操作。

III、 Apache服务的配置

安装完成后,系统自动在/etc/apache2目录下生成httpd.conf文件,该文件是Apache服务的配置文件,将其中一行修改如下:

<Directory   "/usr/local/apache2/htdocs/mrtg">

此目录即为网页发布目录,后续操作所生成的索引文件都将存放在这个目录中,才能以网页的形式发布出来。

注:给大家介绍一个网站,上面提供了非常全面的rpm包下载,本文中所用的所有rpm包都从该网站下载,非常方便。网址为:http://rpm.pbone.net/

IV、安装MRTG

下载mrtg-2.16.2.tar.gz文件, 解压缩至mrtg-2.16.2目录,命令如下:

[root@localhost lxjun]#tar   -zxvf    mrtg-2.16.2.tar.gz

将mrtg安装至指定目录/usr/local/mrtg-2
[root@localhost mrtg-2.16.2]#./configure   --prefix=/usr/local/mrtg-2
[root@localhost mrtg-2.16.2]#make
[root@localhost mrtg-2.16.2]#make   install

1、 生成.cfg文件

[root@localhost bin]#perl cfgmaker public@10.70.0.1 --global "workdir:/usr/local/apache2/htdocs/mrtg"  --output  mrtg10.70.0.1.cfg

这样即在/usr/local/mrtg-2/bin目录下生成10网段交换机的配置文件mrtg10.70.0.1.cfg

2、编辑配置文件

使用vi编辑器对该文件进行编辑,使其成为一个守护进程运行

在该文件末尾添加runasdaemon:yes,存盘退出。

3、后台运行mrtg,时刻监视设备端口流量

[root@localhost bin]# perl   mrtg    mrtg10.70.0.1.cfg   &

注:若此进程正在运行,应先杀掉后才能正常执行,否则将出现错误提示。在执行此操作前,应先使用[root@localhost bin]# ps  -ef  |grep  mrtg命令查看一下正在运行的关于mrtg的进程,查看结果如下:

root     16004     1  0  Apr03 ?         00:10:37 perl mrtg mrtg192.168.211.1.cfg
root     20778     1  0  Apr04 ?         00:03:50 perl mrtg mrtg172.19.96.2.cfg
root      6277     1  0  09:27 ?          00:00:02 perl mrtg mrtg10.70.0.1.cfg
root      6420  6169  0  09:41   pts/4    00:00:00 grep mrtg

表明此进程正在运行,应使用[root@localhost bin]# kill  -9  6277(PID)先杀掉此进程,再执行此步操作。

4、生成index文件

[root@localhost bin]# perl indexmaker --output=/usr/local/apache2/htdocs/mrtg/index.html mrtg10.70.0.1.cfg

在/usr/local/apache2/htdocs/mrtg目录下生成index.html文件,该文件以图表的形式记录了10网段交换机各端口的流量信息。

更换端口后必须进行的操作

因为MRTG是通过snmp协议的get(  )命令读取交换机设备的MIB库信息,所以更换端口后index文件中获取不到更换后的端口的流量信息,原端口信息也不会在表中自行消失。必须重新执行全部操作。

使用FreeBSD的SNMP+MRTG网络流量分析

、 安装SNMP
一般版本的FreeBSD系统SNMP存放在/usr/ports/net/net-snmp下面,但是有的版本不是。有些版本 在安装Package的时候,除了要安装Net之外,还要安装Net-mgmt里面的SNMP,安装好之后,SNMP就存放在/usr/ports /net-mgmt/net-snmp下面了。下面就是安装过程:
# cd /usr/ports/net-mgmt/net-snmp #snmp的存放路径
# make install clean #安装snmp
# ee /etc/rc.conf
snmpd_enable="YES"
snmpd_flags="-p /var/run/snmpd.pid"
# /etc/netstart
# ee /usr/local/share/snmp/snmpd.conf
rocommunity public
# /usr/local/etc/rc.d/snmpd.sh start #启动snmp

2、 安装mrtg
mrtg根据不同的版本存放的位置不同,一般存放在/usr/ports/net/net-snmp下面,这里介绍的安装过程种mrtg存放在/usr/ports/net-mgmt/mrtg下面。
# cd /usr/ports/net-mgmt/mrtg #mrtg的存放路径
# make install clean #安装mrtg
# cd /home #以下四个命令是建立MRTG
# mkdir http #的WEB目录,具体目录可以
# cd http #根据个人的爱好自己设定
# mkdir mrtg
# cd /usr/local/etc/mrtg
# /usr/local/bin/cfgmaker public@192.168.1.100 > mrtg #创建MRTG的cfg文件
192.168.1.100 :被监控设备的地址
mrtg :是要输出的档案
public :设备设定档的共同的名字(community name) 预设是public,
这个可以在/usr/local/share/snmp/snmpd.conf里面修改
# ee mrtg
WorkDir: /home/http/mrtg #指向已设定的WEB目录
# /usr/local/bin/indexmaker –-title ‘标题’ --output
/home/http/mrtg/index.html mrtg #生成index.html文件
# /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg #运行mrtg(如果有错误,就
多运行几次)
#ee /etc/crontab #让mrtg每5分钟运行一次
*/5 * * * root /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg

3、 安装apache
apache存放在/usr/ports/www/apache2下面
# cd /usr/ports/www/apache2 #apache2的存放地址
# make install clean #安装apache2
# ee /etc/rc.conf
apache2_enable=”YES”
# /etc/netstart
# ee /usr/local/etc/apache2/httpd.conf #配置虚拟主机
NameVirtualHost *:80

<Directory "/home/http/mrtg">
Options Indexes Includes FollowSymlinks
Allow from all #允许访问
</Directory>

<VirtualHost *:80>
ServerAdmin root@test.com
DocumentRoot /home/http/mrtg
ServerName xxx.xxx.xxx.xxx #安装mrtg的主机地址
DirectoryIndex index.html #前面生成的index.html
ErrorLog /var/log/xxx.xxx.xxx.xxx-error_log
CustomLog /var/log/xxx.xxx.xxx.xxx-access_log common
</VirtualHost>
# /usr/local/etc/rc.d/apache2.sh start #启动apache
打开http://xxx.xxx.xxx.xxx,就可以看到被监控设备的网络信息了。

4、 设置http://xxx.xxx.xxx.xxx的访问权限
监控流量的网页做好之后,接下来就设置访问这个网页的权限。
1) 修改http.conf ,在<Directory "/home/http/mrtg">和</Directoy>
之间加入一行:
AllowOverride All
意思是在/home/http/mrtg下不同目录的访问权限由该目录下的.htaccess文件来控制,而且不同目录的权限策略可互相覆盖
2) 编辑.htaccess 文件
# cd /home/http/mrtg
# mkdir user #建立存放密码文件的文件夹
# ee .htaccess #访问权限控制文件
AuthUserFile /home/http/mrtg/user/pass #用户密码信息存放文件
AuthType Basic #认证类型为基本型
AuthName "cnseaport"
require valid-user #认证方式
3) 建立用户
# htpasswd –c /home/http/mrtg/user/pass admin #建立用户admin
New password: #输入用户秘密
Re-type new password: #再次输入密码
Adding password for user admin #添加用户成功信息
可以建立多个用户
4) 重新启动apache,再次访问http://xxx.xxx.xxx.xxx,这时应该出现一个
身份认证窗口,你需要输入用户名和密码才能访问这个页面。

MRTG FOR WINDOWS 安装指南

MRTG(Multi Router Traffic Grapher),通常讲是一个监控网络链路流量负载的开源软件,它可以从所有运行SNMP协议的设备上(包括服务器、路由器、交换机等)抓取信息。事实上它不仅可以监控网络设备,任何其它的支持SNMP协议的设备都可以做为MRTG的监控对象,并自动生成包含PNG图形格式的HTML文档,通过HTTP 方式显示给用户。

官方的安装指导:http://mrtg.cs.pu.edu.tw/doc/mrtg-nt-guide.en.html

准备安装环境

安装之前,除了MRTG安装程序外,还要下载几个辅助软件。这些软件全部是免费的。
1. 下载MRTG
http://www.mrtg.org

2. 下载ActivePerl
http://www.activestate.com/Products/Download/Download.plex?id=ActivePerl

3. 下载Windows服务安装工具:SERANY.exe 和 INSTSRV.exe
http://www.electrasoft.com/srvany/srvany.htm

安装MRTG

下载了以上软件后就可以开始安装了。事实上在Windows上安装MRTG很简单,因为MRTG是以Perl语言开发的,所以要首先安装一个Perl语言的运行环境出来。

1. 安装ActivePerl

解压ActivePerl的包,在安装目录中找到install.bat文件,运行它即可。在DOS窗口中,安装程序会问一些问题,诸如安装路径、是否要修改环境变量等,可以全部使用缺省设置,一路回车就行了。缺省情况下Perl安装在C:\Perl目录下。完成安装后,打开Windows的环境变量检查一下是否增加了Perl的运行文件路径。

2. 安装MRTG

解压MRTG的包,我用的是MRTG-2.12.2版本。将解压后的目录移到C:\下就行了。

需要注意的地方

(1)、给Windows安装SNMP协议支持
通常由于SNMP是一个建议关闭的协议(因为有安全漏洞),所以Windows 2003不是缺省安装的。不过MRTG就是要用SNMP协议,有什么办法呢,就装一个吧。在“控制面板->增加/删除程序->Windows 组件安装”中,安装SNMP的组件。(打开"Windows 组件向导"-->在“组件”中,单击“管理和监视工具”(但是不要选中或清除其复选框),然后单击“详细信息”。
选中“简单网络管理协议”复选框,然后单击“确定”。)

(2)、修改SNMP的安全设置

如果被监控的机器上也跑Windows的话,这部分就一定要设置(要在被监控方设置,MRTG所在服务器可以不用设置),否则永远也收不到SNMP的消息。
打开Services窗口并找到SNMP服务,打开右键菜单,选择属性。在打开的窗口中找到“安全”选项页。在选项页中有两部分设置,上半部分是指 SNMP服务接受哪种Community指示字,缺省情况下Windows 2003不对任何指示字反馈。我一般都设为“public--READ ONLY”。下半部分可以设置可信任的主机名、IP或是IPX名称。

(3)、修改防火墙

如果你安装了防火墙,要记得打开UDP 161端口,否则也会问题多多。

运行MRTG
好了,总算安装完了。现在可以运行一下MRTG了,看看它的庐山真面目。

打开DOS窗口,首先进入C:\mrtg\bin,然后输入以下命令:

perl cfgmaker public@localhost --global "WorkDir: C:\Inetpub\wwwroot\mrtg" --output mrtg.cfg

这条命令是给MRTG建立一个监控配置文件,监控的对象是localhost,就是本地机器。你也可以用IP地址来代替localhost,或者指向其它的监控主机。(注意:上面这行命令中WorkDir: 与C:盘符之间要有空格!!! 另外C:\Inetpub\wwwroot\mrtg这个目录也可以换成其它目录,不过因为mrtg会在这个工作目录下生成统计图表和网页,所以一般指定为某个站点下的目录,以方便直接从网上查看统计数据)

再键入一个命令:

perl mrtg mrtg.cfg

这个命令会在C:\Inetpub\wwwroot\mrtg目录下建立一些HTML和PNG文件,这些文件就是用户通常看到的流量报表了。

使MRTG成为Windows的服务

SERANY.exe和INSTSRV.exe这两个程序是Windows自带的工具的软件。它们可以把任何一个Windows的应用程序安装成为

Windows的一个服务。

(1)、修改注册表

创建一个文本文件,在文件中写入以下内容,并保存为mrtg.reg文件:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MRTG\Parameters]
"Application"="c:\\perl\\bin\\wperl.exe"
"AppParameters"="c:\\mrtg\\bin\\mrtg --logging=eventlog c:\\mrtg\\bin\\mrtg.cfg"
"AppDirectory"="c:\\mrtg\\bin\\"

(2)、安装服务

把SERANY.exe,instsrv.exe复制MRTG的安装目录下,键入以下命令:

instsrv MRTG c:\mrtg\bin\srvany.exe

双击mrtg.reg文件,把相关信息注册到注册表中。在“控制面板->管理工具->Services”下运行名为MRTG的服务即可。

默认情况下,每5分钟,mrtg收集一次数据(注意:一定要在bin\mrtg.cfg配置文件最后一行加上RunAsDaemon: yes)

mysqlbinlog:用于处理二进制日志文件的实用工具

服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件,应使用mysqlbinlog实用工具。

应这样调用mysqlbinlog

shell> mysqlbinlog [options] log-files...

例如,要想显示二进制日志binlog.000003的内容,使用下面的命令:

shell> mysqlbinlog binlog.0000003

输出包括在binlog.000003中包含的所有语句,以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等。

通常情况,可以使用mysqlbinlog直接读取二进制日志文件并将它们用于本地MySQL服务器。也可以使用--read-from-remote-server选项从远程服务器读取二进制日志。

当读取远程二进制日志时,可以通过连接参数选项来指示如何连接服务器,但它们经常被忽略掉,除非你还指定了--read-from-remote-server选项。这些选项是--host--password--port--protocol--socket--user

还可以使用mysqlbinlog来读取在复制过程中从服务器所写的中继日志文件。中继日志格式与二进制日志文件相同。

5.11.3节,“二进制日志”中详细讨论了二进制日志。

mysqlbinlog支持下面的选项:

·---help-

显示帮助消息并退出。

·---database=db_name-d db_name

只列出该数据库的条目(只用本地日志)

·--force-read-f

使用该选项,如果mysqlbinlog读它不能识别的二进制日志事件,它会打印警告,忽略该事件并继续。没有该选项,如果mysqlbinlog读到此类事件则停止。

·--hexdump-H

在注释中显示日志的十六进制转储。该输出可以帮助复制过程中的调试。在MySQL 5.1.2中添加了该选项。

·--host=host_name-h host_name

获取给定主机上的MySQL服务器的二进制日志。

·--local-load=path-l pat

为指定目录中的LOAD DATA INFILE预处理本地临时文件。

·--offset=N-o N

跳过前N个条目。

·--password[=password]-p[password]

当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中--password-p选项后面没有 密码值,则提示输入一个密码。

·--port=port_num-P port_num

用于连接远程服务器的TCP/IP端口号。

·--position=N-j N

不赞成使用,应使用--start-position

·--protocol={TCP | SOCKET | PIPE | -position

使用的连接协议。

·--read-from-remote-server-R

MySQL服务器读二进制日志。如果未给出该选项,任何连接参数选项将被忽略。这些选项是--host--password--port--protocol--socket--user

·--result-file=name, -r name

将输出指向给定的文件。

·--short-form-s

只显示日志中包含的语句,不显示其它信息。

·--socket=path-S path

用于连接的套接字文件。

·--start-datetime=datetime

从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取。datetime值相对于运行mysqlbinlog的机器上的本地时区值格式应符合DATETIMETIMESTAMP数据类型。例如:

shell> mysqlbinlog --start-datetime="2004-12-25 11:25:56" binlog.000003

该选项可以帮助点对点恢复。

·--stop-datetime=datetime

从二进制日志中第1个日期时间等于或晚于datetime参量的事件起停止读。关于datetime值的描述参见--start-datetime选项。该选项可以帮助及时恢复。

·--start-position=N

从二进制日志中第1个位置等于N参量时的事件开始读。

·--stop-position=N

从二进制日志中第1个位置等于和大于N参量时的事件起停止读。

·--to-last-logs-t

MySQL服务器中请求的二进制日志的结尾处不停止,而是继续打印直到最后一个二进制日志的结尾。如果将输出发送给同一台MySQL服务器,会导致无限循环。该选项要求--read-from-remote-server

·--disable-logs-bin-D

禁用二进制日志。如果使用--to-last-logs选项将输出发送给同一台MySQL服务器,可以避免无限循环。该选项在崩溃恢复时也很有用,可以避免复制已经记录的语句。注释:该选项要求有SUPER权限。

·--user=user_name-u user_name

连接远程服务器时使用的MySQL用户名。

·--version-V

显示版本信息并退出。

还可以使用--var_name=value选项设置下面的变量:

·open_files_limit

指定要保留的打开的文件描述符的数量。

可以将mysqlbinlog的输出传到mysql客户端以执行包含在二进制日志中的语句。如果你有一个旧的备份,该选项在崩溃恢复时也很有用(参见5.9.1节,“数据库备份”)

shell> mysqlbinlog hostname-bin.000001 | mysql

或:

shell> mysqlbinlog hostname-bin.[0-9]* | mysql

如果你需要先修改含语句的日志,还可以将mysqlbinlog的输出重新指向一个文本文件。(例如,想删除由于某种原因而不想执行的语句)。编辑好文件后,将它输入到mysql程序并执行它包含的语句。

mysqlbinlog有一个--position选项,只打印那些在二进制日志中的偏移量大于或等于某个给定位置的语句(给出的位置必须匹配一个事件的开始)。它还有在看见给定日期和时间的事件后停止或启动的选项。这样可以使用--stop-datetime选项进行点对点恢复(例如,能够说“将数据库前滚动到今天10:30 AM的位置)

如果MySQL服务器上有多个要执行的二进制日志,安全的方法是在一个连接中处理它们。下面是一个说明什么是不安全的例子:

shell> mysqlbinlog hostname-bin.000001 | mysql # DANGER!!
shell> mysqlbinlog hostname-bin.000002 | mysql # DANGER!!

使用与服务器的不同连接来处理二进制日志时,如果第1个日志文件包含一个CREATE TEMPORARY TABLE语句,第2个日志包含一个使用该临时表的语句,则会造成问题。当第1mysql进程结束时,服务器撤销临时表。当第2mysql进程想使用该表时,服务器报告 “不知道该”。

要想避免此类问题,使用一个连接来执行想要处理的所有二进制日志中的内容。下面提供了一种方法:

shell> mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql

另一个方法是:

shell> mysqlbinlog hostname-bin.000001 >   /tmp/statements.sql
shell> mysqlbinlog hostname-bin.000002 >> /tmp/statements.sql
shell> mysql -e "source /tmp/statements.sql"

mysqlbinlog产生的输出可以不需要原数据文件即可重新生成一个LOAD DATA INFILE操作。mysqlbinlog将数据复制到一个临时文件并写一个引用该文件的LOAD DATA LOCAL INFILE语句。由系统确定写入这些文件的目录的默认位置。要想显式指定一个目录,使用--local-load选项。

因为mysqlbinlog可以将LOAD DATA INFILE语句转换为LOAD DATA LOCAL INFILE语句(也就是说,它添加了LOCAL),用于处理语句的客户端和服务器必须配置为允许LOCAL操作。参见5.6.4节,“LOAD DATA LOCAL安全问题”

警告:LOAD DATA LOCAL语句创建的临时文件不会自动删除,因为在实际执行完那些语句前需要它们。不再需要语句日志后应自己删除临时文件。文件位于临时文件目录中,文件名类似original_file_name-#-#

--hexdump选项可以在注释中产生日志内容的十六进制转储:

shell> mysqlbinlog --hexdump master-bin.000001

上述命令的输出应类似:

/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
# at 4
#051024 17:24:13 server id 1   end_log_pos 98
# Position   Timestamp    Type    Master ID         Size       Master Pos     Flags
# 00000004 9d fc 5c 43    0f    01 00 00 00    5e 00 00 00    62 00 00 00    00 00
# 00000017 04 00 35 2e 30 2e 31 35   2d 64 65 62 75 67 2d 6c |..5.0.15.debug.l|
# 00000027 6f 67 00 00 00 00 00 00   00 00 00 00 00 00 00 00 |og..............|
# 00000037 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 |................|
# 00000047 00 00 00 00 9d fc 5c 43   13 38 0d 00 08 00 12 00 |.......C.8......|
# 00000057 04 04 04 04 12 00 00 4b   00 04 1a                 |.......K...|
#        Start: binlog v 4, server v 5.0.15-debug-log created 051024 17:24:13
#        at startup
ROLLBACK;

十六进制转储的输出包含下面的元素:

·Position: The byte position within the log file.

·Timestamp: The event timestamp. In the example just shown, '9d fc 5c 43' is the representation of '051024 17:24:13' in hexadecimal.

·Type: The type of the log event. '0f' means that the example event is a FORMAT_DESCRIPTION_EVENT. The types are:

·                00   UNKNOWN_EVENT
·                     This event should never be present in the log.
·                01   START_EVENT_V3
·                     This indicates the start of a log file written by MySQL 4 or earlier.
·                02   QUERY_EVENT
·                     The most common type of events.   These contain queries executed
·                     on the master.
·                03   STOP_EVENT
·                     Indicates that master has stopped.
·                04   ROTATE_EVENT
·                     Written when the master switches to a new log file.
·                05   INTVAR_EVENT
·                     Used mainly for AUTO_INCREMENT values and if the LAST_INSERT_ID()
·                     function is used in the statement.
·                06   LOAD_EVENT
·                     Used for LOAD DATA INFILE in MySQL 3.23.
·                07   SLAVE_EVENT
·                     Reserved for future use.
·                08   CREATE_FILE_EVENT
·                     Used for LOAD DATA INFILE statements.   This indicates the start
·                     of execution of such a statement.   A temporary file is created
·                     on the slave.   Used in MySQL 4 only.
·                09   APPEND_BLOCK_EVENT
·                     Contains data for use in a LOAD DATA INFILE statement.   The
·                     data is stored in the temporary file on the slave.
·                0a   EXEC_LOAD_EVENT
·                     Used for LOAD DATA INFILE statements.   The contents of the
·                     temporary file is stored in the table on the slave.
·                     Used in MySQL 4 only.
·                0b   DELETE_FILE_EVENT
·                     Rollback of LOAD DATA INFILE statement.   The temporary file
·                     should be deleted on slave.
·                0c   NEW_LOAD_EVENT
·                     Used for LOAD DATA INFILE in MySQL 4 and earlier.
·                0d   RAND_EVENT
·                     Used to send information about random values if the RAND()
·                     function is used in the query.
·                0e   USER_VAR_EVENT
·                     Used to replicate user variables.
·                0f   FORMAT_DESCRIPTION_EVENT
·                     This indicates the start of a log file written by MySQL 5 or later.
·                10   XID_EVENT
·                     Event indicating commit of XA transaction
·                11   BEGIN_LOAD_QUERY_EVENT
·                     Used for LOAD DATA statements in MySQL 5 and later.
·                12   EXECUTE_LOAD_QUERY_EVENT
·                     Used for LOAD DATA statements in MySQL 5 and later.
·                13   TABLE_MAP_EVENT
·                     Reserved for future use
·                14   WRITE_ROWS_EVENT
·                     Reserved for future use
·                15   UPDATE_ROWS_EVENT
·                     Reserved for future use
·                16   DELETE_ROWS_EVENT
·                     Reserved for future use

·Master ID: The server id of the master that created the event.

·Size: The size in bytes of the event.

·Master Pos: The position of the event in the original master log file.

·Flags: 16 flags.

·                01   LOG_EVENT_BINLOG_IN_USE_F
·                     Log file correctly closed (Used only in FORMAT_DESCRIPTION_EVENT)
·                     If this flag is set (if the flags are e.g. '01 00') in an
·                     FORMAT_DESCRIPTION_EVENT, then the log file has not been
·                     properly closed.   Most probably because of a master crash (for
·                     example, due to power failure).
·                02   Reserved for future use.
·                04   LOG_EVENT_THREAD_SPECIFIC_F
·                     Set if the event is dependent on the connection it was
·                     executed in (example '04 00'), e.g. if the event uses
·                     temporary tables.
·                08   LOG_EVENT_SUPPRESS_USE_F
·                     Set in some circumstances when the event is not dependent on
·                     the current database

其它标志保留用于将来使用。

在以后的版本中十六进制转储输出的格式可能会改变。

原文来自:MySQL 5.1参考手册

MYSQL慢速(SLOW LOG)脚本分析

mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,
要修改my.cnf或者在mysql启动的时候加入一些参数。如果在my.cnf(Windows为my.ini文件)里面修改,需增加如下几行

long_query_time = 1
log-slow-queries = /var/youpath/slow.log
log-queries-not-using-indexes

long_query_time 是指执行超过多久的sql会被log下来,这里是1秒。
log-slow-queries 设置把日志写在那里,可以为空,系统会给一个缺省的文件host_name-slow.log,
log-queries-not-using-indexes 就是字面意思,log下来没有使用索引的query。

mysql有以下几种日志:
错误日志:   -log-err
查询日志:   -log
慢查询日志:     -log-slow-queries
更新日志:     -log-update
二进制日志:   -log-bin

把上述参数打开,运行一段时间,就可以关掉了,详细请见http://blog.haohtml.com/index.php/archives/2772

接下来就是分析了,这里的文件名字叫host-slow.log。
先mysqldumpslow –help以下,e它主要用的是
-s ORDER what to sort by (t, at, l, al, r, ar etc), ‘at’ is default
-t NUM just show the top n queries
-g PATTERN grep: only consider stmts that include this string

-s,是order的顺序,说明写的不够详细,主要有
c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒叙
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感的

mysqldumpslow -s c -t 20 host-slow.log
mysqldumpslow -s r -t 20 host-slow.log

上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。
mysqldumpslow -t 10 -s t -g “left join” host-slow.log
这个是按照时间返回前10条里面含有左连接的sql语句。

用了这个工具就可以查询出来那些sql语句是性能的瓶颈,进行优化,比如加索引,该应用的实现方式等。

mysqldumpslow -s c -t 10 /tmp/slow_query.log


Nginx常见应用技术-Tips

目  录
一、  Nginx  基础知识
二、  Nginx  安装及调试
三、  Nginx Rewrite
四、  Nginx Redirect
五、  Nginx  目录自动加斜线:
六、  Nginx Location
七、  Nginx expires
八、  Nginx  防盗链
九、  Nginx  访问控制
十、  Nginx 日志处理
十一、  Nginx Cache
十二、  Nginx  负载均衡
十三、  Nginx 简单优化
十四、  如何构建高性能的 LEMP 环境
十五、  Nginx 服务监控
十六、  常见问题与错误处理.
十七、  相关资源下载

作者:NetSeek
欢迎转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明.
首发时间: 2008-11-25

转帖NetSeek的Nginx Tips 希望对广大Cuer有用!

附件pdf:Nginx常见应用技术-Tips.pdf

SHOW INDEX语法 查看索引状态

SHOW INDEX FROM tbl_name [FROM db_name]

SHOW INDEX会返回表索引信息。其格式与ODBC中的SQLStatistics调用相似。

SHOW INDEX会返回以下字段:

· Table

表的名称。

· Non_unique

如果索引不能包括重复词,则为0。如果可以,则为1。

· Key_name

索引的名称。

· Seq_in_index

索引中的列序列号,从1开始。

· Column_name

列名称。

· Collation

列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。

· Cardinality

索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。

· Sub_part

如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。

· Packed

指示关键字如何被压缩。如果没有被压缩,则为NULL。

· Null

如果列含有NULL,则含有YES。如果没有,则该列含有NO。

· Index_type

用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。

· Comment

多种评注。

您可以使用db_name.tbl_name作为tbl_name FROM db_name语法的另一种形式。这两个语句是等价的:

mysql> SHOW INDEX FROM mytable FROM mydb;

mysql> SHOW INDEX FROM mydb.mytable;

SHOW KEYS是SHOW INDEX的同义词。您也可以使用mysqlshow -k db_name tbl_name命令列举一个表的索引。

SHOW INNODB STATUS语法

SHOW INNODB STATUS

在MySQL 5.1中,这是SHOW ENGINE INNODB STATUS的同义词,但不赞成使用。

Windows 内存泄漏检测工具——LeakDiag

LeakDiag是微软一款检测memory leak的工具,使用比较简单

首先去下载一个ftp://ftp.microsoft.com/PSS/Tools/Developer%20Support%20Tools/LeakDiag/

安装好,默认是在c:\leakdiag

leakdiag1
对于内存泄漏的检查,本质上在于定位内存泄漏。这种定位包含两层含义:

一是定位模块,即哪个模块出了问题。

二是定位代码,即找到造成内存泄漏的代码。

对此,在分工合作完成一个系统的背景下,我们检查内存泄漏的工作流程就应该是:第一,定位模块;第二,如果是我们的模块出现问题,就要定位代码。

对于内存泄漏的检查工作,感觉更像一个侦探工作。只有找到足够的线索,才能找到真正的原因。要想成为一个优秀侦探,自身的侦察能力最重要。而优秀的侦探,一般都会有一些好的侦探工具。

那么,应该怎样来评价内存泄漏的检查工具的优劣?在这里,我们不妨展开想象:

1) 它可以自由选择监测的时间点;

2) 它可以attach 任何一个运行的进程来追踪内存泄漏;

3) 我不需要在我的程序中加任何代码;

4) 没有源代码,我照样能发现内存泄漏的地方;

5) 我能得到每次分配内存,而未释放的堆栈情况。

6) 不管是发布版,还是调试版的程序,都能做到上面几点。

在此,我推荐使用MicroSoft公司自己开发的一个工具——LeakDiag

LeakDiag是一个监测内存泄漏的工具,可以用来精确地找到内存泄露一直到代码行。它使用微软的Detours 技术,拦截指定内存分配的调用并跟踪各种调用栈,并报告已分配但尚未释放的内存,这一信息允许让我们在排除一个内存泄露问题时,能精确查看哪些组件进行了 该分配。使用正确的调试符号,我们甚至可以看见请求分配的代码行。比较了市面上各种内存泄漏检测工具,我觉得这个工具较好的做到了上面的6 点。

LeakDiag支持5种不同的分配:

1) 虚拟分配。 这种分配可追踪用VirtualAlloc/ VirtualAllocEx 等关于虚拟内存分配的内存。此时,选择LeakDiag [Memory allocators] 选项的“Virtual Memory Allocator”来检测。

2) 堆分配。这种分配可追踪NTDLL.DLL中如下函数分配的内存。

· RtlCreateHeap,

· RtlDestroyHeap,

· RtlAllocateHeap,

· RtlFreeHeap,

· RtlReAllocateHeap,

· LocalReAlloc,

· LocalFree,

· LocalAlloc,

· LocalReAlloc,

· GlobalAlloc,

· GlobalReAlloc and

· GlobalFree

此时,选择LeakDiag [Memory allocators] 选项的“Windows Heap Allocator”来检测。

3) 线程局部存储(Thread Local StorageTLS指允许一个进程的多个线程存储每个线程所独有的数据的一种Win32 机制)分配。这种分配可追踪MSDART32.DLL中如下函数分配的内存。

· MPHeapAlloc,

· MPHeapFree and

· MPHeapReAlloc

此时,选择LeakDiag [Memory allocators] 选项的“MPHeap Allocator”来检测。

4) COM分配(外部和内部)。这种分配可追踪OLE32.DLLOLEAUT32.DLL 中如下函数分配的内存。

· CoGetMalloc,

· CoTaskMemAlloc,

· CoTaskMemFree,

· CoTaskMemRealloc,

· CRetailMalloc_Alloc,

· CRetailMalloc_Free,

· CRetailMalloc_Realloc,

· SysAllocStringLen,

· SysAllocStringByteLen,

· SysAllocString,

· SysFreeString,

· SysReAllocString and

· SysReAllocStringLen

此时,选择LeakDiag [Memory allocators] 选项的“COM Allocator”或“COM Internal Allocator”来检测。

5) C运行时分配。这种分配可追踪MSVCRT.DLL中如下函数分配的内存。

· malloc,

· calloc,

· realloc,

· free,

· new,

· new[],

· delete and

· delete[]

此时,选择LeakDiag [Memory allocators] 选项的“C Runtime Allocator”来检测。