<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Security Team Blog &#187; 系统维护</title>
	<atom:link href="http://www.secblog.cn/category/system/feed" rel="self" type="application/rss+xml" />
	<link>http://www.secblog.cn</link>
	<description>服务器系统架构、优化及网络安全</description>
	<lastBuildDate>Tue, 29 Nov 2011 02:15:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>金山逍遥网 sersync 服务器实时镜像、自动同步程序开源</title>
		<link>http://www.secblog.cn/system/584.html</link>
		<comments>http://www.secblog.cn/system/584.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 06:06:36 +0000</pubDate>
		<dc:creator>豬頭濱</dc:creator>
				<category><![CDATA[系统维护]]></category>

		<guid isPermaLink="false">http://www.secblog.cn/?p=584</guid>
		<description><![CDATA[Sersync 是我们金山逍遥网技术支持部平台组周洋同学，开发的一款基于 inotify + rsync 的大量文件的多服务器自动同步程序，目前已开源，开源协议为 New BSD License。 原理： 使用 Linux 2.6 内核的 inotify 监控 Linux 文件系统事件，被监听目录下如果有文件发生修改，sersync 将通过内核自动捕获到事件，并将该文件利用 rsync 同步到多台远程服务器。sersync 仅仅同步发生增、删、改事件的单个文件或目录，不像rsync镜像同步那样需要比对双方服务器整个目录下数千万的文件，并且支持多线程同步，因此效率非常 高。 应用： 金山游戏官网的 CMS 内容发布系统。无论编辑通过 Web 还是 FTP 上传图片、视频、附件，还是系统工程师直接去CMS发布服务器上增加、修改、删除文件，干完这些事情后不用做任何处理，sersync 会自动将发生增、删、改事件的文件同步到远程服务器，并可以在文件同步完成后，自动调用 CDN（ChinaCache）缓存刷新接口，刷新发生修改、删除的文件的访问 URL。 更多内容，请访问项目网址：http://code.google.com/p/sersync/]]></description>
			<content:encoded><![CDATA[<p>Sersync 是我们金山逍遥网技术支持部平台组<a href="http://code.google.com/u/zhouyangkunta/" target="_blank">周洋</a>同学，开发的一款基于 inotify + rsync 的大量文件的多服务器自动同步程序，目前已开源，开源协议为 New BSD License。</p>
<p><strong>原理：</strong><br />
使用 Linux 2.6 内核的 inotify 监控 Linux 文件系统事件，被监听目录下如果有文件发生修改，sersync  将通过内核自动捕获到事件，并将该文件利用 rsync 同步到多台远程服务器。sersync  仅仅同步发生增、删、改事件的单个文件或目录，不像rsync镜像同步那样需要比对双方服务器整个目录下数千万的文件，并且支持多线程同步，因此效率非常 高。</p>
<p><strong>应用：</strong><br />
金山游戏官网的 CMS 内容发布系统。无论编辑通过 Web 还是  FTP 上传图片、视频、附件，还是系统工程师直接去CMS发布服务器上增加、修改、删除文件，干完这些事情后不用做任何处理，sersync  会自动将发生增、删、改事件的文件同步到远程服务器，并可以在文件同步完成后，自动调用  CDN（ChinaCache）缓存刷新接口，刷新发生修改、删除的文件的访问 URL。</p>
<p>更多内容，请访问项目网址：<a href="http://code.google.com/p/sersync/" target="_blank">http://code.google.com/p/sersync/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.secblog.cn/system/584.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于php5.2.4 服务器时间和北京时间相差8小时的解决方法</title>
		<link>http://www.secblog.cn/system/562.html</link>
		<comments>http://www.secblog.cn/system/562.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 05:52:23 +0000</pubDate>
		<dc:creator>豬頭濱</dc:creator>
				<category><![CDATA[系统维护]]></category>

		<guid isPermaLink="false">http://www.secblog.cn/?p=562</guid>
		<description><![CDATA[服务器时间 2007年11月29日 10:24:40  北京时间： 2007年11月29日 18:24:40 在php.ini添加 ;;;;;;;;;;;;;;;;;;; ; Module Settings ; ;;;;;;;;;;;;;;;;;;; [Date] ; Defines the default timezone used by the date functions ;date.timezone = date.timezone = Etc/GMT-8 重起iis/apache 刷新探针再看 服务器时间 2007年11月29日 18:27:49  北京时间： 2007年11月29日 18:27:49]]></description>
			<content:encoded><![CDATA[<table cellspacing="0">
<tbody>
<tr>
<td>服务器时间</td>
<td>2007年11月29日 10:24:40  北京时间： 2007年11月29日 18:24:40</td>
</tr>
</tbody>
</table>
<p>在php.ini添加<br />
;;;;;;;;;;;;;;;;;;;<br />
; Module Settings ;<br />
;;;;;;;;;;;;;;;;;;;<br />
[Date]<br />
; Defines the default timezone used by the date functions<br />
;date.timezone =<br />
date.timezone = Etc/GMT-8</p>
<p>重起iis/apache 刷新探针再看</p>
<table cellspacing="0">
<tbody>
<tr>
<td>服务器时间</td>
<td>2007年11月29日 18:27:49  北京时间： 2007年11月29日 18:27:49</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.secblog.cn/system/562.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL数据库故障解决──修复损坏的表[转载]</title>
		<link>http://www.secblog.cn/system/560.html</link>
		<comments>http://www.secblog.cn/system/560.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 05:51:48 +0000</pubDate>
		<dc:creator>豬頭濱</dc:creator>
				<category><![CDATA[系统维护]]></category>

		<guid isPermaLink="false">http://www.secblog.cn/?p=560</guid>
		<description><![CDATA[昨天，校党委宣传部的W老师打电话向我寻求帮助，说中南民大论坛MySQL数据库发生故障，他们试图用5月7日的数据库备份去恢复，但没有成功。 我晚上回宿舍后，登录到民大论坛服务器上一看，原来是论坛MySQL数据库的一张MySQL表损坏。根据我的经验，成功修复MySQL损坏表的概率是 90%，根本没有必要急着去用旧的数据库备份去恢复，何况备份又不及时，5月7日到发生故障的5月22日，意味着要丢失15天的数据啊。 我修复了5月22日的数据库，故障发生之前的数据没有丢失。方法很简单，四步即可搞定。 ①、用root帐号从命令行登录MySQL： mysql -u root -p ②、输入root帐号的密码。 ③、选定数据库名（本例中的数据库名为studentmis）： use studentmis; ④、修复损坏的表（本例中要修复的表为smis_user_student）： repair table smis_user_student; 注：以上操作适用于MySQL的MyISAM表存储结构。]]></description>
			<content:encoded><![CDATA[<p>昨天，校党委宣传部的W老师打电话向我寻求帮助，说中南民大论坛MySQL数据库发生故障，他们试图用5月7日的数据库备份去恢复，但没有成功。 我晚上回宿舍后，登录到民大论坛服务器上一看，原来是论坛MySQL数据库的一张MySQL表损坏。根据我的经验，成功修复MySQL损坏表的概率是 90%，根本没有必要急着去用旧的数据库备份去恢复，何况备份又不及时，5月7日到发生故障的5月22日，意味着要丢失15天的数据啊。</p>
<p>我修复了5月22日的数据库，故障发生之前的数据没有丢失。方法很简单，四步即可搞定。</p>
<p>①、用root帐号从命令行登录MySQL：<br />
mysql -u root -p</p>
<p>②、输入root帐号的密码。</p>
<p>③、选定数据库名（本例中的数据库名为studentmis）：<br />
use studentmis;</p>
<p>④、修复损坏的表（本例中要修复的表为smis_user_student）：<br />
repair table smis_user_student;</p>
<p><a href="http://blog.s135.com/attachment/200705/mysql_repair.gif" target="_blank"><img title="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200705/mysql_repair.gif" border="0" alt="点击在新窗口中浏览此图片" /></a></p>
<p>注：以上操作适用于MySQL的MyISAM表存储结构。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.secblog.cn/system/560.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>命令行方式管理MySQL数据库实例</title>
		<link>http://www.secblog.cn/system/558.html</link>
		<comments>http://www.secblog.cn/system/558.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 05:51:07 +0000</pubDate>
		<dc:creator>豬頭濱</dc:creator>
				<category><![CDATA[系统维护]]></category>

		<guid isPermaLink="false">http://www.secblog.cn/?p=558</guid>
		<description><![CDATA[[文章作者：张宴 本文版本：v1.0 最后修改：2007.08.06 转载请注明出处：http://blog.s135.com] 我一直习惯用phpMyAdmin对MySQL数据库进行管理，曾修改了一个《可管理多台远程MySQL服务器的phpMyAdmin 2.10.2》。 但有些机器上因为安全等因素，只设置了允许从本机访问自身的MySQL端口，而且没有安装Apache和PHP，因而不能使用phpMyAdmin。于 是，我只好使用命令行方式来对MySQL数据库进行管理。为了方便以后从命令行操作数据库可以更方便（拷贝、粘贴），我写下了这篇文章。 一、从命令行登录MySQL数据库服务器 1、登录使用默认3306端口的MySQL /usr/local/mysql/bin/mysql -u root -p 2、通过TCP连接管理不同端口的多个MySQL（注意：MySQL4.1以上版本才有此项功能） /usr/local/mysql/bin/mysql -u root -p &#8211;protocol=tcp &#8211;host=localhost &#8211;port=3307 3、通过socket套接字管理不同端口的多个MySQL /usr/local/mysql/bin/mysql -u root -p &#8211;socket=/tmp/mysql3307.sock 4、通过端口和IP管理不同端口的多个MySQL /usr/local/mysql/bin/mysql -u root -p -P 3306 -h 127.0.0.1 二、数据库操作SQL语句 1、显示服务器上当前存在什么数据库 SHOW DATABASES; 2、创建名称为rewin的数据库 CREATE DATABASE rewin; 3、删除名称为rewin的数据库 DROP DATABASE rewin; 4、选择rewin数据库 USE rewin; 三、表操作SQL语句（登录之后必须用以上的USE命令选择一个数据库，再进行表操作） 1、显示当前数据库中存在什么表 SHOW [...]]]></description>
			<content:encoded><![CDATA[<p>[文章作者：张宴 本文版本：v1.0 最后修改：2007.08.06 转载请注明出处：<a href="http://blog.s135.com/" target="_blank">http://blog.s135.com</a>]</p>
<p>我一直习惯用phpMyAdmin对MySQL数据库进行管理，曾修改了一个《<a href="http://blog.s135.com/read.php/260.htm" target="_blank">可管理多台远程MySQL服务器的phpMyAdmin 2.10.2</a>》。 但有些机器上因为安全等因素，只设置了允许从本机访问自身的MySQL端口，而且没有安装Apache和PHP，因而不能使用phpMyAdmin。于 是，我只好使用命令行方式来对MySQL数据库进行管理。为了方便以后从命令行操作数据库可以更方便（拷贝、粘贴），我写下了这篇文章。</p>
<p>一、从命令行登录MySQL数据库服务器<br />
1、登录使用默认3306端口的MySQL</p>
<div>/usr/local/mysql/bin/mysql -u root -p</div>
<p>2、通过TCP连接管理不同端口的多个MySQL（注意：MySQL4.1以上版本才有此项功能）</p>
<div>/usr/local/mysql/bin/mysql -u root -p &#8211;protocol=tcp &#8211;host=localhost &#8211;port=3307</div>
<p>3、通过socket套接字管理不同端口的多个MySQL</p>
<div>/usr/local/mysql/bin/mysql -u root -p &#8211;socket=/tmp/mysql3307.sock</div>
<p>4、通过端口和IP管理不同端口的多个MySQL</p>
<div>/usr/local/mysql/bin/mysql -u root -p -P 3306 -h 127.0.0.1</div>
<hr />二、数据库操作SQL语句<br />
1、显示服务器上当前存在什么数据库</p>
<div>SHOW DATABASES;</div>
<p>2、创建名称为rewin的数据库</p>
<div>CREATE DATABASE rewin;</div>
<p>3、删除名称为rewin的数据库</p>
<div>DROP DATABASE rewin;</div>
<p>4、选择rewin数据库</p>
<div>USE rewin;</div>
<hr />三、表操作SQL语句（登录之后必须用以上的USE命令选择一个数据库，再进行表操作）<br />
1、显示当前数据库中存在什么表</p>
<div>SHOW TABLES;</div>
<p>2、创建数据库表zhangyan：在mysql&gt;后粘贴以下SQL语句，存储引擎为MYISAM，字段id为主键、唯一索引。</p>
<div>CREATE TABLE `zhangyan` (<br />
`id` INT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT ,<br />
`username` VARCHAR( 20 ) NOT NULL ,<br />
`password` CHAR( 32 ) NOT NULL ,<br />
`time` DATETIME NOT NULL ,<br />
`number` FLOAT( 10 ) NOT NULL ,<br />
`content` TEXT NOT NULL ,<br />
PRIMARY KEY ( `id` )<br />
) ENGINE = MYISAM ;</div>
<p>3、查看zhangyan表结构</p>
<div>DESCRIBE zhangyan;</div>
<p>4、从表中检索信息<br />
4.1、从zhangyan表中检索所有记录</p>
<div>SELECT * FROM zhangyan;</div>
<p>4.2、从zhangyan表中检索特定的行：字段username等于abc，字段number等于1，按字段id降序排列</p>
<div>SELECT * FROM zhangyan WHERE username = &#8216;abc&#8217; AND number=&#8217;1&#8242; ORDER BY id DESC;</div>
<p>4.3、从zhangyan表中检索指定的字段：username和password</p>
<div>SELECT username, password FROM zhangyan;</div>
<p>4.4、从zhangyan表中检索出唯一的不重复记录：</p>
<div>SELECT DISTINCT username FROM zhangyan;</div>
<p>5、插入信息到zhangyan表</p>
<div>INSERT  INTO zhangyan (id, username, password, time, number, content) VALUES  (”, &#8216;abc&#8217;, &#8217;123456&#8242;, &#8217;2007-08-06 14:32:12&#8242;, &#8217;23.41&#8242;, &#8216;hello world&#8217;);</div>
<p>6、更新zhangyan表中的指定信息</p>
<div>UPDATE zhangyan SET content = &#8216;hello china&#8217; WHERE username = &#8216;abc&#8217;;</div>
<p>7、删除zhangyan表中的指定信息</p>
<div>DELETE FROM zhangyan WHERE id = 1;</div>
<p>8、清空zhangyan表</p>
<div>DELETE FROM zhangyan;</div>
<p>9、删除zhangyan表</p>
<div>DROP TABLE zhangyan;</div>
<p>10、更改表结构，将zhangyan表username字段的字段类型改为CHAR(25)</p>
<div>ALTER TABLE zhangyan CHANGE username username CHAR(25);</div>
<p>11、将当前目录下的mysql.sql导入数据库</p>
<div>SOURCE ./mysql.sql;</div>
<hr />四、数据库权限操作SQL语句<br />
1、创建一个具有root权限，可从任何IP登录的用户sina，密码为zhangyan</p>
<div>GRANT ALL PRIVILEGES ON *.* TO &#8216;sina&#8217;@'%&#8217; IDENTIFIED BY &#8216;zhangyan&#8217;;</div>
<p>2、创建一个具有“数据操作”、“结构操作”权限，只能从192.168.1.***登录的用户sina，密码为zhangyan</p>
<div>GRANT  SELECT , INSERT , UPDATE , DELETE , FILE , CREATE , DROP , INDEX ,  ALTER , CREATE TEMPORARY TABLES , CREATE VIEW , SHOW VIEW , CREATE  ROUTINE, ALTER ROUTINE, EXECUTE ON *.* TO &#8216;sina&#8217;@&#8217;192.168.1.%&#8217;  IDENTIFIED BY &#8216;zhangyan&#8217;;</div>
<p>3、创建一个只拥有“数据操作”权限，只能从192.168.1.24登录，只能操作rewin数据库的zhangyan表的用户sina，密码为zhangyan</p>
<div>GRANT SELECT , INSERT , UPDATE , DELETE ON  rewin.zhangyan TO &#8216;sina&#8217;@&#8217;192.168.1.24&#8242; IDENTIFIED BY &#8216;zhangyan&#8217;;</div>
<p>4、创建一个拥有“数据操作”、“结构操作”权限，可从任何IP登录，只能操作rewin数据库的用户sina，密码为zhangyan</p>
<div>GRANT  SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , INDEX , ALTER ,  CREATE TEMPORARY TABLES , CREATE VIEW , SHOW VIEW , CREATE ROUTINE,  ALTER ROUTINE, EXECUTE ON rewin.* TO &#8216;sina&#8217;@'%&#8217; IDENTIFIED BY  &#8216;zhangyan&#8217;;</div>
<p>5、删除用户</p>
<div>DROP USER &#8216;sina&#8217;@'%&#8217;;</div>
<p>PS：如果想了解更多的MySQL操作资料，请参考<a href="http://dev.mysql.com/doc/refman/5.1/zh/" target="_blank">MySQL官方的中文参考手册</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.secblog.cn/system/558.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用tar命令简单实现数据的全备份、增量备份、差量备份</title>
		<link>http://www.secblog.cn/system/553.html</link>
		<comments>http://www.secblog.cn/system/553.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 05:48:41 +0000</pubDate>
		<dc:creator>豬頭濱</dc:creator>
				<category><![CDATA[系统维护]]></category>

		<guid isPermaLink="false">http://www.secblog.cn/?p=553</guid>
		<description><![CDATA[命令基本格式是： tar cvzf TARGET SOURCES -N TIME e.g tar cvzf foo.tgz /bak -N “2004-03-03 16:49:17&#8243; 记住全备份的时间f_time和上一次增量备份的时间i_time;(现在的办法是以job为单位记录这两个时间: ” [JobName] [F_TIME] [I_TIME] &#8216;\n&#8217; “) 全备份: tar cvzf foo.tgz /bak 增量备份: tar cvzf foo.tgz /bak -N i_time 差量备份: tar cvzf foo.tgz /bak -N f_time]]></description>
			<content:encoded><![CDATA[<p>命令基本格式是： tar cvzf TARGET SOURCES -N TIME e.g tar cvzf foo.tgz /bak -N “2004-03-03 16:49:17&#8243;<br />
记住全备份的时间f_time和上一次增量备份的时间i_time;(现在的办法是以job为单位记录这两个时间: ” [JobName] [F_TIME] [I_TIME] &#8216;\n&#8217; “)<br />
全备份: tar cvzf foo.tgz /bak<br />
增量备份: tar cvzf foo.tgz /bak -N i_time<br />
差量备份: tar cvzf foo.tgz /bak -N f_time</p>
]]></content:encoded>
			<wfw:commentRss>http://www.secblog.cn/system/553.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>忘记mysql密码怎么办</title>
		<link>http://www.secblog.cn/system/549.html</link>
		<comments>http://www.secblog.cn/system/549.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 05:47:33 +0000</pubDate>
		<dc:creator>豬頭濱</dc:creator>
				<category><![CDATA[系统维护]]></category>

		<guid isPermaLink="false">http://www.secblog.cn/?p=549</guid>
		<description><![CDATA[忘记mysql密码？说明你很笨蛋.能看到这里说明你很聪明 如果 MySQL 正在运行，首先杀之： killall -TERM mysqld。 启动 MySQL ：bin/safe_mysqld &#8211;skip-grant-tables &#38; 就可以不需要密码就进入 MySQL 了。 然后就是 &#62;use mysql &#62;update user set password=password(“new_pass”) where user=”root”; &#62;flush privileges; 重新杀 MySQL ，用正常方法启动 MySQL 一定注意：很多新手没有用password=password(“&#8230;”)，而是直接password=”&#8230;”所以改掉密码不好使]]></description>
			<content:encoded><![CDATA[<p>忘记mysql密码？说明你很笨蛋.能看到这里说明你很聪明</p>
<p>如果 MySQL 正在运行，首先杀之： killall -TERM mysqld。</p>
<p>启动 MySQL ：bin/safe_mysqld &#8211;skip-grant-tables &amp;</p>
<p>就可以不需要密码就进入 MySQL 了。</p>
<p>然后就是</p>
<p>&gt;use mysql</p>
<p>&gt;update user set password=password(“new_pass”) where user=”root”;</p>
<p>&gt;flush privileges;</p>
<p>重新杀 MySQL ，用正常方法启动 MySQL</p>
<p>一定注意：很多新手没有用password=password(“&#8230;”)，而是直接password=”&#8230;”所以改掉密码不好使</p>
]]></content:encoded>
			<wfw:commentRss>http://www.secblog.cn/system/549.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux禁Ping的方法</title>
		<link>http://www.secblog.cn/system/547.html</link>
		<comments>http://www.secblog.cn/system/547.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 05:46:41 +0000</pubDate>
		<dc:creator>豬頭濱</dc:creator>
				<category><![CDATA[系统维护]]></category>

		<guid isPermaLink="false">http://www.secblog.cn/?p=547</guid>
		<description><![CDATA[[root@redhat7 root]# echo 1 &#62; /proc/sys/net/ipv4/icmp_echo_ignore_all 如果要恢复，只要： [root@redhat7 root]# echo 0 &#62; /proc/sys/net/ipv4/icmp_echo_ignore_all 即可，挺方便，不要去专门使用ipchains或者iptables了。]]></description>
			<content:encoded><![CDATA[<p>[root@redhat7 root]# echo 1 &gt; /proc/sys/net/ipv4/icmp_echo_ignore_all<br />
如果要恢复，只要：<br />
[root@redhat7 root]# echo 0 &gt; /proc/sys/net/ipv4/icmp_echo_ignore_all<br />
即可，挺方便，不要去专门使用ipchains或者iptables了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.secblog.cn/system/547.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Innodb数据库损坏导致mysql锁死</title>
		<link>http://www.secblog.cn/system/528.html</link>
		<comments>http://www.secblog.cn/system/528.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 05:34:19 +0000</pubDate>
		<dc:creator>豬頭濱</dc:creator>
				<category><![CDATA[系统维护]]></category>

		<guid isPermaLink="false">http://www.secblog.cn/?p=528</guid>
		<description><![CDATA[MySQL自3.23.58版本以后，提供了名为InnoDB的引擎提供存储过程等功能 当服务器发生意外断电等错误的时候，可能导致innodb锁死 用top命令查看，发现mysqld进程占用cpu达到100%并无法正常启动、关闭 070316 12:30:43 mysqld started 070316 12:30:43 InnoDB: Database was not shut down normally! InnoDB: Starting crash recovery. InnoDB: Reading tablespace information from the .ibd files&#8230; InnoDB: Restoring possible half-written data pages from the doublewrite InnoDB: buffer&#8230; 070316 12:30:43 InnoDB: Starting log scan based on checkpoint at InnoDB: log sequence number 0 2347685. [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL自3.23.58版本以后，提供了名为InnoDB的引擎提供存储过程等功能<br />
当服务器发生意外断电等错误的时候，可能导致innodb锁死<br />
用top命令查看，发现mysqld进程占用cpu达到100%并无法正常启动、关闭</p>
<p>070316 12:30:43 mysqld started<br />
070316 12:30:43 InnoDB: Database was not shut down normally!<br />
InnoDB: Starting crash recovery.<br />
InnoDB: Reading tablespace information from the .ibd files&#8230;<br />
InnoDB: Restoring possible half-written data pages from the doublewrite<br />
InnoDB: buffer&#8230;<br />
070316 12:30:43 InnoDB: Starting log scan based on checkpoint at<br />
InnoDB: log sequence number 0 2347685.<br />
InnoDB: Doing recovery: scanned up to log sequence number 0 2347685<br />
070316 12:30:43 InnoDB: Error: page 4 log sequence number 0 1516429185<br />
InnoDB: is in the future! Current system log sequence number 0 2347685.<br />
InnoDB: Your database may be corrupt.</p>
<p>解决方案<br />
首先要彻底杀掉所有运行的mysql进程，并暂时停止web服务器，以免再次出发mysql的调用<br />
/etc/init.d/httpd stop<br />
killall -9 mysqld<br />
killall -9 mysqld_safe</p>
<p>现在用ps awxuf命令确认没有mysql相关进程在运行了<br />
到/var/lib/mysql目录下，找到ibdata1、ib_logfile0、ib_logfile1等几个文件，将其改名或者移动走<br />
执行/etc/init.d/mysqld restart重新启动mysqld</p>
<p>这时候再查看log，就会发现innodb的引擎会重建出错的文件<br />
070316 12:41:35 mysqld started<br />
InnoDB: The first specified data file ./ibdata1 did not exist:<br />
InnoDB: a new database to be created!<br />
070316 12:41:35 InnoDB: Setting file ./ibdata1 size to 10 MB<br />
InnoDB: Database physically writes the file full: wait&#8230;<br />
070316 12:41:35 InnoDB: Log file ./ib_logfile0 did not exist: new to be created<br />
InnoDB: Setting log file ./ib_logfile0 size to 5 MB<br />
InnoDB: Database physically writes the file full: wait&#8230;<br />
070316 12:41:35 InnoDB: Log file ./ib_logfile1 did not exist: new to be created<br />
InnoDB: Setting log file ./ib_logfile1 size to 5 MB<br />
InnoDB: Database physically writes the file full: wait&#8230;<br />
InnoDB: Doublewrite buffer not found: creating new<br />
InnoDB: Doublewrite buffer created<br />
InnoDB: Creating foreign key constraint system tables<br />
InnoDB: Foreign key constraint system tables created<br />
070316 12:41:36 InnoDB: Started; log sequence number 0 0<br />
/usr/libexec/mysqld: ready for connections.<br />
Version: &#8217;4.1.12&#8242; socket: &#8216;/var/lib/mysql/mysql.sock&#8217; port: 3306 Source distribution</p>
<p>现在可以通过top命令确认mysqld是否正常运行。</p>
<p>执行/etc/init.d/httpd start正常启动web服务，并观察mysql是否正常，一般故障可以解决</p>
<p>注意：如果想禁用innodb的功能，可以在/etc/my.cnf里边的[mysqld]部分中，加入如下一行：<br />
skip-innodb<br />
然后重启mysqld服务，即可禁用innodb 。<br />
但是不推荐禁用，如果部分mysql程序调用了存储过程，那么就无法工作了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.secblog.cn/system/528.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD自动备份数据库.删除备份</title>
		<link>http://www.secblog.cn/system/505.html</link>
		<comments>http://www.secblog.cn/system/505.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 05:19:52 +0000</pubDate>
		<dc:creator>豬頭濱</dc:creator>
				<category><![CDATA[系统维护]]></category>

		<guid isPermaLink="false">http://www.secblog.cn/?p=505</guid>
		<description><![CDATA[#!/bin/sh BACKUP_BASE_DIR=”/data/backup/database” max_old_backup=12 clean_old_backup() { count=0 for name in `ls $BACKUP_BASE_DIR&#124;grep -E &#8216;[0-9]{6,6}\-[0-9]{6,6}&#8217; &#124; sort -r` do count=$((count+1)) if [ $count -gt $max_old_backup ] ; then echo -n “Cleaning old backup: $name&#8230; ” if [ "$testmode" = 1 ] ; then echo -n “rm -fr $BACKUP_BASE_DIR/$name” else rm -fr $BACKUP_BASE_DIR/$name fi echo ” Done.” else [...]]]></description>
			<content:encoded><![CDATA[<p>#!/bin/sh</p>
<p>BACKUP_BASE_DIR=”/data/backup/database”<br />
max_old_backup=12</p>
<p>clean_old_backup()<br />
{<br />
count=0<br />
for name in `ls $BACKUP_BASE_DIR|grep -E &#8216;[0-9]{6,6}\-[0-9]{6,6}&#8217; | sort -r`<br />
do<br />
count=$((count+1))<br />
if [ $count -gt $max_old_backup ] ; then<br />
echo -n “Cleaning old backup: $name&#8230; ”<br />
if [ "$testmode" = 1 ] ; then<br />
echo -n “rm -fr $BACKUP_BASE_DIR/$name”<br />
else<br />
rm -fr $BACKUP_BASE_DIR/$name<br />
fi<br />
echo ” Done.”<br />
else<br />
echo “Keeping old backup: $name”<br />
fi<br />
done<br />
}</p>
<p>clean_old_backup<br />
tar -zcf /data/backup/database/test.`date &#8216;+%Y%m%d-%H%M%S&#8217;`.tar.gz /var/db/mysql/test/<br />
ee /etc/crontab<br />
0 */4 * * * /root/mysql.sh &gt;&gt; /data/backup/backlog/tar.log</p>
<p>每四小时执行一次备份.只保留12个数据库备份</p>
]]></content:encoded>
			<wfw:commentRss>http://www.secblog.cn/system/505.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL数据库性能优化(总结)</title>
		<link>http://www.secblog.cn/system/499.html</link>
		<comments>http://www.secblog.cn/system/499.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 05:17:34 +0000</pubDate>
		<dc:creator>豬頭濱</dc:creator>
				<category><![CDATA[系统维护]]></category>

		<guid isPermaLink="false">http://www.secblog.cn/?p=499</guid>
		<description><![CDATA[在Apache, PHP, MySQL的体系架构中，MySQL对于性能的影响最大，也是关键的核心部分。MySQL的设置是否合理优化，直接影响到网站的速度和承载量！同 时，MySQL也是优化难度最大的一个部分，不但需要理解一些MySQL专业知识，同时还需要长时间的观察统计并且根据经验进行判断，然后设置合理的参 数。 下面我们了解一下MySQL优化的一些基础，MySQL的优化我分为三个部分： 一是服务器物理硬件的优化； 二是软件优化，也就是MySQL自身(my.cnf)的优化/设置优化; 三是数据库的设计和数据信息的优化。 下面分别说明： 一、服务器物理硬件的优化 服务器硬件对MySQL性能的影响 a) 磁盘寻道能力（磁盘I/O）,以目前高转速SCSI硬盘(7200转/秒)为例，这种硬盘理论上每秒寻道7200次，这是物理特性决定的，没有办法改变。 MySQL每秒钟都在进行大量、复杂的查询操作，对磁盘的读写量可想而知。所以，通常认为磁盘I/O是制约MySQL性能的最大因素之一，对于日均访问量 在100万PV以上的网站，由于磁盘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) 物理内存对于一台使用MySQL的Database Server来说，服务器内存建议不要小于2GB，推荐使用4GB以上的物理内存。 二、软件优化——MySQL自身(my.cnf)的优化 MySQL自身因素 当解决了上述服务器硬件制约因素后，让我们看看MySQL自身的优化是如何操作的。对MySQL自身的优化主要是对其配置文件my.cnf中的各项参数进行优化调整。下面我们介绍一些对性能影响较大的参数。 由于my.cnf文件的优化设置是与服务器硬件配置息息相关的，因而我们指定一个假想的服务器硬件环境： CPU: 2颗Intel Xeon 2.4GHz 内存: 4GB DDR 硬盘: SCSI 73GB 下面，我们根据以上硬件配置结合一份已经优化好的my.cnf进行说明： # vi /etc/my.cnf 以下只列出my.cnf文件中[mysqld]段落中的内容，其他段落内容对MySQL运行性能影响甚微，因而姑且忽略。 [mysqld] port = 3306 serverid = 1 socket = /tmp/mysql.sock skip-locking [...]]]></description>
			<content:encoded><![CDATA[<p>在Apache, PHP,   MySQL的体系架构中，MySQL对于性能的影响最大，也是关键的核心部分。MySQL的设置是否合理优化，直接影响到网站的速度和承载量！同 时，MySQL也是优化难度最大的一个部分，不但需要理解一些MySQL专业知识，同时还需要长时间的观察统计并且根据经验进行判断，然后设置合理的参 数。</p>
<p>下面我们了解一下MySQL优化的一些基础，MySQL的优化我分为三个部分：<br />
一是服务器物理硬件的优化；<br />
二是软件优化，也就是MySQL自身(my.cnf)的优化/设置优化;<br />
三是数据库的设计和数据信息的优化。</p>
<p>下面分别说明：<br />
<strong>一、服务器物理硬件的优化<br />
</strong><br />
服务器硬件对MySQL性能的影响<br />
a)   磁盘寻道能力（磁盘I/O）,以目前高转速SCSI硬盘(7200转/秒)为例，这种硬盘理论上每秒寻道7200次，这是物理特性决定的，没有办法改变。 MySQL每秒钟都在进行大量、复杂的查询操作，对磁盘的读写量可想而知。所以，通常认为磁盘I/O是制约MySQL性能的最大因素之一，对于日均访问量 在100万PV以上的网站，由于磁盘I/O的制约，MySQL的性能会非常低下！解决这一制约因素可以考虑以下几种解决方案：<br />
使用RAID-0+1磁盘阵列，注意不要尝试使用RAID-5，MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快；   抛弃传统的硬盘，使用速度更快的闪存式存储设备。经过Discuz!公司技术工程的测试，使用闪存式存储设备可比传统硬盘速度高出6－10倍左右。b)  CPU  对于MySQL应用，推荐使用S.M.P.架构的多路对称CPU，例如：可以使用两颗Intel Xeon 3.6GHz的CPU。<br />
c)  物理内存对于一台使用MySQL的Database  Server来说，服务器内存建议不要小于2GB，推荐使用4GB以上的物理内存。</p>
<p><strong>二、软件优化——MySQL自身(my.cnf)的优化<br />
</strong><a name="entrymore"></a><br />
<strong>MySQL自身因素</strong></p>
<p>当解决了上述服务器硬件制约因素后，让我们看看MySQL自身的优化是如何操作的。对MySQL自身的优化主要是对其配置文件my.cnf中的各项参数进行优化调整。下面我们介绍一些对性能影响较大的参数。<br />
由于my.cnf文件的优化设置是与服务器硬件配置息息相关的，因而我们指定一个假想的服务器硬件环境：<br />
CPU: 2颗Intel Xeon 2.4GHz<br />
内存: 4GB DDR<br />
硬盘: SCSI  73GB</p>
<p>下面，我们根据以上硬件配置结合一份已经优化好的my.cnf进行说明：<br />
# vi  /etc/my.cnf<br />
以下只列出my.cnf文件中[mysqld]段落中的内容，其他段落内容对MySQL运行性能影响甚微，因而姑且忽略。<br />
[mysqld]<br />
port = 3306<br />
serverid = 1<br />
socket =  /tmp/mysql.sock<br />
skip-locking            #  避免MySQL的外部锁定，减少出错几率增强稳定性。<br />
skip-name-resolve #禁止MySQL对外部连接进行DNS解析，使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意，如果开启该选项，则所有远程主机连接授权都要使用IP地址方式，否则MySQL将无法正常处理连接请求！<br />
back_log = 384     #指定MySQL可能的连接数量。当MySQL主线程在很短的时间内接收到非常多的连接请求，该参数生效，主线程花费很短的时间检查连接并且启动一个新线程。<br />
back_log              # 参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。   如果系统在一个短时间内有很多连接，则需要增大该参数的值，该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自 己的限制。  试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。<br />
key_buffer_size = 256M #  key_buffer_size指定用于索引的缓冲区大小，增加它可得到更好的索引处理性能。对于内存在4GB左右的服务器该参数可设置为256M或384M。  注意：该参数值设置的过大反而会是服务器整体效率降低！<br />
max_allowed_packet = 4M<br />
thread_stack =  256K<br />
table_cache = 128K<br />
sort_buffer_size = 6M #查询排序时所能使用的缓冲区大小。注意：该参数对应的分配内存是每连接独占！如果有100个连接，那么实际分配的总共排序缓冲区大小为100  × 6 ＝ 600MB。所以，对于内存在4GB左右的服务器推荐设置为6-8M。<br />
read_buffer_size = 4M #读查询操作所能使用的缓冲区大小。和sort_buffer_size一样，该参数对应的分配内存也是每连接独享！  join_buffer_size = 8M   #联合查询操作所能使用的缓冲区大小，和sort_buffer_size一样，该参数对应的分配内存也是每连接独享！  myisam_sort_buffer_size = 64M<br />
table_cache  = 512<br />
thread_cache_size = 64<br />
query_cache_size = 64M #指定MySQL查询缓冲区的大小。</p>
<p>可以通过在MySQL控制台执行以下命令观察：<br />
# &gt; SHOW VARIABLES  LIKE &#8216;%query_cache%&#8217;;<br />
# &gt; SHOW STATUS LIKE &#8216;Qcache%&#8217;;<br />
#  如果Qcache_lowmem_prunes的值非常大，则表明经常出现缓冲不够的情况；<br />
#如果Qcache_hits的值非常大，则表明查询缓冲使用非常频繁，如果该值较小反而会影响效率，那么可以考虑不用查询缓冲；  #Qcache_free_blocks，如果该值非常大，则表明缓冲区中碎片很多。<br />
tmp_table_size = 256M<br />
max_connections = 768  #指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many  Connections的错误提 示，则需要增大该参数值。<br />
max_connect_errors = 10000000<br />
wait_timeout =  10                   #指定一个请求的最大连接时间，对于4GB左右内存的服务器可以设置为5-10。<br />
thread_concurrency = 8 #该参数取值为服务器逻辑CPU数量×2，在本例中，服务器有2颗物理CPU，而每颗物理CPU又支持H.T超线程，所以实际取值为4  × 2 ＝ 8<br />
skip-networking                         #开启该选项可以彻底关闭MySQL的TCP/IP连接方式，如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项！否则将无法正常连接！</p>
<p><strong>三、数据库的设计和数据信息的优化</strong></p>
<p><strong>表设计方面</strong></p>
<p>1、选取最适用的字段属性</p>
<p>MySQL可以很好的支持大数据量的存取，但是一般说来，数据库中的表越小，在它上面执行的查询也就会越快。因此，在创建表的时候，为 了获得更好的性能，我们可以将表中字段的宽度设得尽可能小。例如，在定义邮政编码这个字段时，如果将其设置为CHAR(255),显然给数据库增加了不必 要的空间，甚至使用VARCHAR这种类型也是多余的，因为CHAR(6)就可以很好的完成任务了。同样的，如果可以的话，我们应该使用 MEDIUMINT而不是BIGIN来定义整型字段。</p>
<p>2、在可能的情况下，应该尽量把字段设置为NOT NULL，这样在将来执行查询的时候，数据库不用去比较NULL值。</p>
<p>3、对于某些文本字段，例如“省份”或者“性别”，我们可以将它们定义为ENUM类型。因为在MySQL中，ENUM类型被当作数值型数据来处理，而数值型数据被处理起来的速度要比文本类型快得多。这样，我们又可以提高数据库的性能。</p>
<p>4、使用尽量小的数据类型，例如：MEDIUMINT比INT少占用25%空间。</p>
<p>5、用于比较的不同字段，应设置相同的类型及长度。</p>
<p>6、使用索引，主索引尽可能短,仅创建真正用到的索引（索引会减慢存储数据的速度）。</p>
<p>索引是提高数据库性能的常用方法，它可以令数据库服务器以比没有索引快得多的速度检索特定的行，尤其是在查询语句当中包含有MAX(),   MIN()和ORDERBY这些命令的时候，性能提高更为明显。那该对哪些字段建立索引呢？一般说来，索引应建立在那些将用于JOIN,  WHERE判断和ORDER   BY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说，出现大量重复值是很有可能的情况，例如   customerinfo中的“province”..   字段，在这样的字段上建立索引将不会有什么帮助；相反，还有可能降低数据库的性能。我们在创建表的时候可以同时创建合适的索引，也可以使用ALTER   TABLE或CREATE INDEX在以后创建索引。<br />
此外，MySQL从版本3.23.23开始支持全文索引和搜索。全文索引在MySQL   中是一个FULLTEXT类型索引，但仅能用于MyISAM  类型的表。对于一个大的数据库，将数据装载到一个没有FULLTEXT索引的表中，然后再使用ALTER  TABLE或CREATE  INDEX创建索引，将是非常快的。但如果将数据装载到一个已经有FULLTEXT索引的表中，执行过程将会非常慢。</p>
<p>7、如果一个字符串类型字段有唯一前缀，可以使用这个前缀作为索引。如前缀为1个字符，则可以这样设置索引 INDEX( text( 1 ) )。</p>
<p>8、可以把经常扫描的表拆分。</p>
<p>9、使用外键</p>
<p>锁定表的方法可以维护数据的完整性，但是它却不能保证数据的关联性。这个时候我们就可以使用外键。例如，外键可以保证每一条销售记录都指向 某一个存在的客户。在这里，外键可以把customerinfo   表中的CustomerID映射到salesinfo表中CustomerID，任何一条没有合法CustomerID的记录都不会被更新或插入到   salesinfo中。</p>
<p>CREATE TABLE customerinfo　　(<br />
CustomerID  INT NOT NULL ,<br />
PRIMARY KEY ( CustomerID )<br />
) TYPE =  INNODB;<br />
CREATE TABLE salesinfo　　(<br />
SalesID INT NOT  NULL,<br />
CustomerID INT NOT NULL,<br />
PRIMARY KEY(CustomerID,  SalesID),<br />
FOREIGN KEY (CustomerID) REFERENCES  customerinfo<br />
(CustomerID) ON DELETECASCADE<br />
) TYPE =  INNODB;<br />
注意例子中的参数“ON DELETE CASCADE”。该参数保证当 customerinfo   表中的一条客户记录被删除的时候，salesinfo 表中所有与该客户相关的记录也会被自动删除。如果要在 MySQL   中使用外键，一定要记住在创建表的时候将表的类型定义为事务安全表 InnoDB类型。该类型不是 MySQL 表的默认类型。定义的方法是在  CREATE TABLE  语句中加上 TYPE=INNODB。如例中所示。</p>
<p><strong>查询方面：</strong></p>
<p>1、使用连接（JOIN）来代替子查询(Sub-Queries)</p>
<p>MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果，然后把这个结果作为过滤条件用在另一 个查询中。例如，我们要将客户基本信息表中没有任何订单的客户删除掉，就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来，然后将结果传递 给主查询，如下所示：</p>
<p>DELETE FROM customerinfo WHERE CustomerID NOT  in (SELECT CustomerID FROM salesinfo )</p>
<p>使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作，同时也可以避免事务或者表锁死，并且写起来也很容易。但是，有些情况 下，子查询可以被更有效率的连接（JOIN）..  替代。例如，假设我们要将所有没有订单记录的用户取出来，可以用下面这个查询完成：</p>
<p>SELECT * FROM customerinfo WHERE CustomerID  NOT in (SELECT CustomerID FROM salesinfo )</p>
<p>如果使用连接（JOIN）..  来完成这个查询工作，速度将会快很多。尤其是当salesinfo表中对CustomerID建有索引的话，性能将会更好，查询如下：</p>
<p>SELECT * FROM customerinfo  LEFT JOIN  salesinfoON customerinfo.CustomerID=salesinfo. CustomerID  WHERE  salesinfo.CustomerID IS NULL</p>
<p>连接（JOIN）.. 之所以更有效率一些，是因为 MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。</p>
<p>2、使用联合(UNION)来代替手动创建的临时表</p>
<p>MySQL 从 4.0 的版本开始支持 UNION 查询，它可以把需要使用临时表的两条或更多的 SELECT   查询合并的一个查询中。在客户端的查询会话结束的时候，临时表会被自动删除，从而保证数据库整齐、高效。使用 UNION  来创建查询的时候，我们只需要用  UNION作为关键字把多个 SELECT 语句连接起来就可以了，要注意的是所有 SELECT  语句中的字段数目要想同。下面的例子就演示了一个使用  UNION的查询。</p>
<p>SELECT Name, Phone FROM client UNION SELECT  Name, BirthDate FROM author　　UNION　　SELECT Name, Supplier FROM  product</p>
<p>3、事务</p>
<p>尽管我们可以使用子查询（Sub-Queries）、连接（JOIN）和联合（UNION）来创建各种各样的查询，但不是所有的数据库操作都可 以只用一条或少数几条SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。但是在这种情况下，当这个语句块中的某一条语句运行出错 的时候，整个语句块的操作就会变得不确定起来。设想一下，要把某个数据同时插入两个相关联的表中，可能会出现这样的情况：第一个表中成功更新后，数据库突 然出现意外状况，造成第二个表中的操作没有完成，这样，就会造成数据的不完整，甚至会破坏数据库中的数据。要避免这种情况，就应该使用事务，它的作用是： 要么语句块中每条语句都操作成功，要么都失败。换句话说，就是可以保持数据库中数据的一致性和完整性。事物以BEGIN   关键字开始，COMMIT关键字结束。在这之间的一条SQL操作失败，那么，ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。</p>
<p>BEGIN;<br />
INSERT INTO salesinfo SET  CustomerID=14;<br />
UPDATE inventory SET Quantity=11　　WHERE  item=&#8217;book&#8217;;<br />
COMMIT;</p>
<p>事务的另一个重要作用是当多个用户同时使用相同的数据源时，它可以利用锁定数据库的方法来为用户提供一种安全的访问方式，这样可以保证用户的操作不被其它的用户所干扰。</p>
<p>4、锁定表</p>
<p>尽管事务是维护数据库完整性的一个非常好的方法，但却因为它的独占性，有时会影响数据库的性能，尤其是在很大的应用系统中。由于在事务执行的过 程中，数据库将会被锁定，因此其它的用户请求只能暂时等待直到该事务结束。如果一个数据库系统只有少数几个用户来使用，事务造成的影响不会成为一个太大的 问题；但假设有成千上万的用户同时访问一个数据库系统，例如访问一个电子商务网站，就会产生比较严重的响应延迟。</p>
<p>其实，有些情况下我们可以通过锁定表的方法来获得更好的性能。下面的例子就用锁定表的方法来完成前面一个例子中事务的功能。</p>
<p>LOCK TABLE inventory WRITE<br />
SELECT  Quantity FROM inventory<br />
WHEREItem=&#8217;book&#8217;;<br />
&#8230;<br />
UPDATE inventory  SET Quantity=11<br />
WHEREItem=&#8217;book&#8217;;<br />
UNLOCK TABLES</p>
<p>这里，我们用一个 SELECT 语句取出初始数据，通过一些计算，用 UPDATE 语句将新值更新到表中。包含有 WRITE 关键字的  LOCK  TABLE 语句可以保证在 UNLOCK TABLES 命令被执行之前，不会有其它的访问来对 inventory  进行插入、更新或者删除的操作。</p>
<p>5、优化的查询语句</p>
<p>绝大多数情况下，使用索引可以提高查询的速度，但如果SQL语句使用不恰当的话，索引将无法发挥它应有的作用。下面是应该注意的几个方面。首 先，最好是在相同类型的字段间进行比较的操作。在MySQL   3.23版之前，这甚至是一个必须的条件。例如不能将一个建有索引的INT字段和BIGINT字段进行比较；但是作为特殊的情况，在CHAR类型的字段和   VARCHAR类型字段的字段大小相同的时候，可以将它们进行比较。其次，在建有索引的字段上尽量不要使用函数进行操作。</p>
<p>例如，在一个DATE类型的字段上使用YEAE()函数时，将会使索引不能发挥应有的作用。所以，下面的两个查询虽然返回的结果一样，但后者要比前者快得多。</p>
<p>SELECT * FROM order WHERE  YEAR(OrderDate)&lt;2001;</p>
<p>SELECT * FROM order WHERE  OrderDate&lt;”2001-01-01&#8243;;</p>
<p>同样的情形也会发生在对数值型字段进行计算的时候：</p>
<p>SELECT * FROM inventory WHERE  Amount/7&lt;24;</p>
<p>SELECT * FROM inventory WHERE Amount&lt;24*7;</p>
<p>上面的两个查询也是返回相同的结果，但后面的查询将比前面的一个快很多。在搜索字符型字段时，我们有时会使用 LIKE  关键字和通配符，这种做法虽然简单，但却也是以牺牲系统性能为代价的。例如下面的查询将会比较表中的每一条记录。</p>
<p>SELECT * FROM books<br />
WHERE name like  “MySQL%”<br />
但是如果换用下面的查询，返回的结果一样，但速度就要快上很多：</p>
<p>SELECT * FROM books<br />
WHERE  name&gt;=”MySQL”and name&lt;”MySQM”</p>
<p>最后，应该注意避免在查询中让MySQL进行自动类型转换，因为转换过程也会使索引变得不起作用。</p>
<p><strong>其他方面：</strong></p>
<p>1、清空表使用TRUNCATE TABLE tablename 比 DELETE FROM tablename 快。</p>
<p>2、INSERT时，只有在要插入数值与默认数值不同时才执行插入操作。</p>
<p>3、一次插入多行时，尽量使用多个VALUES列表的INSERT语句。</p>
<p>4、从表中删除大量行后，运行OPTIMIZE TABLE tablename 进行碎片整理。</p>
<p>5、使用ANALYZE TABLE tablename 更新索引分布。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.secblog.cn/system/499.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

