存档

文章标签 ‘MySQL’

推荐一下EMS SQL Manager for MySQL

2009年3月12日

原来操作mysql一直使用两个工具:phpMyAdmin和Mysql的官方GUI客户端

前者是服务器端的,不提了,后者功能虽然挺全(至少比phpMyAdmin全),可是用着就是别扭,各种功能的摆放不是很有条理,需要大量输入的东西比如query和脚本时也没有什么人性化的帮助。

这两天才发现了EMS SQL Manager for MySQL,初步用了用感觉不错,发到这里推荐一下吧。

技术

搬家日记(X-Space到WordPress)

2009年2月8日

搬家工作基本完成,颇发扬了自已动手,丰衣足食的精神,记录一下吧。

我的blog原先架在Discuz!的附属的Supesite的X-Space上,目的是转到现在的wordpress上来。本来以为会有现成的blog搬家工具,结果各处一搜,竟然都不支持X-Space自已host的这种blog,唯一看到一个叫blogbak的,也只能把X-Space上的blog导到它自己的51某某站上。
那没有现成的工具,那就用RSS吧,结果发现X-Space不能把日志导出成RSS2.0的文件,作罢。那,从WP这边导入X-Space的rss的feed总是万能的了吧,结果再一次被X-Space的RSS输出打击掉,它只输出一定长度的文章,结果长的文章的后半部分就被截掉了,而且不能通过设置改变这个行为。。。。

没办法,自己写程序搬家好了。。。不过也好,这样comment和commentor的联系方式什么的都能留下,否则我就放弃他们了
(注:上面的功能新版的X-Space好像已经有了,不过我的版本很老。。。)

我写的这些代码适用于满足以下条件的人:
1.是自己host的X-Space和wordpress,自己的主机或者虚拟主机都行,专门的博客提供商(BSP)就不行了
2.X-Space和wordpress在同一个数据库中(一般虚拟主机都这样),如果不是,就得自己改改代码了
3.X-Space的文字编码是gb2312,wordpress的是UTF-8(话又说回来,要是编码相同,连程序都不用了,完全靠SQL也能完成搬家)

搬家步骤:

  1. 正常地安装wordpress
  2. 首先,要小改一下X-Space在数据库里的supe_spacecomments表,在它之中加一列integer列,叫wpID,用于保存原blog里日志的ID和新WP的blog中日志的ID的对应
  3. 打开本文附件convertscript.zip里的两个PHP文件,把里面的数据名、用户名密码等改成实际的值,上传到自己的虚拟主机上
  4. 执行convertArticle.php,把原有的日志转换到WP中(新文章的作者会是默认的id=1,也就是admin用户)
  5. 执行convertComment.php,把原有的comment也转到WP中
  6. 跑一下这句sql: UPDATE `wp_posts` SET `post_name` = md5( `post_content` ) WHERE `post_name` = “”, 用来给每篇日志生成一个post_name,用在该文的静态地址中

至此,搬家基本就算是完成了,不过有点美中不足,就是WP的wp_posts表中有一列叫comment_count,算是个冗余的计数信息吧。默认它是0的,我写了下面的sql以填写它的值:

UPDATE `wp_posts` AS w
INNER JOIN
(
    SELECT p.`ID` AS `wpID` , count( * ) AS `comment_count`
    FROM `wp_posts` AS p
    INNER JOIN `wp_comments` AS c ON p.`ID` = c.`comment_post_ID`
    GROUP BY p.`ID`
) AS ct
ON w.`ID`=ct.`wpID`
SET w.`comment_count`=ct.`comment_count`

但是我的512j的服务器上mysql是4.0.22版本,还不支持子查询。。。。
不过,这个字段有没有用我也不确定,因为各种地方显示的comment计数都是正常的。。。

最后,小感慨一下。以后挑blog建的时候,要先研究好这东西的接口怎么样,否则就容易上X-Space这样的贼船了。。。

技术, 杂记 , , ,

关于用到mysql的应用,注意检查编码问题

2008年5月9日

对于集成了mysql的一些应用,比如proftpd的用户认证(已经栽在它上面两次了!!),用的时候一定要检查my.cnf里关于client端默认编码的事。
因为它没有地方让你执行什么set names=XXX这种语句,所以只能靠my.cnf里的默认设置

切记在与mysql有关的应用遇到问题要养成检查my.cnf的习惯,否则真是不知道怎么死的。。。

技术 , ,

记一次网站紧急维护过程

2008年2月25日

学院自己设计的选课系统,今年初次启用,用于一个年级约150人的同时选课。选课开始之后很快网站便失去响应。重启服务器之后重新开启选课系统,但是又迅速停止服务。于是选课宣布推迟。

 


二次选课安排在某日下午。于第二次选课前一天接手站点维护,对站点的结构和程序性能进行分析。该站点由两台服务器分别负责数据库和Web服务。采用10个
并发用户模拟选课过程时,210个事务操作需要10分钟左右。期间Web服务器基本没有负载,而数据库服务器CPU满载。站点数据表尺寸在1M的级别,程
序代码中仅有一次锁表操作,但是有若干处在循环中查询数据库。因此推测性能问题是由于对数据库访问次数过多而导致的。

 

开启
数据库的日志并访问课程列表页面,发现仅此一个页面就有200余次数据库查询操作。对课程列表页面进行压力测试发现,数据库服务器每秒可处理近800次查
询请求。而一次完整的选课过程则会导致900余次数据库查询。这说明程序结构存在着严重的问题,因此对程序进行重构,消除循环中对于数据库的访问。共将三
处循环中对于数据库的访问改为存储过程,另外修改了一些查询语句。同时对数据表项目进行了小的调整,添加了几个表项作为缓存,消除了几处多余查询和重复查
询。撤销了两个被频繁调用的且结果稳定的函数中对于数据库的调用,将部分结果暂时硬编码至程序中。另有一处被频繁调用的函数因程序结构原因无法进行快速重
构,故而放弃对其的修改。经过上述重构,显示课程列表页面所需的访问数据库次数降低至20次左右,同时由于数据库和程序客户端的问题增加了三次额外的数据
库连接操作。应当说这个数据库访问次数仍是偏多的,但是与原先的情况相比有了明显的改进,同时由于程序结构的限制,在短时间内无法进行进一步的优化,因此
对程序的优化到此为止告一段落。整个重构过程耗时约12小时。在程序重构的同时,根据网站页面的功能对于部分网页暂时采取了转为静态页面和不显示的方法以
降低重构的工作量。优化结束后对课程列表页面进行压力测试,10个客户端连续刷新时Web服务器的CPU占用在40%左右,而数据库服务器的CPU占用在
30%附近。

 

程序重构结束之后,对数据库以及两台服务器的操作系统继续进行优化。根据程序中的查询语句为数据库增添了一些
索引,从而使得10个客户端连续刷新课程列表页面时数据库服务器的CPU占用降低至10%以下。此时Web服务器的CPU占用相对较高,同时使用压力测试
软件进行测试时响应时间有明显的周期性分布。检查Web服务器的网络连接情况,发现Web服务器端访问数据库的网络连接在程序结束之后没有及时关闭,猜测
这可能导致网络连接数过多,从而导致响应时间周期性的分布。因此调整Web服务器的部分网络参数以消除此现象。另外为Web服务器安装了程序脚本的预编译
模块以避免重复的脚本编译操作。经过这些优化之后,25个客户端连续刷新课程列表页面时Web服务器的CPU占用降低至20%以下,数据库服务器的CPU
占用在15%左右。

 

分析维护前后系统的性能,对于程序的重构使响应速度提高了近10倍;添加新的数据库索引以及Web程序脚本预编译又各自使得Web服务器和数据库服务器的响应速度翻倍。因此总的来看,维护之后站点的性能提高了近20倍。

 


日上午对于网站的内容以及程序逻辑进行进一步的检查,更正了几处数据和逻辑错误。下午选课时,网站负载在选课开始3分钟后达到峰值。Web服务器的峰值
CPU占用在15%,而数据库服务器的峰值CPU占用在10%。选课开始10分钟后两服务器已没有明显负载。根据数据库内容的监测,此时大部分学生的选课
已基本结束。

运维 , ,

php中调用mysql存储过程的两个问题

2007年5月1日

一、存储过程返回一个结果集的问题

正常情况下,如果在php中调用一个mysql存储过程,而该过程返回一个结果集的话,那么会收到“#1312 – PROCEDURE XXX can’t return a result set in the given context”的错误提示。
解决方法是,在用mysql_connect()连接数据库时,使用最后一个参数client_flags,设该参数值为0×20000,即如下:

define(‘CLIENT_MULTI_RESULTS’, 0×20000);
$db = mysql_connect(“dbhost”, “dbuser”, “dbpasswd”,1,CLIENT_MULTI_RESULTS);

二、提示“Lost connection to MySQL server during query”的问题

如果在一个页面中调用了不止一次存储过程,就可能收到上面的提示。一个省事的方法就是每次调用储存过程都重connect一下数据库。
在网上查了一下这个问题,有的人说可以在phpinfo()中看一下mysql client API的版本,至少在5.0.15以上才行,不过我的已然是5.0.18了。还有说要改php.ini,设置这个参数:set-variable=thread_stack=256k

编程 ,

mysql客户程序的中文乱码问题

2007年3月30日

自mysql5.0以来,自己的客户端程序在编码问题上越来越复杂了,乱码是常见的。

一般来说,对于想使用中文的情况(包括用C写的程序或是php等),在连接上数据库之后,应该执行一下set names ‘gb2312′(或是别的编码),这时再使用中文就是正常的了。

不过今天遇到的问题源于proftpd,用proftpd与mysql相连实现用户认证,而用户的家目录也是存在数据库中的,而我们FTP的家目录中含有中文,这样mysql返给proftpd就是乱码了,无法登录。可是你有没办法让proftpd给mysql发一个set names的命令,所以问题应该这么解决。编辑/etc/my.cnf,在其中加一个[client]字段,其下加一句:default-character-set=gb2312,这样应该就没问题了,相当于本机所有的mysql客户程序都默认用gb2312去连别的数据库。你可以用mysql程序连数据库,用show variables;命令来看看编码的几项是不是已经成了gb2312。不过这样还是不甚好,因为一个机器上的客户程序还是可能连多个数据库的,如果几个数据库用的编码不同,还是不成,所以如果条件许可,还是应该在程序执行时调用set names来指定当前连接的编码。

运维 ,

mysql_store_result()与mysql_use_result()的区别

2007年3月21日

在使用mysql_query()进行一个查询后,一般要用这两个函数之一来把结果存到一个MYSQL_RES *变量中。

两者的主要区别是,mysql_use_result()的结果必须“一次性用完”,也就是说用它得到一个result后,必须反复用mysql_fetch_row()读取其结果直至该函数返回null为止,否则如果你再次进行mysql查询,会得到“Commands out of sync; you can’t run this command now”的错误。而mysql_store_result()得到result是存下来的,你无需把全部行结果读完,就可以进行另外的查询。比如你进行一个查询,得到一系列记录,再根据这些结果,用一个循环再进行数据库查询,就只能用mysql_store_result()。

技术

mysql忘记root口令的解决办法

2006年10月28日

mysql正运行的话,则停止之,
然后以不需要密码的模式启动MySQL:./mysqld_safe –skip-grant-tables &
这时直接打./mysql就进入了,不需要密码

输入以下命令

>use mysql
>update user set password=password(“XXXXXXX”) where user=”root”;
>flush privileges;

再停止运行mysql,重新以正常模式进入即可。

运维

列一下自己的MAP安装程序吧

2006年7月21日

UploadFiles/2006-7/721619265.rar装的次数太多了,不过每次的设置越来越少,列个表吧

1装apache
文件httpd-2.2.0.tar.gz
命令./configure –enable-so (它默认的prefix=/usr/local/apache2)
自启方法:把系统自带的init.d/httpd改成新的目录就得了
附件一就是这个httpd文件(直接上传非说文档类型不对,只得打包)

2装mysql
参考页面:http://dev.mysql.com/doc/refman/5.0/en/quick-install.html
基本就按上面的做就得了
文件:mysql-5.0.18.tar.gz
命令:./configure –prefix=/usr/local/mysql –with-extra-character=gb2312,gbk,big5
(注:后来在一个redhat8.0上装mysql,发现用上面的命令根本没有gb2312编码,所以改用./configure –prefix=/usr/local/mysql –with-charset=gb2312 –with-extra-charset=all)
安完后到/usr/local/mysql去
执行bin/mysql_install_db –user=mysql
自启方法:在mysql的源码目录中有个support-files/mysql.server,把它拷为/etc/rc.d/init.d/mysqld,然后加上执行权限就行了

方便起见,用这个命令grant一下来自非localhost的root的权限:
grant all on *.* to root@’%’ identified by ‘xxxx’;

后来升级了内核,mysql会crash,原因不太清楚,编译时多加了几项:
./configure –prefix=/usr/local/mysql –with-extra-charsets=gb2312,gbk,big5 –with-mysqld-ldflags=-all-static –enable-assembler –with-debug
还要编辑一下生成的Makefile,我的CXXFLAG字段是这样的:CXXFLAGS = -g -O -DDBUG_ON -DSAFE_MUTEX -fno-implicit-templates -fno-exceptions -fno-rtti -felide-constructors
参考的是以下两个地址:
http://dev.mysql.com/doc/refman/5.0/en/installing-source.html
http://dev.mysql.com/doc/refman/5.0/en/configure-options.html

3装PHP5
参考页面:http://www.php.net/manual/en/install.unix.apache2.php
文件:php-5.1.2.tar.gz
./configure –with-apxs2=/usr/local/apache2/bin/apxs –with-mysql=/usr/local/mysql –with-mysqli=/usr/local/mysql/bin/mysql_config –enable-ftp

4.关于gd的相关内容

今天我又装了个gd,要装的东西挺多的,在这列一下用到的文件:

freetype-2.3.4.tar.gz  gd-2.0.34.tar.gz  jpegsrc.v6b.tar.gz  libpng-1.2.16.tar.gz  zlib-1.2.3.tar.gz
除了gd本身以外,其余几个都是解开,./configure;make;make install就完事了
最后编gd,gd其实也是这个步骤,它是自动检测另外几个包的安装情况,configure的时候会列出来其它几项的有无,看一下对不对就是了,如果不对的话configure的时候再指定路径。
然后就是再编译一下php,我用到的命令为:
./configure –with-apxs2=/usr/local/apache2/bin/apxs –with-mysql=/usr/local/mysql –with-mysqli=/usr/local/mysql/bin/mysql_config –with-gd –with-jpeg-dir –with-png-dir –with-zlib-dir –with-freetype-dir –enable-ftp

运维, 技术 , , ,