<?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>DBAlife &#187; 数据库管理</title>
	<atom:link href="http://www.dbalife.com/archives/category/database/feed" rel="self" type="application/rss+xml" />
	<link>http://www.dbalife.com</link>
	<description>网站系统架构实践</description>
	<lastBuildDate>Wed, 27 Jul 2011 09:57:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>MySQL Slow Query</title>
		<link>http://www.dbalife.com/archives/539.html</link>
		<comments>http://www.dbalife.com/archives/539.html#comments</comments>
		<pubDate>Wed, 19 Jan 2011 17:38:32 +0000</pubDate>
		<dc:creator>skywalker</dc:creator>
				<category><![CDATA[DB性能优化]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[调优]]></category>

		<guid isPermaLink="false">http://www.dbalife.com/archives/539.html</guid>
		<description><![CDATA[转载自http://www.perfgeeks.com/?p=365 优化MySQL最重要的一部分工作是先确定”有问题”的查询语句。只有先找出这些查询较慢的sql查询(执行时间较长)，我们才能进一步分析原因并且优化它。MySQL为我们提供了Slow Query Log记录功能，它能记录执行时间超过了特定时长的查询。分析Slow Query Log有助于帮我们找到”问题”查询。 记录slow queries 首先，我们需要查看mysql server版本号，以及是否配置启用了slow query log。查看mysql server版本号，主要是一些功能以及配置依赖于mysql server 版本号 查看mysql server版本号 $echo "status" &#124;mysql &#124;grep "Server version" Server version: 5.1.38-log Source distribution 不同的MySQL版本，设定与功能略有不同。 检查当前服务器有没有在记录slow query $mysqladmin var &#124;grep "log_slow" &#124;tr -d "&#124;" log_slow_queries OFF 当log_slow_queries是ON时，才表示已经启用了记录slow query功能。默认是不记录slow query的。 启用slow query日志 #//将下列配置放到my.cnf中，查看my.cnf位置可以使用命令ps -ef &#124;grep mysqld_safe [mysqld] log-slow-queries = /var/lib/mysql/slow-queries.log long_query_time = [...]
Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/522.html' rel='bookmark' title='MySQL5.5复制/同步的新特性及改进'>MySQL5.5复制/同步的新特性及改进</a></li>
<li><a href='http://www.dbalife.com/archives/521.html' rel='bookmark' title='MySQL Replication基本原理'>MySQL Replication基本原理</a></li>
<li><a href='http://www.dbalife.com/archives/133.html' rel='bookmark' title='PIX logging Architecture所需perl module的几点注意'>PIX logging Architecture所需perl module的几点注意</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="entry">
<p>转载自http://www.perfgeeks.com/?p=365</p>
<hr style="width: 100%; height: 2px;" />
<p>优化MySQL最重要的一部分工作是先确定”有问题”的查询语句。只有先找出这些查询较慢的sql查询(执行时间较长)，我们才能进一步分析原因并且优化它。MySQL为我们提供了Slow  Query Log记录功能，它能记录执行时间超过了特定时长的查询。分析Slow Query Log有助于帮我们找到”问题”查询。</p>
<h2>记录slow queries</h2>
<p>首先，我们需要查看mysql server版本号，以及是否配置启用了slow query log。查看mysql  server版本号，主要是一些功能以及配置依赖于mysql server 版本号<br />
<strong>查看mysql  server版本号</strong></p>
<div class="codesnip-container">
<pre style="font-family: monospace;" class="bash codesnip"><span class="re1">$echo</span> <span class="st0">"status"</span> <span class="sy0">|</span>mysql <span class="sy0">|</span><span class="kw2">grep</span> <span class="st0">"Server version"</span>
Server version:         5.1.38-log Source distribution</pre>
</div>
<p>不同的MySQL版本，设定与功能略有不同。<br />
<strong>检查当前服务器有没有在记录slow query</strong></p>
<div class="codesnip-container">
<pre style="font-family: monospace;" class="bash codesnip"><span class="re1">$mysqladmin</span> var <span class="sy0">|</span><span class="kw2">grep</span> <span class="st0">"log_slow"</span> <span class="sy0">|</span><span class="kw2">tr</span> <span class="re5">-d</span> <span class="st0">"|"</span>
log_slow_queries	OFF</pre>
</div>
<p>当log_slow_queries是ON时，才表示已经启用了记录slow query功能。默认是不记录slow  query的。<br />
<strong>启用slow query日志</strong></p>
<div class="codesnip-container">
<pre style="font-family: monospace;" class="bash codesnip"><span class="co0">#//将下列配置放到my.cnf中，查看my.cnf位置可以使用命令ps -ef |grep mysqld_safe</span>
<span class="br0">[</span>mysqld<span class="br0">]</span>
log-slow-queries	= <span class="sy0">/</span>var<span class="sy0">/</span>lib<span class="sy0">/</span>mysql<span class="sy0">/</span>slow-queries.log
long_query_time		= <span class="nu0">1</span>
log-queries-not-using-indexes
log-slow-admin-statements</pre>
</div>
<p>上面的配置打开了slow query日志,将会捕获了执行时间超过了1秒的查询，包括执行速度较慢的管理命令(比如OPTIMEZE  TABLE),并且记录了没有使用索引的查询。这些SQL，都会被记录到log-slow-queries指定的文件/var/lib/mysql/slow-queries.log文件中。</p>
<ul>
<ol>log-slow-queries &lt;slow_query_log_file&gt;<br />
存放slow query日志的文件。你必须保证mysql  server进程mysqld_safe进程用户对该文件有w权限。</ol>
<ol>long_query_time<br />
如果query  time超过了该值，则认为是较慢查询，并被记录下来。单位是秒，最小值是1,默认值是10秒。10秒对于大多数应用来讲，太长了。我们推荐从3秒开始，依次减少，每次都找出最”昂贵”的10条SQL语句并且优化他们。日复一日，一步一步优化。一次性找出很多条SQL语句，对于优化来讲，意义并不大。</ol>
<ol>log-queries-not-using-indexes<br />
MySQL会将没有使用索引的查询记录到slow  query日志中。无论它执行有多快，查询语句没有使用索引，都会被记录。有的时候，有些没有使用引索的查询非常快(例如扫描很小的表)，但也有可能导致服务器变慢，甚至还会使用大量的磁盘空间。</ol>
<ol>log-slow-admin-statements<br />
一些管理指令，也会被记录。比如OPTIMEZE TABLE, ALTER  TABLE等等。</ol>
</ul>
<h2>日志文件</h2>
<p>我们可以通过tail -f查看日志文件。</p>
<div class="codesnip-container">
<pre style="font-family: monospace;" class="bash codesnip"><span class="re1">$tail</span> <span class="re5">-f</span> <span class="sy0">/</span>var<span class="sy0">/</span>lib<span class="sy0">/</span>mysql<span class="sy0">/</span>slow-queries.log
<span class="co0"># Time: 110107 16:22:11</span>
<span class="co0"># User@Host: root[root] @ localhost []</span>
<span class="co0"># Query_time: 9.869362  Lock_time: 0.000035 Rows_sent: 1  Rows_examined: 6261774</span>
SET <span class="re2">timestamp</span>=<span class="nu0">1294388531</span>;
<span class="kw1">select</span> count<span class="br0">(</span><span class="sy0">*</span><span class="br0">)</span> from ep_friends;</pre>
</div>
<p>第一行,SQL查询执行的时间<br />
第二行,执行SQL查询的连接信息<br />
第三行记录了一些我们比较有用的信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>Query_time</strong>  SQL执行的时间,越长则越慢<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>Lock_time</strong>  在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>Rows_sent</strong>  查询返回的行数<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>Rows_examined</strong> 查询检查的行数<br />
Slow  Query日志，虽然帮助你记录了那些执行过了的SQL语句。但它不是万能的，意义可能没有你想象的那么大。它只告诉了你哪些语句慢，但是为什么慢?具体原因，还是需要你自己去分析，不断的调试。也许，你只需要换一条更有效的sql语句，也许你只需简单地增加一个索引，但也有可能你需要调整你应用程序的设计方案。比如，上面那条语句是很明显，它检查了600多万行数据。不幸的是，并不是每条语句都这么明显。也许还有别的原因，比如:<br />
*锁表了，导致查询处于等态状态。lock_time显示了查询等待锁被翻译的时间<br />
*数据或索引没有被缓存。常见于第一次启动服务器或者服务器没有调优<br />
*备份数据库，I/O变慢<br />
*也许同时运行了其它的查询，减少了当前查询</p>
<p>所以,不要过于紧张日志文件某条记录，而应该理性地审记，找出真正的原因。如果经常出现的slow  query需要特别注意。如果个别出现，则做一些常规检查即可。我们建议，统计并且形成基准报告，进行比较排除，比胡乱瞎撞有用。希望大家不要在这部分过于浪费时间与精力。</p>
<h2>线上记录slow query</h2>
<p>上文的配置需要重启mysql  server进程mysqld才会生效。但是很多时候，尤其是产品运营环境，不希望每次修改都需要重新启动mysql服务器，也希望能在某些特定时间记录。MySQL5.1给我们提供了更为灵活的运行时控制，使得你不必重新启动mysql服务器，也能选择性地记录或者不记录某些slow  queries。</p>
<p>MySQL5.1中，提供了全局变量slow_query_log、slow_query_log_file可以灵活地控制enable/disable慢查询。同时可以通过long_query_time设置时间</p>
<div class="codesnip-container">
<pre style="font-family: monospace;" class="bash codesnip"><span class="co0">#//停用slow query记录</span>
<span class="co0">#注意:设置了slow_query_log全局变量, log_slow_queries也会隐性地跟着改变</span>
mysql<span class="sy0">&gt;</span><span class="kw1">set</span> global <span class="re2">slow_query_log</span>=OFF</pre>
</div>
<p>不幸运的是,在MySQL5.0并没有提供类似的全局变量来灵活控制，但是我们可以通过将long_query_time设置得足够大来避免记录某些查询语句。比如</p>
<div class="codesnip-container">mysql&gt;set global long_query_time = 3600;</div>
<p>MySQL5.0, 不关服务的情况下，希望不记录日志的办法是将日志文件成为/dev/null的符号链接(symbolic  link)。注意:你只需要在改变后运行FLUSH LOGS以确定MYSQL释放当前的日志文件描述符，重新把日志记录到/dev/null</p>
<p>和MySQL5.0不同,MySQL5.1可以在运行时改变日记行为，将日志记录到数据库表中。只要将mysql全局变量log_output设置为TABLE即可。MySQL会将日志分别记录到表mysql.gengera_log和mysql.slow_log二张表中。但是，我们推荐将日志记录在日记文件中。</p>
<div class="codesnip-container">mysql&gt; show variables like  ‘log_output’\G<br />
Variable_name: log_output<br />
Value: FILE<br />
mysql&gt;set  global log_output=’table’;</div>
<h2>缺陷与审记</h2>
<p>虽然记录了slow query能够帮助你优化产品。但是MySQL目前版本，还有几大蹩足的地方。<br />
1.MySQL5.0版本,  long_query_time时间粒度不够细,最小值为1秒。对于高并发性能的网页脚本而言，1秒出现的意义不大。即出现1秒的查询比较少。直到mysql5.1.21才提供更细粒度的long_query_time设定.<br />
2.不能将服务器执行的所有查询记录到慢速日志中。虽然MySQL普通日志记录了所有查询，但是它们是解析查询之前就记录下来了。这意味着普通日志没办法包含诸如执行时间，锁表时间，检查行数等信息。<br />
3.如果开启了log_queries_not_using_indexes选项，slow  query日志会充满过多的垃圾日志记录，这些快且高效的全表扫描查询(表小)会冲掉真正有用的slow queries记录。比如select * from  category这样的查询也会被记录下来。</p>
<p>通过<a href="http://www.mysqlperformanceblog.com/2007/07/18/microslow-patch-for-5120/">microslow-patch</a>补丁可使用更细的时间粒度，和记录所有执行过的sql语句。不过，使用这个补订不得不自己编译MySQL，出于稳定性考滤，我们推荐在开发测试环境，可以打上这个补丁，享受这个补丁带来的便利。在运营环境尽量不要这么做…</p>
<p>MySQL自带了mysqldumpslow工具用来分析slow query日志，除此之外，还有一些好用的开源工具。比如<a href="http://myprofi.sourceforge.net/index.shtml">MyProfi</a>、<a href="http://code.google.com/p/mysql-log-filter/">mysql-log-filter</a>，当然还有<a href="http://hackmysql.com/mysqlsla">mysqlsla</a></p>
</div>
<p>Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/522.html' rel='bookmark' title='MySQL5.5复制/同步的新特性及改进'>MySQL5.5复制/同步的新特性及改进</a></li>
<li><a href='http://www.dbalife.com/archives/521.html' rel='bookmark' title='MySQL Replication基本原理'>MySQL Replication基本原理</a></li>
<li><a href='http://www.dbalife.com/archives/133.html' rel='bookmark' title='PIX logging Architecture所需perl module的几点注意'>PIX logging Architecture所需perl module的几点注意</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.dbalife.com/archives/539.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Memcached HA架构探索</title>
		<link>http://www.dbalife.com/archives/532.html</link>
		<comments>http://www.dbalife.com/archives/532.html#comments</comments>
		<pubDate>Thu, 30 Dec 2010 02:57:38 +0000</pubDate>
		<dc:creator>skywalker</dc:creator>
				<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[分布式]]></category>
		<category><![CDATA[数据库管理]]></category>
		<category><![CDATA[系统管理]]></category>
		<category><![CDATA[解决方案]]></category>
		<category><![CDATA[高可用性]]></category>

		<guid isPermaLink="false">http://www.dbalife.com/archives/532.html</guid>
		<description><![CDATA[本文转载自悠悠堂 magent是一款开源的Memcached代理服务器软件，可以用它做一些高可用尝试。 一、安装步骤： 1、编译安装libevent： wget http://monkey.org/~provos/libevent-1.4.9-stable.tar.gz tar zxvf libevent-1.4.9-stable.tar.gz cd libevent-1.4.9-stable/ ./configure –prefix=/usr make &#38;&#38; make install cd ../ 2、编译安装Memcached： wget http://danga.com/memcached/dist/memcached-1.2.6.tar.gz tar zxvf memcached-1.2.6.tar.gz cd memcached-1.2.6/ ./configure –with-libevent=/usr make &#38;&#38; make install cd ../ 3、编译安装magent： mkdir magent cd magent/ wget http://memagent.googlecode.com/files/magent-0.5.tar.gz tar zxvf magent-0.5.tar.gz /sbin/ldconfig sed -i “s#LIBS = -levent#LIBS = -levent -lm#g” Makefile [...]
Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/327.html' rel='bookmark' title='vmware server 2.0 安装要点'>vmware server 2.0 安装要点</a></li>
<li><a href='http://www.dbalife.com/archives/126.html' rel='bookmark' title='Apache2与Resin2整合虚拟主机的配置'>Apache2与Resin2整合虚拟主机的配置</a></li>
<li><a href='http://www.dbalife.com/archives/21.html' rel='bookmark' title='系统安全笔记'>系统安全笔记</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>本文转载自<a href="http://www.yoyotown.com/?p=484">悠悠堂</a></p>
<hr style="width: 100%; height: 2px;" />
<p>magent是一款开源的Memcached代理服务器软件，可以用它做一些高可用尝试。</p>
<p>一、安装步骤：<br />
1、编译安装libevent：<br />
wget  http://monkey.org/~provos/libevent-1.4.9-stable.tar.gz<br />
tar zxvf  libevent-1.4.9-stable.tar.gz<br />
cd libevent-1.4.9-stable/<br />
./configure  –prefix=/usr<br />
make &amp;&amp; make install<br />
cd ../</p>
<p>2、编译安装Memcached：<br />
wget  http://danga.com/memcached/dist/memcached-1.2.6.tar.gz<br />
tar zxvf  memcached-1.2.6.tar.gz<br />
cd memcached-1.2.6/<br />
./configure  –with-libevent=/usr<br />
make &amp;&amp; make install<br />
cd ../</p>
<p>3、编译安装magent：<br />
mkdir magent<br />
cd magent/<br />
wget  http://memagent.googlecode.com/files/magent-0.5.tar.gz<br />
tar zxvf  magent-0.5.tar.gz<br />
/sbin/ldconfig<br />
sed -i “s#LIBS = -levent#LIBS = -levent  -lm#g” Makefile<br />
make<br />
cp magent /usr/bin/magent<br />
cd ../</p>
<p>二、高可用网络架构</p>
<p><img class="aligncenter size-full wp-image-485" title="magent_memcached" alt="magent_memcached" src="http://www.yoyotown.com/wp-content/uploads/2009/11/magent_memcached.png" height="272" width="334" /><br />
服务器A&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; 服务器B</p>
<p>启动两个memcached进程，端口分别为11211和11212：<br />
memcached -m 1 -u root -d -l 127.0.0.1  -p 11211<br />
memcached -m 1 -u root -d -l 127.0.0.1 -p 11212</p>
<p>启动两个magent进程，端口分别为10000和11000：<br />
magent -u root -n 51200 -l 127.0.0.1 -p  10000 -s 127.0.0.1:11211 -b 127.0.0.1:11212<br />
magent -u root -n 51200 -l  127.0.0.1 -p 11000 -s 127.0.0.1:11212 -b 127.0.0.1:11211<br />
-s 为要写入的memcached，  -b  为备份用的memcached。<br />
说明：测试环境用magent和memached的不同端口来实现，在生产环境中可以将magent和memached作为一组放到两台服务器上。</p>
<p>也就是说通过magent能够写入两个memcached。<br />
[root@odb ~]# telnet 127.0.0.1  10000<br />
Trying 127.0.0.1…<br />
Connected to localhost.localdomain  (127.0.0.1).<br />
Escape character is ‘^]’.<br />
set key 0 0 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在10000端口设置key的值<br />
88888888<br />
STORED<br />
quit<br />
Connection closed by  foreign host.<br />
[root@odb ~]# telnet 127.0.0.1 11211<br />
Trying  127.0.0.1…<br />
Connected to localhost.localdomain (127.0.0.1).<br />
Escape  character is ‘^]’.<br />
get key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在11211端口获取key的值成功<br />
VALUE key 0 8<br />
88888888<br />
END<br />
quit<br />
Connection  closed by foreign host.<br />
[root@odb ~]# telnet 127.0.0.1 11212<br />
Trying  127.0.0.1…<br />
Connected to localhost.localdomain (127.0.0.1).<br />
Escape  character is ‘^]’.<br />
get key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在11212端口获取key的值成功<br />
VALUE key 0 8<br />
88888888<br />
END<br />
quit<br />
Connection  closed by foreign host.</p>
<p>高可用性测试：<br />
[root@odb ~]# ps aux |grep -v grep |grep memcached<br />
root&nbsp;&nbsp;&nbsp;&nbsp;  23455&nbsp; 0.0&nbsp; 0.0&nbsp; 5012 1796 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ss&nbsp;&nbsp; 09:22&nbsp;&nbsp; 0:00 memcached -m 1 -u root -d  -l 127.0.0.1 -p 11212<br />
root&nbsp;&nbsp;&nbsp;&nbsp; 24950&nbsp; 0.0&nbsp; 0.0&nbsp; 4120 1800 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ss&nbsp;&nbsp;  10:58&nbsp;&nbsp; 0:00 memcached -m 1 -u root -d -l 127.0.0.1 -p 11211<br />
[root@odb ~]# ps  aux |grep -v grep |grep ‘magent -u’<br />
root&nbsp;&nbsp;&nbsp;&nbsp; 25919&nbsp; 0.0&nbsp; 0.0&nbsp; 2176&nbsp; 484  ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ss&nbsp;&nbsp; 12:00&nbsp;&nbsp; 0:00 magent -u root -n 51200 -l 127.0.0.1 -p 10000 -s  127.0.0.1:11211 -b 127.0.0.1:11212<br />
root&nbsp;&nbsp;&nbsp;&nbsp; 25925&nbsp; 0.0&nbsp; 0.0&nbsp; 3004&nbsp; 484  ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ss&nbsp;&nbsp; 12:00&nbsp;&nbsp; 0:00 magent -u root -n 51200 -l 127.0.0.1 -p 11000 -s  127.0.0.1:11212 -b 127.0.0.1:11211<br />
[root@odb ~]# telnet 127.0.0.1  10000<br />
Trying 127.0.0.1…<br />
Connected to localhost.localdomain  (127.0.0.1).<br />
Escape character is ‘^]’.<br />
set stone 0 0  6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在10000端口设置stone的值<br />
123456<br />
STORED<br />
quit<br />
Connection closed by  foreign host.<br />
[root@odb ~]# telnet 127.0.0.1 11000<br />
Trying  127.0.0.1…<br />
Connected to localhost.localdomain (127.0.0.1).<br />
Escape  character is ‘^]’.<br />
set shidl 0 0 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在11000端口设置shidl的值<br />
666666<br />
STORED<br />
get stone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在11000端口获取stone的值成功<br />
VALUE stone 0 6<br />
123456<br />
END<br />
incr stone  2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;—在11000端口修改stone的值成功<br />
123458<br />
get stone<br />
VALUE  stone 0 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在11000端口验证stone的值，证明上面的修改成功<br />
123458<br />
END<br />
get  shidl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;—在11000端口获取shidl的值成功<br />
VALUE shidl 0  6<br />
666666<br />
END<br />
quit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;—退出11000端口<br />
Connection  closed by foreign host.<br />
[root@odb ~]# telnet 127.0.0.1 10000<br />
Trying  127.0.0.1…<br />
Connected to localhost.localdomain (127.0.0.1).<br />
Escape  character is ‘^]’.<br />
get stone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在10000端口获取stone的值，已被修改<br />
VALUE stone 0 6<br />
123458<br />
END<br />
get  shidl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;—在10000端口获取shidl的值成功<br />
VALUE shidl 0  6<br />
666666<br />
END<br />
delete shidl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在10000端口删除shidl<br />
DELETED<br />
get shidl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在10000端口删除shidl生效<br />
END<br />
quit<br />
Connection closed by foreign  host.<br />
[root@odb ~]# telnet 127.0.0.1 11000<br />
Trying 127.0.0.1…<br />
Connected  to localhost.localdomain (127.0.0.1).<br />
Escape character is ‘^]’.<br />
get  shidl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;—在11000端口验证删除shidl生效<br />
END<br />
get  stone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;—在11000端口获取stone的值成功<br />
VALUE stone 0  6<br />
123458<br />
END<br />
quit<br />
Connection closed by foreign host.</p>
<p>Down机模拟测试：</p>
<p>Down掉11211端口的memcached：</p>
<p>[root@odb ~]# kill -9 24950<br />
[root@odb ~]# telnet 127.0.0.1 10000<br />
Trying  127.0.0.1…<br />
Connected to localhost.localdomain (127.0.0.1).<br />
Escape  character is ‘^]’.<br />
get stone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在10000依然可以获取stone的值<br />
VALUE stone 0  6<br />
123458<br />
END<br />
quit<br />
Connection closed by foreign host.<br />
[root@odb  ~]# telnet 127.0.0.1 11000<br />
Trying 127.0.0.1…<br />
Connected to  localhost.localdomain (127.0.0.1).<br />
Escape character is ‘^]’.<br />
get  stone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;—在11000依然可以获取stone的值<br />
VALUE stone 0  6<br />
123458<br />
END<br />
quit<br />
Connection closed by foreign host.</p>
<p>Down掉11000端口的magent：</p>
<p>[root@odb ~]# kill -9 25925<br />
[root@odb ~]# telnet 127.0.0.1 10000<br />
Trying  127.0.0.1…<br />
Connected to localhost.localdomain (127.0.0.1).<br />
Escape  character is ‘^]’.<br />
get stone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;—在10000依然可以获取stone的值<br />
VALUE stone 0  6<br />
123458<br />
END<br />
quit<br />
Connection closed by foreign host.</p>
<p>   <!-- technorati tags begin -->
<p style="font-size:10px;text-align:right;">标签: <a href="http://technorati.com/tag/ha" rel="tag">ha</a>, <a href="http://technorati.com/tag/memcached" rel="tag">memcached</a></p>
<p><!-- technorati tags end --></p>
<p>Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/327.html' rel='bookmark' title='vmware server 2.0 安装要点'>vmware server 2.0 安装要点</a></li>
<li><a href='http://www.dbalife.com/archives/126.html' rel='bookmark' title='Apache2与Resin2整合虚拟主机的配置'>Apache2与Resin2整合虚拟主机的配置</a></li>
<li><a href='http://www.dbalife.com/archives/21.html' rel='bookmark' title='系统安全笔记'>系统安全笔记</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.dbalife.com/archives/532.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL5.5复制/同步的新特性及改进</title>
		<link>http://www.dbalife.com/archives/522.html</link>
		<comments>http://www.dbalife.com/archives/522.html#comments</comments>
		<pubDate>Thu, 23 Dec 2010 09:01:38 +0000</pubDate>
		<dc:creator>skywalker</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[数据库管理]]></category>

		<guid isPermaLink="false">http://www.dbalife.com/archives/522.html</guid>
		<description><![CDATA[谭俊青@MySQL实验室 MySQL5.5的在复制/同步方面的改进： &#160;&#160;&#160; * 保证主从服务器上数据的一致性（同步） &#160;&#160;&#160; * 能立检测到复制的异常 &#160;&#160;&#160; * Crashed Salve能自动从错误中恢复同步 &#160;&#160;&#160; * 在环形复制中用户能够指定跳过某实例事件 &#160;&#160;&#160; * 主从复制中能自动适应字段类型的转换 MySQL半同步复制(semi-synchronous replication) 默认情况下MySQL的复制是异步的，Master上所有的更新操作写入Binlog之后并不确保所有的更新都被复制到Slave之上。异步操作虽然效率高，但是在Master/Slave出现问题的时候，存在很高数据不同步的风险，甚至可能丢失数据。 MySQL5.5引入半同步复制功能的目的是为了保证在master出问题的时候，至少有一台Slave的数据是完整的。在超时的情况下也可以临时转入异步复制，保障业务的正常使用，直到一台salve追赶上之后，继续切换到半同步模式。 Master: INSTALL PLUGIN ‘rpl_semi_sync_master’ SONAME ‘semisync_master.so’; SET GLOBAL rpl_semi_sync_master_enabled=1; SET GLOBAL rpl_semi_sync_master_timeout=1000; (1s, default 10s) Slave: INSTALL PLUGIN ‘rpl_semi_sync_slave’ SONAME ‘semisync_slave.so’; SET GLOBAL rpl_semi_sync_slave_enabled=1; 默认情况下MySQL的复制是异步的，Master上所有的更新操作写入Binlog之后并不确保所有的更新都被复制到Slave之上。异步操作虽然效率高，但是在Master/Slave出现问题的时候，存在很高数据不同步的风险，甚至可能丢失数据。 MySQL5.5引入半同步复制功能的目的是为了保证在master出问题的时候，至少有一台Slave的数据是完整的。在超时的情况下也可以临时转入异步复制，保障业务的正常使用，直到一台salve追赶上之后，继续切换到半同步模式。 Master: INSTALL PLUGIN ‘rpl_semi_sync_master’ SONAME ‘semisync_master.so’; SET [...]
Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/539.html' rel='bookmark' title='MySQL Slow Query'>MySQL Slow Query</a></li>
<li><a href='http://www.dbalife.com/archives/521.html' rel='bookmark' title='MySQL Replication基本原理'>MySQL Replication基本原理</a></li>
<li><a href='http://www.dbalife.com/archives/213.html' rel='bookmark' title='Mysql导入慢的解决方法'>Mysql导入慢的解决方法</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>谭俊青@MySQL实验室</p>
<p>MySQL5.5的在复制/同步方面的改进：</p>
<p>&nbsp;&nbsp;&nbsp; * 保证主从服务器上数据的一致性（同步）<br />
&nbsp;&nbsp;&nbsp; * 能立检测到复制的异常<br />
&nbsp;&nbsp;&nbsp; * Crashed Salve能自动从错误中恢复同步<br />
&nbsp;&nbsp;&nbsp; * 在环形复制中用户能够指定跳过某实例事件<br />
&nbsp;&nbsp;&nbsp; * 主从复制中能自动适应字段类型的转换 </p>
<p><span style="font-weight: bold;">MySQL半同步复制(semi-synchronous replication)</p>
<p></span>默认情况下MySQL的复制是异步的，Master上所有的更新操作写入Binlog之后并不确保所有的更新都被复制到Slave之上。异步操作虽然效率高，但是在Master/Slave出现问题的时候，存在很高数据不同步的风险，甚至可能丢失数据。</p>
<p>MySQL5.5引入半同步复制功能的目的是为了保证在master出问题的时候，至少有一台Slave的数据是完整的。在超时的情况下也可以临时转入异步复制，保障业务的正常使用，直到一台salve追赶上之后，继续切换到半同步模式。</p>
<p>Master:<br />
INSTALL PLUGIN ‘rpl_semi_sync_master’ SONAME ‘semisync_master.so’;<br />
SET GLOBAL rpl_semi_sync_master_enabled=1;<br />
SET GLOBAL rpl_semi_sync_master_timeout=1000; (1s, default 10s)</p>
<p>Slave:<br />
INSTALL PLUGIN ‘rpl_semi_sync_slave’ SONAME ‘semisync_slave.so’;<br />
SET GLOBAL rpl_semi_sync_slave_enabled=1;</p>
<p>默认情况下MySQL的复制是异步的，Master上所有的更新操作写入Binlog之后并不确保所有的更新都被复制到Slave之上。异步操作虽然效率高，但是在Master/Slave出现问题的时候，存在很高数据不同步的风险，甚至可能丢失数据。</p>
<p>MySQL5.5引入半同步复制功能的目的是为了保证在master出问题的时候，至少有一台Slave的数据是完整的。在超时的情况下也可以临时转入异步复制，保障业务的正常使用，直到一台salve追赶上之后，继续切换到半同步模式。</p>
<p>Master:<br />
INSTALL PLUGIN ‘rpl_semi_sync_master’ SONAME ‘semisync_master.so’;<br />
SET GLOBAL rpl_semi_sync_master_enabled=1;<br />
SET GLOBAL rpl_semi_sync_master_timeout=1000; (1s, default 10s)</p>
<p>Slave:<br />
INSTALL PLUGIN ‘rpl_semi_sync_slave’ SONAME ‘semisync_slave.so’;<br />
SET GLOBAL rpl_semi_sync_slave_enabled=1;</p>
<p><span style="font-weight: bold;">复制心跳（用户检测复制是否中断）</span></p>
<p>MySQL5.5提供的新的配置master_heartbeat_period，能够在复制停止工作和出现网络中断的时候帮助我们迅速发现问题。</p>
<p>启用方法：</p>
<p>STOP SLAVE;<br />
CHANGE MASTER TO master_heartbeat_period= milliseconds;<br />
START SLAVE;</p>
<p><span style="font-weight: bold;">Slave自动恢复同步</span></p>
<p>在MySQL5.5版本之前，MySQL Slave实例在异常终止服务之后，可能导致复制中断，并且relay binlog可能损坏，在MySQL再次启动之后并不能正常恢复复制。在MySQL5.5中这一问题得到了解决，MySQL可以自行丢弃顺坏的而未处理的数据，重新从master上获取源数据，进而回复复制。</p>
<p>跳过指定复制事件</p>
<p>在多Master或环形复制的情况下，处于复制链条中间的服务器异常，可以通过</p>
<p>CHANGE MASTER TO MASTER_HOST=xxx IGNORE_SERVER_IDS=y</p>
<p>跳过出问题的MySQL实例。</p>
<p>自动转换字段类型</p>
<p>MySQL5.1在基于语句的复制下，支持部分的字段转换，但是行级的会报错。MySQL5.5语句和行级复制都已支持。还可以通过 SLAVE_TYPE_CONVERSIONS 控制转换的方向。</p>
<div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;">用 <a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser">Flock 浏览器</a> 创建</div>
<p><!-- technorati tags begin -->
<p style="font-size:10px;text-align:right;">标签: <a href="http://technorati.com/tag/mysql" rel="tag">mysql</a>, <a href="http://technorati.com/tag/replication" rel="tag">replication</a>, <a href="http://technorati.com/tag/5.5" rel="tag">5.5</a></p>
<p><!-- technorati tags end --></p>
<p>Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/539.html' rel='bookmark' title='MySQL Slow Query'>MySQL Slow Query</a></li>
<li><a href='http://www.dbalife.com/archives/521.html' rel='bookmark' title='MySQL Replication基本原理'>MySQL Replication基本原理</a></li>
<li><a href='http://www.dbalife.com/archives/213.html' rel='bookmark' title='Mysql导入慢的解决方法'>Mysql导入慢的解决方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.dbalife.com/archives/522.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Replication基本原理</title>
		<link>http://www.dbalife.com/archives/521.html</link>
		<comments>http://www.dbalife.com/archives/521.html#comments</comments>
		<pubDate>Thu, 23 Dec 2010 08:53:56 +0000</pubDate>
		<dc:creator>skywalker</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[数据库管理]]></category>
		<category><![CDATA[高可用性]]></category>

		<guid isPermaLink="false">http://www.dbalife.com/archives/521.html</guid>
		<description><![CDATA[1、复制进程 &#160;&#160;&#160; Mysql的复制（replication）是一个异步的复制，从一个Mysql instace（称之为Master）复制到另一个Mysql instance（称之Slave）。实现整个复制操作主要由三个进程完成的，其中两个进程在Slave（Sql进程和IO进程），另外一个进程在Master（IO进程）上。 &#160;&#160;&#160; 要实施复制，首先必须打开Master端的binary log（bin-log）功能，否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。 &#160;&#160;&#160; 复制的基本过程如下： &#160;&#160;&#160; 1)、Slave上面的IO进程连接上Master，并请求从指定日志文件的指定位置（或者从最开始的日志）之后的日志内容； &#160;&#160;&#160; 2)、Master接收到来自Slave的IO进程的请求后，通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息，返回给Slave的IO进程。返回信息中除了日志所包含的信息之外，还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置； &#160;&#160;&#160; 3)、Slave的IO进程接收到信息后，将接收到的日志内容依次添加到Slave端的relay-log文件的最末端，并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中，以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容，请发给我”； &#160;&#160;&#160; 4)、Slave的Sql进程检测到relay-log中新增加了内容后，会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容，并在自身执行。 &#160;&#160;&#160; 实际上在老版本的Mysql的复制实现在Slave端并不是两个进程完成的，而是由一个进程完成。但是后来发现这样做存在较大的风险和性能问题，主要如下： &#160;&#160;&#160; 首先，一个进程就使复制bin-log日志和解析日志并在自身执行的过程成为一个串行的过程，性能受到了一定的限制，异步复制的延迟也会比较长。 &#160;&#160;&#160; 另外，Slave端从Master端获取bin-log过来之后，需要接着解析日志内容，然后在自身执行。在这个过程中，Master端可能又产生了大量变化并声称了大量的日志。如果在这个阶段Master端的存储出现了无法修复的错误，那么在这个阶段所产生的所有变更都将永远无法找回。如果在Slave端的压力比较大的时候，这个过程的时间可能会比较长。 &#160;&#160;&#160; 所以，后面版本的Mysql为了解决这个风险并提高复制的性能，将Slave端的复制改为两个进程来完成。提出这个改进方案的人是Yahoo!的一位工程师“Jeremy Zawodny”。这样既解决了性能问题，又缩短了异步的延时时间，同时也减少了可能存在的数据丢失量。当然，即使是换成了现在这样两个线程处理以后，同样也还是存在slave数据延时以及数据丢失的可能性的，毕竟这个复制是异步的。只要数据的更改不是在一个事物中，这些问题都是会存在的。如果要完全避免这些问题，就只能用mysql的cluster来解决了。不过mysql的cluster是内存数据库的解决方案，需要将所有数据都load到内存中，这样就对内存的要求就非常大了，对于一般的应用来说可实施性不是太大。 &#160;&#160;&#160; 2、复制实现级别 &#160;&#160;&#160; Mysql的复制可以是基于一条语句（Statement level），也可以是基于一条记录（Row level），可以在Mysql的配置参数中设定这个复制级别，不同复制级别的设置会影响到Master端的bin-log记录成不同的形式。 &#160;&#160;&#160; Row Level：日志中会记录成每一行数据被修改的形式，然后在slave端再对相同的数据进行修改。 &#160;&#160;&#160; 优点：在row level模式下，bin-log中可以不记录执行的sql语句的上下文相关的信息，仅仅只需要记录那一条记录被修改了，修改成什么样了。所以row level的日志内容会非常清楚的记录下每一行数据修改的细节，非常容易理解。而且不会出现某些特定情况下的存储过程，或function，以及trigger的调用和触发无法被正确复制的问题。 &#160;&#160;&#160; 缺点：row level下，所有的执行的语句当记录到日志中的时候，都将以每行记录的修改来记录，这样可能会产生大量的日志内容，比如有这样一条update语句：update product set owner_member_id = ‘b’ where owner_member_id = ‘a’，执行之后，日志中记录的不是这条update语句所对应额事件（mysql以事件的形式来记录bin-log日志），而是这条语句所更新的每一条记录的变化情况，这样就记录成很多条记录被更新的很多个事件。自然，bin-log日志的量就会很大。尤其是当执行alter table之类的语句的时候，产生的日志量是惊人的。因为Mysql对于alter table之类的表结构变更语句的处理方式是整个表的每一条记录都需要变动，实际上就是重建了整个表。那么该表的每一条记录都会被记录到日志中。 &#160;&#160;&#160; [...]
Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/539.html' rel='bookmark' title='MySQL Slow Query'>MySQL Slow Query</a></li>
<li><a href='http://www.dbalife.com/archives/522.html' rel='bookmark' title='MySQL5.5复制/同步的新特性及改进'>MySQL5.5复制/同步的新特性及改进</a></li>
<li><a href='http://www.dbalife.com/archives/213.html' rel='bookmark' title='Mysql导入慢的解决方法'>Mysql导入慢的解决方法</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><strong>1、复制进程</strong></p>
<p>&nbsp;&nbsp;&nbsp; Mysql的复制（<a class="st_tag internal_tag" title="标签 replication 下的日志" href="http://ourmysql.com/archives/tag/replication" rel="tag">replication</a>）是一个异步的复制，从一个Mysql instace（称之为Master）复制到另一个Mysql  instance（称之Slave）。实现整个复制操作主要由三个进程完成的，其中两个进程在Slave（Sql进程和IO进程），另外一个进程在Master（IO进程）上。</p>
<p>&nbsp;&nbsp;&nbsp; 要实施复制，首先必须打开Master端的binary  log（bin-log）功能，否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。</p>
<p>&nbsp;&nbsp;&nbsp; 复制的基本过程如下：</p>
<p>&nbsp;&nbsp;&nbsp; 1)、Slave上面的IO进程连接上Master，并请求从指定日志文件的指定位置（或者从最开始的日志）之后的日志内容；</p>
<p>&nbsp;&nbsp;&nbsp;  2)、Master接收到来自Slave的IO进程的请求后，通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息，返回给Slave的IO进程。返回信息中除了日志所包含的信息之外，还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置；</p>
<p>&nbsp;&nbsp;&nbsp;  3)、Slave的IO进程接收到信息后，将接收到的日志内容依次添加到Slave端的relay-log文件的最末端，并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中，以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容，请发给我”；</p>
<p>&nbsp;&nbsp;&nbsp;  4)、Slave的Sql进程检测到relay-log中新增加了内容后，会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容，并在自身执行。</p>
<p>&nbsp;&nbsp;&nbsp;  实际上在老版本的Mysql的复制实现在Slave端并不是两个进程完成的，而是由一个进程完成。但是后来发现这样做存在较大的风险和性能问题，主要如下：</p>
<p>&nbsp;&nbsp;&nbsp; 首先，一个进程就使复制bin-log日志和解析日志并在自身执行的过程成为一个串行的过程，性能受到了一定的限制，异步复制的延迟也会比较长。</p>
<p>&nbsp;&nbsp;&nbsp;  另外，Slave端从Master端获取bin-log过来之后，需要接着解析日志内容，然后在自身执行。在这个过程中，Master端可能又产生了大量变化并声称了大量的日志。如果在这个阶段Master端的存储出现了无法修复的错误，那么在这个阶段所产生的所有变更都将永远无法找回。如果在Slave端的压力比较大的时候，这个过程的时间可能会比较长。</p>
<p>&nbsp;&nbsp;&nbsp;  所以，后面版本的Mysql为了解决这个风险并提高复制的性能，将Slave端的复制改为两个进程来完成。提出这个改进方案的人是Yahoo!的一位工程师“Jeremy  Zawodny”。这样既解决了性能问题，又缩短了异步的延时时间，同时也减少了可能存在的数据丢失量。当然，即使是换成了现在这样两个线程处理以后，同样也还是存在slave数据延时以及数据丢失的可能性的，毕竟这个复制是异步的。只要数据的更改不是在一个事物中，这些问题都是会存在的。如果要完全避免这些问题，就只能用mysql的cluster来解决了。不过mysql的cluster是内存数据库的解决方案，需要将所有数据都load到内存中，这样就对内存的要求就非常大了，对于一般的应用来说可实施性不是太大。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>2、复制实现级别</strong></p>
<p>&nbsp;&nbsp;&nbsp; Mysql的复制可以是基于一条语句（Statement level），也可以是基于一条记录（Row  level），可以在Mysql的配置参数中设定这个复制级别，不同复制级别的设置会影响到Master端的bin-log记录成不同的形式。</p>
<p>&nbsp;&nbsp;&nbsp;<strong> Row Level</strong>：日志中会记录成每一行数据被修改的形式，然后在slave端再对相同的数据进行修改。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>优点</strong>：在row  level模式下，bin-log中可以不记录执行的sql语句的上下文相关的信息，仅仅只需要记录那一条记录被修改了，修改成什么样了。所以row  level的日志内容会非常清楚的记录下每一行数据修改的细节，非常容易理解。而且不会出现某些特定情况下的存储过程，或function，以及trigger的调用和触发无法被正确复制的问题。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>缺点</strong>：row  level下，所有的执行的语句当记录到日志中的时候，都将以每行记录的修改来记录，这样可能会产生大量的日志内容，比如有这样一条update语句：update  product set owner_member_id = ‘b’ where owner_member_id =  ‘a’，执行之后，日志中记录的不是这条update语句所对应额事件（mysql以事件的形式来记录bin-log日志），而是这条语句所更新的每一条记录的变化情况，这样就记录成很多条记录被更新的很多个事件。自然，bin-log日志的量就会很大。尤其是当执行alter  table之类的语句的时候，产生的日志量是惊人的。因为Mysql对于alter  table之类的表结构变更语句的处理方式是整个表的每一条记录都需要变动，实际上就是重建了整个表。那么该表的每一条记录都会被记录到日志中。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>Statement Level</strong>:每一条会修改数据的sql都会记录到  master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>优点</strong>：statement level下的优点首先就是解决了row  level下的缺点，不需要记录每一行数据的变化，减少bin-log日志量，节约IO，提高性能。因为他只需要记录在Master上所执行的语句的细节，以及执行语句时候的上下文的信息。</p>
<p>&nbsp;&nbsp;&nbsp;  <strong>缺点</strong>：由于他是记录的执行语句，所以，为了让这些语句在slave端也能正确执行，那么他还必须记录每条语句在执行的时候的一些相关信息，也就是上下文信息，以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果。另外就是，由于Mysql现在发展比较快，很多的新功能不断的加入，使mysql得复制遇到了不小的挑战，自然复制的时候涉及到越复杂的内容，bug也就越容易出现。在statement  level下，目前已经发现的就有不少情况会造成mysql的复制出现问题，主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现，比如：sleep()函数在有些版本中就不能真确复制，在存储过程中使用了last_insert_id()函数，可能会使slave和master上得到不一致的id等等。由于row  level是基于每一行来记录的变化，所以不会出现类似的问题。</p>
<p>&nbsp;&nbsp;&nbsp; 从官方文档中看到，之前的Mysql一直都只有基于statement的复制模式，直到5.1.5版本的Mysql才开始支持row  level的复制。从5.0开始，Mysql的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现，给Mysql的复制又带来了更大的新挑战。另外，看到官方文档说，从5.1.8版本开始，Mysql提供了除Statement  Level和Row Level之外的第三种复制模式：Mixed，实际上就是前两种模式的结合。</p>
<p>&nbsp;&nbsp;&nbsp;  在Mixed模式下，Mysql会根据执行的每一条具体的sql语句来区分对待记录的日志形式，也就是在Statement和Row之间选择一种。新版本中的Statment  level还是和以前一样，仅仅记录执行的语句。而新版本的Mysql中队row level模式也被做了优化，并不是所有的修改都会以row  level来记录，像遇到表结构变更的时候就会以statement模式来记录，如果sql语句确实就是update或者delete等修改数据的语句，那么还是会记录所有行的变更。</p>
<p>&nbsp;&nbsp;&nbsp; 3、复制常用架构</p>
<p>&nbsp;&nbsp;&nbsp;  Mysql复制环境90%以上都是一个Master带一个或者多个Slave的架构模式，主要用于读压力比较大的应用的数据库端廉价扩展解决方案。因为只要master和slave的压力不是太大（尤其是slave端压力）的话，异步复制的延时一般都很少很少。尤其是自slave端的复制方式改成两个进程处理之后，更是减小了slave端的延时。而带来的效益是，对于数据实时性要求不是特别的敏感度的应用，只需要通过廉价的pc  server来扩展slave的数量，将读压力分散到多台slave的机器上面，即可解决数据库端的读压力瓶颈。这在很大程度上解决了目前很多中小型网站的数据库压力瓶颈问题，甚至有些大型网站也在使用类似方案解决数据库瓶颈。</p>
<p>&nbsp;&nbsp;&nbsp;  一个Master带多个slave的架构实施非常简单，多个slave和单个slave的实施并没有太大区别。在Master端并不care有多少个slave连上了master端，只要有slave进程通过了连接认证，向他请求binlog信息，他就会按照连接上来的io进程的要求，读取自己的binlog信息，返回给slave的IO进程。对于slave的配置细节，在Mysql的官方文档上面已经说的很清楚了，甚至介绍了多种实现slave的配置方法。</p>
<p>&nbsp;&nbsp;&nbsp; Mysql不支持一个Slave instance从属于多个Master的架构。就是说，一个slave  instance只能接受一个master的同步源，听说有patch可以改进这样的功能，但没有实践过。Mysql  AB之所以不实现这样的功能，主要是考虑到冲突解决的问题。</p>
<p>&nbsp;&nbsp;&nbsp; Mysql也可以搭建成dual master模式，也就是说两个Mysql  instance互为对方的Master，也同时为对方的Slave。不过一般这种架构也是只有一端提供服务，避免冲突问题。因为即使在两边执行的修改有先后顺序，由于复制的异步实现机制，同样会导致即使在晚做的修改也可能会被早做的修改所覆盖，就像如下情形：</p>
<p>&nbsp;&nbsp;&nbsp; 时间点 Mysql A Mysql B<br />
&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更新x表y记录为10<br />
&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  更新x表y记录为20<br />
&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取到A日志并应用，更新x表的y记录为10（不符合期望）<br />
&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  获取B日志更新x表y记录为20（符合期望）</p>
<p>&nbsp;&nbsp;&nbsp;  这样，不仅在B库上面的数据不是用户所期望的结果，A和B两边的数据也出现了不一致的情况。除非能将写操作根据某种条件固定分开在A和B两端，保证不会交叉写入，才能够避免上面的问题。</p>
<div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;">用 <a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser">Flock 浏览器</a> 创建</div>
<p><!-- technorati tags begin -->
<p style="font-size:10px;text-align:right;">标签: <a href="http://technorati.com/tag/mysql" rel="tag">mysql</a>, <a href="http://technorati.com/tag/replication" rel="tag">replication</a>, <a href="http://technorati.com/tag/master" rel="tag">master</a>, <a href="http://technorati.com/tag/slave" rel="tag">slave</a>, <a href="http://technorati.com/tag/%E5%8E%9F%E7%90%86" rel="tag">原理</a>, <a href="http://technorati.com/tag/ha" rel="tag">ha</a></p>
<p><!-- technorati tags end --></p>
<p>Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/539.html' rel='bookmark' title='MySQL Slow Query'>MySQL Slow Query</a></li>
<li><a href='http://www.dbalife.com/archives/522.html' rel='bookmark' title='MySQL5.5复制/同步的新特性及改进'>MySQL5.5复制/同步的新特性及改进</a></li>
<li><a href='http://www.dbalife.com/archives/213.html' rel='bookmark' title='Mysql导入慢的解决方法'>Mysql导入慢的解决方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.dbalife.com/archives/521.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>kill某个用户的所有session</title>
		<link>http://www.dbalife.com/archives/518.html</link>
		<comments>http://www.dbalife.com/archives/518.html#comments</comments>
		<pubDate>Tue, 21 Dec 2010 07:13:44 +0000</pubDate>
		<dc:creator>skywalker</dc:creator>
				<category><![CDATA[DBA脚本]]></category>
		<category><![CDATA[数据库管理]]></category>
		<category><![CDATA[kill session]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[用户]]></category>

		<guid isPermaLink="false">http://www.dbalife.com/archives/518.html</guid>
		<description><![CDATA[kill_all_session_by_username.sh 用于杀掉Oracle数据库中某个用户的所有session #!/bin/sh if [ $# -ne 1 ] ; then echo "Usage: $0 &#60;Username&#62;"; echo "WARNING: the &#60;Username&#62; MUST in upper case."; exit 1; fi username=$1 echo $username function_get_info(){ username=$1 sqlplus  / as sysdba  &#60;&#60;EOF select username,sid,serial# from v\$session where username = '$username'; EXIT EOF } function_get_info ${username} &#124;awk '/^'${username}'/ { print "alter system [...]
Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/30.html' rel='bookmark' title='笔记：查询oracle被锁的对象'>笔记：查询oracle被锁的对象</a></li>
<li><a href='http://www.dbalife.com/archives/56.html' rel='bookmark' title='如何使用跟踪事件10046'>如何使用跟踪事件10046</a></li>
<li><a href='http://www.dbalife.com/archives/38.html' rel='bookmark' title='AutoTrace'>AutoTrace</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>kill_all_session_by_username.sh<br />
用于杀掉Oracle数据库中某个用户的所有session</p>
<p>#!/bin/sh</p>
<p>if [ $# -ne 1 ] ;<br />
then<br />
echo "Usage: $0 &lt;Username&gt;";<br />
echo "WARNING: the &lt;Username&gt; MUST in upper case.";<br />
exit 1;<br />
fi</p>
<p>username=$1<br />
echo $username</p>
<p>function_get_info(){<br />
username=$1</p>
<p>sqlplus  / as sysdba  &lt;&lt;EOF<br />
select username,sid,serial# from v\$session where username = '$username';<br />
EXIT<br />
EOF<br />
}</p>
<p>function_get_info ${username} |awk '/^'${username}'/ { print "alter system kill session '\''"  $2 "," $3 "'\'' ; "} '<br />
sql_killsession=`function_get_info |awk '/^'${username}'/ { print "alter system kill session  '\''"  $2 "," $3 "'\''; "} '`<br />
echo $sql_killsession</p>
<p>sqlplus  / as sysdba  &lt;&lt;EOF<br />
#$sql_killsession<br />
EXIT<br />
EOF</p>
<div class="flockcredit" style="text-align: right; color: #ccc; font-size: x-small;">用 <a style="color: #999; font-weight: bold;" title="Flock Browser" href="http://www.flock.com/blogged-with-flock" target="_new">Flock 浏览器</a> 创建</div>
<p><!-- technorati tags begin --></p>
<p style="font-size: 10px; text-align: right;">标签: <a rel="tag" href="http://technorati.com/tag/oracle">oracle</a>, <a rel="tag" href="http://technorati.com/tag/killsession">killsession</a></p>
<p><!-- technorati tags end --></p>
<p>Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/30.html' rel='bookmark' title='笔记：查询oracle被锁的对象'>笔记：查询oracle被锁的对象</a></li>
<li><a href='http://www.dbalife.com/archives/56.html' rel='bookmark' title='如何使用跟踪事件10046'>如何使用跟踪事件10046</a></li>
<li><a href='http://www.dbalife.com/archives/38.html' rel='bookmark' title='AutoTrace'>AutoTrace</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.dbalife.com/archives/518.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>禁用/启用所有外键约束</title>
		<link>http://www.dbalife.com/archives/383.html</link>
		<comments>http://www.dbalife.com/archives/383.html#comments</comments>
		<pubDate>Sat, 06 Feb 2010 16:01:14 +0000</pubDate>
		<dc:creator>skywalker</dc:creator>
				<category><![CDATA[DBA脚本]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[数据库管理]]></category>
		<category><![CDATA[fk]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[启用]]></category>
		<category><![CDATA[外键]]></category>
		<category><![CDATA[禁用]]></category>
		<category><![CDATA[约束]]></category>

		<guid isPermaLink="false">http://www.dbalife.com/?p=383</guid>
		<description><![CDATA[1、ORACLE数据库中的外键约束名都在表user_constraints中可以查到。其中constraint_type='R'表示是外键约束。 2、启用外键约束的命令为：alter table table_name enable constraint constraint_name 3、禁用外键约束的命令为：alter table table_name disable constraint constraint_name 4、然后再用SQL查出数据库中所以外键的约束名： select 'alter table '&#124;&#124;table_name&#124;&#124;' enable constraint '&#124;&#124;constraint_name&#124;&#124;';' from user_constraints where constraint_type='R' select 'alter table '&#124;&#124;table_name&#124;&#124;' disable constraint '&#124;&#124;constraint_name&#124;&#124;';' from user_constraints where constraint_type='R' Related posts: oralce10g shrink drop table遭遇ORA-604 / ORA-1422 Oracle9i优化器介绍（下）
Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/286.html' rel='bookmark' title='oralce10g shrink'>oralce10g shrink</a></li>
<li><a href='http://www.dbalife.com/archives/128.html' rel='bookmark' title='drop table遭遇ORA-604 / ORA-1422'>drop table遭遇ORA-604 / ORA-1422</a></li>
<li><a href='http://www.dbalife.com/archives/32.html' rel='bookmark' title='Oracle9i优化器介绍（下）'>Oracle9i优化器介绍（下）</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>1、ORACLE数据库中的外键约束名都在表user_constraints中可以查到。其中constraint_type='R'表示是外键约束。</p>
<p>2、启用外键约束的命令为：alter table table_name enable constraint constraint_name</p>
<p>3、禁用外键约束的命令为：alter table table_name disable constraint constraint_name</p>
<p>4、然后再用SQL查出数据库中所以外键的约束名：</p>
<p>select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints where constraint_type='R'</p>
<p>select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints where constraint_type='R'</p>
<p>Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/286.html' rel='bookmark' title='oralce10g shrink'>oralce10g shrink</a></li>
<li><a href='http://www.dbalife.com/archives/128.html' rel='bookmark' title='drop table遭遇ORA-604 / ORA-1422'>drop table遭遇ORA-604 / ORA-1422</a></li>
<li><a href='http://www.dbalife.com/archives/32.html' rel='bookmark' title='Oracle9i优化器介绍（下）'>Oracle9i优化器介绍（下）</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.dbalife.com/archives/383.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用SQL处理多行汇聚问题</title>
		<link>http://www.dbalife.com/archives/379.html</link>
		<comments>http://www.dbalife.com/archives/379.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 04:50:12 +0000</pubDate>
		<dc:creator>skywalker</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[数据库管理]]></category>
		<category><![CDATA[软件开发]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[多行]]></category>
		<category><![CDATA[汇聚]]></category>

		<guid isPermaLink="false">http://www.dbalife.com/?p=379</guid>
		<description><![CDATA[表结构如下： NAME                            Null          Type ------------------------  ---------  ----- N_SEC_CODE                NOT NULL  CHAR(6) C_RESEARCHER_CODE  NOT NULL  VARCHAR2(20) 此表保存了“股票”与“研究员”的对应关系数据，一般而言，对于同一只股票而言，可能有多个研究员对其进行跟踪研究。所以目前遇到一个要求，需查询出每只股票和对应的研究员（研究员代码间，使用逗号分隔）。 例如有如下数据： 000297                            [...]
Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/41.html' rel='bookmark' title='sqlplus下如何看执行计划'>sqlplus下如何看执行计划</a></li>
<li><a href='http://www.dbalife.com/archives/6.html' rel='bookmark' title='Oracle分析函数参考手册'>Oracle分析函数参考手册</a></li>
<li><a href='http://www.dbalife.com/archives/39.html' rel='bookmark' title='Statistics Lock导致的IMP问题'>Statistics Lock导致的IMP问题</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>表结构如下：<br />
NAME                            Null          Type<br />
------------------------  ---------  -----<br />
N_SEC_CODE                NOT NULL  CHAR(6)<br />
C_RESEARCHER_CODE  NOT NULL  VARCHAR2(20)</p>
<p>此表保存了“股票”与“研究员”的对应关系数据，一般而言，对于同一只股票而言，可能有多个研究员对其进行跟踪研究。所以目前遇到一个要求，需查询出每只股票和对应的研究员（研究员代码间，使用逗号分隔）。</p>
<p>例如有如下数据：<br />
000297                                    chenpeng           <br />
000297                                    liusu             <br />
合并处理后需显示为：<br />
000297                                    chenpeng,liusu</p>
<p>多行数据汇总聚一行，只需要把SQL中“n_sec_code”换为你的用来汇总的列，“c_researcher_code”替换为需合并文本的列，“m_researcher_stock_rel”替换为你的表名</p>
<p> SELECT n_sec_code,<br />
  TRANSLATE (LTRIM (text, '/'), '*/', '*,') researcherList<br />
   FROM<br />
  (SELECT ROW_NUMBER () OVER (PARTITION BY n_sec_code ORDER BY n_sec_code, lvl DESC) rn,<br />
    n_sec_code                                                                         ,<br />
    text<br />
     FROM<br />
    (SELECT n_sec_code,<br />
      LEVEL lvl       ,<br />
      SYS_CONNECT_BY_PATH (c_researcher_code,'/') text<br />
       FROM<br />
      (SELECT n_sec_code                      ,<br />
        c_researcher_code AS c_researcher_code,<br />
        ROW_NUMBER () OVER (PARTITION BY n_sec_code ORDER BY n_sec_code,c_researcher_code) x<br />
         FROM m_researcher_stock_rel<br />
     ORDER BY n_sec_code,<br />
        c_researcher_code<br />
      ) a CONNECT BY n_sec_code = PRIOR n_sec_code<br />
    AND x - 1                   = PRIOR x<br />
    )<br />
  )<br />
  WHERE rn = 1<br />
ORDER BY n_sec_code;</p>
<p>Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/41.html' rel='bookmark' title='sqlplus下如何看执行计划'>sqlplus下如何看执行计划</a></li>
<li><a href='http://www.dbalife.com/archives/6.html' rel='bookmark' title='Oracle分析函数参考手册'>Oracle分析函数参考手册</a></li>
<li><a href='http://www.dbalife.com/archives/39.html' rel='bookmark' title='Statistics Lock导致的IMP问题'>Statistics Lock导致的IMP问题</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.dbalife.com/archives/379.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql中的STRICT_TRANS_TABLES</title>
		<link>http://www.dbalife.com/archives/339.html</link>
		<comments>http://www.dbalife.com/archives/339.html#comments</comments>
		<pubDate>Fri, 15 Jan 2010 19:39:52 +0000</pubDate>
		<dc:creator>skywalker</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[数据库管理]]></category>
		<category><![CDATA[软件开发]]></category>
		<category><![CDATA[my.ini]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[STRICT_TRANS_TABLES]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.dbalife.com/?p=339</guid>
		<description><![CDATA[在调试php symfony，加载fixture数据时，遇到了错误： SQLSTATE[HY000]: General error: 1366 Incorrect integer value: 'log' for column 'tasklog_id' at row 1 这是因为mysql5.5中默认启用了STRICT_TRANS_TABLES参数。 STRICT_TRANS_TABLES的工作方式： 　　· 对于事务性存储引擎，在语句中任何地方出现的不良数据值均会导致放弃语句并执行回滚。         · 对于非事务性存储引擎，如果错误出现在要插入或更新的第1行，将放弃语句。（在这种情况下，可以认为语句未改变表，就像事务表一样）。首行后出现的错误不会导致放弃语句。取而代之的是，将调整不良数据值，并给出告警，而不是错误。换句话讲，使用STRICT_TRANS_TABLES后，错误值会导致MySQL执行回滚操作，如果可以，所有更新到此为止。 　　要想执行更严格的检查，请启用STRICT_ALL_TABLES。除了非事务性存储引擎，它与STRICT_TRANS_TABLES等同，即使当不良数据出现在首行后的其他行，所产生的错误也会导致放弃语句。这意味着，如果错误出现在非事务性表多行插入或更新过程的中途，仅更新部分结果。前面的行将完成插入或更新，但错误出现点后面的行则不然。 因此，解决方法就是在my.ini里把STRICT_TRANS_TABLES关掉 ?View Code C#Set the SQL mode to strict #sql-mode=&#34;STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&#34; sql-mode=&#34;NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&#34; No related posts.
No related posts.]]></description>
			<content:encoded><![CDATA[<p>在调试php symfony，加载fixture数据时，遇到了错误：</p>
<blockquote><p>SQLSTATE[HY000]: General error: 1366 Incorrect integer value: 'log' for column 'tasklog_id' at row 1</p></blockquote>
<p>这是因为mysql5.5中默认启用了<em>STRICT_TRANS_TABLES</em>参数。</p>
<p>STRICT_TRANS_TABLES的工作方式：<br />
　　· 对于事务性存储引擎，在语句中任何地方出现的不良数据值均会导致放弃语句并执行回滚。<br />
        · 对于非事务性存储引擎，如果错误出现在要插入或更新的第1行，将放弃语句。（在这种情况下，可以认为语句未改变表，就像事务表一样）。首行后出现的错误不会导致放弃语句。取而代之的是，将调整不良数据值，并给出告警，而不是错误。换句话讲，使用STRICT_TRANS_TABLES后，错误值会导致MySQL执行回滚操作，如果可以，所有更新到此为止。</p>
<p>　　要想执行更严格的检查，请启用STRICT_ALL_TABLES。除了非事务性存储引擎，它与STRICT_TRANS_TABLES等同，即使当不良数据出现在首行后的其他行，所产生的错误也会导致放弃语句。这意味着，如果错误出现在非事务性表多行插入或更新过程的中途，仅更新部分结果。前面的行将完成插入或更新，但错误出现点后面的行则不然。</p>
<p>因此，解决方法就是在my.ini里把STRICT_TRANS_TABLES关掉</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p339code2'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3392"><td class="code" id="p339code2"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#Set the SQL mode to strict</span>
<span style="color: #339933;">#sql-mode=&quot;STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&quot;</span>
sql<span style="color: #339933;">-</span>mode<span style="color: #339933;">=</span><span style="color: #ff0000;">&quot;NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&quot;</span></pre></td></tr></table></div>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.dbalife.com/archives/339.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle Trace Level Event Numbers</title>
		<link>http://www.dbalife.com/archives/329.html</link>
		<comments>http://www.dbalife.com/archives/329.html#comments</comments>
		<pubDate>Mon, 16 Nov 2009 06:28:29 +0000</pubDate>
		<dc:creator>skywalker</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[数据库管理]]></category>
		<category><![CDATA[10046]]></category>
		<category><![CDATA[level]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[trace]]></category>

		<guid isPermaLink="false">http://www.dbalife.com/?p=329</guid>
		<description><![CDATA[Oracle Trace Level Event Numbers 相关参考信息: Oracle Trace: The Swiss Army Knife of Diagnostic Tools Setting Events Trace and TKPROF 10000 control file debug event, name 'control_file' 10001 control file crash event1 10002 control file crash event2 10003 control file crash event3 10004 control file crash event4 10005 trace latch operations for debugging 10006 testing [...]
Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/101.html' rel='bookmark' title='ORACLE STATSPACK REPORT输出结果说明'>ORACLE STATSPACK REPORT输出结果说明</a></li>
<li><a href='http://www.dbalife.com/archives/383.html' rel='bookmark' title='禁用/启用所有外键约束'>禁用/启用所有外键约束</a></li>
<li><a href='http://www.dbalife.com/archives/261.html' rel='bookmark' title='Oracle 10g 手动建库'>Oracle 10g 手动建库</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Oracle Trace Level Event Numbers</p>
<p>相关参考信息:</p>
<ul>
<li><a href="http://www.proligence.com/pr_oracle_trace.pdf"><span style="color: #0082ff;">Oracle Trace: The Swiss Army Knife of Diagnostic Tools</span></a></li>
<li><a href="http://www.ixora.com.au/q+a/events.htm"><span style="color: #0082ff;">Setting Events</span></a></li>
<li><a href="http://www.psoug.org/reference/trace_tkprof.html"><span style="color: #0082ff;">Trace and TKPROF</span></a></li>
</ul>
<div id="more-more">
<blockquote>
<pre>10000 control file debug event, name 'control_file'
10001 control file crash event1
10002 control file crash event2
10003 control file crash event3
10004 control file crash event4
10005 trace latch operations for debugging
10006 testing - block recovery forced
10007 log switch debug crash after new log select, thread %s
10008 log switch debug crash after new log header write, thread %s
10009 log switch debug crash after old log header write, thread %s
10010 Begin Transaction
10011 End Transaction
10012 Abort Transaction
10013 Instance Recovery
10014 Roll Back to Save Point
10015 Undo Segment Recovery
10016 Undo Segment extend
10017 Undo Segment Wrap
10018 Data Segment Create
10019 Data Segment Recovery
10020 partial link restored to linked list (KSG)
10021 latch cleanup for state objects (KSS)
10022 trace ktsgsp
10023 Create Save Undo Segment
10024 Write to Save Undo
10025 Extend Save Undo Segment
10026 Apply Save Undo
10027 latch cleanup for enqueue locks (KSQ)
10028 latch cleanup for enqueue resources (KSQ)
10029 session logon (KSU)
10030 session logoff (KSU)
10031 row source debug event (R*)
10032 sort end (SOR*)
10035 parse <acronym title="Structured Query Language
">SQL</acronym> statement (OPIPRS)
10036 create remote row source (QKANET)
10037 allocate remote row source (QKARWS)
10038 dump row source tree (QBADRV)
10039 type checking (OPITCA)
10040 dirty cache list
10041 dump undo records skipped
10042 trap error during undo application
10044 free list undo operations
10045 "free list update operations - ktsrsp, ktsunl"
10046 enable <acronym title="Structured Query Language
">SQL</acronym> statement timing
10047 trace switching of sessions
10048 Undo segment shrink
10049 protect library cache memory heaps
10050 sniper trace
10051 trace OPI calls
10052 don't clean up obj$
10053 <acronym title="Cost based optimer
">CBO</acronym> Enable optimizer trace
10054 trace UNDO handling in MLS
10055 trace UNDO handing
10056 dump analyze stats (kdg)
10057 suppress file names in error messages
10058 use table scan cost in tab$.spare1
10060 <acronym title="Cost based optimer
">CBO</acronym> Enable predicate dump
10061 disable SMON from cleaning temp segment
10062 disable usage of <acronym title="Operating System
">OS</acronym> Roles in osds
10063 disable usage of <acronym title="Database Administrator
">DBA</acronym> and OPER privileges in osds
10064 "thread enable debug crash level %s, thread %s"
10065 limit library cache dump information for state object dump
10066 simulate failure to verify file
10067 force redo log checksum errors - block number
10068 force redo log checksum errors - file number
10069 Trusted Oracle test event
10070 force datafile checksum errors - block number
10071 force datafile checksum errors - file number
10072 protect latch recovery memory
10073 have PMON dump info before latch cleanup
10074 default trace function mask for kst
10075 <acronym title="Cost based optimer
">CBO</acronym> Disable outer-join to regular join conversion
10076 <acronym title="Cost based optimer
">CBO</acronym> Enable cartesian product join costing
10077 <acronym title="Cost based optimer
">CBO</acronym> Disable view-merging optimization for outer-joins
10078 <acronym title="Cost based optimer
">CBO</acronym> Disable constant predicate elimination optimization
10080 dump a block on a segment list which cannot be exchanged
10081 segment High Water Mark has been advanced
10082 free list head block is the same as the last block
10083 a brand new block has been requested from space management
10084 free list becomes empty
10085 free lists have been merged
10086 <acronym title="Cost based optimer
">CBO</acronym> Enable error if kko and qka disagree on oby sort
10087 disable repair of media corrupt data blocks
10088 <acronym title="Cost based optimer
">CBO</acronym> Disable new NOT IN optimization
10089 <acronym title="Cost based optimer
">CBO</acronym> Disable index sorting
10090 invoke other events before crash recovery
10091 <acronym title="Cost based optimer
">CBO</acronym> Disable constant predicate merging
10092 <acronym title="Cost based optimer
">CBO</acronym> Disable hash join
10093 <acronym title="Cost based optimer
">CBO</acronym> Enable force hash joins
10094 before resizing a data file
10095 dump debugger commands to trace file
10096 after the cross instance call when resizing a data file
10097 after generating redo when resizing a data file
10098 after the <acronym title="Operating System
">OS</acronym> has increased the size of a data file
10099 after updating the file header with the new file size
10100 after the <acronym title="Operating System
">OS</acronym> has decreased the size of a data file
10101 atomic redo write recovery
10102 switch off anti-joins
10103 <acronym title="Cost based optimer
">CBO</acronym> Disable hash join swapping
10104 dump hash join statistics to trace file
10105 <acronym title="Cost based optimer
">CBO</acronym> Enable constant pred trans and MPs w WHERE-clause
10106 <acronym title="Cost based optimer
">CBO</acronym> Disable evaluating correlation pred last for NOT IN
10107 <acronym title="Cost based optimer
">CBO</acronym> Always use bitmap index
10108 <acronym title="Cost based optimer
">CBO</acronym> Don't use bitmap index
10109 <acronym title="Cost based optimer
">CBO</acronym> Disable move of negated predicates
10110 <acronym title="Cost based optimer
">CBO</acronym> Try index rowid range scans
10111 Bitmap index creation switch
10112 Bitmap index creation switch
10113 Bitmap index creation switch
10114 Bitmap index creation switch
10115 <acronym title="Cost based optimer
">CBO</acronym> Bitmap optimization use maximal expression
10116 <acronym title="Cost based optimer
">CBO</acronym> Bitmap optimization switch
10117 <acronym title="Cost based optimer
">CBO</acronym> Disable new parallel cost model
10118 <acronym title="Cost based optimer
">CBO</acronym> Enable hash join costing
10119 QKA Disable GBY sort elimination
10120 <acronym title="Cost based optimer
">CBO</acronym> Disable index fast full scan
10121 <acronym title="Cost based optimer
">CBO</acronym> Don't sort bitmap chains
10122 <acronym title="Cost based optimer
">CBO</acronym> disable count(col) =&gt; count(*) transformation
10123 QKA Disable Bitmap And-EQuals
10145 test auditing network errors
10146 enable Oracle TRACE collection
10200 block cleanout
10201 consistent read undo application
10202 consistent read block header
10203 consistent read buffer status
10204 signal recursive extend
10205 row cache debugging
10206 transaction table consistent read
10207 consistent read transactions' status report
10208 consistent read loop check
10209 enable simulated error on control file
10210 check data block integrity
10211 check index block integrity
10212 check cluster integrity
10213 crash after control file write
10214 simulate write errors on control file
10215 simulate read errors on control file
10216 dump control file header
10217 debug sequence numbers
10218 dump uba of applied undo
10219 monitor multi-pass row locking
10220 show updates to the transaction table
10221 show changes done with undo
10222 row cache
10223 transaction layer - turn on verification codes
10226 trace CR applications of undo for data operations
10227 verify (multi-piece) row structure
10228 trace application of redo by kcocbk
10230 check redo generation by copying before applying
10231 skip corrupted blocks on _table_scans_
10232 dump corrupted blocks symbolically when kcbgotten
10233 skip corrupted blocks on index operations
10234 trigger event after calling kcrapc to do redo N times
10235 check memory manager internal structures
10236 library cache manager
10237 simulate ^C (for testing purposes)
10238 instantiation manager
10239 multi-instance library cache manager
10240 dump dba's of blocks that we wait for
10241 dump <acronym title="Structured Query Language
">SQL</acronym> generated for remote execution (OPIX)
10243 simulated error for test %s of K2GTAB latch cleanup
10244 make tranids in error msgs print as 0.0.0 (for testing)
10245 simulate lock conflict error for testing PMON
10246 print trace of PMON actions to trace file
10247 Turn on scgcmn tracing. (<acronym title="Virtual Memory System
">VMS</acronym> ONLY)
10248 turn on tracing for dispatchers
10249 turn on tracing for multi-stated servers
10250 Trace all allocate and free calls to the topmost <acronym title="System Global Area
">SGA</acronym> heap
10251 check consistency of transaction table and undo block
10252 simulate write error to data file header
10253 simulate write error to redo log
10254 trace cross-instance calls
10256 turn off multi-threaded server load balancing
10257 trace multi-threaded server load balancing
10258 force shared servers to be chosen round-robin
10259 get error message text from remote using explicit call
10260 Trace calls to SMPRSET (<acronym title="Virtual Memory System
">VMS</acronym> ONLY)
10261 Limit the size of the <acronym title="Process Global Area
">PGA</acronym> heap
10262 Don't check for memory leaks
10263 Don't free empty <acronym title="Process Global Area
">PGA</acronym> heap extents
10264 Collect statistics on context area usage (x$ksmcx)
10265 Keep random system generated output out of error messages
10266 Trace OSD stack usage
10267 Inhibit KSEDMP for testing
10268 Don't do forward coalesce when deleting extents
10269 Don't do coalesces of free space in SMON
10270 Debug shared cursors
10271 distributed transaction after COLLECT
10272 distributed transaction before PREPARE
10273 distributed transaction after PREPARE
10274 distributed transaction before COMMIT
10275 distributed transaction after COMMIT
10276 distributed transaction before FORGET
10277 Cursor sharing (or not) related event (used for testing)
10281 maximum time to wait for process creation
10282 Inhibit signalling of other backgrounds when one dies
10286 Simulate control file open error
10287 Simulate archiver error
10288 Do not check block type in ktrget
10289 Do block dumps to trace file in hex rather than fromatted
10290 kdnchk - checkvalid event - not for general purpose use.
10291 die in dtsdrv to test controlfile undo"
10292 dump uet entries on a 1561 from dtsdrv"
10293 dump debugging information when doing block recovery"
10294 enable PERSISTENT <acronym title="distributed lock manager
">DLM</acronym> operations on non-compliant systems"
10300 disable undo compatibility check at database open
10301 Enable LCK timeout table consistency check"
10320 Enable data layer (kdtgrs) tracing of space management calls"
10352 report direct path statistics
10353 number of slots
10354 turn on direct read path for parallel query
10355 turn on direct read path for scans
10356 turn on hint usage for direct read
10357 turn on debug information for direct path
10374 parallel query server interrupt (validate lock value)
10375 turn on checks for statistics rollups
10376 turn on table queue statistics
10377 turn off load balancing
10379 direct read for rowid range scans (unimplemented)
10380 kxfp latch cleanup testing event
10381 kxfp latch cleanup testing event
10382 parallel query server interrupt (reset)
10383 auto parallelization testing event
10384 parallel dataflow scheduler tracing
10385 parallel table scan range sampling method
10386 parallel <acronym title="Structured Query Language
">SQL</acronym> hash and range statistics
10387 parallel query server interrupt (normal)
10388 parallel query server interrupt (failure)
10389 parallel query server interrupt (cleanup)
10390 Trace parallel query slave execution
10391 trace rowid range partitioning
10392 parallel query debugging bits
10393 print parallel query statistics
10394 allow parallelization of small tables
10395 adjust sample size for range table queues
10396 circumvent range table queues for queries
10397 suppress verbose parallel coordinator error reporting
10398 enable timeouts in parallel query threads
10399 use different internal maximum buffer size
10400 turn on system state dumps for shutdown debugging
10500 turn on traces for SMON
10510 turn off SMON check to offline pending offline rollbacksegment
10511 turn off SMON check to cleanup undo dictionary
10512 turn off SMON check to shrink rollback segments
10600 check cursor frame. allocation
10602 cause an access violation (for testing purposes)
10603 cause an error to occur during truncate (for testing purposes)
10604 trace parallel create index
10605 enable parallel create index by default
10606 trace parallel create index
10607 trace index rowid partition scan
10608 trace create bitmap index
10610 trace create index pseudo optimizer
10666 Do not get database enqueue name
10667 Cause sppst to check for valid process ids
10690 Set shadow process core file dump type (Unix only)
10691 Set background process core file type (Unix only)
10700 Alter access violation exception handler
10701 Dump direct loader index keys
10702 Enable histogram data generation
10703 Simulate process death during enqueue get
10704 Print out information about what enqueues are being obtained
10706 Print out information about instance lock manipulation
10707 Simulate process death for instance registration
10708 Print out Tracing information for skxf multi instance comms
10709 enable parallel instances in create index by default
10710 trace bitmap index access
10711 trace bitmap index merge
10712 trace bitmap index or
10713 trace bitmap index and
10714 trace bitmap index minus
10715 trace bitmap index conversion to rowids
10800 disable Smart Disk scan
10801 enable Smart Disk trace
10802 reserved for Smart Disk
10803 write timing statistics on OPS recovery scan
10804 reserved for ksxb
10805 reserved for row source sort
10900 extent manager fault insertion event #%s
10924 import storage parse error ignore event
10925 trace name context forever
10926 trace name context forever
10927 trace name context forever
10928 trace name context forever
10999 do not get database enqueue name</pre>
</blockquote>
</div>
<p>Related posts:<ol>
<li><a href='http://www.dbalife.com/archives/101.html' rel='bookmark' title='ORACLE STATSPACK REPORT输出结果说明'>ORACLE STATSPACK REPORT输出结果说明</a></li>
<li><a href='http://www.dbalife.com/archives/383.html' rel='bookmark' title='禁用/启用所有外键约束'>禁用/启用所有外键约束</a></li>
<li><a href='http://www.dbalife.com/archives/261.html' rel='bookmark' title='Oracle 10g 手动建库'>Oracle 10g 手动建库</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.dbalife.com/archives/329.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sqlplus增强设置</title>
		<link>http://www.dbalife.com/archives/323.html</link>
		<comments>http://www.dbalife.com/archives/323.html#comments</comments>
		<pubDate>Thu, 24 Sep 2009 04:11:05 +0000</pubDate>
		<dc:creator>skywalker</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[数据库管理]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[prompt]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[sqlplus]]></category>
		<category><![CDATA[vi]]></category>

		<guid isPermaLink="false">http://www.dbalife.com/?p=323</guid>
		<description><![CDATA[更强的编辑器 sqlplus可以与vi整合，在sqlplus中调用vi编辑器。方法是在sqlplus中执行define_editor='vi'，或将define_editor='vi'添加到/product/10.2/sqlplus/admin/glogin.sql文件中。 之后再登录sqlplus，可以输入edit命令编辑上一次执行的sql。 更人性化的提示符 在glogin.sql文件中添加： set termout off default gname=idle column global_name new_value gname SELECT lower(USER) &#124;&#124; '@' &#124;&#124;upper(instance_name)&#124;&#124;'('&#124;&#124;nvl(UTL_INADDR.GET_HOST_ADDRESS, SYS_CONTEXT('userenv', 'ip_address'))&#124;&#124;')' GLOBAL_NAME FROM v$instance; set sqlprompt '&#38;gname&#62; ' set termout on 这样每次登录SQLPLUS提示符会自动更改为“当前用户名@实例名(IP地址)&#62; ”的形式。 10g以下版本在登录后切换用户的情况下，提示符不能自动更新。 No related posts.
No related posts.]]></description>
			<content:encoded><![CDATA[<p><strong>更强的编辑器</strong></p>
<p>sqlplus可以与vi整合，在sqlplus中调用vi编辑器。方法是在sqlplus中执行define_editor='vi'，或将define_editor='vi'添加到/product/10.2/sqlplus/admin/glogin.sql文件中。</p>
<p>之后再登录sqlplus，可以输入edit命令编辑上一次执行的sql。</p>
<p><strong>更人性化的提示符</strong></p>
<p>在glogin.sql文件中添加：</p>
<blockquote><p><span style="COLOR: green">set</span><span style="COLOR: gray"> </span><span style="COLOR: blue">termout</span><span style="COLOR: gray"> </span><span style="COLOR: green">off</span><span style="COLOR: gray"><br />
</span><span style="COLOR: green">default</span><span style="COLOR: gray"> </span><span style="COLOR: blue">gname</span><span style="COLOR: gray">=</span><span style="COLOR: blue">idle</span><span style="COLOR: gray"><br />
</span><span style="COLOR: green">column</span><span style="COLOR: gray"> </span><span style="COLOR: blue">global_name</span><span style="COLOR: gray"> </span><span style="COLOR: blue">new_value</span><span style="COLOR: gray"> </span><span style="COLOR: blue">gname</span><span style="COLOR: gray"><br />
</span><span style="COLOR: green">SELECT</span><span style="COLOR: gray"> </span><span style="COLOR: #00008b">lower</span><span style="COLOR: olive">(</span><span style="COLOR: green">USER</span><span style="COLOR: olive">)</span><span style="COLOR: gray"> || </span><span style="COLOR: #8b0000">'</span><span style="COLOR: red">@</span><span style="COLOR: #8b0000">'</span><span style="COLOR: gray"> ||</span><span style="COLOR: #00008b">upper</span><span style="COLOR: olive">(</span><span style="COLOR: blue">instance_name</span><span style="COLOR: olive">)</span><span style="COLOR: gray">||</span><span style="COLOR: #8b0000">'</span><span style="COLOR: red">(</span><span style="COLOR: #8b0000">'</span><span style="COLOR: gray">||</span><span style="COLOR: blue">nvl</span><span style="COLOR: olive">(</span><span style="COLOR: blue">UTL_INADDR</span><span style="COLOR: gray">.</span><span style="COLOR: blue">GET_HOST_ADDRESS</span><span style="COLOR: gray">, </span><span style="COLOR: blue">SYS_CONTEXT</span><span style="COLOR: olive">(</span><span style="COLOR: #8b0000">'</span><span style="COLOR: red">userenv</span><span style="COLOR: #8b0000">'</span><span style="COLOR: gray">, </span><span style="COLOR: #8b0000">'</span><span style="COLOR: red">ip_address</span><span style="COLOR: #8b0000">'</span><span style="COLOR: olive">))</span><span style="COLOR: gray">||</span><span style="COLOR: #8b0000">'</span><span style="COLOR: red">)</span><span style="COLOR: #8b0000">'</span><span style="COLOR: gray"> </span><span style="COLOR: blue">GLOBAL_NAME</span><span style="COLOR: gray"> </span><span style="COLOR: green">FROM</span><span style="COLOR: gray"> </span><span style="COLOR: blue">v</span><span style="COLOR: gray">$</span><span style="COLOR: #00008b">instance</span><span style="COLOR: gray">;<br />
</span><span style="COLOR: green">set</span><span style="COLOR: gray"> </span><span style="COLOR: blue">sqlprompt</span><span style="COLOR: gray"> </span><span style="COLOR: #8b0000">'</span><span style="COLOR: red">&amp;gname&gt; </span><span style="COLOR: #8b0000">'</span><span style="COLOR: gray"><br />
</span><span style="COLOR: green">set</span><span style="COLOR: gray"> </span><span style="COLOR: blue">termout</span><span style="COLOR: gray"> </span><span style="COLOR: green">on</span></p></blockquote>
<p>这样每次登录SQLPLUS提示符会自动更改为“当前用户名@实例名(IP地址)&gt; ”的形式。</p>
<p>10g以下版本在登录后切换用户的情况下，提示符不能自动更新。</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.dbalife.com/archives/323.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

