July 2, 2010
MySQL之Handler_read_*
"在MySQL里,我们一般使用 SHOW STATUS 查询服务器状态,语法一般来说如下:\nSHOW [GLOBAL | SESSION] STATUS [LIKE ‘pattern’ | WHERE expr]\n执行命令后会看到很多内容,其中有一部分是Handler_read_*,它们显示了数据库处理SELECT查询语句的状态,对于调试SQL语句有很大意 义,可惜实际很多人并不理解它们的实际意义,本文简单介绍一下:\n为了让介绍更易懂,先建立一个测试用的表:\nCREATE TABLE IF NOT EXISTS foo (\nid int(10) unsigned NOT NULL auto_increment,\ncol1 varchar(10) NOT NULL,\ncol2 text NOT NULL,\nPRIMARY KEY (id),\nKEY col1 (col1)\n);\nINSERT INTO `foo` (`id`, `col1`, `col2`) VALUES (1, ‘a’, ‘a’), (2, ‘b’, ‘b’), (3, ‘c’, ‘c’), (4, ‘d’, ‘d’), …"
July 2, 2010
根据status信息对MySQL服务器进行优化[精典]
"对于SQL查询语句对于服务器系统资源的使用情况见:发现瓶颈 – Profiling(程序剖析) -MySQL Profiling\n网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的 情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据服务器的”状态”进行优化。\nmysql\u0026gt; show global status;\n可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:\nmysql\u0026gt; show variables;\n一、慢查询\nmysql\u0026gt; show variables like ‘%slow%’; +——————+——-+ | Variable_name | Value | +——————+——-+ | log_slow_queries | ON | | slow_launch_time | 2 | +——————+——-+\nmysql\u0026gt; show global status like ‘%slow%’; …"
July 2, 2010
mysql优化的重要参数 key_buffer_size table_cache 分享
"MySQL服务器端的参数有很多,但是对于大多数初学者来说,众多的参数往往使得我们不知所措,但是哪些参数是需要我们调整的,哪些对服务器的性能影响最大呢?对于使用Myisam存储引擎来说,主要有key_buffer_size和table_cache两个参数。对于InnoDB引擎来说主要还是以innodb_开始的参数,也很好辨认。 查看MySQL参数,可以使用show variables和show status命令查看,前者查看服务器静态参数,即在数据库启动后不会动态更改的值,比如缓冲区、字符集等。后者查看服务器的动态运行状态信息,即数据库运行期间动态变化的信息,比如锁,当前连接数等。\nkey_buffer_size这个参数是用来设置索引块(index blocks)缓存的大小,它被所有线程共享,严格说是它决定了数据库索引处理的速度,尤其是索引读的速度。那我们怎么才能知道key_buffer_size的设置是否合理呢,一般可以检查状态值Key_read_requests和Key_reads,比例key_reads / key_read_requests 应该尽可能的低,比 …"
July 1, 2010
MYSQL慢查询日志分析
"Mysql5.5慢查询开启有些改变,在my.cnf的 [mysqld] section 添加以下几行即可.注意一定要在[mysqld]块,否则不起作用.\nlong_query_time = 0.001 slow-query-log = ON slow_query_log_file = /usr/local/mysql/data/slow.log log-queries-not-using-indexes = on\n===================================================\nmysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数。 如果在my.cnf里面修改,需增加如下几行\nlong_query_time = 10 slow_query_log = /var/log/slow.log\nlong_query_time 是指执行超过多久的sql会被log下来,这里是10秒。 slow_query_log 设置把日志写在那里,为空的时候,系统会 …"
June 29, 2010
分享FreeBSD 8.0的十四条优化策略
"【51CTO独家特稿】笔者目前是一位外企linux/unix系统工程师与项目实施工程师,而FreeBSD一直作为我们企业内部的开发服务器,具有稳定和高效的特点。本文根据笔者经验总结了十四条FreeBSD的优化策略。如无其它,以下所指FreeBSD均指FreeBSD 8.0_release。\n一、提高ports安装速度\nFreeBSD中的ports安装工具默认工具是用fetch,下载时经常出现龟速现象。为了提高ports安装速度,我推荐axel工具。相关make.conf文件配置步骤如下:\ncd /usr/ports/ftp/axel make install #修改/et/make.conf vi /etc/make.conf #加入以下内容 FETCH_CMD=axel FETCH_BEFORE_ARGS= -n 10 -a FETCH_AFTER_ARGS= DISABLE_SIZE=yes MASTER_SITE_OVERRIDE?=\\ http://ports.hshh.org/${DIST_SUBDIR}/\\ …"
June 27, 2010
MySQL 备份(推荐方法)
"一般来说,你有两种可供选择的备份MySQL的方式—-mysqldump 或者mysqlhotcopy。\nmysqldump可以备份各种类型的数据表,但是mysqlhotcopy 只适合 备份MyISAM和ISAM的数据表。所以使用mysqlhotcopy之前,你必须确认你的数据表是不 是有其他的存储引擎(storage engines)的。\nHow To:\nmysqldump -u root -p*** DBNAME | gzip -f\u0026gt;/backup/dbname.’date +%w’.dump.gz\nmysqlhotcopy DBNAME -u root -p *** /backup\n**两者速度:**因为 mysqlhotcopy会直接拷贝存储数据的文件,所以其速度是依赖于磁盘操作的速度,较之mysqldump要快些。下面是两种方式备份同一个数据的 时候的时间消耗比较:\nmysqldump 耗时22分39秒(gzip 压缩后文件大小为747M.) mysqlhotcopy 耗时6分07秒(tar gzip打包压缩后文件大小为1014M.) 参考: …"
June 27, 2010
图解”How MySQL Replication Works”
"replication by orczhou, on Flickr\n在使用MySQL的应用中,如果你的MySQL Server压力逐渐增大,在应用层优化已经到了一定瓶颈时,那么你应该首先考虑 MySQL Replication。本文将利用图示的方式简单的描述出MySQL Replication是如何工作的。\n如何同步\n主库将所有的更新操作,写入二进制日志。\n从库运行”IO线程”(Slave IO Thread)读取主库的二进制日志。\n从库运行”SQL线程”(Slave SQL Thread)执行IO线程(Slave IO Thread)读取的日志中的SQL,从而保持和主库的一致。\n如何分配请求\n目前,这部分需要在应用层实现。\n执行更新SQL(UPDATE,INSERT,DELETE)时,请求主库。\n执行查询SQL(SELECT)时,请求从库。\n所以,当你的应用(Application)SELECT请求所占的比率越大,那么Relication就会越有效。"
June 27, 2010
关于MySQL explain 中的ID(推荐)
"Explain ID详解\n含义:select查询的序列号,是一组数字,表示的是查询中执行select子句或者是操作表的顺序。\nid的情况有三种,分别是:\nid相同表示加载表的顺序是从上到下。 id不同id值越大,优先级越高,越先被执行。 id有相同,也有不同,同时存在。id相同的可以认为是一组,从上往下顺序执行;在所有的组中,id的值越大,优先级越高,越先执行。 再看一个查询计划的例子:\n执行顺序依次为 4 -\u0026gt; 3 -\u0026gt; 2 \u0026gt; 1 \u0026gt; NULL\n第一行:id列为1,表示第一个select,select_type列的primary表示该查询为外层查询,table列被标记为,表示查询结果来自一个衍生表,其中3代表该查询衍生自第三个select查询,即id为3的select。[select d1.name……]\n第二行:id为3,表示该查询的执行次序为2(4→3),是整个查询中第三个select的一部分。因查询包含在from中,所以为derived。[select id,name from t1 where other_column=”]\n第三行:select列表 …"
June 26, 2010
LVS & MySQL NDB Cluster
"章文嵩博士(LVS开源项目创始人)进入淘宝好几个月了,今天是他第一次讲解LVS的实现原理。作为DBA的一员,终于近距离膜拜了大牛。 讲解的内容就不具体介绍了,在LVS 官方网站上面可以找到。PPT的内容和网站上基本上一样,只是讲解人是章博士本人。我在这整理一下自己的理解,不对请大家指正。 ^_^\n组成LVS最重要的部分有三个:请求分发服务器、处理服务器、共享存储。\n典型的Web集群并不需要共享存储,只有请求分发服务器和处理服务器,如下图所示: [][2] 如果完成请求需要基于数据,那么共享存储就是LVS必须的组件了。LVS邮件服务器集群如下所示: [][3] 目前能应用于LVS的MySQL集群只能是NDB Cluster,因为MySQL众多的存储引擎中,只有NDB Cluster实现了共享存储的功能。 在NDB Cluster中,SQL Node相当于处理服务器,Data Node相当于共享存储。LVS可以让应用程序的开发更加简单,开发人员并不需要知道执行SQL的数据库服务器到底是哪一个,但是可以获得自己想要的数 据。而NDB Cluster提供的数据拆分和扩容功能,保证了数据库的可扩 …"
June 26, 2010
mysqldump意外终止的原因以及解决方法
"mysqldump是非常重要的MySQL备份工具。然而在长年累月的使用过程中,TAOBAO多次出现了因mysqldump意外终止而导致备份 失败的情况。 以下是我们经常遇到的问题:\n1、Lost connection to MySQL server at ‘reading initial communication packet’: 这个主要是因为DNS不稳定导致的。如果做了网络隔离,MySQL处于一个相对安全的网络环境,那么开启skip-name-resolve选项将会最大 程度避免这个问题。\n2、Lost connection to MySQL server at ‘reading authorization packet’: 从MySQL获取一个可用的连接是多次握手的结果。在多次握手的过程中,网络波动会导致握手失败。增加connect_timeout可以解决这个问题; 然而增加connect_timeout并不能防止网络故障的发生,反而会引起MySQL线程占用。最好的解决办法是让mysqldump重新发起连接请 求。\n3、Lost connection to MySQL …"