<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8883038670969461735</id><updated>2012-02-16T18:26:06.442+08:00</updated><category term='mobile'/><category term='virtualization'/><category term='em'/><category term='sqlldr'/><category term='postgresql'/><category term='support'/><category term='imp'/><category term='installation'/><category term='cluster'/><category term='bug'/><category term='rac'/><category term='etl'/><category term='storage'/><category term='sqlplus'/><category term='ocp'/><category term='sqlnet'/><category term='mysql cluster'/><category term='lifestyle'/><category term='troubleshooting'/><category term='distributed database'/><category term='instant client'/><category term='shell'/><category term='sun'/><category term='performance'/><category term='database link'/><category term='solaris'/><category term='xen'/><category term='linux'/><category term='plsql'/><category term='ora-7445'/><category term='mysql'/><category term='cmt'/><category term='gdb'/><category term='english'/><category term='security'/><category term='ssh'/><category term='internal'/><category term='vnc'/><category term='ntp'/><category term='file system'/><category term='exp'/><category term='bi'/><category term='odi'/><category term='oracle'/><category term='oracle text'/><category term='ora-600'/><category term='ops'/><category term='external table'/><category term='sql'/><category term='netapp'/><category term='1z0-043'/><category term='administration'/><category term='backup and recovery'/><category term='source code'/><category term='mysql proxy'/><category term='network'/><category term='rman'/><category term='architecture'/><category term='replication'/><category term='bugzilla'/><category term='execution plan'/><title type='text'>谢太数据库</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default?start-index=101&amp;max-results=100'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>128</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-78615951857476513</id><published>2011-11-16T07:25:00.001+08:00</published><updated>2011-11-16T09:28:44.678+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ops'/><title type='text'>Linkedin/Glu Deployment Automation Platform</title><content type='html'>Glu自动化部署平台&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is glu?&lt;/b&gt;&lt;br /&gt;glu is a free/open source deployment and monitoring automation platform.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What problems does glu solve?&lt;/b&gt;&lt;br /&gt;glu is solving the following problems:&lt;br /&gt;deploy (and monitor) applications to an arbitrary large set of nodes:&lt;br /&gt;efficiently&lt;br /&gt;with minimum/no human interaction&lt;br /&gt;securely&lt;br /&gt;in a reproducible manner&lt;br /&gt;ensure consistency over time (prevent drifting)&lt;br /&gt;detect and troubleshoot quickly when problems arise&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How does it work?&lt;/b&gt;&lt;br /&gt;glu takes a very declarative approach, in which you describe/model what you want, and glu can then:&lt;br /&gt;compute the set of actions to deploy/upgrade your applications&lt;br /&gt;ensure that it remains consistent over time&lt;br /&gt;detect and alert you when there is a mismatch&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Glu has 3 major components. Agents, Orchestration Engine, and ZooKeeper.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;glu vs puppet&lt;/b&gt;&lt;br /&gt;puppet is very good at configuring the infrastructure of a machine (users, groups, packages, etc...)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;=&gt; static/stable does not change often&lt;/li&gt;&lt;/ul&gt;glu is very good at provisioning dynamic applications on an ensemble of machines (the system)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;=&gt; changes often, real-time failure detection (monitoring), "bounce", etc...&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/linkedin/glu"&gt;glu&lt;/a&gt;&lt;br /&gt;&lt;a href="http://linkedin.github.com/glu/slides/glu-tech-talk-201107.pdf"&gt;Glu Tech Talk 201107&lt;/a&gt;&lt;br /&gt;&lt;a href="http://devops.com/2011/09/19/glu-ing-the-last-mile-by-ken-sipe/"&gt;Glu-ing the Last Mile by Ken Sipe.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://prettyprint.me/2011/01/24/continuous-deployment-at-outbrain/"&gt;Continuous Deployment at outbrain&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pongasoft.com/blog/yan/glu/2011/09/30/future-of-glu-glu-in-the-clouds/"&gt;The future of glu - glu in the cloud&lt;/a&gt;&lt;br /&gt;&lt;a href="http://techblog.outbrain.com/2011/05/monitoring-a-wild-beast/"&gt;Monitoring a Wild Beast&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-78615951857476513?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/78615951857476513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=78615951857476513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/78615951857476513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/78615951857476513'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2011/11/linkedinglu-deployment-automation.html' title='Linkedin/Glu Deployment Automation Platform'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>1号 Zhongguancun East Rd, Haidian, Beijing, China, 100083</georss:featurename><georss:point>39.993602254871945 116.33206129074097</georss:point><georss:box>39.993222254871945 116.33144429074096 39.993982254871945 116.33267829074097</georss:box></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-8421041869631695811</id><published>2011-09-01T14:22:00.000+08:00</published><updated>2011-09-01T14:22:20.533+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>bash merge sort</title><content type='html'>bash merge sort&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;bash归并排序&lt;br /&gt;&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;rest() { shift; echo $@; }&lt;br /&gt;length() { echo $#; }&lt;br /&gt;first() { echo $1; }&lt;br /&gt;merge()&lt;br /&gt;{&lt;br /&gt;  declare left=$1 right=$2 result=&lt;br /&gt;  declare length_left=$(length $left)&lt;br /&gt;  declare length_right=$(length $right)&lt;br /&gt;  while (( length_left&amp;gt;0 || length_right&amp;gt;0 )); do&lt;br /&gt;    if (( length_left&amp;gt;0 &amp;amp;&amp;amp; length_right&amp;gt;0 )); then&lt;br /&gt;      if [ $(first $left) -le $(first $right) ]; then&lt;br /&gt;        result=&amp;quot;$result $(first $left)&amp;quot;&lt;br /&gt;        left=$(rest $left)&lt;br /&gt;      else&lt;br /&gt;        result=&amp;quot;$result $(first $right)&amp;quot;&lt;br /&gt;        right=$(rest $right)&lt;br /&gt;      fi&lt;br /&gt;    elif [ $(length $left) -gt 0 ]; then&lt;br /&gt;      result=&amp;quot;$result $(first $left)&amp;quot;&lt;br /&gt;      left=$(rest $left)&lt;br /&gt;    elif [ $(length $right) -gt 0 ]; then&lt;br /&gt;      result=&amp;quot;$result $(first $right)&amp;quot;&lt;br /&gt;      right=$(rest $right)&lt;br /&gt;    fi&lt;br /&gt;    length_left=$(length $left)&lt;br /&gt;    length_right=$(length $right)&lt;br /&gt;  done&lt;br /&gt;  echo $result&lt;br /&gt;}&lt;br /&gt;merge_sort()&lt;br /&gt;{&lt;br /&gt;  [ $# -le 1 ] &amp;amp;&amp;amp; { echo $@; return; }&lt;br /&gt;  declare -i middle=$(($#/2+1))&lt;br /&gt;  declare left= right= result=&lt;br /&gt;  for ((i=1;i&amp;lt;middle;i++)); do&lt;br /&gt;    left=&amp;quot;$left ${!i}&amp;quot;&lt;br /&gt;  done&lt;br /&gt;  for ((i=middle;i&amp;lt;=$#;i++)); do&lt;br /&gt;    right=&amp;quot;$right ${!i}&amp;quot;&lt;br /&gt;  done&lt;br /&gt;  left=$(merge_sort $left)&lt;br /&gt;  right=$(merge_sort $right)&lt;br /&gt;  result=$(merge &amp;quot;$left&amp;quot; &amp;quot;$right&amp;quot;)&lt;br /&gt;  echo $result&lt;br /&gt;}&lt;br /&gt;merge_sort $@&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;执行：&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;# ./merge_sort.sh $(for in in {1..50}; do echo $((RANDOM%200-100)); done)&lt;br /&gt;-99 -89 -88 -84 -83 -83 -81 -76 -75 -70 -70 -70 -54 -53 -51 -51 -49 -49 -40 -40 -30 -27 -24 -19 -15 -13 -12 -12 -8 -2 -2 -2 2 4 10 17 20 24 28 34 39 39 40 42 45 48 48 49 62 83&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;算法参考：&lt;a href="http://en.wikipedia.org/wiki/Merge_sort"&gt;Merge sort&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-8421041869631695811?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/8421041869631695811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=8421041869631695811' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/8421041869631695811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/8421041869631695811'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2011/09/bash-merge-sort.html' title='bash merge sort'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-6877428538849775014</id><published>2011-08-30T19:30:00.002+08:00</published><updated>2011-09-01T14:22:43.781+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>bash quicksort</title><content type='html'>bash quicksort&lt;br /&gt;&lt;br /&gt;用bash实现快速排序&lt;br /&gt;参考&lt;a href="http://en.wikipedia.org/wiki/Quicksort"&gt;Quicksort&lt;/a&gt;算法实现，如下：&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;function swap()&lt;br /&gt;{&lt;br /&gt;  declare -r _array_name=$1&lt;br /&gt;  declare -r _i1=$2&lt;br /&gt;  declare -r _i2=$3&lt;br /&gt;  eval declare -r _tmp=\${${_array_name}[$_i1]}&lt;br /&gt;  eval ${_array_name}[$_i1]=\${${_array_name}[$_i2]}&lt;br /&gt;  eval ${_array_name}[$_i2]=\$_tmp&lt;br /&gt;}&lt;br /&gt;function partition()&lt;br /&gt;{&lt;br /&gt;  declare -r _array_name=$1&lt;br /&gt;  declare -r _left=$2&lt;br /&gt;  declare -r _right=$3&lt;br /&gt;  declare -r _pivot_index=${4:-$_left}&lt;br /&gt;  eval declare -r _pivot_value=\${${_array_name}[$_pivot_index]}&lt;br /&gt;  swap $_array_name $_pivot_index $_right&lt;br /&gt;  declare _store_index=$_left&lt;br /&gt;  for ((_i=_left; _i&lt;_right; _i++)); do&lt;br /&gt;    eval declare _v=\${${_array_name}[$_i]}&lt;br /&gt;    if (( _v &lt; _pivot_value )); then&lt;br /&gt;      swap $_array_name $_i $_store_index&lt;br /&gt;      ((_store_index++))&lt;br /&gt;    fi&lt;br /&gt;  done&lt;br /&gt;  swap $_array_name $_right $_store_index&lt;br /&gt;  #echo "store_index=$_store_index"&lt;br /&gt;  return $_store_index&lt;br /&gt;}&lt;br /&gt;function quick_sort()&lt;br /&gt;{  &lt;br /&gt;  declare -r _array_name=$1&lt;br /&gt;  declare -r _left=$2&lt;br /&gt;  declare -r _right=$3&lt;br /&gt;  #declare -r _tmpfile=${TMPDIR:-/tmp}/qs_tmpfile.$$&lt;br /&gt;  #((_right-_left&gt;256)) &amp;&amp; { echo "do not support more than 256 elements in array." &gt;&amp;2; return 1; }&lt;br /&gt;  if ((_left&lt;_right)); then&lt;br /&gt;    declare _pivot_index=$_left&lt;br /&gt;    #partition $_array_name $_left $_right $_pivot_index &gt;$_tmpfile&lt;br /&gt;    #declare _pivot_new_index=$(sed -n '/^store_index=/s/.*=//p' $_tmpfile)&lt;br /&gt;    partition $_array_name $_left $_right $_pivot_index&lt;br /&gt;    declare _pivot_new_index=$?&lt;br /&gt;    quick_sort $_array_name $_left $((_pivot_new_index-1))&lt;br /&gt;    quick_sort $_array_name $((_pivot_new_index+1)) $_right&lt;br /&gt;  fi&lt;br /&gt;  #[ -f $_tmpfile ] &amp;&amp; /bin/rm -f $_tmpfile&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;稍微简化一下，改成：&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;function quick_sort2()&lt;br /&gt;{  &lt;br /&gt;  swap()&lt;br /&gt;  {&lt;br /&gt;    eval declare -r _tmp=\${${_array_name}[$1]}&lt;br /&gt;    eval ${_array_name}[$1]=\${${_array_name}[$2]}&lt;br /&gt;    eval ${_array_name}[$2]=\$_tmp&lt;br /&gt;  }&lt;br /&gt;  declare -r _array_name=$1&lt;br /&gt;  declare -r _left=$2&lt;br /&gt;  declare -r _right=$3&lt;br /&gt;  if ((_left&lt;_right)); then&lt;br /&gt;    declare -r _pivot_index=$_left&lt;br /&gt;    #declare -r _pivot_index=$(( ($_right+$_left)/2 ))&lt;br /&gt;    eval declare _pivot_value=\${${_array_name}[$_pivot_index]}&lt;br /&gt;    swap $_pivot_index $_right&lt;br /&gt;    declare _store_index=$_left&lt;br /&gt;    for ((_i=_left; _i&lt;_right; _i++)); do&lt;br /&gt;      eval declare _v=\${${_array_name}[$_i]}&lt;br /&gt;      if (( _v &lt; _pivot_value )); then&lt;br /&gt;        swap $_i $_store_index&lt;br /&gt;        ((_store_index++))&lt;br /&gt;      fi&lt;br /&gt;    done&lt;br /&gt;    swap $_right $_store_index&lt;br /&gt;    quick_sort2 $_array_name $_left $((_store_index-1))&lt;br /&gt;    quick_sort2 $_array_name $((_store_index+1)) $_right&lt;br /&gt;  fi&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;运行结果&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;# declare -a a=($(for in in {1..50}; do echo $((RANDOM%200-100)); done))&lt;br /&gt;# quick_sort2 a 0 $((${#a[@]}-1))&lt;br /&gt;# echo "${a[@]}"&lt;br /&gt;-99 -97 -96 -94 -90 -82 -77 -76 -72 -70 -66 -66 -66 -63 -59 -53 -51 -50 -50 -48 -46 -45 -38 -34 -33 -30 -22 -21 -21 -20 -18 -10 0 2 2 3 9 24 26 26 44 46 47 47 62 66 80 95 99 99&lt;br /&gt;#&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;其实网上有个更简单的办法，&lt;a href="http://blog.johnlawrence.net/2008/10/tweetable-quicksort/"&gt;Tweetable Quicksort by john&lt;/a&gt;，一行脚本就可搞定了。&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;q(){ l=;g=;[ $# -lt 2 ]&amp;&amp;echo $@||(for n in ${@:2};do [ $n -gt $1 ]&amp;&amp;g="$g$n "||l="$l$n ";done;echo `q $l` $1 `q $g`;)}&lt;br /&gt;&lt;/pre&gt;运行&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;# q $(for in in {1..50}; do echo $((RANDOM%200-100)); done)&lt;br /&gt;-100 -96 -92 -91 -80 -75 -71 -66 -54 -52 -44 -43 -40 -33 -32 -29 -28 -23 -20 -12 -12 1 16 22 22 27 27 33 33 35 38 39 41 44 45 48 50 55 58 61 62 66 69 72 83 83 85 94 97 98&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;外部链接：&lt;br /&gt;&lt;a href="http://www.cnblogs.com/figure9/archive/2010/12/10/1902711.html"&gt;一个Quicksort究竟可以写到多么短&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html"&gt;快速排序（Quicksort）的Javascript实现&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mindhacks.cn/2008/06/13/why-is-quicksort-so-quick/"&gt;数学之美番外篇：快排为什么那样快&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;又看到一个SLEEP排序，很有趣&lt;br /&gt;&lt;a href="http://dis.4chan.org/read/prog/1295544154"&gt;Genius sorting algorithm: Sleep sort &lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;function f() {&lt;br /&gt;    sleep "$1"&lt;br /&gt;    echo "$1"&lt;br /&gt;}&lt;br /&gt;while [ -n "$1" ]&lt;br /&gt;do&lt;br /&gt;    f "$1" &amp;&lt;br /&gt;    shift&lt;br /&gt;done&lt;br /&gt;wait&lt;br /&gt;&lt;br /&gt;example usage:&lt;br /&gt;./sleepsort.bash 5 3 6 3 6 3 1 4 7&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-6877428538849775014?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/6877428538849775014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=6877428538849775014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/6877428538849775014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/6877428538849775014'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2011/08/bash-quicksort.html' title='bash quicksort'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-3897913024376295894</id><published>2011-08-17T21:34:00.009+08:00</published><updated>2011-08-18T02:57:14.928+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='gdb'/><title type='text'>Getting MySQL process list with GDB</title><content type='html'>用GDB调试MySQL，显示线程列表&lt;br /&gt;&lt;br /&gt;define helper functions&lt;br /&gt;&lt;pre class="plsql_code"&gt;cat &amp;gt;mysql.gdb &amp;lt;&amp;lt;'EOF'&lt;br /&gt;#set interactive-mode off&lt;br /&gt;set confirm off&lt;br /&gt;dont-repeat&lt;br /&gt;define show_processlist&lt;br /&gt;  #argc is not available in older version gdb&lt;br /&gt;  #if $argc==1&lt;br /&gt;  #  set $p_thread_id=(long long)$arg0&lt;br /&gt;  #else&lt;br /&gt;    set $p_thread_id=(long long)-1&lt;br /&gt;  #end&lt;br /&gt;  set $current=((base_ilist)threads).first&lt;br /&gt;  set $last=&amp;amp;(((base_ilist)threads).last)&lt;br /&gt;  printf "Id\tUser\tHost\tDb\tCommand\tTime\tState\tInfo\n"&lt;br /&gt;  while $current != $last&lt;br /&gt;    set $tmp=(class THD *)$current&lt;br /&gt;    set $tmp_sctx=$tmp-&amp;gt;security_ctx&lt;br /&gt;    if ( $p_thread_id == -1 || $p_thread_id == $tmp-&amp;gt;thread_id )&lt;br /&gt;      set $id=$tmp-&amp;gt;thread_id&lt;br /&gt;      set $user=(char*)($tmp_sctx-&amp;gt;user?$tmp_sctx-&amp;gt;user:($tmp-&amp;gt;system_thread?"system user":"unauthenticated user"))&lt;br /&gt;      set $host=$tmp_sctx-&amp;gt;host_or_ip&lt;br /&gt;      set $db=($tmp-&amp;gt;db)?$tmp-&amp;gt;db:"NULL"&lt;br /&gt;      set $command=(int)($tmp-&amp;gt;command)&lt;br /&gt;      #set $proc_info=(char*)(($tmp-&amp;gt;killed==THD::KILL_CONNECTION)?"Killed":0) #5.1&lt;br /&gt;      set $proc_info=(char*)($tmp-&amp;gt;killed?"Killed":0)&lt;br /&gt;      set $state_info=(char*) ($tmp-&amp;gt;locked ? "Locked" : $tmp-&amp;gt;net.reading_or_writing ? ($tmp-&amp;gt;net.reading_or_writing == 2 ? "Writing to net" : $command == COM_SLEEP ? "" : "Reading from net") : $tmp-&amp;gt;proc_info ? $tmp-&amp;gt;proc_info : ($tmp-&amp;gt;mysys_var &amp;amp;&amp;amp; $tmp-&amp;gt;mysys_var-&amp;gt;current_cond) ? "Waiting on cond" : "NULL")&lt;br /&gt;      set $start_time=$tmp-&amp;gt;start_time&lt;br /&gt;      #set $now=my_time(0) #5.1&lt;br /&gt;      set $now=time((time_t*) 0)&lt;br /&gt;      set $query=(char*)($tmp-&amp;gt;query_string.str?$tmp-&amp;gt;query_string.str:"")&lt;br /&gt;      printf "%u\t%s\t%s\t%s\t%s\t%u\t%s\t%.100s\n",$id,$user,$host,$db,command_name[$command].str,$now-$start_time,$state_info,$query&lt;br /&gt;    end&lt;br /&gt;    set $current=$current-&amp;gt;next&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;document show_processlist&lt;br /&gt;  Prints MySQL process list.&lt;br /&gt;  Syntax: show_processlist [thread id]&lt;br /&gt;  Examples:&lt;br /&gt;    show_processlist&lt;br /&gt;    show_processlist 123&lt;br /&gt;    show_processlist -1&lt;br /&gt;end&lt;br /&gt;define kill_thread&lt;br /&gt;  #if $argc &amp;gt;= 1&lt;br /&gt;    set $p_thread_id=(unsigned long long)$arg0&lt;br /&gt;    #set $p_only_kill_query=(char *)(($argc &amp;gt;= 2)?$arg1:"connection")&lt;br /&gt;    set $p_only_kill_query=(char *)$arg1&lt;br /&gt;    set $only_kill_query=(strcmp($p_only_kill_query,(char *)"query")==0)?1:0&lt;br /&gt;    set $current=((base_ilist)threads).first&lt;br /&gt;    set $last=&amp;amp;(((base_ilist)threads).last)&lt;br /&gt;    while $current != $last&lt;br /&gt;      set $tmp=(class THD *)$current&lt;br /&gt;      if $p_thread_id == $tmp-&amp;gt;thread_id&lt;br /&gt;        set $id=$tmp-&amp;gt;thread_id&lt;br /&gt;        printf "kill thread id %d %s\n", $id, $only_kill_query?"only query":""&lt;br /&gt;        #call kill_one_thread($tmp, $id, $only_kill_query)&lt;br /&gt;        call sql_kill($tmp, $id, $only_kill_query)&lt;br /&gt;        loop_break&lt;br /&gt;      end&lt;br /&gt;      set $current=$current-&amp;gt;next&lt;br /&gt;    end&lt;br /&gt;  #else&lt;br /&gt;  #  help kill_thread&lt;br /&gt;  #end&lt;br /&gt;end&lt;br /&gt;document kill_thread&lt;br /&gt;  Kills MySQL thread.&lt;br /&gt;  Syntax: kill_thread &amp;lt;thread id&amp;gt; &amp;lt;query|connection&amp;gt;&lt;br /&gt;  Examples:&lt;br /&gt;    kill_thread 123&lt;br /&gt;    kill_thread 123 "connection"&lt;br /&gt;    kill_thread 321 "query"&lt;br /&gt;end&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;show processlist&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;span class="fullpost"&gt;mysql_port=8217&lt;br /&gt;# older version gdb does not support '-ex' option&lt;br /&gt;#gdb -batch -silent -p $(pgrep -f "/mysqld .*$mysql_port"|head -n1) -x mysql.gdb -ex 'show_processlist'&lt;br /&gt;gdb -silent -p $(pgrep -f "/mysqld .*$mysql_port"|head -n1) -x mysql.gdb &amp;lt;&amp;lt;'EOF' |\&lt;br /&gt;sed -n '/^=====begin=====$/,/=====end=====/p'|sed '1d;$d'&lt;br /&gt;set prompt&lt;br /&gt;set pagination off&lt;br /&gt;printf "\n\n"&lt;br /&gt;printf "=====begin=====\n"&lt;br /&gt;show_processlist&lt;br /&gt;printf "=====end=====\n"&lt;br /&gt;EOF&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;kill thread&lt;br /&gt;&lt;br /&gt;&lt;pre class="plsql_code"&gt;thread_id=223&lt;br /&gt;gdb -silent -p $(pgrep -f "/mysqld .*$mysql_port"|head -n1) -x mysql.gdb &amp;lt;&amp;lt;EOF&lt;br /&gt;kill_thread $thread_id "connect"&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-3897913024376295894?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/3897913024376295894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=3897913024376295894' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/3897913024376295894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/3897913024376295894'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2011/08/getting-mysql-process-list-with-gdb.html' title='Getting MySQL process list with GDB'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-2685578185052269306</id><published>2011-08-16T01:13:00.000+08:00</published><updated>2011-08-16T01:13:32.529+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='source code'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><title type='text'>MySQL General Query Log</title><content type='html'>MySQL General Query Log&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;==参考文档==&lt;br /&gt;The General Query Log: http://dev.mysql.com/doc/refman/5.1/en/query-log.html&lt;br /&gt;Selecting General Query and Slow Query Log Output Destinations: http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html&lt;br /&gt;mysql-5.1.52.tar.gz mysql-5.1.52.tar.gz&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;==系统变量==&lt;br /&gt;MySQL 5.1.29+&lt;br /&gt;* general_log 普通查询日志开关&lt;br /&gt;* general_log_file 普通查询日志文件名&lt;br /&gt;* log_output 日志输出方式&lt;br /&gt;* sql_log_off 会话级普通查询日志开关&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;==代码分析==&lt;br /&gt;&lt;br /&gt;* 日志相关操作的代码文件是：sql/log.cc和sql/log.h&lt;br /&gt;&lt;br /&gt;* 记录日志函数只有两个：general_log_write和general_log_print&lt;br /&gt;** 两者区别主要是输入的参数不一样，general_log_print是可变参数的，general_log_write参数数量是固定的&lt;br /&gt;&lt;br /&gt;* 函数内判断操作是否需要记录日志。判断依据是：&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;&amp;nbsp; if (*general_log_handler_list &amp;amp;&amp;amp; (what_to_log &amp;amp; (1L &amp;lt;&amp;lt; (uint) command)))&lt;/pre&gt;&lt;br /&gt;what_to_log变量在sql/mysqld.cc初始化为二进制的15个1（COM_TIME等于15）&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;what_to_log= ~ (1L &amp;lt;&amp;lt; (uint) COM_TIME);&lt;/pre&gt;&lt;br /&gt;因此判断条件(what_to_log &amp;amp; (1L &amp;lt;&amp;lt; (uint) command))总是真的，默认所有操作都被记录。好像没有手工设置what_to_log的地方？&lt;br /&gt;&lt;br /&gt;* MySQL其它程序调general_log_write或general_log_print函数写日志，比如当建立连接、退出、查询等操作时。经查看代码，有以下地方记录日志：&lt;br /&gt;** sql/sql_connect.cc&lt;br /&gt;*** check_user(connect和change user都调用此函数)&lt;br /&gt;**** ER_NOT_SUPPORTED_AUTH_MODE和ER_SERVER_IS_IN_SECURE_AUTH_MODE,ER_ACCESS_DENIED_ERROR记录日志：general_log_print COM_CONNECT&lt;br /&gt;**** 认证通过后也记录日志：general_log_print command(COM_CONNECT或COM_CHANGE_USER)&lt;br /&gt;** sql/sql_parse.cc&lt;br /&gt;*** COM_INIT_DB&lt;br /&gt;**** use命令执行成功后记录日志 general_log_write&lt;br /&gt;*** COM_QUERY general_log_write&lt;br /&gt;*** COM_FIELD_LIST general_log_print&lt;br /&gt;*** COM_QUIT general_log_print&lt;br /&gt;*** COM_CREATE_DB general_log_print&lt;br /&gt;*** COM_DROP_DB general_log_write&lt;br /&gt;*** COM_BINLOG_DUMP general_log_print&lt;br /&gt;*** COM_REFRESH general_log_print&lt;br /&gt;*** COM_SHUTDOWN general_log_print&lt;br /&gt;*** COM_STATISTICS general_log_print&lt;br /&gt;*** COM_PROCESS_INFO general_log_print&lt;br /&gt;*** COM_DEBUG general_log_print&lt;br /&gt;** sql/sql_prepare.cc&lt;br /&gt;*** mysqld_stmt_reset general_log_print (COM_STMT_RESET)&lt;br /&gt;*** mysqld_stmt_close general_log_print (COM_STMT_CLOSE)&lt;br /&gt;*** mysql_stmt_get_longdata general_log_print (COM_STMT_SEND_LONG_DATA)&lt;br /&gt;*** Prepared_statement::prepare&lt;br /&gt;**** 存储过程内语句不记录日志 general_log_write COM_STMT_PREPARE&lt;br /&gt;*** Prepared_statement::execute&lt;br /&gt;**** 存储过程内语句不记录日志 general_log_write COM_STMT_EXECUTE&lt;br /&gt;** sql/sp_head.cc&lt;br /&gt;*** sp_instr_stmt::execute&lt;br /&gt;**** general_log_write COM_QUERY&lt;br /&gt;** sql/sql_show.cc&lt;br /&gt;*** mysqld_show_create_db&lt;br /&gt;*** 当权限不够时记录日志 general_log_print COM_INIT_DB&lt;br /&gt;** sql/log_event.cc&lt;br /&gt;*** Query_log_event::do_apply_event&lt;br /&gt;**** If the query was not ignored, it is printed to the general log general_log_write COM_QUERY&lt;br /&gt;*** Xid_log_event::do_apply_event&lt;br /&gt;**** For a slave Xid_log_event is COMMIT general_log_print COM_QUERY&lt;br /&gt;** sql/slave.cc&lt;br /&gt;*** connect_to_master&lt;br /&gt;**** slave重连接master时记录日志 general_log_print COM_CONNECT_OUT&lt;br /&gt;** sql/sql_db.cc&lt;br /&gt;*** mysql_change_db&lt;br /&gt;**** ER_DBACCESS_DENIED_ERROR无权限访问数据库 general_log_print COM_INIT_DB&lt;br /&gt;&lt;br /&gt;* 这两个函数内分别调用了LOGGER::general_log_write和LOGGER::general_log_print方法&lt;br /&gt;* LOGGER::general_log_print又调用了LOGGER::general_log_write&lt;br /&gt;* LOGGER::general_log_write根据log_output变量设置的日志输出方式，可能有多个，再调用当前日志句柄中的log_general方法&lt;br /&gt;&lt;br /&gt;* Log_to_csv_event_handler::log_general&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;==格式==&lt;br /&gt;&lt;br /&gt;===表===&lt;br /&gt;# 当前时间&lt;br /&gt;# 用户名和主机名&lt;br /&gt;## 格式是：priv_user[user] @ host[ip]&lt;br /&gt;# 线程标识&lt;br /&gt;# 命令类型&lt;br /&gt;# 查询语句&lt;br /&gt;&lt;br /&gt;===文件===&lt;br /&gt;# 当前时间&lt;br /&gt;# 线程标识&lt;br /&gt;# 命令类型&lt;br /&gt;# 查询语句&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;==DML操作==&lt;br /&gt;不支持DML操作&lt;br /&gt;&lt;br /&gt;===delete===&lt;br /&gt;不能delete日志表&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;mysql&amp;gt; delete from mysql.general_log;&lt;br /&gt;ERROR 1556 (HY000): You can't use locks with log tables.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;避免报错，可rename表名后再操作&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;SET @old_log_state = @@global.general_log;&lt;br /&gt;SET GLOBAL general_log = 'OFF';&lt;br /&gt;rename table general_log to general_log_tmp;&lt;br /&gt;delete from general_log_tmp;&lt;br /&gt;rename table general_log_tmp to general_log;&lt;br /&gt;SET GLOBAL general_log = @old_log_state;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;====相关代码====&lt;br /&gt;sql/lock.cc&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;int mysql_lock_tables_check(THD *thd, TABLE **tables, uint count, uint flags)&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((t-&amp;gt;reginfo.lock_type &amp;gt;= TL_READ_NO_INSERT)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || (thd-&amp;gt;lex-&amp;gt;sql_command == SQLCOM_LOCK_TABLES))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_error(ER_CANT_LOCK_LOG_TABLE, MYF(0));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBUG_RETURN(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;==DDL操作==&lt;br /&gt;一些DDL操作不被支持&lt;br /&gt;&lt;br /&gt;===drop===&lt;br /&gt;不支持在线drop操作&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;mysql&amp;gt; drop table mysql.general_log;&lt;br /&gt;ERROR 1580 (HY000): You cannot 'DROP' a log table if logging is enabled&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;====相关代码====&lt;br /&gt;sql/sql_table.cc&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,&lt;br /&gt;...&lt;br /&gt;&amp;nbsp; /* Disable drop of enabled log tables, must be done before name locking */&lt;br /&gt;&amp;nbsp; for (table= tables; table; table= table-&amp;gt;next_local)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (check_if_log_table(table-&amp;gt;db_length, table-&amp;gt;db,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; table-&amp;gt;table_name_length, table-&amp;gt;table_name, 1))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_error(ER_BAD_LOG_STATEMENT, MYF(0), "DROP");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pthread_mutex_unlock(&amp;amp;LOCK_open);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBUG_RETURN(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;===truncate===&lt;br /&gt;支持在线truncate&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;==存储引擎==&lt;br /&gt;默认用CSV存储引擎。只支持CSV或MyISAM&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;mysql&amp;gt; set global general_log=0;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; alter table mysql.general_log engine=innodb;&lt;br /&gt;ERROR 1579 (HY000): This storage engine cannot be used for log tables"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;修改为Innodb存储引擎：&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;SET @old_log_state = @@global.general_log;&lt;br /&gt;SET GLOBAL general_log = 'OFF';&lt;br /&gt;use mysql&lt;br /&gt;drop table if exists general_log_new;&lt;br /&gt;create table general_log_new like general_log;&lt;br /&gt;alter table general_log_new engine=innodb;&lt;br /&gt;rename table general_log to general_log_old, general_log_new to general_log;&lt;br /&gt;show create table general_log\G&lt;br /&gt;SET GLOBAL general_log = @old_log_state;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;====相关代码====&lt;br /&gt;sql/sql_table.cc&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;bool mysql_alter_table(THD *thd,char *new_db, char *new_name,&lt;br /&gt;...&lt;br /&gt;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Check if we attempt to alter mysql.slow_log or&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mysql.general_log table and return an error if&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; it is the case.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TODO: this design is obsolete and will be removed.&lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; if (table_list &amp;amp;&amp;amp; table_list-&amp;gt;db &amp;amp;&amp;amp; table_list-&amp;gt;table_name)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int table_kind= 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; table_kind= check_if_log_table(table_list-&amp;gt;db_length, table_list-&amp;gt;db,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; table_list-&amp;gt;table_name_length,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; table_list-&amp;gt;table_name, 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (table_kind)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Disable alter of enabled log tables */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (logger.is_log_table_enabled(table_kind))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_error(ER_BAD_LOG_STATEMENT, MYF(0), "ALTER");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBUG_RETURN(TRUE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Disable alter of log tables to unsupported engine */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((create_info-&amp;gt;used_fields &amp;amp; HA_CREATE_USED_ENGINE) &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (!create_info-&amp;gt;db_type || /* unknown engine */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !(create_info-&amp;gt;db_type-&amp;gt;flags &amp;amp; HTON_SUPPORT_LOG_TABLES)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_error(ER_UNSUPORTED_LOG_ENGINE, MYF(0));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBUG_RETURN(TRUE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;#ifdef WITH_PARTITION_STORAGE_ENGINE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (alter_info-&amp;gt;flags &amp;amp; ALTER_PARTITION)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_error(ER_WRONG_USAGE, MYF(0), "PARTITION", "log table");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBUG_RETURN(TRUE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;#endif&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;HTON_SUPPORT_LOG_TABLES 表示该存储引擎是否支持日志表&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;$ grep -r HTON_SUPPORT_LOG_TABLES *&lt;br /&gt;sql/sql_table.cc:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !(create_info-&amp;gt;db_type-&amp;gt;flags &amp;amp; HTON_SUPPORT_LOG_TABLES)))&lt;br /&gt;sql/handler.h:#define HTON_SUPPORT_LOG_TABLES&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1 &amp;lt;&amp;lt; 7) //Engine supports log tables&lt;br /&gt;storage/myisam/ha_myisam.cc:&amp;nbsp; myisam_hton-&amp;gt;flags= HTON_CAN_RECREATE | HTON_SUPPORT_LOG_TABLES;&lt;br /&gt;storage/csv/ha_tina.cc:&amp;nbsp; tina_hton-&amp;gt;flags= (HTON_CAN_RECREATE | HTON_SUPPORT_LOG_TABLES |&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-2685578185052269306?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/2685578185052269306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=2685578185052269306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2685578185052269306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2685578185052269306'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2011/08/mysql-general-query-log.html' title='MySQL General Query Log'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-1676658540493148806</id><published>2011-08-16T01:08:00.000+08:00</published><updated>2011-08-16T01:13:19.084+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='source code'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql proxy'/><title type='text'>MySQL Proxy RW Splitting</title><content type='html'>MySQL Proxy RW Splitting&lt;br /&gt;&lt;br /&gt;=rw-splitting.lua=&lt;br /&gt;&lt;br /&gt;==说明==&lt;br /&gt;* MySQL Proxy 0.8.1版本的读写分离脚本&lt;br /&gt;* 下载地址&lt;br /&gt;mysql-proxy-0.8.1-linux-glibc2.3-x86-64bit.tar.gz&lt;br /&gt;* 参考文档&lt;br /&gt;** 读写分离脚本说明&lt;br /&gt;MySQL Proxy RW Splitting: http://forge.mysql.com/wiki/MySQL_Proxy_RW_Splitting&lt;br /&gt;MySQL Proxy learns R/W Splitting: http://jan.kneschke.de/projects/mysql/mysql-proxy-learns-r-w-splitting&lt;br /&gt;MySQL Proxy: more R/W splitting: http://jan.kneschke.de/projects/mysql/mysql-proxy-more-r-w-splitting/&lt;br /&gt;** Lua开发&lt;br /&gt;Lua 5.1 Reference Manual: http://www.lua.org/manual/5.1/manual.html&lt;br /&gt;Programming in Lua (first edition): http://www.lua.org/pil/&lt;br /&gt;** MySQL Proxy脚本开发&lt;br /&gt;MySQL Proxy Scripting: http://dev.mysql.com/doc/refman/5.5/en/mysql-proxy-scripting.html&lt;br /&gt;MySQL Proxy Snippet: http://forge.mysql.com/tools/search.php?t=tag&amp;amp;k=mysqlproxy&lt;br /&gt;MySQL Proxy Dev: http://forge.mysql.com/wiki/MySQL_Proxy_Dev&lt;br /&gt;Advanced LUA Scripting: http://forge.mysql.com/wiki/Advanced_LUA_Scripting&lt;br /&gt;ProxyCookbook: http://forge.mysql.com/wiki/ProxyCookbook&lt;br /&gt;http://blog.suncrescent.net/2008/05/partial-mysql-proxy-api-doc/&lt;br /&gt;&lt;br /&gt;==代码==&lt;br /&gt;===1-20行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;&amp;nbsp; 1 --[[ $%BEGINLICENSE%$&lt;br /&gt;&amp;nbsp; 2&amp;nbsp; Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved.&lt;br /&gt;&amp;nbsp; 3&lt;br /&gt;&amp;nbsp; 4&amp;nbsp; This program is free software; you can redistribute it and/or&lt;br /&gt;&amp;nbsp; 5&amp;nbsp; modify it under the terms of the GNU General Public License as&lt;br /&gt;&amp;nbsp; 6&amp;nbsp; published by the Free Software Foundation; version 2 of the&lt;br /&gt;&amp;nbsp; 7&amp;nbsp; License.&lt;br /&gt;&amp;nbsp; 8&lt;br /&gt;&amp;nbsp; 9&amp;nbsp; This program is distributed in the hope that it will be useful,&lt;br /&gt;&amp;nbsp;10&amp;nbsp; but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;&amp;nbsp;11&amp;nbsp; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;br /&gt;&amp;nbsp;12&amp;nbsp; GNU General Public License for more details.&lt;br /&gt;&amp;nbsp;13&lt;br /&gt;&amp;nbsp;14&amp;nbsp; You should have received a copy of the GNU General Public License&lt;br /&gt;&amp;nbsp;15&amp;nbsp; along with this program; if not, write to the Free Software&lt;br /&gt;&amp;nbsp;16&amp;nbsp; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA&lt;br /&gt;&amp;nbsp;17&amp;nbsp; 02110-1301&amp;nbsp; USA&lt;br /&gt;&amp;nbsp;18&lt;br /&gt;&amp;nbsp;19&amp;nbsp; $%ENDLICENSE%$ --]]&lt;br /&gt;&amp;nbsp;20&lt;/pre&gt;&lt;br /&gt;* 声明版权信息&lt;br /&gt;* lua脚本中 "--\[\[" 和 "--\]\]" 之间表示多行注释块&lt;br /&gt;&lt;br /&gt;===21-29行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;&amp;nbsp;21 ---&lt;br /&gt;&amp;nbsp;22 -- a flexible statement based load balancer with connection pooling&lt;br /&gt;&amp;nbsp;23 --&lt;br /&gt;&amp;nbsp;24 -- * build a connection pool of min_idle_connections for each backend and maintain&lt;br /&gt;&amp;nbsp;25 --&amp;nbsp;&amp;nbsp; its size&lt;br /&gt;&amp;nbsp;26 -- *&lt;br /&gt;&amp;nbsp;27 --&lt;br /&gt;&amp;nbsp;28 --&lt;br /&gt;&amp;nbsp;29&lt;/pre&gt;&lt;br /&gt;* 脚本说明&lt;br /&gt;* lua脚本中 "--" 之后表示单行注释信息&lt;br /&gt;&lt;br /&gt;===30-34行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;&amp;nbsp;30 local commands&amp;nbsp;&amp;nbsp;&amp;nbsp; = require("proxy.commands")&lt;br /&gt;&amp;nbsp;31 local tokenizer&amp;nbsp;&amp;nbsp; = require("proxy.tokenizer")&lt;br /&gt;&amp;nbsp;32 local lb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = require("proxy.balance")&lt;br /&gt;&amp;nbsp;33 local auto_config = require("proxy.auto-config")&lt;br /&gt;&amp;nbsp;34&lt;/pre&gt;&lt;br /&gt;* require加载MySQL Proxy模块&lt;br /&gt;* 模块文件所在缺省目录是$LUA_HOME/lib/mysql-proxy/lua/proxy/&lt;br /&gt;* 各模块说明如下：&lt;br /&gt;** commands.lua：解析网络包中的MySQL命令&lt;br /&gt;*** 参考 http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Command_Packet_.28Overview.29&lt;br /&gt;** tokenizer.lua：加载模块mysql.tokenizer；格式化SQL语句。没看懂&lt;br /&gt;** balance.lua：负载均衡&lt;br /&gt;*** function idle_failsafe_rw：获取一个空闲的可读写的连接（可读写的主库或备库）&lt;br /&gt;*** function idle_ro：获取一个空闲的只读的连接（只读备库）&lt;br /&gt;** auto-config.lua：加载模块lpeg，即"Parsing Expression Grammars For Lua"；管理配置参数&lt;br /&gt;*** 语法&lt;br /&gt;**** proxy show config 显示配置&lt;br /&gt;**** proxy set global xxx.yyy=zzz 设置配置&lt;br /&gt;**** proxy save config into "xxx" 保存配置&lt;br /&gt;**** proxy load config from "xxx" 加载配置&lt;br /&gt;*** 参考&lt;br /&gt;**** http://www.inf.puc-rio.br/~roberto/lpeg/&lt;br /&gt;**** http://www.gammon.com.au/scripts/doc.php?general=lua_lpeg&lt;br /&gt;*** 问题&lt;br /&gt;**** [[#proxy set global 报错 ERROR 1064 (42000): You have an error in your SQL syntax]]&lt;br /&gt;**** [[#proxy set global 报错 ERROR 1105 (07000): (lua) proxy.response.errmsg is nil]]&lt;br /&gt;**** [[#proxy save config 保存配置文件大小等于0]]&lt;br /&gt;**** [[#proxy save config 保存配置文件名带双引号]]&lt;br /&gt;&lt;br /&gt;===35-46行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;&amp;nbsp;35 --- config&lt;br /&gt;&amp;nbsp;36 --&lt;br /&gt;&amp;nbsp;37 -- connection pool&lt;br /&gt;&amp;nbsp;38 if not proxy.global.config.rwsplit then&lt;br /&gt;&amp;nbsp;39&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.global.config.rwsplit = {&lt;br /&gt;&amp;nbsp;40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; min_idle_connections = 4,&lt;br /&gt;&amp;nbsp;41&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; max_idle_connections = 8,&lt;br /&gt;&amp;nbsp;42&lt;br /&gt;&amp;nbsp;43&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; is_debug = false&lt;br /&gt;&amp;nbsp;44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;45 end&lt;br /&gt;&amp;nbsp;46&lt;/pre&gt;&lt;br /&gt;* 设置读写分离的缺省配置参数&lt;br /&gt;&lt;br /&gt;===47-55行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;&amp;nbsp;47 ---&lt;br /&gt;&amp;nbsp;48 -- read/write splitting sends all non-transactional SELECTs to the slaves&lt;br /&gt;&amp;nbsp;49 --&lt;br /&gt;&amp;nbsp;50 -- is_in_transaction tracks the state of the transactions&lt;br /&gt;&amp;nbsp;51 local is_in_transaction&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = false&lt;br /&gt;&amp;nbsp;52&lt;br /&gt;&amp;nbsp;53 -- if this was a SELECT SQL_CALC_FOUND_ROWS ... stay on the same connections&lt;br /&gt;&amp;nbsp;54 local is_in_select_calc_found_rows = false&lt;br /&gt;&amp;nbsp;55&lt;/pre&gt;&lt;br /&gt;* 初始化变量&lt;br /&gt;* is_in_transaction：false表示转发查询语句到只读连接上&lt;br /&gt;* is_in_select_calc_found_rows：表示查询语句中是否有"SQL_CALC_FOUND_ROWS"&lt;br /&gt;&lt;br /&gt;===56-72行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;&amp;nbsp;56 ---&lt;br /&gt;&amp;nbsp;57 -- get a connection to a backend&lt;br /&gt;&amp;nbsp;58 --&lt;br /&gt;&amp;nbsp;59 -- as long as we don't have enough connections in the pool, create new connections&lt;br /&gt;&amp;nbsp;60 --&lt;br /&gt;&amp;nbsp;61 function connect_server()&lt;br /&gt;&amp;nbsp;62&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local is_debug = proxy.global.config.rwsplit.is_debug&lt;br /&gt;&amp;nbsp;63&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- make sure that we connect to each backend at least ones to&lt;br /&gt;&amp;nbsp;64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- keep the connections to the servers alive&lt;br /&gt;&amp;nbsp;65&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&lt;br /&gt;&amp;nbsp;66&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- on read_query we can switch the backends again to another backend&lt;br /&gt;&amp;nbsp;67&lt;br /&gt;&amp;nbsp;68&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if is_debug then&lt;br /&gt;&amp;nbsp;69&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print()&lt;br /&gt;&amp;nbsp;70&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("[connect_server] " .. proxy.connection.client.src.name)&lt;br /&gt;&amp;nbsp;71&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&amp;nbsp;72&lt;/pre&gt;&lt;br /&gt;* 函数connect_server说明： 获取一个到后端的连接&lt;br /&gt;* 初始化is_debug变量&lt;br /&gt;&lt;br /&gt;===75-121行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;&amp;nbsp;73&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local rw_ndx = 0&lt;br /&gt;&amp;nbsp;74&lt;br /&gt;&amp;nbsp;75&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- init all backends&lt;br /&gt;&amp;nbsp;76&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i = 1, #proxy.global.backends do&lt;br /&gt;&amp;nbsp;77&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = proxy.global.backends[i]&lt;br /&gt;&amp;nbsp;78&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local pool&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = s.pool -- we don't have a username yet, try to find a connections which is idling&lt;br /&gt;&amp;nbsp;79&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local cur_idle = pool.users[""].cur_idle_connections&lt;br /&gt;&amp;nbsp;80&lt;br /&gt;&amp;nbsp;81&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pool.min_idle_connections = proxy.global.config.rwsplit.min_idle_connections&lt;br /&gt;&amp;nbsp;82&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pool.max_idle_connections = proxy.global.config.rwsplit.max_idle_connections&lt;br /&gt;&amp;nbsp;83&lt;br /&gt;&amp;nbsp;84&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if is_debug then&lt;br /&gt;&amp;nbsp;85&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; [".. i .."].connected_clients = " .. s.connected_clients)&lt;br /&gt;&amp;nbsp;86&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; [".. i .."].pool.cur_idle&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = " .. cur_idle)&lt;br /&gt;&amp;nbsp;87&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; [".. i .."].pool.max_idle&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = " .. pool.max_idle_connections)&lt;br /&gt;&amp;nbsp;88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; [".. i .."].pool.min_idle&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = " .. pool.min_idle_connections)&lt;br /&gt;&amp;nbsp;89&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; [".. i .."].type = " .. s.type)&lt;br /&gt;&amp;nbsp;90&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; [".. i .."].state = " .. s.state)&lt;br /&gt;&amp;nbsp;91&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&amp;nbsp;92&lt;br /&gt;&amp;nbsp;93&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- prefer connections to the master&lt;br /&gt;&amp;nbsp;94&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if s.type == proxy.BACKEND_TYPE_RW and&lt;br /&gt;&amp;nbsp;95&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.state ~= proxy.BACKEND_STATE_DOWN and&lt;br /&gt;&amp;nbsp;96&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cur_idle &amp;lt; pool.min_idle_connections then&lt;br /&gt;&amp;nbsp;97&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.connection.backend_ndx = i&lt;br /&gt;&amp;nbsp;98&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;&amp;nbsp;99&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif s.type == proxy.BACKEND_TYPE_RO and&lt;br /&gt;100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.state ~= proxy.BACKEND_STATE_DOWN and&lt;br /&gt;101&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cur_idle &amp;lt; pool.min_idle_connections then&lt;br /&gt;102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.connection.backend_ndx = i&lt;br /&gt;103&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;104&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif s.type == proxy.BACKEND_TYPE_RW and&lt;br /&gt;105&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.state ~= proxy.BACKEND_STATE_DOWN and&lt;br /&gt;106&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rw_ndx == 0 then&lt;br /&gt;107&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rw_ndx = i&lt;br /&gt;108&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;109&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;110&lt;br /&gt;111&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if proxy.connection.backend_ndx == 0 then&lt;br /&gt;112&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if is_debug then&lt;br /&gt;113&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; [" .. rw_ndx .. "] taking master as default")&lt;br /&gt;114&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;115&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.connection.backend_ndx = rw_ndx&lt;br /&gt;116&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;117&lt;br /&gt;118&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- pick a random backend&lt;br /&gt;119&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&lt;br /&gt;120&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- we someone have to skip DOWN backends&lt;br /&gt;121&lt;/pre&gt;&lt;br /&gt;* 创建一个新的或分配一个已有的MySQL Proxy到MySQL Server后端的连接&lt;br /&gt;* 按backends顺序和下列次序选择：&lt;br /&gt;** 优先选取一个可读写的后端，直到该后端空闲连接数达到最小空闲连接数&lt;br /&gt;** 其次选取一个只读的后端，直到该后端空闲连接数达到最小空闲连接数&lt;br /&gt;** 最后选取第一个可读写的后端&lt;br /&gt;* backends顺序是：先rw后ro；命令行配置中出现的先后顺序&lt;br /&gt;* 问题：分配算法和实际测试结果有差异，原因不明。比如min_idle_connections设置是1，但可以建min_idle_connections+1=2个连接&lt;br /&gt;* connected_clients总是0，原因不明，此变量需要脚本自行赋值维护？&lt;br /&gt;* 当客户端连接数小于min_idle_connections+1时，调试信息中cur_idle_connections总显示为0。超过min_idle_connections+1后才显示出数值，不会新建连接，等于min_idle_connections+1&lt;br /&gt;&lt;br /&gt;===122-139行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;122&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- ok, did we got a backend ?&lt;br /&gt;123&lt;br /&gt;124&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if proxy.connection.server then&lt;br /&gt;125&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if is_debug then&lt;br /&gt;126&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; using pooled connection from: " .. proxy.connection.backend_ndx)&lt;br /&gt;127&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;128&lt;br /&gt;129&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- stay with it&lt;br /&gt;130&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return proxy.PROXY_IGNORE_RESULT&lt;br /&gt;131&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;132&lt;br /&gt;133&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if is_debug then&lt;br /&gt;134&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; [" .. proxy.connection.backend_ndx .. "] idle-conns below min-idle")&lt;br /&gt;135&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;136&lt;br /&gt;137&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- open a new connection&lt;br /&gt;138 end&lt;br /&gt;139&lt;/pre&gt;&lt;br /&gt;* 没看懂。估计是，如果已建立了连接池，则返回PROXY_IGNORE_RESULT，表示忽略接下来服务器发回的handshake，这样就不会建立起新连接&lt;br /&gt;* 函数connect_server结束&lt;br /&gt;&lt;br /&gt;===140-164行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;140 ---&lt;br /&gt;141 -- put the successfully authed connection into the connection pool&lt;br /&gt;142 --&lt;br /&gt;143 -- @param auth the context information for the auth&lt;br /&gt;144 --&lt;br /&gt;145 -- auth.packet is the packet&lt;br /&gt;146 function read_auth_result( auth )&lt;br /&gt;147&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if is_debug then&lt;br /&gt;148&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("[read_auth_result] " .. proxy.connection.client.src.name)&lt;br /&gt;149&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;150&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if auth.packet:byte() == proxy.MYSQLD_PACKET_OK then&lt;br /&gt;151&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- auth was fine, disconnect from the server&lt;br /&gt;152&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.connection.backend_ndx = 0&lt;br /&gt;153&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif auth.packet:byte() == proxy.MYSQLD_PACKET_EOF then&lt;br /&gt;154&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- we received either a&lt;br /&gt;155&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&lt;br /&gt;156&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- * MYSQLD_PACKET_ERR and the auth failed or&lt;br /&gt;157&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- * MYSQLD_PACKET_EOF which means a OLD PASSWORD (4.0) was sent&lt;br /&gt;158&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("(read_auth_result) ... not ok yet");&lt;br /&gt;159&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif auth.packet:byte() == proxy.MYSQLD_PACKET_ERR then&lt;br /&gt;160&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- auth failed&lt;br /&gt;161&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;162 end&lt;br /&gt;163&lt;br /&gt;164&lt;/pre&gt;&lt;br /&gt;* 参考&lt;br /&gt;** http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol&lt;br /&gt;* 问题&lt;br /&gt;** [[#read_auth_result没有显示调试信息]]&lt;br /&gt;&lt;br /&gt;===165-171行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;165 ---&lt;br /&gt;166 -- read/write splitting&lt;br /&gt;167 function read_query( packet )&lt;br /&gt;168&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local is_debug = proxy.global.config.rwsplit.is_debug&lt;br /&gt;169&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local cmd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = commands.parse(packet)&lt;br /&gt;170&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = proxy.connection.client&lt;br /&gt;171&lt;/pre&gt;&lt;br /&gt;* read_query函数&lt;br /&gt;* 解析网络包、语句&lt;br /&gt;&lt;br /&gt;===172-174行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;172&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local r = auto_config.handle(cmd)&lt;br /&gt;173&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if r then return r end&lt;br /&gt;174&lt;/pre&gt;&lt;br /&gt;* 处理PROXY命令(show,set,save,load)，返回PROXY_SEND_RESULT和结果&lt;br /&gt;&lt;br /&gt;===175-188行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;175&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local tokens&lt;br /&gt;176&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local norm_query&lt;br /&gt;177&lt;br /&gt;178&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- looks like we have to forward this statement to a backend&lt;br /&gt;179&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if is_debug then&lt;br /&gt;180&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("[read_query] " .. proxy.connection.client.src.name)&lt;br /&gt;181&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; current backend&amp;nbsp;&amp;nbsp; = " .. proxy.connection.backend_ndx)&lt;br /&gt;182&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; client default db = " .. c.default_db)&lt;br /&gt;183&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; client username&amp;nbsp;&amp;nbsp; = " .. c.username)&lt;br /&gt;184&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if cmd.type == proxy.COM_QUERY then&lt;br /&gt;185&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; query&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .. cmd.query)&lt;br /&gt;186&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;187&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;188&lt;/pre&gt;&lt;br /&gt;* 声明本地变量&lt;br /&gt;* 显示调试信息&lt;br /&gt;&lt;br /&gt;===189-204行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;189&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if cmd.type == proxy.COM_QUIT then&lt;br /&gt;190&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- don't send COM_QUIT to the backend. We manage the connection&lt;br /&gt;191&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- in all aspects.&lt;br /&gt;192&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.response = {&lt;br /&gt;193&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type = proxy.MYSQLD_PACKET_OK,&lt;br /&gt;194&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;195&lt;br /&gt;196&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if is_debug then&lt;br /&gt;197&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; (QUIT) current backend&amp;nbsp;&amp;nbsp; = " .. proxy.connection.backend_ndx)&lt;br /&gt;198&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;199&lt;br /&gt;200&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return proxy.PROXY_SEND_RESULT&lt;br /&gt;201&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;202&lt;br /&gt;203&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.queries:append(1, packet, { resultset_is_needed = true })&lt;br /&gt;204&lt;/pre&gt;&lt;br /&gt;* 截取QUIT命令，不发送到后端服务器&lt;br /&gt;* 构造查询队列。命令放入查询队列&lt;br /&gt;&lt;br /&gt;===205-255行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;205&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- read/write splitting&lt;br /&gt;206&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&lt;br /&gt;207&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- send all non-transactional SELECTs to a slave&lt;br /&gt;208&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not is_in_transaction and&lt;br /&gt;209&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.type == proxy.COM_QUERY then&lt;br /&gt;210&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tokens&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = tokens or assert(tokenizer.tokenize(cmd.query))&lt;br /&gt;211&lt;br /&gt;212&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local stmt = tokenizer.first_stmt_token(tokens)&lt;br /&gt;213&lt;br /&gt;214&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if stmt.token_name == "TK_SQL_SELECT" then&lt;br /&gt;215&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; is_in_select_calc_found_rows = false&lt;br /&gt;216&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local is_insert_id = false&lt;br /&gt;217&lt;br /&gt;218&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i = 1, #tokens do&lt;br /&gt;219&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local token = tokens[i]&lt;br /&gt;220&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- SQL_CALC_FOUND_ROWS + FOUND_ROWS() have to be executed&lt;br /&gt;221&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- on the same connection&lt;br /&gt;222&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- print("token: " .. token.token_name)&lt;br /&gt;223&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- print("&amp;nbsp; val: " .. token.text)&lt;br /&gt;224&lt;br /&gt;225&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not is_in_select_calc_found_rows and token.token_name == "TK_SQL_SQL_CALC_FOUND_ROWS" then&lt;br /&gt;226&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; is_in_select_calc_found_rows = true&lt;br /&gt;227&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif not is_insert_id and token.token_name == "TK_LITERAL" then&lt;br /&gt;228&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local utext = token.text:upper()&lt;br /&gt;229&lt;br /&gt;230&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if utext == "LAST_INSERT_ID" or&lt;br /&gt;231&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utext == "@@INSERT_ID" then&lt;br /&gt;232&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; is_insert_id = true&lt;br /&gt;233&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;234&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;235&lt;br /&gt;236&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- we found the two special token, we can't find more&lt;br /&gt;237&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if is_insert_id and is_in_select_calc_found_rows then&lt;br /&gt;238&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;239&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;240&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;241&lt;br /&gt;242&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- if we ask for the last-insert-id we have to ask it on the original&lt;br /&gt;243&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- connection&lt;br /&gt;244&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not is_insert_id then&lt;br /&gt;245&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local backend_ndx = lb.idle_ro()&lt;br /&gt;246&lt;br /&gt;247&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if backend_ndx &amp;gt; 0 then&lt;br /&gt;248&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.connection.backend_ndx = backend_ndx&lt;br /&gt;249&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;250&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;251&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp; found a SELECT LAST_INSERT_ID(), staying on the same backend")&lt;br /&gt;252&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;253&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;254&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;255&lt;/pre&gt;&lt;br /&gt;* 没看懂&lt;br /&gt;** 查看查询语句中是否含有SQL_CALC_FOUND_ROWS或LAST_INSERT_ID&lt;br /&gt;** 如果没有LAST_INSERT_ID，则选一个空闲的只读后端，否则后端不变&lt;br /&gt;&lt;br /&gt;===256-272行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;256&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- no backend selected yet, pick a master&lt;br /&gt;257&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if proxy.connection.backend_ndx == 0 then&lt;br /&gt;258&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- we don't have a backend right now&lt;br /&gt;259&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&lt;br /&gt;260&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- let's pick a master as a good default&lt;br /&gt;261&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&lt;br /&gt;262&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.connection.backend_ndx = lb.idle_failsafe_rw()&lt;br /&gt;263&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;264&lt;br /&gt;265&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- by now we should have a backend&lt;br /&gt;266&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&lt;br /&gt;267&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- in case the master is down, we have to close the client connections&lt;br /&gt;268&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- otherwise we can go on&lt;br /&gt;269&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if proxy.connection.backend_ndx == 0 then&lt;br /&gt;270&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return proxy.PROXY_SEND_QUERY&lt;br /&gt;271&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;272&lt;/pre&gt;&lt;br /&gt;* 其它非查询语句，选择一个可读写后端&lt;br /&gt;* 如无可选后端，不做后续操作，直接跳出函数&lt;br /&gt;&lt;br /&gt;===273-302行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;273&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local s = proxy.connection.server&lt;br /&gt;274&lt;br /&gt;275&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- if client and server db don't match, adjust the server-side&lt;br /&gt;276&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&lt;br /&gt;277&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- skip it if we send a INIT_DB anyway&lt;br /&gt;278&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if cmd.type ~= proxy.COM_INIT_DB and&lt;br /&gt;279&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.default_db and c.default_db ~= s.default_db then&lt;br /&gt;280&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; server default db: " .. s.default_db)&lt;br /&gt;281&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; client default db: " .. c.default_db)&lt;br /&gt;282&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; syncronizing")&lt;br /&gt;283&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.queries:prepend(2, string.char(proxy.COM_INIT_DB) .. c.default_db, { resultset_is_needed = true })&lt;br /&gt;284&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;285&lt;br /&gt;286&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- send to master&lt;br /&gt;287&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if is_debug then&lt;br /&gt;288&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if proxy.connection.backend_ndx &amp;gt; 0 then&lt;br /&gt;289&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local b = proxy.global.backends[proxy.connection.backend_ndx]&lt;br /&gt;290&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp; sending to backend : " .. b.dst.name);&lt;br /&gt;291&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; is_slave&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : " .. tostring(b.type == proxy.BACKEND_TYPE_RO));&lt;br /&gt;292&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; server default db: " .. s.default_db)&lt;br /&gt;293&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; server username&amp;nbsp; : " .. s.username)&lt;br /&gt;294&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;295&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; in_trans&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : " .. tostring(is_in_transaction))&lt;br /&gt;296&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; in_calc_found&amp;nbsp;&amp;nbsp; : " .. tostring(is_in_select_calc_found_rows))&lt;br /&gt;297&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; COM_QUERY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : " .. tostring(cmd.type == proxy.COM_QUERY))&lt;br /&gt;298&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;299&lt;br /&gt;300&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return proxy.PROXY_SEND_QUERY&lt;br /&gt;301 end&lt;br /&gt;302&lt;/pre&gt;&lt;br /&gt;* 保证后端数据库和客户端数据库一致&lt;br /&gt;* 显示调试信息&lt;br /&gt;&lt;br /&gt;===303-332行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;303 ---&lt;br /&gt;304 -- as long as we are in a transaction keep the connection&lt;br /&gt;305 -- otherwise release it so another client can use it&lt;br /&gt;306 function read_query_result( inj )&lt;br /&gt;307&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local is_debug = proxy.global.config.rwsplit.is_debug&lt;br /&gt;308&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local res&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = assert(inj.resultset)&lt;br /&gt;309&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local flags&amp;nbsp;&amp;nbsp;&amp;nbsp; = res.flags&lt;br /&gt;310&lt;br /&gt;311&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if inj.id ~= 1 then&lt;br /&gt;312&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- ignore the result of the USE &lt;default_db&gt;&lt;br /&gt;313&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- the DB might not exist on the backend, what do do ?&lt;br /&gt;314&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&lt;br /&gt;315&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if inj.id == 2 then&lt;br /&gt;316&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- the injected INIT_DB failed as the slave doesn't have this DB&lt;br /&gt;317&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- or doesn't have permissions to read from it&lt;br /&gt;318&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if res.query_status == proxy.MYSQLD_PACKET_ERR then&lt;br /&gt;319&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.queries:reset()&lt;br /&gt;320&lt;br /&gt;321&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.response = {&lt;br /&gt;322&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type = proxy.MYSQLD_PACKET_ERR,&lt;br /&gt;323&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errmsg = "can't change DB ".. proxy.connection.client.default_db ..&lt;br /&gt;324&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; " to on slave " .. proxy.global.backends[proxy.connection.backend_ndx].dst.name&lt;br /&gt;325&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;326&lt;br /&gt;327&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return proxy.PROXY_SEND_RESULT&lt;br /&gt;328&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;329&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;330&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return proxy.PROXY_IGNORE_RESULT&lt;br /&gt;331&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;332&lt;/default_db&gt;&lt;/pre&gt;&lt;br /&gt;* 处理COM_INIT_DB命令的返回结果&lt;br /&gt;* 忽略其它语句的结果&lt;br /&gt;&lt;br /&gt;===333-348行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;333&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; is_in_transaction = flags.in_trans&lt;br /&gt;334&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local have_last_insert_id = (res.insert_id and (res.insert_id &amp;gt; 0))&lt;br /&gt;335&lt;br /&gt;336&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not is_in_transaction and&lt;br /&gt;337&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; not is_in_select_calc_found_rows and&lt;br /&gt;338&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; not have_last_insert_id then&lt;br /&gt;339&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- release the backend&lt;br /&gt;340&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.connection.backend_ndx = 0&lt;br /&gt;341&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif is_debug then&lt;br /&gt;342&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("(read_query_result) staying on the same backend")&lt;br /&gt;343&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; in_trans&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : " .. tostring(is_in_transaction))&lt;br /&gt;344&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; in_calc_found&amp;nbsp;&amp;nbsp; : " .. tostring(is_in_select_calc_found_rows))&lt;br /&gt;345&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("&amp;nbsp;&amp;nbsp;&amp;nbsp; have_insert_id&amp;nbsp; : " .. tostring(have_last_insert_id))&lt;br /&gt;346&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;347 end&lt;br /&gt;348&lt;/pre&gt;&lt;br /&gt;* 参考：http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#OK_Packet&lt;br /&gt;* 检查是否在事务内，是否有insert_id。设置backend_ndx=0，下次重新选取后端连接？&lt;br /&gt;&lt;br /&gt;===349-364行===&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;349 ---&lt;br /&gt;350 -- close the connections if we have enough connections in the pool&lt;br /&gt;351 --&lt;br /&gt;352 -- @return nil - close connection&lt;br /&gt;353 --&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IGNORE_RESULT - store connection in the pool&lt;br /&gt;354 function disconnect_client()&lt;br /&gt;355&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local is_debug = proxy.global.config.rwsplit.is_debug&lt;br /&gt;356&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if is_debug then&lt;br /&gt;357&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("[disconnect_client] " .. proxy.connection.client.src.name)&lt;br /&gt;358&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;359&lt;br /&gt;360&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- make sure we are disconnection from the connection&lt;br /&gt;361&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- to move the connection into the pool&lt;br /&gt;362&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.connection.backend_ndx = 0&lt;br /&gt;363 end&lt;br /&gt;364&lt;/pre&gt;&lt;br /&gt;* 不懂&lt;br /&gt;&lt;br /&gt;==问题==&lt;br /&gt;&lt;br /&gt;===ERROR 1047 (08S01): Unknown command===&lt;br /&gt;现象：&lt;br /&gt;* 用MySQL Proxy 0.8.1缺省的rw-splitting脚本，客户端连接多次，当每个backend都建立起一定空闲连接（连接数都达到min_idle_connects+1，原因不清）后，再次连接时报错"ERROR 1047 (08S01): Unknown command"。如下：&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;$ ./mysql -h 127.0.0.1 -P 4040 -u yyyy -pxxxx -e "proxy show config"&lt;br /&gt;+---------+----------------------+-------+---------+&lt;br /&gt;| module&amp;nbsp; | option&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | value | type&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+---------+----------------------+-------+---------+&lt;br /&gt;| rwsplit | min_idle_connections | 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | number&amp;nbsp; |&lt;br /&gt;| rwsplit | is_debug&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | true&amp;nbsp; | boolean |&lt;br /&gt;| rwsplit | max_idle_connections | 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | number&amp;nbsp; |&lt;br /&gt;+---------+----------------------+-------+---------+&lt;br /&gt;$ ./mysql -h 127.0.0.1 -P 4040 -u yyyy -pxxxx -e "proxy show config"&lt;br /&gt;+---------+----------------------+-------+---------+&lt;br /&gt;| module&amp;nbsp; | option&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | value | type&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+---------+----------------------+-------+---------+&lt;br /&gt;| rwsplit | min_idle_connections | 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | number&amp;nbsp; |&lt;br /&gt;| rwsplit | is_debug&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | true&amp;nbsp; | boolean |&lt;br /&gt;| rwsplit | max_idle_connections | 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | number&amp;nbsp; |&lt;br /&gt;+---------+----------------------+-------+---------+&lt;br /&gt;$ ./mysql -h 127.0.0.1 -P 4040 -u yyyy -pxxxx -e "proxy show config"&lt;br /&gt;ERROR 1047 (08S01): Unknown command&lt;/pre&gt;&lt;br /&gt;* MySQL数据库版本是5.5的，改成5.1问题消失&lt;br /&gt;&lt;br /&gt;原因：&lt;br /&gt;* 好像认证有问题，5.5下read_auth_result了2次。原因待查&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;If a long-password capable client tries to authenticate to a server that supports long passwords, but the user password provided is actually short, read_auth_result() will be called twice. The first time, auth.packet:byte() will equal 254, indicating that the client should try again using the old password protocol. The second time time read_auth_result()/ is called, auth.packet:byte() will indicate whether the authentication actually succeeded.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;解决：&lt;br /&gt;* 无&lt;br /&gt;* 不用5.5版本的数据库&lt;br /&gt;&lt;br /&gt;===read_auth_result没有显示调试信息===&lt;br /&gt;现象：&lt;br /&gt;* is_debug设置为true，然而read_auth_result没有显示出debug信息&lt;br /&gt;&lt;br /&gt;原因：&lt;br /&gt;* 脚本问题，函数read_auth_result中的变量is_debug没有赋值&lt;br /&gt;&lt;br /&gt;解决：&lt;br /&gt;* 在147行之前增加如下代码：&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local is_debug = proxy.global.config.rwsplit.is_debug&lt;/pre&gt;&lt;br /&gt;* 修改脚本后即可生效，不用重启MySQL Proxy&lt;br /&gt;&lt;br /&gt;===proxy set global 报错 ERROR 1064 (42000): You have an error in your SQL syntax===&lt;br /&gt;现象：&lt;br /&gt;* 客户端执行命令"proxy set global xxx.yyy = zzz"，设置MySQL Proxy参数，报语法错误，如下：&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;mysql&amp;gt; proxy set global rwsplit.min_idle_connections = 2;&lt;br /&gt;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'proxy set global rwsplit.min_idle_connections = 2' at line 1&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;原因：&lt;br /&gt;* auto-config.lua脚本问题。不能处理带下划线的参数名称。&lt;br /&gt;&lt;br /&gt;解决：&lt;br /&gt;* 修改脚本lib/mysql-proxy/lua/proxy/auto-config.lua&lt;br /&gt;将&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;local literal = l.R("az", "AZ") ^ 1&lt;/pre&gt;&lt;br /&gt;改成&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;local literal = l.R("az", "AZ", "__") ^ 1&lt;/pre&gt;&lt;br /&gt;* 然后重启MySQL Proxy进程&lt;br /&gt;&lt;br /&gt;===proxy set global 报错 ERROR 1105 (07000): (lua) proxy.response.errmsg is nil===&lt;br /&gt;现象：&lt;br /&gt;* 设置is_debug=false报错，如下：&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;mysql&amp;gt; proxy set global rwsplit.is_debug = false;&lt;br /&gt;ERROR 1105 (07000): (lua) proxy.response.errmsg is nil&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;原因：&lt;br /&gt;* auto-config.lua脚本问题。当参数值等于false时，parse_value函数返回false，导致"if not val then"判断出错&lt;br /&gt;&lt;br /&gt;解决：&lt;br /&gt;* 修改lib/mysql-proxy/lua/proxy/auto-config.lua，handle函数代码&lt;br /&gt;将&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;if not val then&lt;/pre&gt;&lt;br /&gt;改为&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;if val == nil then&lt;/pre&gt;&lt;br /&gt;* 然后重启MySQL Proxy服务&lt;br /&gt;&lt;br /&gt;===proxy save config 保存配置文件大小等于0===&lt;br /&gt;现象：&lt;br /&gt;* proxy save config 命令保存的配置文件，文件大小等于0，要等待一段时间，或重启MySQL Proxy后，其大小才不等于0&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;-rw-r-----&amp;nbsp; 1 oracle oinstall&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Jul&amp;nbsp; 4 15:36 "a.log"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;原因：&lt;br /&gt;* auto-config.lua脚本问题。文件写操作之后，没有刷新缓冲区&lt;br /&gt;&lt;br /&gt;解决：&lt;br /&gt;* 修改lib/mysql-proxy/lua/proxy/auto-config.lua，save函数代码&lt;br /&gt;在&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;file:write(content)&lt;/pre&gt;&lt;br /&gt;之后，增加&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;file:flush(content)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;===proxy save config 保存配置文件名带双引号===&lt;br /&gt;现象：&lt;br /&gt;* proxy save config 命令保存的配置文件，文件名包括双引号&lt;br /&gt;&lt;pre class="console"&gt;&lt;br /&gt;-rw-r----- 1 oracle oinstall&amp;nbsp; 186 Jul&amp;nbsp; 4 15:59 "a"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;原因：&lt;br /&gt;* auto-config.lua脚本问题。文件名匹配包括双引号&lt;br /&gt;&lt;br /&gt;解决：&lt;br /&gt;* 修改lib/mysql-proxy/lua/proxy/auto-config.lua代码&lt;br /&gt;将&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;local string_quoted&amp;nbsp; = l.P("\"") * ( 1 - l.P("\"") )^0 * l.P("\"") -- /".*"/&lt;/pre&gt;&lt;br /&gt;改成&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;local string_quoted&amp;nbsp; = l.P("\"") * l.C(( 1 - l.P("\"") )^0) * l.P("\"") -- /".*"/&lt;/pre&gt;&lt;br /&gt;将&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l.Ct( l.Cc("string") * l.C(string_quoted) +&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SAVE / "SAVE" * CONFIG * WS^1 * INTO * l.C(string_quoted)) +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (LOAD / "LOAD" * CONFIG * WS^1 * FROM * l.C(string_quoted))) * -1)&lt;/pre&gt;&lt;br /&gt;改成&lt;br /&gt;&lt;pre class="plsql_code"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l.Ct( l.Cc("string") * string_quoted +&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SAVE / "SAVE" * CONFIG * WS^1 * INTO * string_quoted) +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (LOAD / "LOAD" * CONFIG * WS^1 * FROM * string_quoted)) * -1)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-1676658540493148806?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/1676658540493148806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=1676658540493148806' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/1676658540493148806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/1676658540493148806'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2011/08/mysql-proxy-rw-splitting.html' title='MySQL Proxy RW Splitting'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-7700684801080591623</id><published>2011-08-16T00:55:00.003+08:00</published><updated>2011-08-16T00:56:46.051+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='etl'/><category scheme='http://www.blogger.com/atom/ns#' term='odi'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>ODI FAQ</title><content type='html'>去年DW项目实施时写的一些常见问题，主要针对ODI 10g版本，内容较陈旧，仅供参考&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;一个变量可以在多个Scenario中使用而不产生冲突吗?&lt;/b&gt;===&lt;br /&gt;可以&lt;br /&gt;&lt;br /&gt;Recommendations For Working With ODI Variables In Startscen And OdiStartScen Calls ID 423737.1&lt;br /&gt;https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;id=423737.1&amp;amp;type=NOT&lt;br /&gt;&lt;br /&gt;If the same Variable is used in multiple simultaneously running Scenarios, it must have the 'Action' parameter set to 'Not Persistent' to avoid Variable value collision from concurrent Scenarios.&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;如何处理目录下的所有文件&lt;/b&gt;===&lt;br /&gt;&lt;br /&gt;ODI Series – Processing all files in a directory: http://john-goodwin.blogspot.com/2009/06/odi-series-processing-all-files-in.html&lt;br /&gt;How to refresh ODI variables from file – Part 1 – Just one value: http://odiexperts.com/?p=243&lt;br /&gt;How to refresh ODI variables from file – Part 2 – Getting all lines, once at time: http://odiexperts.com/?p=273&lt;br /&gt;Getting one or several unknown files from a directory: http://odiexperts.com/?p=1426&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;如何删除ODI日志&lt;/b&gt;===&lt;br /&gt;How To Avoid Saturating The ODI Log Tables ID 423934.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=423934.1&lt;br /&gt;Session And Scenario Execution Log Tables Used By ODI ID 424663.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=424663.1&lt;br /&gt;Programming ODI To Automatically Purge The Operator Journal ID 423839.1 https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=423839.1&lt;br /&gt;How To Manually Delete A Scenario And Its Related Reports In The ODI Repository With SQL ID 424661.1 https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=424661.1&lt;br /&gt;ODI snippets: Purge Log and shrink space: http://www.business-intelligence-quotient.com/?p=539&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;ODI User Function怎么用?&lt;/b&gt;===&lt;br /&gt;ODI User Functions: A Case Study: http://blogs.oracle.com/dataintegration/2009/09/odi_user_functions_a_case_stud.html&lt;br /&gt;http://john-goodwin.blogspot.com/2009/06/odi-series-quick-look-at-user-functions.html&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;如何并行执行过程&lt;/b&gt;===&lt;br /&gt;Parallel Processing in ODI: http://blogs.oracle.com/dataintegration/2009/11/parallel_processing_in_odi.html&lt;br /&gt;How To Run ODI Processes In Parallel And Using OdiWaitForChildSession ID 443858.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=443858.1&lt;br /&gt;Asynchronous -Parallel Execution: http://odiexperts.com/?p=1180&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;ODI的学习资源有哪些&lt;/b&gt;===&lt;br /&gt;Oracle Data Integrator: http://www.oracle.com/technology/products/oracle-data-integrator/index.html&lt;br /&gt;Oracle Data Integrator Release 10.1.3.6 Documentation Library: http://download.oracle.com/docs/cd/E15985_01/index.htm&lt;br /&gt;Oracle Data Integrator Downloads: http://www.oracle.com/technology/software/products/odi/index.html&lt;br /&gt;Oracle Data Integrator应用指南: http://www.docin.com/p-32319219.html&lt;br /&gt;Oracle Data Integrator/Sunopsis, Releases and Patches ID 456313.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=456313.1&lt;br /&gt;My Oracle Support searching keyword odi: http://support.oracle.com/&lt;br /&gt;Data Integration Forum: http://forums.oracle.com/forums/forum.jspa?forumID=374&lt;br /&gt;Developing a Knowledge Module in Oracle Data Integrator: http://www.oracle.com/technology/pub/articles/bethke-odi.html&lt;br /&gt;ODI Resources for Beginners: Getting Started with Oracle Data Integrator: http://www.business-intelligence-quotient.com/?p=379&lt;br /&gt;Oracle Data Integration Resource Kit. Included is the State of the Data Integration Market White Paper, in addition to additional key Data Integration resources.: http://www.oracle.com/webapps/dialogue/dlgpage.jsp&lt;br /&gt;Oracle by Example Series: Oracle Data Integrator: http://www.oracle.com/technology/obe/fusion_middleware/odi/index.html&lt;br /&gt;http://www.oracle.com/technology/obe/fusion_middleware/ODI/index.html&lt;br /&gt;Data Integration and Management: http://blogs.oracle.com/dataintegration/&lt;br /&gt;ODI EXPERTS: http://odiexperts.com/&lt;br /&gt;More to life than this...: http://john-goodwin.blogspot.com/&lt;br /&gt;BI-Quotient: http://www.business-intelligence-quotient.com/&lt;br /&gt;Rittman Mead: http://www.rittmanmead.com&lt;br /&gt;Business Intelligence – Oracle: http://oraclebizint.wordpress.com/category/oracle-data-integrator/&lt;br /&gt;&lt;br /&gt;Oracle Czech BI/DW Blog: http://bidwcz.blogspot.com/&lt;br /&gt;Technology &amp;amp; Other Worldly Issues: http://askankit.blogspot.com/&lt;br /&gt;&lt;br /&gt;https://dbinfo.no.sohu.com:4443/apex/p?n=8247611144080585&lt;br /&gt;https://dbinfo.no.sohu.com:4443/apex/p?n=8247701710096829&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Note: The repository structure changes slightly between major versions and in particular from 11g onwards.&lt;br /&gt;In this case, it is recommended to use the SDK instead of querying the repository tables directly.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;如何对数据源UNION操作&lt;/b&gt;===&lt;br /&gt;Is It Possible To Use A UNION Operation Of Two Datastores As A Source For An ODI Integration Interface? ID 423731.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=423731.1&lt;br /&gt;KM FOR UNION BASED ON IKM SQL CNTRL APPEND: http://odiexperts.com/?p=1164&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;ODI授权&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;开发想修改md_xxx中dm_agent，想定义为缓慢变化维，我用security manager通过profile给他授予了Object，Model Folder,Model,Sub-Model,Datastore 的所有权限，然后把md_xxx拖到了该用户下instances目录下，指定repository为wk_dev。增加这些权限后，开发说还是报错：com.sunopsis.core.SecurityAccessException: You are not authorized to Edit the Object:SNP_JOIN : DM_AGENT_FK_CHANNEL / 6001&lt;br /&gt;难道我还得把相应的datastore也拖到用户下? ODI授个权怎么就这么麻烦呢? 这种操作到底需要授予哪些权限?&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;we don't know&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;如何用动态文件名&lt;/b&gt;===&lt;br /&gt;Using A Dynamically Specified File Name Or Directory Name With ODI ID 423635.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=423635.1&lt;br /&gt;Using Parameters in ODI: The Dynamic File Name Example: http://blogs.oracle.com/dataintegration/2009/04/using_parameters_in_odi_the_dy_1.html&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;Operator中如何显示出变量值?&lt;/b&gt;===&lt;br /&gt;Find the Value of the Variable in Operator ?: http://odiexperts.com/?p=855&lt;br /&gt;ODI Variables and the Operator Module: http://www.business-intelligence-quotient.com/?p=762&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;One Comment on “ODI Variables and the Operator Module”&lt;br /&gt;&lt;br /&gt;&amp;nbsp; 1.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #1 Craig Stewart said at 3:18 pm on March 17th, 2010:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Uli&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Another great article – another snippet to follow-up. If the variable has been passed into the execution as a parameter, then if you use odiRef.getSession(”SESS_PARAMS” ) it will printout the values of the parameters. To make this readable in the execution, I usually put in a procedure with a Java Beanshell step, with the code:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; As it is in /* */ comments, it is ignored, and does not look like an error/kludge, but prints out neatly in the log.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Shame there is no similar thing for the variables set dynamically!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Craig&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Using Jython Scripting Features In ODI FAQ ID 566475.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=566475.1#aref78&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;10. Displaying ODI Variables Values In ODI Operator Log&lt;br /&gt;&lt;br /&gt;Is there any technique whereby it is possible, in the ODI Operator Log, to display the values of ODI Variables which have been initialized from runtime parameters when launching Scenarios?&lt;br /&gt;Such a technique would allow the recording of Variable values during runtime and would be useful for execution audit operations.&lt;br /&gt;&lt;br /&gt;Two alternative solutions are possible:&lt;br /&gt;&lt;br /&gt;In the case of OdiStartScen (SnpsStartScen) tool, it is possible to specify the name of the Session with the "-SESSION_NAME" parameter. In this case, pass the value of the ODI Variable to this parameter for display in ODI Journal.&lt;br /&gt;&lt;br /&gt;A Jython script step such as the following, in a Knowledge Module, will allow the display of the ODI Variable value in the Execution tab of the step :&lt;br /&gt;a = 'Table = '+ '#YOURVARIABLE'&lt;br /&gt;raise(a)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Such a Jython script will require the "Ignore errors" checkbox to be checked in the Knowledge Module step. Do not forget that such an Integration Interface must be called from an ODI Package including steps which Declare and Refresh the ODI Variable.&lt;br /&gt;&lt;br /&gt;Variable values cannot be displayed in this case because the Agent records data in ODI Operator Log before the ODI process that substitutes Variables by their values, and before sending the values to the technology be be directly used or bound.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;如何重新生成scenario&lt;/b&gt;===&lt;br /&gt;ODI: Automating deployment of scenarios to production in Oracle Data Integrator: http://www.business-intelligence-quotient.com/?p=340&lt;br /&gt;What Will Each Generation Mode (Replace, Re-generate, Creation) Of ODI Project "Generate All Scenarios" Option Do? ID 555709.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=555709.1&lt;br /&gt;Generate Multiple Scenarios: http://odiexperts.com/?p=456&lt;br /&gt;In ODI What Is The Difference Between Generation And Regeneration Of A Scenario ID 733103.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=733103.1&lt;br /&gt;&lt;br /&gt;How To Ensure That The Regeneration Of An ODI Scenario Is Successful? ID 804583.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=804583.1&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;生成场景报错ORA-12899&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;生成场景时报如下错误&lt;br /&gt;java.sql.SQLException: ORA-12899: value too large for column "W_DEV"."SNP_SCEN_STEP"."VAR_VALUE" (actual: 265, maximum: 250)&lt;br /&gt;如何解决？&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;变量赋值不能超过250字符。可以将一个大的变量分成多个小的变量，最后再拼到一起。&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;用OdiFileWait报错&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;程序中使用OdiFileWait检查文件是否存在，文件可以被ls看到，目录权限drwxr-xr-x，文件权限-rw-r--r--，但是OdiFileWait总报错说No File Found.&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;# TIMEOUT时间太短，应该设置长一些，比如10000ms&lt;br /&gt;# 文件名PATTERN中不能带目录名，比如#v_dirname/#v_filename，只能是纯文件名&lt;br /&gt;# 改用别的方式检查文件是否存在，比如OdiOSCommand, sh -c "test -f #v_dirname/#v_filename"&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;SQLLDR导数据的字段顺序出错&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;用LKM File to Oracle (SQLLDR)导数据，报错字段格式不对。检查日志和生成的控制文件，发现控制文件中字段的顺序变了，跟文件中不一致&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;因为在Interface配置的Target Datastore有些字段execute on source,有些execute on staging。KM生成的控制文件中，字段顺序自动发生了变化，execute on source的字段在前，execute on staging的在后。所以相关字段统一使用execute on source或staging...，顺序才不会变。&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;IKM插入数据报错 ORA-01031: insufficient privileges&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;IKM SQL Control Append在Insert new rows这步报错&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1031 : 42000 : java.sql.SQLException: ORA-01031: insufficient privileges&lt;br /&gt;&lt;br /&gt;java.sql.SQLException: ORA-01031: insufficient privileges&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;执行的语句是&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;insert /*+ append */ into&amp;nbsp; ods.ODS_ORACLE_TABXXX&lt;br /&gt;(&lt;br /&gt;….&lt;br /&gt;from&amp;nbsp; ODI_WORK.I$_ODS_ORACLE_TABXXX&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;直接用sqlplus以odi work用户在ods数据库上执行同样语句，报错&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,ods.seq_ods_oracle_tabxxx_id.nextval,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br /&gt;ERROR at line 88:&lt;br /&gt;ORA-01031: insufficient privileges&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;ods库上的odi work用户没有相应权限，需要手工授予&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;grant select any sequence to ODI_WORK;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;如何实现反连接?&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;ODI中如何实现not in, not exists&lt;br /&gt;比如:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;select * from t1 where not exists (select null from t2 where t2.c1=t1.c1)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;How To Set Up Negative Join Operations In An ODI Integration Interface ? ID 742144.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=742144.1&lt;br /&gt;Using Oracle Outer Join Operations Such As LIKE, IN, NOT IN, IS NULL ...In ODI Integration Interfaces. ID 424034.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;id=424034.1&lt;br /&gt;&lt;br /&gt;比如&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;select * from t1 where not exists (select null from t2 where t2.c1=t1.c1)&lt;/pre&gt;&lt;br /&gt;用left outer join实现:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Interface-&amp;gt;Diagram-&amp;gt;Sources&lt;/pre&gt;&lt;br /&gt;* t1 left outer join t2&lt;br /&gt;** 注意不能选中left outer join复选框, 必须手工写(+)号&lt;br /&gt;**Implementation填t1.c1=t2.c1(+), 设置为execute on staging&lt;br /&gt;* t2增加filter, Implementation填t2.c1 is null, 设置为execute on staging&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;刷新变量出错No value to affect to this variable for DefDate&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;Package中刷新变量，报错Error: No value to affect to this variable for DefDate&lt;br /&gt;意思是说select刷新语句没有返回结果。&lt;br /&gt;然而数据库中运行select语句可以查到记录，有返回结果。&lt;br /&gt;&lt;br /&gt;Package是按照Best practice，先声明变量，再刷新的，使用上应该没有错。&lt;br /&gt;&lt;br /&gt;刷新语句是:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;select to_char(t1_id) from admin_odi.t1&lt;br /&gt;where name='#v_t1_name'&lt;/pre&gt;&lt;br /&gt;* 将where子句改成where name='p_city_day'，也报同样错。&lt;br /&gt;* 如果注释掉where子句，改成select to_char(p1_id) from admin_odi.t1，则刷新成功，取得第一条记录的结果。&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;* 原因不明。&lt;br /&gt;* 删掉Diagram中变量声明和刷新的步骤，重新定义这2步，即可。&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;调用场景参数中带双引号的转义&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;用如下命令调用一个场景失败，报Unmatching quotes错误&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;OdiStartScen "-SCEN_NAME=T1_INVOKER" "-SCEN_VERSION=001" "-TEST_XIEWEN.v_t1_name=p_city_day" "-TEST_XIEWEN.v_scen_name=P_CITY_DAY" "-TEST_XIEWEN.v_scen_params=\"-ODS_FROM_ONLINE_CITY.v_start_date=#TEST_XIEWEN.v_start_date\" \"-ODS_FROM_ONLINE_CITY.v_end_date=#TEST_XIEWEN.v_end_date\" \"-ODS_FROM_ONLINE_CITY.v_date_format=#TEST_XIEWEN.v_date_format\""&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;应如何转义双引号？&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;现在用的方法是，先用一段特殊字符代表双引号，在被调用的场景中再将特殊字符替换回双引号&lt;br /&gt;&lt;br /&gt;调用场景时，特殊字符\\u0022代表双引号:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;OdiStartScen "-SCEN_NAME=T1_INVOKER" "-SCEN_VERSION=001" "-TEST_XIEWEN.v_t1_name=p_city_day" "-TEST_XIEWEN.v_scen_name=P_CITY_DAY" "-TEST_XIEWEN.v_scen_params=\\u0022-ODS_FROM_ONLINE_CITY.v_start_date=#TEST_XIEWEN.v_start_date\\u0022 \\u0022-ODS_FROM_ONLINE_CITY.v_end_date=#TEST_XIEWEN.v_end_date\\u0022 \\u0022-ODS_FROM_ONLINE_CITY.v_date_format=#TEST_XIEWEN.v_h1\\u0022"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;场景中再替换回双引号：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;select replace(q'{#v_scen_params}','\\u0022','"') from dual&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;改resource name后interface取的还是旧表名&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;为了测试用，将一个表data store的resource name改成另一个临时建的新表名，点refresh number of rows显示行数也和新表名相符, 然而运行interface，取到的还是旧表数据。为什么？&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;* LKM Oracle to Oracle (DBLINK)_corp使用了odiRef.getSrcTablesList("", "[SCHEMA].[TABLE_NAME]获得源表表名&lt;br /&gt;** TABLE_NAME表示逻辑表名,RES_NAME才表示物理表名&lt;br /&gt;** TABLE_NAME Logical name of the source datastore&lt;br /&gt;** RES_NAME Physical access name of the resource.......&lt;br /&gt;* 所以修改resource name不管用，必须修改data store的名字。&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;Historize变量没取到最新值&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;有一个Historize变量v_etl_sysdate每天都刷新为当天的日期，通过变量的历史可以看到。&lt;br /&gt;&lt;br /&gt;package查看这个变量，得到的不是最后一次刷新的值(2010-07-16)，是历史记录中的第一个值(2010-04-09)。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL&amp;gt; select * from SNP_VAR_DATA where var_name='S2ODS.v_etl_sysdate' order by FIRST_DATE;&lt;br /&gt;&lt;br /&gt;VAR_NAME&lt;br /&gt;------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;CONTEXT_CODE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I_VAL VAR_D&lt;br /&gt;---------------------------------------------------------------------- ---------- -------------------&lt;br /&gt;VAR_V&lt;br /&gt;------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; VAR_N FIRST_DATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FIRST_I_USER LAST_DATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LAST_I_USER I_TXT_VAR_T&lt;br /&gt;---------- ------------------- ------------ ------------------- ----------- -----------&lt;br /&gt;S2ODS.v_etl_sysdate&lt;br /&gt;EMPDATAB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6591&lt;br /&gt;2010-04-09&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010-04-09 00:29:59&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010-04-09 00:29:59&lt;br /&gt;&lt;br /&gt;S2ODS.v_etl_sysdate&lt;br /&gt;EMPDATAB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 21382&lt;br /&gt;2010-04-10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010-04-10 00:29:59&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010-04-10 00:29:59&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;S2ODS.v_etl_sysdate&lt;br /&gt;EMPDATAB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1141971&lt;br /&gt;2010-07-15&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010-07-15 01:00:00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010-07-15 01:00:00&lt;br /&gt;&lt;br /&gt;S2ODS.v_etl_sysdate&lt;br /&gt;EMPDATAB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1142420&lt;br /&gt;2010-07-16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010-07-16 01:00:00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010-07-16 01:00:00&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;98 rows selected.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;* 直接执行package能取到最新值。&lt;br /&gt;* 执行scenario, 如果生成scenario时，选择了v_etl_sysdate做参数，则以后运行scenario该参数默认值都是历史第一个值。&lt;br /&gt;* 生成scenario不选择该变量做参数，执行也可得到最新值。&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;ODI 11gR1&lt;/b&gt;===&lt;br /&gt;document: http://download.oracle.com/docs/cd/E14571_01/odi.htm&lt;br /&gt;download: http://edelivery.oracle.com/EPD/Download/get_form?egroup_aru_number=11571971&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;如有error/discard记录，LKM SQLLDR导入失败&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;如果有error或discard记录，LKM SQLLDR导入失败&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;sqlloader not load file in oracle when get invalid rows.: http://forums.oracle.com/forums/thread.jspa?threadID=1043579&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;This is a bug 8560194 with ODI LKM File to Oracle (SQLLDR) and it has not been resolved yet.&lt;br /&gt;SQLLDR if successful returns 0&lt;br /&gt;SQLLDR if unsuccessful returns 1&lt;br /&gt;SQLLDR if successful but even 1 record erred out to .bad or .dsc file returns 2&lt;br /&gt;&lt;br /&gt;So, for ODI anything that is not 0 is an error.&lt;br /&gt;&lt;br /&gt;To resolve this bug, you will have to customize this KM and change the step "Invoke SQLLDR" to selectively handle each error condition.&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Duplicate the KM.&lt;br /&gt;Goto the step Call sqlldr. and change the technology to Jython.&lt;br /&gt;&lt;br /&gt;Replace the existing code with the following:&lt;br /&gt;&lt;br /&gt;import os&lt;br /&gt;retVal = os.system(r'sqlldr control=&amp;lt;%=snpRef.getSrcTablesList("", "[WORK_SCHEMA]/[TABLE_NAME].ctl", "", "")%&amp;gt; log=&amp;lt;%=snpRef.getSrcTablesList("", "[WORK_SCHEMA]/[TABLE_NAME].log", "", "")%&amp;gt; userid=&amp;lt;%=snpRef.getInfo("DEST_USER_NAME")%&amp;gt;/&amp;lt;%=snpRef.getInfo("DEST_PASS")%&amp;gt;@&amp;lt;%=snpRef.getInfo("DEST_DSERV_NAME")%&amp;gt; &amp;gt; &amp;lt;%=snpRef.getSrcTablesList("", "[WORK_SCHEMA]/[TABLE_NAME].out", "", "")%&amp;gt;')&lt;br /&gt;&lt;br /&gt;if retVal == 1 or retVal &amp;gt; 2:&lt;br /&gt;&amp;nbsp; raise 'SQLLDR failed. Please check the &amp;lt;%=snpRef.getSrcTablesList("", "[WORK_SCHEMA]/[TABLE_NAME].log", "", "")%&amp;gt; for details '&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hope that helps&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;显示Session运行状态有问题&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;Operator日志显示某Session总是Running状态，在后台查询已无相应数据库会话&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;该会话可能是从本机No agent发起的，当会话运行中，退出了客户端(Designer,Operator)。客户端退出，会话也随之终止，但会话状态不会更新到ODI系统表。&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;过程中使用绑定变量，报错Missing parameter&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;Procedure中一条语句使用到了bind variable:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;begin&lt;br /&gt;...&lt;br /&gt;UPDATE &amp;lt;%=odiRef.getOption("TABLE_NAME")%&amp;gt;&lt;br /&gt;&amp;nbsp; SET STATUS=&amp;lt;%=odiRef.getOption("T1_STATUS")%&amp;gt;&lt;br /&gt;&amp;nbsp; WHERE T1_ID=&amp;lt;%=odiRef.getOption("T1_ID")%&amp;gt;;&lt;br /&gt;...&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;P1_ID赋值为":ADMIN_ODI.v_t1_ID"，开头的冒号表示使用绑定变量&lt;br /&gt;&lt;br /&gt;执行时出错:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;com.sunopsis.sql.SnpsMissingParametersException: Missing parameter&lt;br /&gt;&amp;nbsp; at com.sunopsis.sql.SnpsQuery.completeHostVariable(SnpsQuery.java)&lt;br /&gt;&amp;nbsp; at com.sunopsis.sql.SnpsQuery.updateExecStatement(SnpsQuery.java)&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;日志显示，最后生成的语句是:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;begin&lt;br /&gt;...&lt;br /&gt;UPDATE #ADMIN_ODI.v_admin_odi_t1&lt;br /&gt;&amp;nbsp; SET STATUS=2&lt;br /&gt;&amp;nbsp; WHERE T1_ID=:ADMIN_ODI.v_t1_ID;&lt;br /&gt;...&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;ODI把UPDATE语句最后的分号当成变量名的一部分，所以找不到变量，就报错了。&lt;br /&gt;&lt;br /&gt;分号换行写，或前面加空格与变量名分开，即可。&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;OdiOSCommand双连字符问题&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;* OdiOSCommand调用命令sh -c "rsync -q --dry-run ...."&lt;br /&gt;* 从Operator操作日志观看生成的命令，double hyphen及其后字符都没有了&lt;br /&gt;* 将双连字符改成\u002d\u002d，生成命令没错，执行报错"命令返回:2"&lt;br /&gt;* 检查出错原因，好像还是因为双连字符后被截断了，导致命令不完整:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sh: -c: line 0: unexpected EOF while looking for matching `"'&lt;br /&gt;sh: -c: line 1: syntax error: unexpected end of file&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;OdiOutFile先将执行的命令写到一个脚本内，然后OdiOSCommand调用此脚本&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;SNP_SESSION.SESS_STATUS字段代表什么含义?&lt;/b&gt;===&lt;br /&gt;* D = Done&lt;br /&gt;* W = Waiting&lt;br /&gt;* E = Error&lt;br /&gt;* R = Running&lt;br /&gt;* M = Warning&lt;br /&gt;* Q = Queued&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;SQLLDR LKM如何实现只选择几列导入&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;* 一个文件有A,B,C 3列，数据库表中有B,C 2列&lt;br /&gt;* interface mapping只映射了B,C列, km生成的CTL文件内也只有这2列, 于是字段不匹配，sqlldr导入失败&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;对所有没有mapping的字段，建filter, 填字段名 is not null or 字段名 is null&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;Scheduler Agent和Work Repository是一一对应的吗&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;odiparam.sh有个参数ODI_SECU_WORK_REP，表示agent连接哪个工作资料库&lt;br /&gt;&lt;br /&gt;10g中，Scheduler Agent在启动时连接该工作资料库，获取scheduler定时任务&lt;br /&gt;&lt;br /&gt;11g，情况好像有所不同，启动agent后，日志显示:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;2010-08-24 20:08:38.177 NOTIFICATION ODI-1128 Agent pa_emods_dev is starting. Application Server: STANDALONE. Agent Version: 11.1.1.3.0 - 23/06/2010&lt;br /&gt;. Port: 21911. JMX Port: 22911&lt;br /&gt;2010-08-24 20:09:01.667 NOTIFICATION ODI-1136 Starting Schedulers on Agent pa_ods_dev&lt;br /&gt;2010-08-24 20:09:01.853 NOTIFICATION ODI-1111 Agent pa_emods_dev started. Agent version: 11.1.1.3.0 - 23/06/2010. Port: 21911. JMX Port: 22911.&lt;br /&gt;2010-08-24 20:09:01.907 NOTIFICATION ODI-1137 Scheduler started for work repository REPWPROD on Agent pa_ods_dev&lt;br /&gt;2010-08-24 20:09:02.012 NOTIFICATION ODI-1137 Scheduler started for work repository REPWDEV on Agent pa_ods_dev&lt;/pre&gt;&lt;br /&gt;貌似连接了所有工作资料库，一个agent就管理了所有scheduler任务&lt;br /&gt;&lt;br /&gt;odiparam.sh对该变量的注释也有所变化：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# The following work repository name variable is required by startcmd (when the specified&lt;br /&gt;# command needs to connects to the work repository), startscen, and restartsession scripts.&lt;br /&gt;# The agent startup and agentstop programs do not need this variable.&lt;br /&gt;#&lt;br /&gt;#&amp;nbsp; ODI_SECU_WORK_REP&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp; Name of the Work Repository to connect. This Work Repository must&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp; be attached to the master repository.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;测试了下，好像是这样&lt;br /&gt;* 10g scheduler agent从odiparam.sh指定的work repository取出context和logical agent等于当前physical agent的任务&lt;br /&gt;* 11g agent从所有的work repositories取出context和logical agent等于当前physical agent的任务&lt;br /&gt;&lt;br /&gt;7.2.2 Agent Startup and Shutdown Cycle: http://download.oracle.com/docs/cd/E14571_01/core.1111/e10106/odi.htm#ASHIA4972&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;When the Oracle Data Integrator agent starts, it first reads its configuration, which includes master repository connection information. Then the agent connects to each of the work repositories attached to this master repository and removes stale sessions. Stale sessions are sessions that are incorrectly indicated in the work repository as running on this given agent. Stale sessions may result from an agent being stopped without being able to stop these sessions gracefully. As the agent restarts, it identifies the stale sessions and moves them to an error state.&lt;br /&gt;&lt;br /&gt;From that point, the agent can retrieve and compute the schedules available for it in each work repository. Once this phase is complete, the agent waits for incoming sessions requests to start their processing, and is also able to start sessions based on its schedules.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;如何使用子查询&lt;/b&gt;===&lt;br /&gt;Using subqueries in Oracle Data Integrator (ODI) interfaces for complex data integration requirements: http://www.business-intelligence-quotient.com/?p=621&lt;br /&gt;Subselect, derived tables, and subqueries in ODI 11G: http://www.business-intelligence-quotient.com/?p=1045&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;生成场景报错An object will be in an unidentified state&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;doctype=FAQ&amp;amp;id=471564.1#aref17&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;2. "An object will be in an unidentified state...." Message Is Randomly Displayed&lt;br /&gt;The following message is displayed randomly:&lt;br /&gt;"An object will be in an unidentified state (it is in the state Not found in the database and Update is currently being performed on it) " for example, when refreshing an Oracle Data Integrator Variable, running a Scenario...&lt;br /&gt;&lt;br /&gt;Such a problem has been attributed to the ODI Log related tablespaces being full.&lt;br /&gt;&lt;br /&gt;Workarounds are the following:&lt;br /&gt;&lt;br /&gt;Increase the size of the appropriate tablespaces containing the ODI Work Repositories.&lt;br /&gt;Purge the Log tables in ODI Log (Operator).&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;* 删除日志&lt;br /&gt;&lt;br /&gt;* 关了重新打开，有时也能好&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;MySQL建temporary indexes的问题&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;LKM建临时索引使用如下语句:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Create &amp;lt;%=odiRef.getTemporaryIndex ("INDEX_TYPE_CLAUSE") %&amp;gt; Index &amp;lt;%=odiRef.getObjectName(odiRef.getTemporaryIndex ("IDX_NAME"),"W") %&amp;gt; on &amp;lt;%=odiRef.getTemporaryIndex ("COLL_NAME")%&amp;gt;&lt;br /&gt;&amp;lt;%=odiRef.getTemporaryIndexColList( "(", " [CX_COL_NAME] ", ", ", ")" )%&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;生成的SQL语句是:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;create ... index aaa.ix$_bbbb on .....;&lt;/pre&gt;&lt;br /&gt;索引名之前带上了数据库名&lt;br /&gt;&lt;br /&gt;MySQL不支持这样写，应去掉数据库名:aaa.&lt;br /&gt;&lt;br /&gt;所以将KM写为&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Create &amp;lt;%=odiRef.getTemporaryIndex ("INDEX_TYPE_CLAUSE") %&amp;gt; Index &lt;!--?=odiRef.getObjectName("&lt;%=odiRef.getTemporaryIndex ("IDX_NAME")%--&gt;", "W").substring(odiRef.getCatalogName("W").length()+1)?&amp;gt; on &amp;lt;%=odiRef.getTemporaryIndex ("COLL_NAME")%&amp;gt;&lt;br /&gt;&amp;lt;%=odiRef.getTemporaryIndexColList( "(", " [CX_COL_NAME] ", ", ", ")" )%&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;good&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;OdiSqlUnload 报错内存不够&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;使用OdiSqlUnload导出数据，大约28万条记录，报OutOfMemoryError&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;java.lang.OutOfMemoryError: Java heap space&lt;br /&gt;&amp;nbsp; at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:1585)&lt;br /&gt;&amp;nbsp; at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1409)&lt;br /&gt;&amp;nbsp; at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2886)&lt;br /&gt;&amp;nbsp; at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:476)&lt;br /&gt;&amp;nbsp; at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2581)&lt;br /&gt;&amp;nbsp; at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1757)&lt;br /&gt;&amp;nbsp; at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2171)&lt;br /&gt;&amp;nbsp; at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)&lt;br /&gt;&amp;nbsp; at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)&lt;br /&gt;&amp;nbsp; at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275)&lt;br /&gt;&amp;nbsp; at com.sunopsis.sql.SnpsQuery.executeQuery(SnpsQuery.java:602)&lt;br /&gt;&amp;nbsp; at com.sunopsis.dwg.tools.SqlUnload.actionExecute(SqlUnload.java:327)&lt;br /&gt;&amp;nbsp; at com.sunopsis.dwg.function.SnpsFunctionBase.execute(SnpsFunctionBase.java:273)&lt;br /&gt;&amp;nbsp; at com.sunopsis.dwg.dbobj.SnpSessTaskSql.execIntegratedFunction(SnpSessTaskSql.java:3185)&lt;br /&gt;&amp;nbsp; at com.sunopsis.dwg.dbobj.SnpSessTaskSql.execIntegratedFunction(SnpSessTaskSql.java:1414)&lt;br /&gt;&amp;nbsp; at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTaskTrt(SnpSessTaskSql.java:2785)&lt;br /&gt;&amp;nbsp; at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTask(SnpSessTaskSql.java:2515)&lt;br /&gt;&amp;nbsp; at com.sunopsis.dwg.dbobj.SnpSessStep.treatAttachedTasks(SnpSessStep.java:534)&lt;br /&gt;&amp;nbsp; at com.sunopsis.dwg.dbobj.SnpSessStep.treatSessStep(SnpSessStep.java:449)&lt;br /&gt;&amp;nbsp; at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java:1954)&lt;br /&gt;&amp;nbsp; at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java:1818)&lt;br /&gt;&amp;nbsp; at oracle.odi.runtime.agent.processor.impl.StartScenRequestProcessor$2.doAction(StartScenRequestProcessor.java:559)&lt;br /&gt;&amp;nbsp; at oracle.odi.core.persistence.dwgobject.DwgObjectTemplate.execute(DwgObjectTemplate.java:224)&lt;br /&gt;&amp;nbsp; at oracle.odi.runtime.agent.processor.impl.StartScenRequestProcessor.doProcessStartScenTask(StartScenRequestProcessor.java:481)&lt;br /&gt;&amp;nbsp; at oracle.odi.runtime.agent.processor.impl.StartScenRequestProcessor$StartScenTask.doExecute(StartScenRequestProcessor.java:1040)&lt;br /&gt;&amp;nbsp; at oracle.odi.runtime.agent.processor.task.AgentTask.execute(AgentTask.java:114)&lt;br /&gt;&amp;nbsp; at oracle.odi.runtime.agent.support.DefaultAgentTaskExecutor$2.run(DefaultAgentTaskExecutor.java:82)&lt;br /&gt;&amp;nbsp; at java.lang.Thread.run(Thread.java:619)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;增加odi agent java虚拟机内存&lt;br /&gt;&lt;br /&gt;"java heap OutOfMemory" Error When Loading A Large Amount Of Data From Mysql With ODI ID 737309.1: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;doctype=PROBLEM&amp;amp;id=737309.1&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;This issue is due to a MySQL JDBC Driver issue.&lt;br /&gt;&lt;br /&gt;When selecting a large amount of data, the MySQL JDBC Driver loads the entire ResultSet returned by the select to the JVM's memory.&lt;br /&gt;&lt;br /&gt;This seems to be the case for any version of MySQL JDBC Driver.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;* http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-implementation-notes.html&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ResultSet&lt;br /&gt;&lt;br /&gt;By default, ResultSets are completely retrieved and stored in memory. In most cases this is the most efficient way to operate, and due to the design of the MySQL network protocol is easier to implement. If you are working with ResultSets that have a large number of rows or large values, and can not allocate heap space in your JVM for the memory required, you can tell the driver to stream the results back one row at a time.&lt;br /&gt;&lt;br /&gt;To enable this functionality, you need to create a Statement instance in the following manner:&lt;br /&gt;&lt;br /&gt;stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; java.sql.ResultSet.CONCUR_READ_ONLY);&lt;br /&gt;stmt.setFetchSize(Integer.MIN_VALUE);&lt;br /&gt;&lt;br /&gt;The combination of a forward-only, read-only result set, with a fetch size of Integer.MIN_VALUE serves as a signal to the driver to stream result sets row-by-row. After this any result sets created with the statement will be retrieved row-by-row.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;* 经试验,odiunload 参数fetchsize改小，比如改成10，能成功&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;索引&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;建索引&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;create index w_dev.i_SNP_SESSION_psn on w_dev.SNP_SESSION(PARENT_SESS_NO) online;&lt;br /&gt;create index w_prod.i_SNP_SESSION_psn on w_prod.SNP_SESSION(PARENT_SESS_NO) online;&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;create index w_dev.i_SNP_OBJ_STATE_IO on w_dev.SNP_OBJ_STATE(I_INSTANCE,I_OBJECT) online;&lt;br /&gt;create index w_prod.i_SNP_OBJ_STATE_IO on w_prod.SNP_OBJ_STATE(I_INSTANCE,I_OBJECT) online;&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;create index w_prod.i_SNP_SESSION_an_ss on w_prod.SNP_SESSION(AGENT_NAME,SESS_STATUS) online;&lt;br /&gt;create index w_dev.i_SNP_SESSION_an_ss on w_dev.SNP_SESSION(AGENT_NAME,SESS_STATUS) online;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;导入报错 ORA-00001: AK_SNP_GRP_STATE&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;导入一个项目时报错：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;java.sql.SQLException: ORA-00001: unique constraint (xxxx.AK_SNP_GRP_STATE) was happend&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;改用utf-8格式导出导入，导入报错&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;... integrity constraint (xxxxx.FK_TXT) violated - Parent Key are not found.&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;因有人以中文系统创建了项目，项目中带有中文字符，如Markers是中文名称，如：优先级、进度、笑脸&lt;br /&gt;&lt;br /&gt;将中文标识改为英文后，导出导入成功&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;ODI Sendmail tool 发中文显示乱码&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;用ODI sendmail tool发中文邮件，显示为乱码&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;标题和内容编码不对，默认用了操作系统的语言设置&lt;br /&gt;&lt;br /&gt;方法1：ODI Agent环境变量LANG设置GBK，LANG=zh_CN.gbk，然后重启agent&lt;br /&gt;&lt;br /&gt;方法2：自己编写jython程序，支持编码，参考Unprintable And UTF-8 Characters When Sending Emails With The ODI&amp;nbsp; SendMail Tool ?: https://support.oracle.com/CSP/main/article?cmd=show&amp;amp;type=NOT&amp;amp;doctype=PROBLEM&amp;amp;id=423953.1。未能实现&lt;br /&gt;&lt;br /&gt;===&lt;b&gt;ODI Agent不断重启&lt;/b&gt;===&lt;br /&gt;Q:&lt;br /&gt;&lt;br /&gt;按问题[#ODI Sendmail tool 发中文显示乱码]所述，设置LANG=zh_CN.gbk后，odi agent反复重启&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;&lt;br /&gt;经检查，是/etc/init.d/odiagentctl condstart重启了进程&lt;br /&gt;&lt;br /&gt;LANG改成zh_CN后，ping日志内容变成中文，脚本无法识别中文，因此误判，导致重启&lt;br /&gt;&lt;br /&gt;只要将&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;grep -q -- "Invalid parameter:-SECURITY_DRIVER"&lt;/pre&gt;&lt;br /&gt;改成&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;grep -q -- ":-SECURITY_DRIVER"&lt;/pre&gt;&lt;br /&gt;即可&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--fin--&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-7700684801080591623?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/7700684801080591623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=7700684801080591623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/7700684801080591623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/7700684801080591623'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2011/08/odi-faq.html' title='ODI FAQ'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-2221821504161032432</id><published>2011-02-22T23:24:00.004+08:00</published><updated>2011-02-22T23:30:00.869+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database link'/><category scheme='http://www.blogger.com/atom/ns#' term='distributed database'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Distributed read consistency 分布式读一致性</title><content type='html'>Distributed read consistency 分布式读一致性&lt;br /&gt;&lt;br /&gt;据文档&lt;a href="http://download.oracle.com/docs/cd/E11882_01/server.112/e17120/ds_txnman010.htm"&gt;Managing Read Consistency&lt;/a&gt;称，在分布式环境中，由于SCN不同步，会导致读出旧数据。比如：远端数据库更新了一个表的记录，并提交。然后，本地数据库通过数据库链接查询该表，得到的是更新前的数据，再次查询才得到更新后的数据。&lt;br /&gt;&lt;br /&gt;多次试验后均未能重现文档所描述的现象，总是能读出最新提交的数据，原因不明。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接：&lt;br /&gt;&lt;a href="https://support.oracle.com/CSP/main/article?cmd=show&amp;type=NOT&amp;doctype=PROBLEM&amp;id=561471.1"&gt;Distributed Query Returns Different Results on Consecutive Runs when no Changes Exist in the Base Tables. [ID 561471.1]&lt;/a&gt;&lt;br /&gt;&lt;a href="https://support.oracle.com/CSP/main/article?cmd=show&amp;type=BUG&amp;id=6933259"&gt;Bug 6933259: DISTRIBUTED QUERY RETURNS WRONG RESULTS&lt;/a&gt;&lt;br /&gt;&lt;a href="https://support.oracle.com/CSP/main/article?cmd=show&amp;type=BUG&amp;id=611416"&gt;Bug 611416: SELECT AFTER UPDATE AND COMMIT DOESN'T SHOW UPDATED COLUMNS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-2221821504161032432?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/2221821504161032432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=2221821504161032432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2221821504161032432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2221821504161032432'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2011/02/distributed-read-consistency.html' title='Distributed read consistency 分布式读一致性'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-9036863399730597477</id><published>2011-02-21T00:52:00.005+08:00</published><updated>2011-02-21T00:56:00.844+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><category scheme='http://www.blogger.com/atom/ns#' term='backup and recovery'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Using dNFS clonedb for testing - 使用dNFS搭建测试数据库</title><content type='html'>Using dNFS clonedb for testing&lt;br /&gt;使用dNFS搭建测试数据库&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. 配置dNFS&lt;br /&gt;&lt;br /&gt;1.1. 挂载NFS&lt;br /&gt;编辑/etc/fstab，如：&lt;br /&gt;&lt;pre&gt;192.168.1.1:/dbak/xxods /home/oracle/xxodsnew    nfs     rw,bg,hard,intr,nolock,tcp,rsize=32768,wsize=32768,nocto,retry=480  0       0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;1.2. 启用nfsodm库&lt;br /&gt;将原odm库改名，并建为nfsodm库的符号连接，如：&lt;br /&gt;&lt;pre&gt;ln -s libnfsodm11.so libodm11.so&lt;br /&gt;&lt;/pre&gt;重启数据库，告警日志显示&amp;quot;Oracle instance running with ODM&amp;quot;，说明dNFS已启用&lt;br /&gt;&lt;pre class="console"&gt;...&lt;br /&gt;  pga_aggregate_target     = 1G&lt;br /&gt;  dg_broker_start          = FALSE&lt;br /&gt;  diagnostic_dest          = &amp;quot;/opt/oracle&amp;quot;&lt;br /&gt;Oracle instance running with ODM: Oracle Direct NFS ODM Library Version 3.0&lt;br /&gt;Fri Dec 31 18:13:43 2010&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;1.3. 设置oradism可执行程序的属性&lt;br /&gt;设置oradism可执行程序的属性setuid，执行&lt;br /&gt;&lt;pre&gt;root.sh -silent&lt;br /&gt;&lt;/pre&gt;oradism可执行程序的属性变为：&lt;br /&gt;&lt;pre class="console"&gt;-rwsr-x--- 1 root   oinstall     68432 Sep  4 22:21 oradism&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;如不设置，告警日志中将可能会报错&amp;quot;Direct NFS: please check that oradism is setuid&amp;quot;，如：&lt;br /&gt;&lt;pre class="console"&gt;...&lt;br /&gt;space available in the underlying filesystem or ASM diskgroup.&lt;br /&gt;Fri Dec 31 18:19:19 2010&lt;br /&gt;alter database backup controlfile to '/home/oracle/xxodsnew/control_bak.ctl'&lt;br /&gt;Direct NFS: please check that oradism is setuid&lt;br /&gt;Fri Dec 31 18:20:19 2010&lt;br /&gt;Direct NFS: please check that oradism is setuid&lt;br /&gt;Fri Dec 31 18:21:19 2010&lt;br /&gt;Direct NFS: please check that oradism is setuid&lt;br /&gt;Fri Dec 31 18:22:19 2010&lt;br /&gt;Direct NFS: please check that oradism is setuid&lt;br /&gt;Fri Dec 31 18:23:20 2010&lt;br /&gt;Completed: alter database backup controlfile to '/home/oracle/xxodsnew/control_bak.ctl'&lt;br /&gt;Fri Dec 31 18:23:51 2010&lt;br /&gt;Starting background process SMCO&lt;br /&gt;Fri Dec 31 18:23:51 2010&lt;br /&gt;SMCO started with pid=28, OS id=18071&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;1.4. 检查视图&lt;br /&gt;v$dnfs_servers: dnfs服务器&lt;br /&gt;v$dnfs_channels: dnfs网络路径&lt;br /&gt;v$dnfs_files: dnfs文件&lt;br /&gt;v$dnfs_stats: dnfs状态&lt;br /&gt;&lt;br /&gt;如：&lt;br /&gt;&lt;pre class="console"&gt;SQL&amp;gt; SQL&amp;gt; select * from v$dnfs_servers;&lt;br /&gt;&lt;br /&gt;        ID&lt;br /&gt;----------&lt;br /&gt;SVRNAME&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;DIRNAME&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;   MNTPORT    NFSPORT      WTMAX      RTMAX&lt;br /&gt;---------- ---------- ---------- ----------&lt;br /&gt;         1&lt;br /&gt;192.168.1.1&lt;br /&gt;/dbak/xxods&lt;br /&gt;       721       2049          0          0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;外部链接：&lt;br /&gt;&lt;a href="https://support.oracle.com/CSP/main/article?cmd=show&amp;type=NOT&amp;doctype=FAQ&amp;id=954425.1"&gt;Direct NFS: FAQ [ID 954425.1]&lt;/a&gt;&lt;br /&gt;&lt;a href="https://support.oracle.com/CSP/main/article?cmd=show&amp;type=NOT&amp;doctype=HOWTO&amp;id=762374.1"&gt;Step by Step - Configure Direct NFS Client (DNFS) on Linux [ID 762374.1]&lt;/a&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/E11882_01/install.112/e17212/storage.htm#CDEHCDDG"&gt;3.2.3 Deciding to Use Direct NFS for Data Files&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/technetwork/articles/directnfsclient-11gr1-twp-129785.pdf"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="https://support.oracle.com/CSP/main/article?cmd=show&amp;type=NOT&amp;doctype=BULLETIN&amp;id=359515.1"&gt;Mount Options for Oracle files when used with NAS devices [ID 359515.1]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;2. 在dnfs上搭建测试库&lt;br /&gt;&lt;br /&gt;使用了dnfs写时拷贝技术（copy-on-write），测试库只写入修改的数据块，从而减少了其占用空间。&lt;br /&gt;&lt;br /&gt;主要步骤如下：&lt;br /&gt;2.1. 生产机导出nfs目录，试机挂载nfs目录&lt;br /&gt;2.2. 创建生产库数据文件备份，用rman image复制，操作系统复制，或存储快照。数据文件备份存放在nfs目录上。&lt;br /&gt;2.2. 生产库控制文件建跟踪备份&lt;br /&gt;2.4. 测试库修改控制文件，将数据文件路径改为nfs备份目录。修改参数文件一些相应参数&lt;br /&gt;2.5. nomount方式启动测试库，建控制文件&lt;br /&gt;2.6. 执行dbms_dnfs.clonedb_renamefile存储过程，将数据文件备份改名到测试目录下。实际上没有真的改名，备份是只读的，不会有任何改动&lt;br /&gt;2.8. 恢复并打开测试数据库&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接：&lt;br /&gt;&lt;a href="http://kevinclosson.wordpress.com/2010/12/23/oracle-database-11g-direct-nfs-clonedb-feature-part-i/"&gt;Oracle Database 11g Direct NFS Clonedb Feature – Part I.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://kevinclosson.wordpress.com/2010/12/23/oracle-database-11g-direct-nfs-clonedb-feature-%E2%80%93-part-i-and-a-half/"&gt;Oracle Database 11g Direct NFS Clonedb Feature – Part I (and a half).&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oracle-base.com/articles/11g/Clonedb_11gR2.php"&gt;Direct NFS (DNFS) Clonedb in Oracle Database 11g Release 2 (Patchset 11.2.0.2)&lt;/a&gt;&lt;br /&gt;&lt;a href="https://support.oracle.com/CSP/main/article?cmd=show&amp;type=NOT&amp;doctype=ANNOUNCEMENT&amp;id=1210656.1"&gt;Clone your dNFS Production Database for Testing [ID 1210656.1]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NOTE 1210656.1 from MOS:&lt;br /&gt;&lt;br /&gt;Clone your dNFS Production Database for Testing [ID 1210656.1] &lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt; &lt;br /&gt;  Modified 17-FEB-2011     Type ANNOUNCEMENT     Status PUBLISHED   &lt;br /&gt;&lt;br /&gt;In this Document&lt;br /&gt;  What is being announced?&lt;br /&gt;  What do you need to do?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Applies to: &lt;br /&gt;Oracle Server - Enterprise Edition - Version: 11.1.0.6 to 11.2.0.1 - Release: 11.1 to 11.2&lt;br /&gt;Information in this document applies to any platform.&lt;br /&gt;Oracle RDBMS&lt;br /&gt;dNFS &lt;br /&gt;What is being announced?&lt;br /&gt;Cloning a production database is an often needed procedure in customer environments to develop and test new application patches. When new OS releases, Storage software, Application version has to be installed in a production environment, it calls for a thorough testing using the production data. Today this is achieved by making a copy of the production datafiles in a test environment. In addition to the test environment, copies of the production database also made in development environment where application developers are creating their new applications and testing them. All of these require huge amount of storage space to be allocated and managed.&lt;br /&gt;&lt;br /&gt;Database cloning process involves copying the entire production database files into the new environment where the development or testing takes place. In addition when customers have multiple test environments, the files need to be copied into each of these test environments. dNFS provides a new feature called clonedb which allows test databases to be cloned instantaneously. dNFS clonedb feature allows customers to set up their test database environment without really copying the production files into the new database environment. The files in the test database are created based on copy-on-write technology, so that only the blocks that are updated in the test database are ever written to the disk. This type of thin-provisioning reduces the amount of storage required for testing and development purposes. In addition to the reduced storage requirement, since the datafiles in the new test environment are not copied, setting up a test database is very quick and instantaneous.&lt;br /&gt;&lt;br /&gt;Database cloning in a dNFS environment can be made from a rman full backup/image copy of all the relevant datafiles or from a storage snapshot. The database backup will be used as the backing store for the datafiles in the test database environment. Customers often take or required to take a full backup of their database and these files can be used to create the dnfs clonedb. By making the backup piece as the backing store the production data files are not touched by the test instances and the test instances don't compete for the same resources that the production database is using. &lt;br /&gt;What do you need to do?&lt;br /&gt;Following the few simple steps described below, one can clone a production database in a matter of few minutes. For the below example let us assume that your production database PROD1 is located at ORACLE_HOME=/u01/prod1/oracle. The rman backup of this production database is taken at RMAN_BACKUP_DIR=/u02/oracle/backup/prod1. The user is trying to clone a test database1 at ORACLE_HOME=/u03/test1/oracle and test database2 at ORACLE_HOME=/u03/test2/oracle&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1.On your production database take a full rman hot/cold backup. If it is a hot backup make sure your production database is in archivelog mode and all the necessary archivelogs are saved and accessible to the new test database environment.&lt;br /&gt;?To take a hot backup first put the database in hot backup mode.&lt;br /&gt;alter database begin backup;&lt;br /&gt;&amp;lt;Do a rman image copy/OS copy/Storage snapshot for each datafile&amp;gt;&lt;br /&gt;alter database end backup;&lt;br /&gt;?You can also run &amp;quot;backup as copy database format&amp;quot; rman command and get a copy of all your datafiles&lt;br /&gt;Recovery Manager: Release 11.2.0.2.0 - Production on Wed Aug 18 10:25:35 2010&lt;br /&gt;Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.&lt;br /&gt;RMAN-06568: connected to target database: PROD1 (DBID=1985124264, not open)&lt;br /&gt;RMAN-06008: connected to recovery catalog database&lt;br /&gt;RMAN&amp;gt; backup as copy database format '/u02/oracle/backup/prod1/%U' ;&lt;br /&gt;RMAN-03090: Starting backup at AUG 18 2010 10:25:37&lt;br /&gt;RMAN-08030: allocated channel: ORA_DISK_1&lt;br /&gt;RMAN-08500: channel ORA_DISK_1: SID=110 device type=DISK&lt;br /&gt;RMAN-08580: channel ORA_DISK_1: starting datafile copy&lt;br /&gt;RMAN-08522: input datafile file number=00001 name=/u01/prod1/oracle/dbs/tbs_01.f&lt;br /&gt;RMAN-08586: output file name=/u02/oracle/backup/prod1/data_D-PROD1_I-1985124264_TS-SYSTEM_FNO-1_01lll1d6 tag=TAG20100818T102541 RECID=1 STAMP=727352775&lt;br /&gt;RMAN-08581: channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:35&lt;br /&gt;&lt;br /&gt;The above command creates a backup of all your datafiles in the location&lt;br /&gt;&amp;quot;/u02/oracle/backup/prod1/&amp;quot;&lt;br /&gt;2.Generate backup control file script from your production database by connecting with sysdba privileges and executing 'alter database backup controlfile to trace'. This will generate a trace file in your user_dump_dest directory which contains the create control file command.&lt;br /&gt;3.Generate the testdb_create.sql using the script in the trace file.&lt;br /&gt;SET ECHO ON&lt;br /&gt;SET FEEDBACK 1&lt;br /&gt;SET NUMWIDTH 10&lt;br /&gt;SET LINESIZE 80&lt;br /&gt;SET TRIMSPOOL ON&lt;br /&gt;SET TAB OFF&lt;br /&gt;SET PAGESIZE 100&lt;br /&gt;STARTUP NOMOUNT PFILE='/u03/test1/oracle/dbs/testdb1.ora'&lt;br /&gt;CREATE CONTROLFILE REUSE SET DATABASE &amp;quot;testdb1&amp;quot; RESETLOGS ARCHIVELOG&lt;br /&gt;MAXLOGFILES 32  MAXLOGMEMBERS 2  MAXINSTANCES 1&lt;br /&gt;MAXLOGHISTORY 908  LOGFILE&lt;br /&gt;GROUP 1 '/u03/test1/oracle/dbs/t_1alog.f' SIZE 100M BLOCKSIZE 512,&lt;br /&gt;GROUP 2 '/u03/test1/oracle/dbs/t_2alog.f' SIZE 100M BLOCKSIZE 512&lt;br /&gt;DATAFILE&lt;br /&gt;' /u02/oracle/backup/prod1/data_D-PROD1_I-1985124264_TS-SYSTEM_FNO-1_01lll1d6',...CHARACTER SET WE8DEC? ;&lt;br /&gt;&lt;br /&gt;make sure you change the name of the database to the test db name and the log directories are pointing to the new testdb environment and use the image copy of the datafiles.&lt;br /&gt;4.Copy spfile from your production db to the testdb environment and change the relevant parameters. In your testdb environment run the testdb_create.sql to create testdb control file. Execute dbms_dnfs.clonedb_renamefile(backup_file_name, new_data_filename) on each datafile in your test database.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; declare&lt;br /&gt;2 begin&lt;br /&gt;3 dbms_dnfs.clonedb_renamefile('/u02/oracle/backup/prod1/data_D-LV1_I-1985124264_TS-SYSTEM_FNO-1_01lll1d6' , 'test1_tbs_01.f');&lt;br /&gt;4 end;&lt;br /&gt;5.PL/SQL procedure successfully completed.&lt;br /&gt;Do this for each datafile in your testdb environment.&lt;br /&gt;6.If you created your test clone from a hotbackup do a recover database recover database using backup controlfile until cancel;&lt;br /&gt;The above command will ask for the archivelogs for the period when the backup was taken and input those file names.&lt;br /&gt;SQL&amp;gt; recover database using backup controlfile until cancel ;&lt;br /&gt;7.Open the database and start running your tests&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; alter database open resetlogs ;&lt;br /&gt;&lt;br /&gt;At this point your testdb will be available for use and you will be able to read and write to the database. The testdb datafiles will not have allocated any storage for the datafiles. As you start running your test work load, inserts on the datafiles will allocate space on demand.&lt;br /&gt;&lt;br /&gt;The above same procedure can be repeated for multiple test database instances using the same backup files. If you have a storage level snapshot taken on the datafile, the rman backup file names can be replaced with the storage snapshot names.&lt;br /&gt;&lt;br /&gt;Since all the testdb clones are using the rman backup or the storage snapshot as the backend storage, availability of these files is critical for testdb to run. If the backup files become unavailable, you will see errors in the testdb database.&lt;br /&gt;&lt;br /&gt;When it is time to destroy the testdb environment, all files in the test environment can be deleted without any impact on the production or backup environment. As this clonedb feature uses the backup piece as the backing storage, there is no pressure on the I/O subsystem that is servicing the production database. DBA's don't have to hunt for storage equivalent to the size of production database to set up a testdb environment. The testdb storage space usage grows at the speed at which the data is modified.&lt;br /&gt;&lt;br /&gt;Work-in-progress - A perl script to automate the above steps is in progress. Using this script one will be able to clone a database by issuing a single command after setting few environment variables. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. dnfs性能测试&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接：&lt;br /&gt;&lt;a href="http://oraclestorageguy.typepad.com/oraclestorageguy/2009/03/new-dnfs-performance-results.html"&gt;New DNFS Performance Results&lt;/a&gt;&lt;br /&gt;&lt;a href="http://glennfawcett.wordpress.com/2009/11/25/monitoring-direct-nfs-with-oracle-11g-and-solaris-pealing-back-the-layers-of-the-onion/"&gt;Monitoring Direct NFS with Oracle 11g and Solaris… pealing back the layers of the onion.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://glennfawcett.wordpress.com/2009/12/14/direct-nfs-vs-kernel-nfs-bake-off-with-oracle-11g-and-solaris-and-the-winner-is/"&gt;Direct NFS vs Kernel NFS bake-off with Oracle 11g and Solaris… and the winner is&lt;/a&gt;&lt;br /&gt;&lt;a href="http://glennfawcett.wordpress.com/2009/12/17/kernel-nfs-fights-back-oracle-throughput-matches-direct-nfs-with-latest-solaris-improvements/"&gt;Kernel NFS fights back… Oracle throughput matches Direct NFS with latest Solaris improvements&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-9036863399730597477?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/9036863399730597477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=9036863399730597477' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/9036863399730597477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/9036863399730597477'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2011/02/using-dnfs-clonedb-for-testing.html' title='Using dNFS clonedb for testing - 使用dNFS搭建测试数据库'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-2082547246938231046</id><published>2010-05-11T20:35:00.001+08:00</published><updated>2010-05-11T20:37:09.951+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Larry Ellison Appears In Iron Man 2</title><content type='html'>埃里森出演钢铁侠2&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.freelists.org/post/oracle-l/Fluff-Larry-Ellison-in-Iron-Man-2"&gt;Fluff: Larry Ellison in Iron Man 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.marketwatch.com/story/silicon-valley-makes-a-cameo-in-iron-man-2-2010-05-11"&gt;Silicon Valley shows up in 'Iron Man 2'&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mercurynews.com/top-stories/ci_15036442"&gt;People: Larry Ellison fills starring 'Iron Man' role, sort of&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-2082547246938231046?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/2082547246938231046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=2082547246938231046' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2082547246938231046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2082547246938231046'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2010/05/larry-ellison-appears-in-iron-man-2.html' title='Larry Ellison Appears In Iron Man 2'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-6730854971426860726</id><published>2009-12-24T17:11:00.000+08:00</published><updated>2009-12-24T17:11:45.581+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database link'/><category scheme='http://www.blogger.com/atom/ns#' term='distributed database'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>questions about database link</title><content type='html'>questions about database link&lt;br /&gt;dblink问题&lt;br /&gt;&lt;br /&gt;Q1:&lt;br /&gt;我现在有两个生产库，A库的部分表通过DBLINK提供给B库使用，B库的应用访问B库，并通过B库查询A库的这些DBLINK链接的表，现在有一个问题：&lt;br /&gt;检查发现 B库的连接数比较多，进一步检查发现有50多个连接是来自A库，即使不用这些DBLINK的表，但连接还是建立的，通过DBLINK建立了8个表的连接，但实际上有50个连接，&lt;br /&gt;是否应用不访问，那么DBLINK的表就没有连接？&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;A1:&lt;br /&gt;1. 是长连接, 一般, 不用的不会释放&lt;br /&gt;2. 跟会话有关, 不同会话之间不共享数据库连接&lt;br /&gt;3. 可调整open_links参数, 控制打开的连接数&lt;br /&gt;&lt;br /&gt;Q2:&lt;br /&gt;奶奶的，会不会出问题？   生产A 上通过DBLINK建立了 B库一个表，并建立同义词， A上一直往这个同义词上插入数据，导致如下的SQL建立的连接达到50多个，全部都是一样的，现在都停止插入了，但进程依然存在，刚才查了open_links参赛，都是4，但为什么会有这么多连接呢？怎么去控制？插入进程应该早就停止了并释放连接，但两个数据库之间的连接到底什么时候释放呢？&lt;br /&gt;&lt;pre class="plsql_code"&gt;INSERT  INTO &amp;quot;SM_SEND_SM_LIST&amp;quot; (&amp;quot;SERIALNO&amp;quot;,&amp;quot;SERVICEID&amp;quot;,&amp;quot;SMCONTEN&lt;br /&gt;T&amp;quot;,&amp;quot;SENDTARGET&amp;quot;,&amp;quot;PRIORITY&amp;quot;,&amp;quot;RCOMPLETETIMEBEGIN&amp;quot;,&amp;quot;RCOMPLETETIMEEN&lt;br /&gt;D&amp;quot;,&amp;quot;RCOMPLETEHOURBEGIN&amp;quot;,&amp;quot;RCOMPLETEHOUREND&amp;quot;,&amp;quot;REQUESTTIME&amp;quot;,&amp;quot;ROADBY&lt;br /&gt;&amp;quot;,&amp;quot;SENDTARGETDESC&amp;quot;,&amp;quot;FEEVALUE&amp;quot;,&amp;quot;LINKID&amp;quot;,&amp;quot;PAD1&amp;quot;,&amp;quot;PAD2&amp;quot;,&amp;quot;PAD3&amp;quot;,&amp;quot;PAD&lt;br /&gt;4&amp;quot;,&amp;quot;PAD5&amp;quot;) VALUES (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:1&lt;br /&gt;4,:15,:16,:17,:18,:19)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;刚才了解了一下，是应用程序往这个同义词插入数据，应用程序通过WEBLOGIC的连接池处理，是不是连接池的连接不释放，导致dblink连接不释放？&lt;br /&gt;这玩意会不会增长到几百甚至更多？&lt;br /&gt;&lt;br /&gt;A2:&lt;br /&gt;1. 你的weblogic的连接池创建了50个会话连接到数据库上, 应用程序访问数据库, 会被随机分配一个连接, 可能是50个中的任何一个, 所以50个会话可能都被用到了, 所以数据库连接就会有50个&lt;br /&gt;2. 程序退出, 连接池不释放连接, 会话依然存在, 所以数据库连接数不变&lt;br /&gt;3. 只要会话数一定, 数据库连接数就一定, 所以不会涨到几百&lt;br /&gt;4. open_links能够限制每个会话最大打开的数据库连接数, 没有系统全局的限制&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Q3:&lt;br /&gt;1，我的应用有7个呢，每个WEBLOGIC都设置有50个连接&lt;br /&gt;2，检查发现大部分插入都是一个SQL，采用绑定变量方式；&lt;br /&gt;3，难道就没有别的方式可以降低连接数量&lt;br /&gt;4，Open_links这个参数好像对这个没有效果，每个进程肯定只建立一个连接，处理完成后进程消失，但连接不消失，而且从这个案例来说，不可能出现一个进程产生多个连接的现象&lt;br /&gt;&lt;br /&gt;我考虑将这个表从B库迁移到A库，A库德插入可能是不同的进程，但B库扫描这个表的进程应该一直是一个，那么这样就应该只有一个连接了！&lt;br /&gt;&lt;br /&gt;A3:&lt;br /&gt;1. 你有7个weblogic, 每个的连接池有50个连接? 还是7个应用使用同一个weblogic, 一共有50个连接?&lt;br /&gt;第一种情况: 如果7个weblogic, 连接池中每个连接都用到了你那个数据库连接, 那么应该最多看到350个连接&lt;br /&gt;第二种情况, 如果连接池中每个连接都用到了数据库连接, 那么应该最多看到50个连接&lt;br /&gt;上述任何一种情况, 如果不是每个连接都用到了数据库连接, 则看到的连接数应当更小&lt;br /&gt;&lt;br /&gt;2. 跟这个没关, 即使用到了n个表, 连接也只有1个&lt;br /&gt;&lt;br /&gt;3.&lt;br /&gt;1)在本地数据库端只有open_links的限制&lt;br /&gt;2)前面说过了回话退出时会释放连接&lt;br /&gt;3)第一条指出了可能的最大连接数&lt;br /&gt;4)alter session close database link可手工关闭连接, 但这么做没意义, 下次还会自动创建&lt;br /&gt;&lt;br /&gt;4.用到了几个数据库连接, 建立的链接就是几个, 可建立的最大值由open_links确定&lt;br /&gt;因为虽然程序(进程)退出了, 但连接池创建的会话不会退出, 所以连接不消失&lt;br /&gt;因为连接池创建了50个连接(会话)到数据库,每个会话都用到了数据库连接, 所以你看到的连接数是50个&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/ds_admin.htm"&gt;30 Managing a Distributed Database&lt;/a&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams139.htm"&gt;OPEN_LINKS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-6730854971426860726?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/6730854971426860726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=6730854971426860726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/6730854971426860726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/6730854971426860726'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/12/questions-about-database-link.html' title='questions about database link'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-4991340753161532184</id><published>2009-12-24T16:35:00.004+08:00</published><updated>2009-12-24T16:37:45.777+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>nmap ping scan</title><content type='html'>nmap ping scan&lt;br /&gt;nmap ping扫描&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. 现象&lt;br /&gt;有3台服务器, 都开了iptables, 允许ICMP,SSH访问&lt;br /&gt;server1: 192.168.18.95&lt;br /&gt;server2: 192.168.51.72&lt;br /&gt;server3: 192.168.51.71&lt;br /&gt;&lt;br /&gt;nmap扫描服务器server1的ssh端口, 结果是通的&lt;br /&gt;&lt;pre class="console"&gt;$ nmap server1 -p22&lt;br /&gt;&lt;br /&gt;Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-12-24 07:47 UTC&lt;br /&gt;Interesting ports on server1 (192.168.18.95):&lt;br /&gt;PORT   STATE SERVICE&lt;br /&gt;22/tcp open  ssh&lt;br /&gt;&lt;br /&gt;Nmap finished: 1 IP address (1 host up) scanned in 0.134 seconds&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;另一台server2扫描不通&lt;br /&gt;&lt;pre class="console"&gt;$ nmap server2 -p22&lt;br /&gt;&lt;br /&gt;Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-12-24 07:48 UTC&lt;br /&gt;Note: Host seems down. If it is really up, but blocking our ping probes, try -P0&lt;br /&gt;Nmap finished: 1 IP address (0 hosts up) scanned in 3.001 seconds&lt;br /&gt;&lt;/pre&gt;然而ping却能ping通&lt;br /&gt;&lt;pre class="console"&gt;$ ping server2 -c 3&lt;br /&gt;PING server2 (192.168.51.72) 56(84) bytes of data.&lt;br /&gt;64 bytes from server2 (192.168.51.72): icmp_seq=1 ttl=63 time=0.314 ms&lt;br /&gt;64 bytes from server2 (192.168.51.72): icmp_seq=2 ttl=63 time=0.214 ms&lt;br /&gt;64 bytes from server2 (192.168.51.72): icmp_seq=3 ttl=63 time=0.247 ms&lt;br /&gt;&lt;br /&gt;--- server2 ping statistics ---&lt;br /&gt;3 packets transmitted, 3 received, 0% packet loss, time 1999ms&lt;br /&gt;rtt min/avg/max/mdev = 0.214/0.258/0.314/0.043 ms&lt;br /&gt;&lt;/pre&gt;SSH端口也可访问&lt;br /&gt;&lt;pre class="console"&gt;$ ssh server2 uptime&lt;br /&gt;username@server2's password:&lt;br /&gt; 07:50:01 up 14 days,  8:02,  1 user,  load average: 0.00, 0.00, 0.00&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;将server2上的iptables关掉后, nmap扫描通过&lt;br /&gt;&lt;pre class="console"&gt;# iptables -F&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;$ nmap server2 -p22&lt;br /&gt;&lt;br /&gt;Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-12-24 07:49 UTC&lt;br /&gt;Interesting ports on server2 (192.168.51.72):&lt;br /&gt;PORT   STATE SERVICE&lt;br /&gt;22/tcp open  ssh&lt;br /&gt;&lt;br /&gt;Nmap finished: 1 IP address (1 host up) scanned in 0.104 seconds&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;再打开server2上的iptables, 用root运行nmap扫描, 结果也是通的&lt;br /&gt;&lt;pre class="console"&gt;# nmap server2 -p22&lt;br /&gt;&lt;br /&gt;Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-12-24 07:50 UTC&lt;br /&gt;Interesting ports on server2 (192.168.51.72):&lt;br /&gt;PORT   STATE SERVICE&lt;br /&gt;22/tcp open  ssh&lt;br /&gt;&lt;br /&gt;Nmap finished: 1 IP address (1 host up) scanned in 0.120 seconds&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;从server3用root向server2扫描也是通的&lt;br /&gt;&lt;pre class="console"&gt;# nmap server2 -p22&lt;br /&gt;&lt;br /&gt;Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-12-24 08:10 UTC&lt;br /&gt;Interesting ports on server2 (192.168.51.72):&lt;br /&gt;PORT   STATE SERVICE&lt;br /&gt;22/tcp open  ssh&lt;br /&gt;MAC Address: 00:16:C0:A8:33:47 (Semtech)&lt;br /&gt;&lt;br /&gt;Nmap finished: 1 IP address (1 host up) scanned in 0.141 seconds&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;server1的iptables设置:&lt;br /&gt;&lt;pre class="console"&gt;*nat&lt;br /&gt;...&lt;br /&gt;-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080&lt;br /&gt;-A OUTPUT -o lo -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080&lt;br /&gt;...&lt;br /&gt;*filter&lt;br /&gt;...&lt;br /&gt;-A INPUT -j RH-Firewall-1-INPUT&lt;br /&gt;-A FORWARD -j RH-Firewall-1-INPUT&lt;br /&gt;-A RH-Firewall-1-INPUT -i lo -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 8080 -m state --state NEW -j ACCEPT&lt;br /&gt;...&lt;br /&gt;-A RH-Firewall-1-INPUT -j DROP&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;server2的iptables设置:&lt;br /&gt;&lt;pre class="console"&gt;*filter&lt;br /&gt;...&lt;br /&gt;-A INPUT -j RH-Firewall-1-INPUT&lt;br /&gt;-A FORWARD -j RH-Firewall-1-INPUT&lt;br /&gt;-A RH-Firewall-1-INPUT -i lo -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 8080 -m state --state NEW -j ACCEPT&lt;br /&gt;...&lt;br /&gt;-A RH-Firewall-1-INPUT -j DROP&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. 调查&lt;br /&gt;打开nmap调试信息和strace跟踪&lt;br /&gt;1) server1:&lt;br /&gt;&lt;pre class="console"&gt;$ nmap -v -d9 --packet-trace -n server1 -p22&lt;br /&gt;&lt;br /&gt;Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-12-24 07:52 UTC&lt;br /&gt;The max # of sockets we are using is: 0&lt;br /&gt;--------------- Timing report ---------------&lt;br /&gt;  hostgroups: min 1, max 100000&lt;br /&gt;  rtt-timeouts: init 1000, min 100, max 10000&lt;br /&gt;  scan-delay: TCP 1000, UDP 1000&lt;br /&gt;  parallelism: min 0, max 0&lt;br /&gt;  max-retries: 10, host-timeout: 0&lt;br /&gt;---------------------------------------------&lt;br /&gt;READ selected for machine 192.168.18.95&lt;br /&gt;Machine 192.168.18.95 MIGHT actually be listening on probe port 80&lt;br /&gt;Hostupdate called for machine 192.168.18.95 state UNKNOWN/COMBO -&gt; HOST_UP (trynum 0, dotimeadj: yes time: 727)&lt;br /&gt;Timeout vals: srtt: -1 rttvar: -1 to: 1000000 delta 798 ==&gt; srtt: 798 rttvar: 5000 to: 100000&lt;br /&gt;Finished block: srtt: 798 rttvar: 5000 timeout: 100000 block_tries: 1 up_this_block: 1 down_this_block: 0 group_sz: 1&lt;br /&gt;massping done:  num_hosts: 1  num_responses: 1&lt;br /&gt;Initiating Connect() Scan against 192.168.18.95 [1 port] at 07:52&lt;br /&gt;CONN (0.1040s) TCP localhost &gt; 192.168.18.95:22 =&gt; Operation now in progress&lt;br /&gt;**TIMING STATS**: IP, probes active/freshportsleft/retry_stack/outstanding/retranwait/onbench, cwnd/ccthresh/delay, timeout/srtt/rttvar/&lt;br /&gt;   Groupstats (1/1 incomplete): 1/*/*/*/*/* 10.00/50/* 1000000/-1/-1&lt;br /&gt;   192.168.18.95: 1/0/0/1/0/0 10.00/50/0 100000/798/5000&lt;br /&gt;Discovered open port 22/tcp on 192.168.18.95&lt;br /&gt;Changing ping technique for 192.168.18.95 to TCP&lt;br /&gt;Timeout vals: srtt: 798 rttvar: 5000 to: 100000 delta -381 ==&gt; srtt: 750 rttvar: 3845 to: 100000&lt;br /&gt;Timeout vals: srtt: -1 rttvar: -1 to: 1000000 delta 417 ==&gt; srtt: 417 rttvar: 5000 to: 100000&lt;br /&gt;The Connect() Scan took 0.00s to scan 1 total ports.&lt;br /&gt;Host 192.168.18.95 appears to be up ... good.&lt;br /&gt;Interesting ports on 192.168.18.95:&lt;br /&gt;Fetchfile found /usr/share/nmap/nmap-services&lt;br /&gt;&lt;br /&gt;PORT   STATE SERVICE&lt;br /&gt;22/tcp open  ssh&lt;br /&gt;Final times for host: srtt: 750 rttvar: 3845  to: 100000&lt;br /&gt;&lt;br /&gt;Nmap finished: 1 IP address (1 host up) scanned in 0.116 seconds&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2) server2:&lt;br /&gt;&lt;pre class="console"&gt;$ nmap -v -d9 --packet-trace -n server2 -p22&lt;br /&gt;&lt;br /&gt;Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-12-24 07:53 UTC&lt;br /&gt;The max # of sockets we are using is: 0&lt;br /&gt;--------------- Timing report ---------------&lt;br /&gt;  hostgroups: min 1, max 100000&lt;br /&gt;  rtt-timeouts: init 1000, min 100, max 10000&lt;br /&gt;  scan-delay: TCP 1000, UDP 1000&lt;br /&gt;  parallelism: min 0, max 0&lt;br /&gt;  max-retries: 10, host-timeout: 0&lt;br /&gt;---------------------------------------------&lt;br /&gt;Finished block: srtt: -1 rttvar: -1 timeout: 1000000 block_tries: 2 up_this_block: 0 down_this_block: 0 group_sz: 1&lt;br /&gt;massping done:  num_hosts: 1  num_responses: 0&lt;br /&gt;Note: Host seems down. If it is really up, but blocking our ping probes, try -P0&lt;br /&gt;Nmap finished: 1 IP address (0 hosts up) scanned in 3.002 seconds&lt;br /&gt;&lt;/pre&gt;与1)对比发现, nmap扫描server1时连接了server1的80端口&lt;br /&gt;&lt;br /&gt;&lt;pre class="console"&gt;$ strace nmap server2 -p22&lt;br /&gt;...&lt;br /&gt;socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3&lt;br /&gt;fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)&lt;br /&gt;fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0&lt;br /&gt;setsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1, linger=0}, 8) = 0&lt;br /&gt;connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("192.168.51.72")}, 16) = -1 EINPROGRESS (Operation now in progress)&lt;br /&gt;select(4, [3], [3], [3], {1, 0})        = 0 (Timeout)&lt;br /&gt;close(3)                                = 0&lt;br /&gt;socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3&lt;br /&gt;fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)&lt;br /&gt;fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0&lt;br /&gt;setsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1, linger=0}, 8) = 0&lt;br /&gt;connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("192.168.51.72")}, 16) = -1 EINPROGRESS (Operation now in progress)&lt;br /&gt;select(4, [3], [3], [3], {1, 0})        = 0 (Timeout)&lt;br /&gt;close(3)                                = 0&lt;br /&gt;...&lt;br /&gt;write(1, "Note: Host seems down. If it is "..., 81Note: Host seems down. If it is really up, but blocking our ping probes, try -P0&lt;br /&gt;) = 81&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;连接server2的80端口, 2次超时(Timeout)后报错'Host seems down.', 然后退出&lt;br /&gt;&lt;br /&gt;3) root用户扫描server2:&lt;br /&gt;&lt;pre class="console"&gt;# nmap -v -d9 --packet-trace -n server2 -p22&lt;br /&gt;&lt;br /&gt;Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-12-24 07:53 UTC&lt;br /&gt;The max # of sockets we are using is: 0&lt;br /&gt;--------------- Timing report ---------------&lt;br /&gt;  hostgroups: min 1, max 100000&lt;br /&gt;  rtt-timeouts: init 1000, min 100, max 10000&lt;br /&gt;  scan-delay: TCP 1000, UDP 1000&lt;br /&gt;  parallelism: min 0, max 0&lt;br /&gt;  max-retries: 10, host-timeout: 0&lt;br /&gt;---------------------------------------------&lt;br /&gt;Packet capture filter (device bond0): (icmp and dst host 192.168.11.18) or ((tcp or udp) and dst host 192.168.11.18 and ( dst port 34806 or dst port 34807 or dst port 34808 or dst port 34809 or dst port 34810))&lt;br /&gt;SENT (0.0100s) ICMP 192.168.11.18 &gt; 192.168.51.72 Echo request (type=8/code=0) ttl=52 id=10191 iplen=28&lt;br /&gt;SENT (0.0100s) TCP 192.168.11.18:34810 &gt; 192.168.51.72:80 A ttl=40 id=58342 iplen=40 seq=1674883102 win=1024 ack=2782179358&lt;br /&gt;RCVD (0.0100s) ICMP 192.168.51.72 &gt; 192.168.11.18 Echo reply (type=0/code=0) ttl=63 id=43696 iplen=28&lt;br /&gt;We got a ping packet back from 192.168.51.72: id = 56906 seq = 21184 checksum = 52980&lt;br /&gt;Hostupdate called for machine 192.168.51.72 state UNKNOWN/COMBO -&gt; HOST_UP (trynum 0, dotimeadj: yes time: 446)&lt;br /&gt;Timeout vals: srtt: -1 rttvar: -1 to: 1000000 delta 382 ==&gt; srtt: 382 rttvar: 5000 to: 100000&lt;br /&gt;Finished block: srtt: 382 rttvar: 5000 timeout: 100000 block_tries: 1 up_this_block: 1 down_this_block: 0 group_sz: 1&lt;br /&gt;massping done:  num_hosts: 1  num_responses: 1&lt;br /&gt;Initiating SYN Stealth Scan against 192.168.51.72 [1 port] at 07:53&lt;br /&gt;Pcap filter: dst host 192.168.11.18 and (icmp or (tcp and (src host 192.168.51.72)))&lt;br /&gt;Packet capture filter (device bond0): dst host 192.168.11.18 and (icmp or (tcp and (src host 192.168.51.72)))&lt;br /&gt;SENT (0.1240s) TCP 192.168.11.18:34786 &gt; 192.168.51.72:22 S ttl=51 id=27748 iplen=44 seq=3810228640 win=4096&lt;br /&gt;**TIMING STATS**: IP, probes active/freshportsleft/retry_stack/outstanding/retranwait/onbench, cwnd/ccthresh/delay, timeout/srtt/rttvar/&lt;br /&gt;   Groupstats (1/1 incomplete): 1/*/*/*/*/* 10.00/50/* 1000000/-1/-1&lt;br /&gt;   192.168.51.72: 1/0/0/1/0/0 10.00/50/0 100000/382/5000&lt;br /&gt;RCVD (0.1240s) TCP 192.168.51.72:22 &gt; 192.168.11.18:34786 SA ttl=63 id=0 iplen=44 seq=3799856132 win=5840 ack=3810228641&lt;br /&gt;Discovered open port 22/tcp on 192.168.51.72&lt;br /&gt;Changing ping technique for 192.168.51.72 to TCP&lt;br /&gt;Timeout vals: srtt: 382 rttvar: 5000 to: 100000 delta 44 ==&gt; srtt: 387 rttvar: 3761 to: 100000&lt;br /&gt;Timeout vals: srtt: -1 rttvar: -1 to: 1000000 delta 426 ==&gt; srtt: 426 rttvar: 5000 to: 100000&lt;br /&gt;The SYN Stealth Scan took 0.01s to scan 1 total ports.&lt;br /&gt;Host 192.168.51.72 appears to be up ... good.&lt;br /&gt;Interesting ports on 192.168.51.72:&lt;br /&gt;Fetchfile found /usr/share/nmap/nmap-services&lt;br /&gt;&lt;br /&gt;PORT   STATE SERVICE&lt;br /&gt;22/tcp open  ssh&lt;br /&gt;Final times for host: srtt: 387 rttvar: 3761  to: 100000&lt;br /&gt;&lt;br /&gt;Nmap finished: 1 IP address (1 host up) scanned in 0.141 seconds&lt;br /&gt;               Raw packets sent: 3 (112B) | Rcvd: 2 (92B)&lt;br /&gt;&lt;/pre&gt;发送ICMP echo request, 并向80端口发送TCP ACK包&lt;br /&gt;&lt;br /&gt;&lt;pre class="console"&gt;# strace nmap server2 -p22&lt;br /&gt;...&lt;br /&gt;socket(PF_INET, SOCK_RAW, IPPROTO_RAW)  = 4&lt;br /&gt;setsockopt(4, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0&lt;br /&gt;setsockopt(4, SOL_IP, IP_HDRINCL, [1], 4) = 0&lt;br /&gt;socket(PF_INET, SOCK_RAW, IPPROTO_RAW)  = 5&lt;br /&gt;setsockopt(5, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0&lt;br /&gt;setsockopt(5, SOL_IP, IP_HDRINCL, [1], 4) = 0&lt;br /&gt;socket(PF_PACKET, SOCK_RAW, 768)        = 6&lt;br /&gt;ioctl(6, SIOCGIFINDEX, {ifr_name="lo", ifr_index=1}) = 0&lt;br /&gt;ioctl(6, SIOCGIFHWADDR, {ifr_name="bond0", ifr_hwaddr=00:14:22:12:39:2b}) = 0&lt;br /&gt;ioctl(6, SIOCGIFINDEX, {ifr_name="bond0", ifr_index=5}) = 0&lt;br /&gt;bind(6, {sa_family=AF_PACKET, proto=0x03, if5, pkttype=PACKET_HOST, addr(0)={0, }, 20) = 0&lt;br /&gt;getsockopt(6, SOL_SOCKET, SO_ERROR, [17179869184], [4]) = 0&lt;br /&gt;socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 7&lt;br /&gt;ioctl(7, SIOCGIFADDR, {ifr_name="bond0", ifr_addr={AF_INET, inet_addr("192.168.11.18")}}) = 0&lt;br /&gt;ioctl(7, SIOCGIFNETMASK, {ifr_name="bond0", ifr_netmask={AF_INET, inet_addr("255.255.255.0")}}) = 0&lt;br /&gt;close(7)                                = 0&lt;br /&gt;brk(0x17164000)                         = 0x17164000&lt;br /&gt;setsockopt(6, SOL_SOCKET, SO_ATTACH_FILTER, "\1\0\0\0\0\0\0\0\20)h\0\0\0\0\0", 16) = 0&lt;br /&gt;fcntl(6, F_GETFL)                       = 0x2 (flags O_RDWR)&lt;br /&gt;fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK)    = 0&lt;br /&gt;recvfrom(6, "\0\220\301\224x\377\177\0\0\220\301\224x\377\177\0\0p\301\224x\377\177\0\0\360\255\23\27\0\0\0"..., 1, MSG_TRUNC, NULL, NULL) = 114&lt;br /&gt;recvfrom(6, "\0\220\301\224x\377\177\0\0\220\301\224x\377\177\0\0p\301\224x\377\177\0\0\360\255\23\27\0\0\0"..., 1, MSG_TRUNC, NULL, NULL) = 114&lt;br /&gt;...&lt;br /&gt;recvfrom(6, "\0\220\301\224x\377\177\0\0\220\301\224x\377\177\0\0p\301\224x\377\177\0\0\360\255\23\27\0\0\0"..., 1, MSG_TRUNC, NULL, NULL) = 146&lt;br /&gt;recvfrom(6, 0x7fff7894c11f, 1, 32, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)&lt;br /&gt;fcntl(6, F_SETFL, O_RDWR)               = 0&lt;br /&gt;setsockopt(6, SOL_SOCKET, SO_ATTACH_FILTER, "\231\0\224x\377\177\0\0\320\312\23\27\0\0\0\0", 16) = 0&lt;br /&gt;sendto(5, "E\0\0\34\360Y\0\0-\1\335\334\300\250\v\22\300\2503H\10\0*\347\244\t)\17", 28, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.51.72")}, 16) = 28&lt;br /&gt;sendto(4, "E\0\0(\2\275\0\0;\6\275h\300\250\v\22\300\2503H\367\205\0Pu\303\312^\312\303\312^"..., 40, 0, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("192.168.51.72")}, 16) = 40&lt;br /&gt;select(7, [6], NULL, NULL, {0, 20000})  = 1 (in [6], left {0, 20000})&lt;br /&gt;recvfrom(6, "\0\24\"\0229+\0\23\200\6\301A\10\0E\0\0\34\252\274\0\0?\1\21z\300\2503H\300\250"..., 104, MSG_TRUNC, {sa_family=AF_PACKET, proto=0x800, if5, pkttype=PACKET_HOST, addr(6)={1, 00138006c141}, [18]) = 60&lt;br /&gt;ioctl(6, SIOCGSTAMP, 0x7fff78948b20)    = 0&lt;br /&gt;close(4)                                = 0&lt;br /&gt;close(5)                                = 0&lt;br /&gt;close(6)                                = 0&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;创建原始套接字, 向server2端口0和80发送数据包&lt;br /&gt;&lt;br /&gt;4) server2关闭iptables:&lt;br /&gt;&lt;pre class="console"&gt;$ strace nmap server2 -p22&lt;br /&gt;...&lt;br /&gt;socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3&lt;br /&gt;fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)&lt;br /&gt;fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0&lt;br /&gt;setsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1, linger=0}, 8) = 0&lt;br /&gt;connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("192.168.51.72")}, 16) = -1 EINPROGRESS (Operation now in progress)&lt;br /&gt;select(4, [3], [3], [3], {1, 0})        = 2 (in [3], out [3], left {1, 0})&lt;br /&gt;recvfrom(3, 0x7ffffaa7bed0, 255, 0, 0, 0) = -1 ECONNREFUSED (Connection refused)&lt;br /&gt;close(3)                                = 0&lt;br /&gt;...&lt;br /&gt;socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3&lt;br /&gt;fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)&lt;br /&gt;fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0&lt;br /&gt;setsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1, linger=0}, 8) = 0&lt;br /&gt;connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("192.168.51.72")}, 16) = -1 EINPROGRESS (Operation now in progress)&lt;br /&gt;select(4, [3], [3], [3], {0, 99000})    = 1 (out [3], left {0, 99000})&lt;br /&gt;getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0&lt;br /&gt;sendto(3, "", 0, 0, NULL, 0)            = 0&lt;br /&gt;getpeername(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("192.168.51.72")}, [17179869200]) = 0&lt;br /&gt;getsockname(3, {sa_family=AF_INET, sin_port=htons(34707), sin_addr=inet_addr("192.168.11.18")}, [68719476752]) = 0&lt;br /&gt;close(3)                                = 0&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;连接server2的80端口, 1次连接被拒绝(Connection refused)后, 不退出, 继续扫描22端口&lt;br /&gt;&lt;br /&gt;5) root从server3扫描server2&lt;br /&gt;&lt;pre class="console"&gt;# nmap -v -d9 --packet-trace -n server2 -p22&lt;br /&gt;&lt;br /&gt;Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-12-24 08:10 UTC&lt;br /&gt;The max # of sockets we are using is: 0&lt;br /&gt;--------------- Timing report ---------------&lt;br /&gt;  hostgroups: min 1, max 100000&lt;br /&gt;  rtt-timeouts: init 1000, min 100, max 10000&lt;br /&gt;  scan-delay: TCP 1000, UDP 1000&lt;br /&gt;  parallelism: min 0, max 0&lt;br /&gt;  max-retries: 10, host-timeout: 0&lt;br /&gt;---------------------------------------------&lt;br /&gt;Initiating ARP Ping Scan against 192.168.51.72 [1 port] at 08:10&lt;br /&gt;Pcap filter: arp and ether dst host 00:16:C0:A8:33:46&lt;br /&gt;Packet capture filter (device eth0): arp and ether dst host 00:16:C0:A8:33:46&lt;br /&gt;SENT (0.0140s) ARP who-has 192.168.51.72 tell 192.168.51.71&lt;br /&gt;**TIMING STATS**: IP, probes active/freshportsleft/retry_stack/outstanding/retranwait/onbench, cwnd/ccthresh/delay, timeout/srtt/rttvar/&lt;br /&gt;   Groupstats (1/1 incomplete): 1/*/*/*/*/* 10.00/50/* 100000/-1/-1&lt;br /&gt;   192.168.51.72: 1/0/0/1/0/0 10.00/50/0 100000/-1/-1&lt;br /&gt;RCVD (0.0150s) ARP reply 192.168.51.72 is-at 00:16:C0:A8:33:47&lt;br /&gt;Timeout vals: srtt: -1 rttvar: -1 to: 100000 delta 364 ==&gt; srtt: 364 rttvar: 5000 to: 100000&lt;br /&gt;Timeout vals: srtt: -1 rttvar: -1 to: 100000 delta 364 ==&gt; srtt: 364 rttvar: 5000 to: 100000&lt;br /&gt;The ARP Ping Scan took 0.01s to scan 1 total hosts.&lt;br /&gt;Initiating SYN Stealth Scan against 192.168.51.72 [1 port] at 08:10&lt;br /&gt;Pcap filter: dst host 192.168.51.71 and (icmp or (tcp and (src host 192.168.51.72)))&lt;br /&gt;Packet capture filter (device eth0): dst host 192.168.51.71 and (icmp or (tcp and (src host 192.168.51.72)))&lt;br /&gt;SENT (0.0380s) TCP 192.168.51.71:35569 &gt; 192.168.51.72:22 S ttl=57 id=4614 iplen=44 seq=1639929488 win=2048&lt;br /&gt;**TIMING STATS**: IP, probes active/freshportsleft/retry_stack/outstanding/retranwait/onbench, cwnd/ccthresh/delay, timeout/srtt/rttvar/&lt;br /&gt;   Groupstats (1/1 incomplete): 1/*/*/*/*/* 10.00/50/* 1000000/-1/-1&lt;br /&gt;   192.168.51.72: 1/0/0/1/0/0 10.00/50/0 100000/364/5000&lt;br /&gt;RCVD (0.0390s) TCP 192.168.51.72:22 &gt; 192.168.51.71:35569 SA ttl=64 id=0 iplen=44 seq=474347775 win=5840 ack=1639929489&lt;br /&gt;Discovered open port 22/tcp on 192.168.51.72&lt;br /&gt;Changing ping technique for 192.168.51.72 to TCP&lt;br /&gt;Timeout vals: srtt: 364 rttvar: 5000 to: 100000 delta 9 ==&gt; srtt: 365 rttvar: 3752 to: 100000&lt;br /&gt;Timeout vals: srtt: -1 rttvar: -1 to: 1000000 delta 373 ==&gt; srtt: 373 rttvar: 5000 to: 100000&lt;br /&gt;The SYN Stealth Scan took 0.01s to scan 1 total ports.&lt;br /&gt;Fetchfile found /usr/share/nmap/nmap-mac-prefixes&lt;br /&gt;&lt;br /&gt;Host 192.168.51.72 appears to be up ... good.&lt;br /&gt;Interesting ports on 192.168.51.72:&lt;br /&gt;Fetchfile found /usr/share/nmap/nmap-services&lt;br /&gt;&lt;br /&gt;PORT   STATE SERVICE&lt;br /&gt;22/tcp open  ssh&lt;br /&gt;MAC Address: 00:16:C0:A8:33:47 (Semtech)&lt;br /&gt;Final times for host: srtt: 365 rttvar: 3752  to: 100000&lt;br /&gt;&lt;br /&gt;Nmap finished: 1 IP address (1 host up) scanned in 0.142 seconds&lt;br /&gt;               Raw packets sent: 2 (86B) | Rcvd: 2 (86B)&lt;br /&gt;&lt;/pre&gt;发送ARP扫描&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. 分析&lt;br /&gt;查看nmap手册&lt;br /&gt;&lt;pre class="console"&gt;$ man nmap&lt;br /&gt;...&lt;br /&gt;HOST DISCOVERY&lt;br /&gt;       One of the very first steps in any network reconnaissance mission is to reduce a (sometimes huge) set of IP ranges into a list of active or interesting hosts. Scanning every port of every single IP address is slow and usually unnecessary. Of course what makes a host interesting depends greatly on the scan purposes. Network administrators may only be interested in hosts running a certain service, while security auditors may care about every single device with an IP address. An administrator may be comfortable using just an ICMP ping to locate hosts on his internal network, while an external penetration tester may use a diverse set of dozens of probes in an attempt to evade firewall restrictions.&lt;br /&gt;&lt;br /&gt;       Because host discovery needs are so diverse, Nmap offers a wide variety of options for customizing the techniques used. Host discovery is sometimes called ping scan, but it goes well beyond the simple ICMP echo request packets associated with the ubiquitous ping tool. Users can skip the ping step entirely with a list scan (-sL) or by disabling ping (-P0), or engage the network with arbitrary combinations of multi-port TCP SYN/ACK, UDP, and ICMP probes. The goal of these probes is to solicit responses which demonstrate that an IP address is actually active (is being used by a host or network device). On many networks, only a small percentage of IP addresses are active at any given time. This is particularly common with RFC1918-blessed private address space such as 10.0.0.0/8. That network has 16 million IPs, but I have seen it used by companies with less than a thousand machines. Host discovery can find those machines in a sparsely allocated sea of IP addresses.&lt;br /&gt;&lt;br /&gt;       If no host discovery options are given, Nmap sends a TCP ACK packet destined for port 80 and an ICMP Echo Request query to each target machine. An exception to this is that an ARP scan is used for any targets which are on a local ethernet network. For unprivileged UNIX shell users, a SYN packet is sent instead of the ack using the connect() system call. These defaults are equivalent to the -PA -PE options. This host discovery is often sufficient when scanning local networks, but a more comprehensive set of discovery probes is recommended for security auditing.&lt;br /&gt;...&lt;br /&gt;       -sP (Ping Scan)&lt;br /&gt;              This option tells Nmap to only perform a ping scan (host discovery), then print out the available hosts that responded to the scan. No further testing (such as port scanning or OS detection) is performed. This is one step more intrusive than the list scan, and can often be used for the same purposes. It allows light reconnaissance of a target network without attracting much attention. Knowing how many hosts are up is more valuable to attackers than the list provided by list scan of every single IP and host name.&lt;br /&gt;&lt;br /&gt;              Systems administrators often find this option valuable as well. It can easily be used to count available machines on a network or monitor server availability. This is often called a ping sweep, and is more reliable than pinging the broadcast address because many hosts do not reply to broadcast queries.&lt;br /&gt;&lt;br /&gt;              The -sP option sends an ICMP echo request and a TCP packet to port 80 by default. When executed by an unprivileged user, a SYN packet is sent (using a connect() call) to port 80 on the target. When a privileged user tries to scan targets on a local ethernet network, ARP requests (-PR) are used unless --send-ip was specified. The -sP option can be combined with any of the discovery probe types (the -P* options, excluding -P0) for greater flexibility. If any of those probe type and port number options are used, the default probes (ACK and echo request) are overridden. When strict firewalls are in place between the source host running Nmap and the target network, using those advanced techniques is recommended. Otherwise hosts could be missed when the firewall drops probes or their responses.&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;nmap在检测服务和端口之前, 默认首先检测主机是否是活动的, 这被称为主机发现(Host Disvocery)或ping扫描(ping scan)&lt;br /&gt;如果主机发现不通过, 则不进行后面的端口扫描&lt;br /&gt;主机发现的方式有多种, 默认方式是向主机80端口发送一个TCP ACK包, 并发送ICMP 回显请求(Echo Request)查询, 如在同一局域网则使用ARP扫描. 对于UNIX下非特权用户, 不发送ack包, 而是使用connect()系统调用发送一个SYN包.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. 结论&lt;br /&gt;1) 特权用户才可以建立原始套接字, 使用ARP, ICMP, ACK扫描&lt;br /&gt;&lt;br /&gt;2) 普通用户运行nmap扫描server1:&lt;br /&gt;nmap使用connect向80端口发送SYN, 因为server1上启动了tomcat服务, 80端口可访问, 所以主机发现成功通过&lt;br /&gt;&lt;br /&gt;3) 普通用户运行nmap扫描打开iptables的server2:&lt;br /&gt;nmap使用connect向80端口发送SYN, server2上iptables不允许访问80端口, 造成扫描超时错误, nmap认为主机不可达, 所以主机发现失败&lt;br /&gt;&lt;br /&gt;4) 普通用户运行nmap扫描关闭iptables的server2:&lt;br /&gt;nmap使用connect向80端口发送SYN, server2上没有监听80端口的服务, 造成连接被拒绝, nmap认为主机可到达, 所以主机发现通过&lt;br /&gt;&lt;br /&gt;5) 特权用户运行nmap扫描打开iptables的server2:&lt;br /&gt;nmap使用原始套接字发出ICMP回显请求, server2上iptables允许ICMP, 所以主机发现能通过&lt;br /&gt;&lt;br /&gt;6) 普通用户ping命令扫描打开iptables的server2:&lt;br /&gt;因为ping命令拥有setuid root权限, 运行时具有root权限, 可以创建原始套接字用ICMP扫描, 所以能ping通主机&lt;br /&gt;&lt;pre class="console"&gt;$ ls -l $(which ping)&lt;br /&gt;-rwsr-xr-x 1 root root 37280 Mar 14  2007 /bin/ping&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;6) 特权用户从server3扫描打开iptables的server2:&lt;br /&gt;因为server2和server3处于同一子网, 所以使用ARP扫描, ARP属于第2层数据链路层, iptables无法过滤, 所以主机发现能通过&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="http://nmap.org/book/man.html"&gt;Chapter 15. Nmap Reference Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://nmap.org/nmap_doc.html"&gt;The Art of Port Scanning - by Fyodor&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-4991340753161532184?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/4991340753161532184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=4991340753161532184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/4991340753161532184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/4991340753161532184'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/12/nmap-ping-scan.html' title='nmap ping scan'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-2497165451832746905</id><published>2009-12-17T00:18:00.007+08:00</published><updated>2009-12-17T13:26:47.752+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='support'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>How to download oracle patches from CLI</title><content type='html'>How to download oracle patches from CLI&lt;br /&gt;如何从命令行下载Oracle补丁&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Oracle的FTP下载站点已于2009年11月6号关闭, 不再提供服务, 下载补丁只能通过My Oracle Support网站&lt;br /&gt;&lt;pre class="console"&gt;$ ftp updates.oracle.com&lt;br /&gt;Connected to updates.oraclegha.com.&lt;br /&gt;421-*********************** Downtime Notice ************************&lt;br /&gt;421-&lt;br /&gt;421-This service was retired as of November 06, 2009.&lt;br /&gt;421-&lt;br /&gt;421-****************************************************************&lt;br /&gt;421&lt;br /&gt;ftp&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;其实可以用命令行工具以HTTPS方式下载补丁&lt;br /&gt;补丁的URL地址格式是:&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;https://updates.oracle.com/Orion/Services/download/?aru=&amp;lt;ARU编号&amp;gt;&lt;br /&gt;ARU(Automated Release Updates)编号可在My Oracle Support网站上查到&lt;br /&gt;1) 访问My Oracle Support网站&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/2gXVuYD-AqDZobXvYcBPuQ?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_DZ1u7Q8ZrVU/SymsFFLYQ3I/AAAAAAAADYg/M9q_RhEwaaY/s288/oraclepatch-01-home.png" alt="oraclepatch-01-home.png" title="oraclepatch-01-home.png" /&gt;&lt;/a&gt;&lt;br /&gt;2) 登录&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/eskWmDIN7ZP2Tgy4afq2Gw?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_DZ1u7Q8ZrVU/SymsFR_tJlI/AAAAAAAADYk/ALZo_68XidU/s288/oraclepatch-02-signin.png" alt="oraclepatch-02-signin.png" title="oraclepatch-02-signin.png" /&gt;&lt;/a&gt;&lt;br /&gt;3) 选择&amp;quot;Patches &amp;amp; Updates&amp;quot;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/xnuhZQ5hBZ8gIj6ajy8JaA?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_DZ1u7Q8ZrVU/SynAqbNZNyI/AAAAAAAADZQ/of5mhgLnJ0A/s288/oraclepatch-03-tab2.png" alt="oraclepatch-03-tab2.png" title="oraclepatch-03-tab2.png" /&gt;&lt;/a&gt;&lt;br /&gt;4) 查找补丁&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/sADhUsEKD8w8oTxuYNcL2Q?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_DZ1u7Q8ZrVU/SymsFtRwiwI/AAAAAAAADYs/aBHbpsxugxs/s288/oraclepatch-04-advsearch.png" alt="oraclepatch-04-advsearch.png" title="oraclepatch-04-advsearch.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/QjOorfg26-wfDVgwp8qIJg?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_DZ1u7Q8ZrVU/SymsFssefFI/AAAAAAAADYw/xlEwvDujHnU/s288/oraclepatch-05-search.png" alt="oraclepatch-05-search.png" title="oraclepatch-05-search.png" /&gt;&lt;/a&gt;&lt;br /&gt;5) 单击选择该行, 弹出菜单, 选择&amp;quot;View Read Me&amp;quot;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/EUBD4ZF4jg_zvZpN9ze6Xg?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_DZ1u7Q8ZrVU/SymsOcZA3RI/AAAAAAAADY0/KNATqpxtvu4/s288/oraclepatch-06-viewreadme.png" alt="oraclepatch-06-viewreadme.png" title="oraclepatch-06-viewreadme.png" /&gt;&lt;/a&gt;&lt;br /&gt;6) 在说明文档的URL地址栏中找到ARU编号&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/bkubhdgDLT6dQC32ebXUnQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_DZ1u7Q8ZrVU/SymsOrIlaeI/AAAAAAAADY4/I1TqziAPues/s288/oraclepatch-07-readme.png" alt="oraclepatch-07-readme.png" title="oraclepatch-07-readme.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;比如,得到10.2.0.4 Patch Set的下载地址是:&lt;br /&gt;&lt;pre&gt;https://updates.oracle.com/Orion/Services/download/?aru=10029612&lt;br /&gt;&lt;/pre&gt;然后用&lt;a href="http://www.gnu.org/software/wget/"&gt;wget&lt;/a&gt;工具下载即可, 在命令行中还需提供登录用户名和密码, 如:&lt;br /&gt;&lt;pre&gt;wget --http-user=&amp;quot;myusername&amp;quot; --http-password=&amp;quot;mypassword&amp;quot; &amp;quot;https://updates.oracle.com/Orion/Services/download/?aru=10029612&amp;quot;&lt;br /&gt;&lt;/pre&gt;对有密码保护的补丁, URL中再加上patch_password参数, 如:&lt;br /&gt;&lt;pre&gt;https://updates.oracle.com/Orion/Services/download/?aru=12345678&amp;amp;patch_password=nosuchpasswd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;wget常见问题:&lt;br /&gt;1. File name too long&lt;br /&gt;报错&amp;quot;File name too long&amp;quot;, 无法写文件&lt;br /&gt;&lt;pre class="console"&gt;Resolving oracle-updates.oracle.com... 68.142.116.74, 68.142.116.73&lt;br /&gt;Connecting to oracle-updates.oracle.com|68.142.116.74|:80... connected.&lt;br /&gt;HTTP request sent, awaiting response... 200 OK&lt;br /&gt;Length: 111,654 (109K) [application/zip]&lt;br /&gt;p8524113_10204_Linux-x86-64.zip?download_url=http:%2F%2Fupdates.oracle.com%2FARULink%2FDownload%2Fprocess_form&amp;amp;userid=o-wenxie@motorola.com&amp;amp;email=wenxie@motorola.com&amp;amp;record_download_url=http:%2F%2Fupdates.oracle.com%2FARULink%2FPatchDownload%2Fpack_stats&amp;amp;timestamp=1260979159&amp;amp;patch_password=NO_PASS&amp;amp;context=A@10+H@aaru203.oracle.com+P@&amp;amp;aru=11423647&amp;amp;patch_file=p8524113_10204_Linux-x86-64.zip&amp;amp;ip_address=123.127.66.13&amp;amp;file_id=27511963&amp;amp;use_proxy=false&amp;amp;id=ZWtXM1l3WXFjVUlEZ2YwVDFUZ1ZOQTpHOWEvMlhXSTlRTDJRL2RKbXMvejJB: File name too long&lt;br /&gt;&lt;br /&gt;Cannot write to `p8524113_10204_Linux-x86-64.zip?download_url=http:%2F%2Fupdates.oracle.com%2FARULink%2FDownload%2Fprocess_form&amp;amp;userid=o-wenxie@motorola.com&amp;amp;email=wenxie@motorola.com&amp;amp;record_download_url=http:%2F%2Fupdates.oracle.com%2FARULink%2FPatchDownload%2Fpack_stats&amp;amp;timestamp=1260979159&amp;amp;patch_password=NO_PASS&amp;amp;context=A@10+H@aaru203.oracle.com+P@&amp;amp;aru=11423647&amp;amp;patch_file=p8524113_10204_Linux-x86-64.zip&amp;amp;ip_address=123.127.66.13&amp;amp;file_id=27511963&amp;amp;use_proxy=false&amp;amp;id=ZWtXM1l3WXFjVUlEZ2YwVDFUZ1ZOQTpHOWEvMlhXSTlRTDJRL2RKbXMvejJB' (File name too long).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;需要指定下载文件名, 该文件名可从wget输出中得到&lt;br /&gt;文件名格式为:&lt;br /&gt;&lt;pre&gt;p&amp;lt;补丁编号&amp;gt;_&amp;lt;数据库版本&amp;gt;_&amp;lt;操作系统&amp;gt;.zip&lt;br /&gt;&lt;/pre&gt;如:&lt;br /&gt;&lt;pre&gt;p6810189_10204_Linux-x86-64.zip&lt;br /&gt;&lt;/pre&gt;也可在My Oracle Support查到&lt;br /&gt;1) 访问My Oracle Support网站&lt;br /&gt;2) 登录&lt;br /&gt;3) 选择&amp;quot;Patches &amp;amp; Updates&amp;quot;&lt;br /&gt;4) 查找补丁&lt;br /&gt;5) 点该行开头的补丁编号&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/KrJspCLJ26gITQGi8FimWA?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_DZ1u7Q8ZrVU/SymsOkHz2ZI/AAAAAAAADY8/2J-SwJD2Gj0/s288/oraclepatch-11-detail.png" alt="oraclepatch-11-detail.png" title="oraclepatch-11-detail.png" /&gt;&lt;/a&gt;&lt;br /&gt;6) 显示出补丁详细信息, 单击&amp;quot;Show File Details&amp;quot;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Tt0TUQEJykpcOb-x_Z-phw?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_DZ1u7Q8ZrVU/SymsOr9aOmI/AAAAAAAADZA/Hz2Rzn9WQ9A/s288/oraclepatch-12-filedetail.png" alt="oraclepatch-12-filedetail.png" title="oraclepatch-12-filedetail.png" /&gt;&lt;/a&gt;&lt;br /&gt;7) 显示出文件名&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Osnyzy0LbXKoJq3HWVpWwQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_DZ1u7Q8ZrVU/SymsOwJgIEI/AAAAAAAADZE/1b9LrRlz_jY/s288/oraclepatch-13-filename.png" alt="oraclepatch-13-filename.png" title="oraclepatch-13-filename.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在wget命令中加-O选项指定下载文件名:&lt;br /&gt;&lt;pre&gt;wget --http-user=&amp;quot;myusername&amp;quot; --http-password=&amp;quot;mypassword&amp;quot; -O &amp;quot;p6810189_10204_Linux-x86-64.zip&amp;quot; &amp;quot;https://updates.oracle.com/Orion/Services/download/?aru=11423647&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2. 加-c选项不能断点续传&lt;br /&gt;报错304 Not Modified&lt;br /&gt;&lt;pre class="console"&gt;Location: https://updates.oracle.com/Orion/Services/download/?aru=10029612 [following]&lt;br /&gt;--15:59:04--  https://updates.oracle.com/Orion/Services/download/?aru=10029612&lt;br /&gt;Connecting to updates.oracle.com|141.146.44.51|:443... connected.&lt;br /&gt;HTTP request sent, awaiting response... 302 Found&lt;br /&gt;Location: http://oracle-updates.oracle.com/ARUConnect/p6810189_10204_Linux-x86-64.zip?download_url=http%3A%2F%2Fupdates.oracle.com%2FARULink%2FDownload%2Fprocess_form&amp;amp;userid=o-wenxie%40motorola.com&amp;amp;record_download_url=http%3A%2F%2Fupdates.oracle.com%2FARULink%2FPatchDownload%2Fpack_stats&amp;amp;email=wenxie%40motorola.com&amp;amp;timestamp=1260979145&amp;amp;patch_password=NO_PASS&amp;amp;context=A%4010%2BH%40aaru204.oracle.com%2BP%40&amp;amp;ip_address=123.127.66.8&amp;amp;patch_file=p6810189_10204_Linux-x86-64.zip&amp;amp;aru=10029612&amp;amp;file_id=22503408&amp;amp;use_proxy=false&amp;amp;id=QUViSEhzNWVGZFlpMGZvVjBlRnZwQTppeWJXRk9Mc2xiVitPU2F1UTNrd21R [following]&lt;br /&gt;--15:59:05--  http://oracle-updates.oracle.com/ARUConnect/p6810189_10204_Linux-x86-64.zip?download_url=http%3A%2F%2Fupdates.oracle.com%2FARULink%2FDownload%2Fprocess_form&amp;amp;userid=o-wenxie%40motorola.com&amp;amp;record_download_url=http%3A%2F%2Fupdates.oracle.com%2FARULink%2FPatchDownload%2Fpack_stats&amp;amp;email=wenxie%40motorola.com&amp;amp;timestamp=1260979145&amp;amp;patch_password=NO_PASS&amp;amp;context=A%4010%2BH%40aaru204.oracle.com%2BP%40&amp;amp;ip_address=123.127.66.8&amp;amp;patch_file=p6810189_10204_Linux-x86-64.zip&amp;amp;aru=10029612&amp;amp;file_id=22503408&amp;amp;use_proxy=false&amp;amp;id=QUViSEhzNWVGZFlpMGZvVjBlRnZwQTppeWJXRk9Mc2xiVitPU2F1UTNrd21R&lt;br /&gt;Resolving oracle-updates.oracle.com... 68.142.116.74, 68.142.116.73&lt;br /&gt;Connecting to oracle-updates.oracle.com|68.142.116.74|:80... connected.&lt;br /&gt;HTTP request sent, awaiting response... 304 Not Modified&lt;br /&gt;15:59:05 ERROR 304: Not Modified.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;同样需要指定下载文件名:&lt;br /&gt;&lt;pre&gt;wget --http-user=&amp;quot;myusername&amp;quot; --http-password=&amp;quot;mypassword&amp;quot; -c -O &amp;quot;p6810189_10204_Linux-x86-64.zip&amp;quot; &amp;quot;https://updates.oracle.com/Orion/Services/download/?aru=11423647&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. HTTPS证书出错&lt;br /&gt;加上--no-check-certificate选项&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="https://support.oracle.com/CSP/main/article?cmd=show&amp;type=NOT&amp;id=841061.1"&gt;Classic MetaLink and My Oracle Support Transition Information Page&lt;/a&gt;&lt;br /&gt;&lt;a href="http://only4left.jpiwowar.com/2009/02/retrieving-oracle-patches-with-wget/"&gt;Retrieving Oracle patches with wget&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.sun.com/patch/entry/automating_patch_downloads_with_wget"&gt;Automated 'wget' patch downloads: issue resolution&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-2497165451832746905?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/2497165451832746905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=2497165451832746905' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2497165451832746905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2497165451832746905'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/12/how-to-download-oracle-patches-from-cli.html' title='How to download oracle patches from CLI'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_DZ1u7Q8ZrVU/SymsFFLYQ3I/AAAAAAAADYg/M9q_RhEwaaY/s72-c/oraclepatch-01-home.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-3769456850141772784</id><published>2009-11-23T16:07:00.003+08:00</published><updated>2009-11-23T16:09:27.883+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>trim spaces from a shell string</title><content type='html'>how to remove leading and trailing spaces from a shell variable?&lt;br /&gt;如何删除shell字符串变量中的前缀的和后缀的空格?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;var=&amp;quot;   hello world!    &amp;quot;&lt;br /&gt;echo &amp;quot;var=\&amp;quot;$var\&amp;quot;&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;var=&amp;quot;   hello world!    &amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;1. echo&lt;br /&gt;&lt;pre&gt;newvar=$(echo $var)&lt;br /&gt;echo &amp;quot;newvar=\&amp;quot;$newvar\&amp;quot;&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;newvar=&amp;quot;hello world!&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. &lt;a href="http://tldp.org/LDP/abs/html/parameter-substitution.html"&gt;Parameter Substitution&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;newvar=${var#&amp;quot;${var%%[![:blank:]]*}&amp;quot;}&lt;br /&gt;newvar=${newvar%&amp;quot;${newvar##*[![:blank:]]}&amp;quot;}&lt;br /&gt;echo &amp;quot;newvar=\&amp;quot;$newvar\&amp;quot;&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;newvar=&amp;quot;hello world!&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. &lt;a href="http://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html"&gt;Pattern Matching&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;shopt -s extglob&lt;br /&gt;newvar=${var##+( )}&lt;br /&gt;newvar=${newvar%%+( )}&lt;br /&gt;shopt -u extglob&lt;br /&gt;echo &amp;quot;newvar=\&amp;quot;$newvar\&amp;quot;&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;newvar=&amp;quot;hello world!&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;4. sed&lt;br /&gt;&lt;pre&gt;newvar=$(echo &amp;quot;$var&amp;quot;|sed 's/\(^[[:blank:]]\+\|[[:blank:]]\+$\)//g')&lt;br /&gt;echo &amp;quot;newvar=\&amp;quot;$newvar\&amp;quot;&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;newvar=&amp;quot;hello world!&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5. awk&lt;br /&gt;&lt;pre&gt;newvar=$(echo &amp;quot;$var&amp;quot;|awk 'gsub(/^[[:blank:]]+|[[:blank:]]+$/,&amp;quot;&amp;quot;)')&lt;br /&gt;echo &amp;quot;newvar=\&amp;quot;$newvar\&amp;quot;&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;newvar=&amp;quot;hello world!&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-3769456850141772784?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/3769456850141772784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=3769456850141772784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/3769456850141772784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/3769456850141772784'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/11/trim-spaces-from-shell-string.html' title='trim spaces from a shell string'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-4330720025349944767</id><published>2009-10-30T17:21:00.000+08:00</published><updated>2009-10-30T17:21:01.156+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><title type='text'>how to resync a broken master-master replication</title><content type='html'>how to resync a broken master-master replication&lt;br /&gt;&lt;br /&gt;[still in draft]&lt;br /&gt;&lt;br /&gt;db01:3306 and db03:3306 are setting up with master-master replicaition.&lt;br /&gt;&lt;br /&gt;in db03 the slave process is accidentally stopped for quite a long time that caused by a wrong configuration, after resolving the problem, dual master replication seems to start working, but unfortunately binary logs were delete older than x days, many tables has got out of date or even lost in db03, recreating the slave db is not acceptable, we have to find a more efficient way to make thier data resync again.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. stop replication from db03 to db01&lt;br /&gt;login db01&lt;br /&gt;&lt;pre&gt;show slave status\G&lt;br /&gt;stop slave;&lt;br /&gt;show slave status\G&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. dump sql script for recreating table structure later&lt;br /&gt;login db01&lt;br /&gt;&lt;pre&gt;DB_LIST=$(mysql -u root --batch --skip-column-names -e 'show databases;'|sed '/^information_schema$\|^mysql$\|^test$/d'|tr '\n' ' ')&lt;br /&gt;mysqldump -u root --no-data --skip-add-drop-table --databases $DB_LIST &amp;gt;$HOME/db01-3306-db.sql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;login db03&lt;br /&gt;&lt;pre&gt;DB_LIST=$(mysql -u root --batch --skip-column-names -e 'show databases;'|sed '/^information_schema$\|^mysql$\|^test$/d'|tr '\n' ' ')&lt;br /&gt;mysqldump -u root --no-data --skip-add-drop-table --databases $DB_LIST &amp;gt;$HOME/db03-3306-db.sql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. recreate lost tables&lt;br /&gt;login db03&lt;br /&gt;&lt;pre&gt;scp db01:db01-3306-db.sql $HOME/&lt;br /&gt;mysql -u root --force &amp;lt;$HOME/db01-3306-db.sql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;login db01&lt;br /&gt;&lt;pre&gt;scp db03:db03-3306-db.sql $HOME/&lt;br /&gt;mysql -u root --force &amp;lt;$HOME/db03-3306-db.sql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4. solve slave sql issues in db03, if any&lt;br /&gt;login db03&lt;br /&gt;&lt;pre&gt;show slave status\G&lt;br /&gt;set global sql_slave_skip_counter=1;&lt;br /&gt;start slave;&lt;br /&gt;show slave status\G&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;now db01 and db03 are actually working in master-slave replication.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. check data consistency between db01 and db03&lt;br /&gt;run mk-table-checksum against db01, it will execute sql queries to calculate crc checksum of tables in db01, then in db02 the same queries will run too, and calculate checksum in db02, finally we will get checksums of both databases.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;mk-table-checksum --ignore-databases=mysql,test --replicate mysql.checksum --empty-replicate-table --create-replicate-table h=db01,P=3306,u=webuser&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;6. sync table records from db01 to db03&lt;br /&gt;run mk-table-sync with dry-run or print option, see what will happen in db03, it will not actually take any actions.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;mk-table-sync --dry-run --ignore-databases=mysql,test --sync-to-master --replicate=mysql.checksum h=db03,P=3306,u=webuser&lt;br /&gt;mk-table-sync --print --ignore-databases=mysql,test --sync-to-master --replicate=mysql.checksum h=db03,P=3306,u=webuser&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;actually sync table data&lt;br /&gt;&lt;pre&gt;mk-table-sync --execute --ignore-databases=mysql,test --sync-to-master --replicate=mysql.checksum h=db03,P=3306,u=webuser&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;7. known issue&lt;br /&gt;"Can't make changes on the master: no unique index exists at /usr/bin/mk-table-sync line 3775.  while doing dbtest.t"&lt;br /&gt;solution: create unique index on the table&lt;br /&gt;it is not a perfect solution, because there may be no suitable columns for defining an unique index, or there may be duplicate records in the table.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8. check to see if all data in both databases are identical&lt;br /&gt;&lt;pre&gt;mk-table-checksum --ignore-databases=mysql,test -P 3306 -u webuser db01 db03|mk-checksum-filter&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;9. start replication from db03 to db01&lt;br /&gt;login db01&lt;br /&gt;&lt;pre&gt;show slave status\G&lt;br /&gt;start slave;&lt;br /&gt;show slave status\G&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;10. external links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.maatkit.org/doc/mk-table-checksum.html"&gt;mk-table-checksum&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.maatkit.org/doc/mk-table-sync.html"&gt;mk-table-sync&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.xaprb.com/blog/2008/02/29/how-to-sync-tables-in-master-master-mysql-replication/"&gt;How to sync tables in master-master MySQL replication&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.dbadojo.com/2008/03/mysql-master-master-replication-table.html"&gt;MySQL Master-Master replication table sync&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pythian.com/news/1156"&gt;Maatkit Options for Restoring a Slave or Master&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.paragon-cs.com/wordpress/2008/03/12/tip-of-the-day-checking-your-tables/"&gt;Tip of the Day — Checking Your Tables — Part I&lt;/a&gt;&lt;br /&gt;&lt;a href="http://learninglamp.wordpress.com/2009/09/14/sync-up-a-mysql-slave-with-mk-table-sync/"&gt;Sync up a MySQL slave with mk-table-sync&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hackmysql.com/blog/2009/10/23/mk-table-sync-and-small-tables/"&gt;mk-table-sync and small tables&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-4330720025349944767?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/4330720025349944767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=4330720025349944767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/4330720025349944767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/4330720025349944767'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/10/how-to-resync-broken-master-master.html' title='how to resync a broken master-master replication'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-9169704095478364881</id><published>2009-10-27T12:19:00.000+08:00</published><updated>2009-10-27T12:19:03.896+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>how to generate sequence in bash</title><content type='html'>how to generate sequence in bash&lt;br /&gt;BASH脚本如何产生序号&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. BASH FOR循环结构(&lt;a href="http://www.gnu.org/software/bash/manual/html_node/Looping-Constructs.html"&gt;Looping Constructs&lt;/a&gt;)&lt;br /&gt;&lt;pre class="console"&gt;$ for ((a=1;a&amp;lt;=5;a++));do echo $a;done&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;&lt;/pre&gt;这种用法只能在FOR循环中使用&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. BASH大括号扩展机制(&lt;a href="http://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html"&gt;Brace Expansion&lt;/a&gt;)&lt;br /&gt;&lt;pre class="console"&gt;$ echo {1..10}&lt;br /&gt;1 2 3 4 5 6 7 8 9 10&lt;br /&gt;$ echo {z..a}&lt;br /&gt;z y x w v u t s r q p o n m l k j i h g f e d c b a&lt;br /&gt;&lt;/pre&gt;bash第4版增加了功能,可指定步长&lt;br /&gt;&lt;br /&gt;开头补零:&lt;br /&gt;&lt;pre class="console"&gt;$ printf &amp;quot;%02d &amp;quot; {6..12}&lt;br /&gt;06 07 08 09 10 11 12 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. &lt;a href="http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html"&gt;seq&lt;/a&gt;命令&lt;br /&gt;seq命令是属于coreutils包的一个工具, 用于生成一组数字序列号, 如:&lt;br /&gt;&lt;pre class="console"&gt;$ seq 1 2 10&lt;br /&gt;1&lt;br /&gt;3&lt;br /&gt;5&lt;br /&gt;7&lt;br /&gt;9&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;开头补零:&lt;br /&gt;&lt;pre class="console"&gt;$ seq -f %02.0f 6 12&lt;br /&gt;06&lt;br /&gt;07&lt;br /&gt;08&lt;br /&gt;09&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4. awk&lt;br /&gt;&lt;pre class="console"&gt;$ awk 'BEGIN {for (i=1;i&amp;lt;=5;i++) print i}'&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5. &lt;a href="http://tldp.org/LDP/abs/html/extmisc.html"&gt;jot&lt;/a&gt;&lt;br /&gt;BSD系统中提供, 可以产生序列,随机数&lt;br /&gt;&lt;a href="http://oreilly.com/catalog/upt2/examples/#jot"&gt;jot - UNIX Power Tools, 2nd Edition&lt;/a&gt;&lt;br /&gt;&lt;a href="http://administratosphere.wordpress.com/2009/01/23/using-bsd-jot/"&gt;Using BSD jot&lt;/a&gt;&lt;br /&gt;&lt;a href="http://freshmeat.net/projects/bsd-jot/"&gt;jot (BSD)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.freebsd.org/cgi/man.cgi?query=jot&amp;apropos=0&amp;sektion=0&amp;manpath=FreeBSD+7.2-RELEASE&amp;format=html"&gt;JOT(1)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-9169704095478364881?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/9169704095478364881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=9169704095478364881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/9169704095478364881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/9169704095478364881'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/10/how-to-generate-sequence-in-bash.html' title='how to generate sequence in bash'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-1397935397170999290</id><published>2009-10-26T15:41:00.003+08:00</published><updated>2009-10-26T15:46:54.306+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><title type='text'>monitoring io statistics by process</title><content type='html'>monitoring io statistics by process&lt;br /&gt;监控进程的IO统计信息&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. I/O accounting&lt;br /&gt;Linux内核2.6.20增加了IO审计功能, 要使用这个功能需要首先在编译内核时打开TASK_DELAY_ACCT和TASK_IO_ACCOUNTING参数&lt;br /&gt;RedHat Linux在内核2.6.18-144之后也加入了该功能, 并在RHEL5.4版本(kernel 2.6.18-164)中发布, 可以直接使用&lt;br /&gt;&lt;br /&gt;一些基于IO审计的监控工具:&lt;br /&gt;1)&lt;a href="http://guichaz.free.fr/iotop"&gt;IOtop&lt;/a&gt;&lt;br /&gt;Iotop is a Python program with a top like UI used to show of behalf of which process is the I / O going on. It requires Python ≥ 2.5 and a Linux kernel ≥ 2.6.20 with the TASK_DELAY_ACCT and TASK_IO_ACCOUNTING options enabled. It requires Python ≥ 2.5 and ≥ Linux kernel 2.6.20 with the TASK_DELAY_ACCT and TASK_IO_ACCOUNTING options enabled.&lt;br /&gt;&lt;br /&gt;2)&lt;a href="http://pagesperso-orange.fr/sebastien.godard/man_pidstat.html"&gt;pidstat&lt;/a&gt;(SYSSTAT工具之一)&lt;br /&gt;Report I/O statistics (kernels 2.6.20 and later only)&lt;br /&gt;&lt;br /&gt;3)&lt;a href="http://dag.wieers.com/home-made/dstat/"&gt;Dstat: Versatile resource statistics tool&lt;/a&gt;&lt;br /&gt;0.6.7 版本后支持显示topio,topbio&lt;br /&gt;&lt;br /&gt;4)&lt;a href="http://htop.sourceforge.net/"&gt;htop - an interactive process viewer for Linux&lt;/a&gt;&lt;br /&gt;显示RBYTES,WBYTES,IO_RATE等列&lt;br /&gt;&lt;br /&gt;5)&lt;a href="http://collectl.sourceforge.net/"&gt;collectl - Process I/O Stats&lt;/a&gt;&lt;br /&gt;2.4.0版本之后支持显示io统计信息, 见&lt;a href="http://collectl.sourceforge.net/ProcessIOStats.html"&gt;Process I/O Stats&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;外部链接&lt;br /&gt;&lt;a href="http://dag.wieers.com/blog/red-hat-backported-io-accounting-to-rhel5"&gt;Red Hat backported I/O accounting to RHEL5&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.4/html-single/Release_Notes/#sect-Release_Notes-Kernel_Related_Updates"&gt;Red Hat Enterprise Linux 5.4 - Release Notes&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. &lt;a href="https://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.4/html/Deployment_Guide/s3-proc-sys-vm.html"&gt;block_dump&lt;/a&gt;&lt;br /&gt;设置内核参数block_dump为非零值, 内核将报告所有磁盘读写操作和脏块刷新的信息&lt;br /&gt;&lt;br /&gt;下载iodump脚本, 用于分析处理内核报告&lt;br /&gt;&lt;pre&gt;wget http://maatkit.googlecode.com/svn/trunk/util/iodump&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;打开block_dump&lt;br /&gt;&lt;pre&gt;echo 1 &gt; /proc/sys/vm/block_dump&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;通过iodump分析dmesg输出的内核报告&lt;br /&gt;&lt;pre&gt;while true; do sleep 1; dmesg -c; done | perl iodump&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;运行一会儿, 按Ctrl-c停止输出, 得到类似下面的结果&lt;br /&gt;&lt;pre class="console"&gt;# while true; do sleep 1; dmesg -c; done | perl iodump&lt;br /&gt;# Caught SIGINT.&lt;br /&gt;TASK                   PID      TOTAL       READ      WRITE      DIRTY DEVICES&lt;br /&gt;kjournald              478       1294          0       1294          0 sda2&lt;br /&gt;pdflush              21422        857          0        857          0 sda5, sdb6&lt;br /&gt;kjournald             1752        365          0        365          0 sda5&lt;br /&gt;kjournald             1758        174          0        174          0 sdb6&lt;br /&gt;kjournald             1756         52          0         52          0 sdb5&lt;br /&gt;syslogd              26752         28          0         28          0 sdb6&lt;br /&gt;firefox              12811         27         27          0          0 sdb5&lt;br /&gt;perl                  3003         25         25          0          0 sda2&lt;br /&gt;process_perfdat       3026         12         12          0          0 sda5&lt;br /&gt;bash                 14749          3          3          0          0 sda2&lt;br /&gt;firefox              12654          3          3          0          0 sdb5&lt;br /&gt;bash                  3004          2          2          0          0 sda2&lt;br /&gt;bash                  3017          1          1          0          0 sda2&lt;br /&gt;squid                25555          1          1          0          0 sda2&lt;br /&gt;check_nrpe            3001          1          1          0          0 sda2&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;最后关闭block_dump&lt;br /&gt;&lt;pre&gt;echo 0 &gt; /proc/sys/vm/block_dump&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="http://www.linuxinsight.com/proc_sys_vm_block_dump.html"&gt;block_dump&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/"&gt;How to find per-process I/O statistics on Linux&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sprocket.io/blog/2006/05/monitoring-filesystem-activity-under-linux-with-block_dump/"&gt;Monitoring filesystem activity under Linux with block_dump&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/249570/"&gt;How can I record what process or kernel activity is using the disk in GNU/Linux?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.scriptbits.net/2009/07/how-to-identify-what-processes-are-generating-io-wait-load/"&gt;How to identify what processes are generating IO Wait load.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;3. &lt;a href="http://git.kernel.org/?p=linux/kernel/git/axboe/blktrace.git"&gt;blktrace&lt;/a&gt;&lt;br /&gt;支持block trace的内核版本:&lt;br /&gt;– Patch for Linux 2.6.14rc3&lt;br /&gt;(or later, up to 2.6.17)&lt;br /&gt;– Linux 2.6.17 (or later) – built in&lt;br /&gt;&lt;br /&gt;安装&lt;br /&gt;&lt;pre&gt;yum -y install blktrace&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;挂载&lt;a href="http://lwn.net/Articles/115405/"&gt;debugfs&lt;/a&gt;文件系统&lt;br /&gt;&lt;pre&gt;mount -t debugfs debugfs /sys/kernel/debug&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;运行blktrace&lt;br /&gt;&lt;pre&gt;blktrace -d /dev/sda2 -o - | blkparse -i - -s&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;运行一段时间后, CTRL-C退出, 显示统计信息:&lt;br /&gt;&lt;pre class="console"&gt;...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;  8,2    0     1576     0.618648628   478  U   N [kjournald] 1&lt;br /&gt;  8,2    0     1577     0.618669180     0  C   W 375869 + 128 [0]&lt;br /&gt;  8,2    0     1578     0.618763920   478  Q   W 376045 + 8 [kjournald]&lt;br /&gt;  8,2    0     1579     0.618765468   478  G   W 376045 + 8 [kjournald]&lt;br /&gt;  8,2    0     1580     0.618766125   478  P   N [kjournald]&lt;br /&gt;  8,2    0     1581     0.618766440   478  I   W 376045 + 8 [kjournald]&lt;br /&gt;  8,2    0     1582     0.618767278   478  U   N [kjournald] 1&lt;br /&gt;  8,2    0     1583     0.618768643   478  D   W 376045 + 8 [kjournald]&lt;br /&gt;  8,2    0     1584     0.618824993     0  C   W 376045 + 8 [0]&lt;br /&gt;blktrace (5609)&lt;br /&gt; Reads Queued:           0,        0KiB  Writes Queued:           0,        0KiB&lt;br /&gt; Read Dispatches:        0,        0KiB  Write Dispatches:        2,        8KiB&lt;br /&gt; Reads Requeued:         0               Writes Requeued:         0&lt;br /&gt; Reads Completed:        0,        0KiB  Writes Completed:        2,       12KiB&lt;br /&gt; Read Merges:            0,        0KiB  Write Merges:            0,        0KiB&lt;br /&gt; IO unplugs:             0               Timer unplugs:           0&lt;br /&gt; Allocation wait:        0               Allocation wait:         0&lt;br /&gt; Dispatch wait:          0               Dispatch wait:           0&lt;br /&gt; Completion wait:        0               Completion wait:         0&lt;br /&gt;kjournald (478)&lt;br /&gt; Reads Queued:           0,        0KiB  Writes Queued:         330,    1,320KiB&lt;br /&gt; Read Dispatches:        0,        0KiB  Write Dispatches:       42,    1,320KiB&lt;br /&gt; Reads Requeued:         0               Writes Requeued:         0&lt;br /&gt; Reads Completed:        0,        0KiB  Writes Completed:        4,       76KiB&lt;br /&gt; Read Merges:            0,        0KiB  Write Merges:          288,    1,152KiB&lt;br /&gt; IO unplugs:            12               Timer unplugs:           0&lt;br /&gt; Allocation wait:        0               Allocation wait:         0&lt;br /&gt; Dispatch wait:          0               Dispatch wait:           0&lt;br /&gt; Completion wait:        0               Completion wait:         0&lt;br /&gt;nagios (5574)&lt;br /&gt; Reads Queued:           0,        0KiB  Writes Queued:           0,        0KiB&lt;br /&gt; Read Dispatches:        0,        0KiB  Write Dispatches:        0,        0KiB&lt;br /&gt; Reads Requeued:         0               Writes Requeued:         0&lt;br /&gt; Reads Completed:        0,        0KiB  Writes Completed:        1,       16KiB&lt;br /&gt; Read Merges:            0,        0KiB  Write Merges:            0,        0KiB&lt;br /&gt; IO unplugs:             0               Timer unplugs:           0&lt;br /&gt; Allocation wait:        0               Allocation wait:         0&lt;br /&gt; Dispatch wait:          0               Dispatch wait:           0&lt;br /&gt; Completion wait:        0               Completion wait:         0&lt;br /&gt;pdflush (776)&lt;br /&gt; Reads Queued:           0,        0KiB  Writes Queued:         126,      504KiB&lt;br /&gt; Read Dispatches:        0,        0KiB  Write Dispatches:       33,      132KiB&lt;br /&gt; Reads Requeued:         0               Writes Requeued:         0&lt;br /&gt; Reads Completed:        0,        0KiB  Writes Completed:       33,      136KiB&lt;br /&gt; Read Merges:            0,        0KiB  Write Merges:            1,        4KiB&lt;br /&gt; IO unplugs:             0               Timer unplugs:           0&lt;br /&gt; Allocation wait:        0               Allocation wait:         0&lt;br /&gt; Dispatch wait:          0               Dispatch wait:           0&lt;br /&gt; Completion wait:        0               Completion wait:         0&lt;br /&gt;swapper (0)&lt;br /&gt; Reads Queued:           0,        0KiB  Writes Queued:           0,        0KiB&lt;br /&gt; Read Dispatches:        0,        0KiB  Write Dispatches:      131,      536KiB&lt;br /&gt; Reads Requeued:         0               Writes Requeued:         0&lt;br /&gt; Reads Completed:        0,        0KiB  Writes Completed:      233,    2,404KiB&lt;br /&gt; Read Merges:            0,        0KiB  Write Merges:            0,        0KiB&lt;br /&gt; IO unplugs:             0               Timer unplugs:           0&lt;br /&gt; Allocation wait:        0               Allocation wait:         0&lt;br /&gt; Dispatch wait:          0               Dispatch wait:           0&lt;br /&gt; Completion wait:        0               Completion wait:         0&lt;br /&gt;&lt;br /&gt;CPU0 (8,2):&lt;br /&gt; Reads Queued:           0,        0KiB  Writes Queued:         456,    1,824KiB&lt;br /&gt; Read Dispatches:        0,        0KiB  Write Dispatches:      208,    1,996KiB&lt;br /&gt; Reads Requeued:         0               Writes Requeued:         0&lt;br /&gt; Reads Completed:        0,        0KiB  Writes Completed:      273,    2,644KiB&lt;br /&gt; Read Merges:            0,        0KiB  Write Merges:          289,    1,156KiB&lt;br /&gt; Read depth:             0               Write depth:            20&lt;br /&gt; IO unplugs:            11               Timer unplugs:           0&lt;br /&gt;CPU2 (8,2):&lt;br /&gt; Reads Queued:           0,        0KiB  Writes Queued:           0,        0KiB&lt;br /&gt; Read Dispatches:        0,        0KiB  Write Dispatches:        0,        0KiB&lt;br /&gt; Reads Requeued:         0               Writes Requeued:         0&lt;br /&gt; Reads Completed:        0,        0KiB  Writes Completed:        0,        0KiB&lt;br /&gt; Read Merges:            0,        0KiB  Write Merges:            0,        0KiB&lt;br /&gt; Read depth:             0               Write depth:            20&lt;br /&gt; IO unplugs:             1               Timer unplugs:           0&lt;br /&gt;&lt;br /&gt;Total (8,2):&lt;br /&gt; Reads Queued:           0,        0KiB  Writes Queued:         456,    1,824KiB&lt;br /&gt; Read Dispatches:        0,        0KiB  Write Dispatches:      208,    1,996KiB&lt;br /&gt; Reads Requeued:         0               Writes Requeued:         0&lt;br /&gt; Reads Completed:        0,        0KiB  Writes Completed:      273,    2,644KiB&lt;br /&gt; Read Merges:            0,        0KiB  Write Merges:          289,    1,156KiB&lt;br /&gt; IO unplugs:            12               Timer unplugs:           0&lt;br /&gt;&lt;br /&gt;Throughput (R/W): 0KiB/s / 4,278KiB/s&lt;br /&gt;Events (8,2): 1,585 entries&lt;br /&gt;Skips: 0 forward (0 -   0.0%)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;最后卸载debug文件系统&lt;br /&gt;&lt;pre&gt;umount /sys/kernel/debug&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="http://www.gelato.org/pdf/apr2006/gelato_ICE06apr_blktrace_brunelle_hp.pdf"&gt;Block I/O Layer Tracing: blktrace&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pdfedit.petricek.net/bt/file_download.php?file_id=17&amp;type=bug"&gt;blktrace User Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.anchor.com.au/blog/2009/02/tracing-io-usage-on-linux/"&gt;Tracing I/O usage on Linux&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. &lt;a href="http://www.atcomputing.nl/Tools/atop/"&gt;atop&lt;/a&gt;&lt;br /&gt;对内核源码打补丁, 能够支持显示每个进程的IO&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. &lt;a href="http://sourceware.org/systemtap/"&gt;systemtap&lt;/a&gt;&lt;br /&gt;例子见&lt;a href="All praise systemtap"&gt;http://bpineau.livejournal.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6. DTrace&lt;br /&gt;Solaris专用&lt;br /&gt;iotop脚本见&lt;a href="http://prefetch.net/articles/solaris.dtracetopten.html"&gt;Top Ten DTrace (D) Scripts&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.brendangregg.com/DTrace/iotop"&gt;iotop - display top disk I/O events by process.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7. 其它&lt;br /&gt;&lt;a href="http://yong321.freeshell.org/freeware/pio.html"&gt;pio and topio&lt;/a&gt;: for solaris,hp-ux,windows&lt;br /&gt;&lt;a href="http://www.brendangregg.com/psio.html"&gt;Psio + other disk I/O by process tools&lt;/a&gt;: for solaris only&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-1397935397170999290?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/1397935397170999290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=1397935397170999290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/1397935397170999290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/1397935397170999290'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/10/monitoring-io-statistics-by-process.html' title='monitoring io statistics by process'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-2670116067873942750</id><published>2009-10-20T18:35:00.001+08:00</published><updated>2009-10-20T18:48:02.446+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>setting up pitrtools</title><content type='html'>setting up pitrtools&lt;br /&gt;&lt;br /&gt;&lt;a href="https://projects.commandprompt.com/public/pitrtools"&gt;pitrtools&lt;/a&gt;也是一种管理postgresql备库的工具集, 由2个python编写的小脚本组成&lt;br /&gt;&lt;a href="https://projects.commandprompt.com/public/pitrtools/browser/branches/1.2/cmd_archiver.README"&gt;cmd_archiver&lt;/a&gt;, 调用rsync复制归档日志文件, 支持向多个备用库服务器传输文件, 这里简单介绍了传输文件的流程&lt;a href="http://www.commandprompt.com/blogs/joshua_drake/2009/01/pitrtools_multiple_slave_support/"&gt;PITRTools: Multiple slave support&lt;/a&gt;&lt;br /&gt;&lt;a href="https://projects.commandprompt.com/public/pitrtools/browser/branches/1.2/cmd_standby.README"&gt;cmd_standby&lt;/a&gt;, 将数据库从主库备份到备库, 调用pg_standby在备库上应用归档日志&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. 测试环境:&lt;br /&gt;primary(master) db: pgdb01&lt;br /&gt;standby(slave) db: pgdb02&lt;br /&gt;db version: Postgresql 8.3.7&lt;br /&gt;os version: CentOS 5.3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. 配置ssh登录&lt;br /&gt;略, 见前篇博客&lt;a href="setting-up-postgresql-warm-standby.html"&gt;setting up postgresql warm standby&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. 安装Pitrtools&lt;br /&gt;登录pgdb01,pgdb02, 下载安装&lt;br /&gt;&lt;pre&gt;wget -O - http://files.commandprompt.com/pitrtools/pitrtools-1.2.tar.bz2|tar -C $HOME -jxf -&lt;br /&gt;chmod +x $HOME/pitrtools-1.2/{cmd_archiver,cmd_standby}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4. 主库配置archiver&lt;br /&gt;&lt;br /&gt;编辑配置文件&lt;br /&gt;&lt;pre&gt;cat &amp;gt;$HOME/pitrtools-1.2/cmd_archiver.ini &amp;lt;&amp;lt;EOF&lt;br /&gt;[DEFAULT]&lt;br /&gt;state: online&lt;br /&gt;pgdata: /var/lib/pgsql/data&lt;br /&gt;r_archivedir: /var/lib/pgsql/archive&lt;br /&gt;l_archivedir: /var/lib/pgsql/archive&lt;br /&gt;rsync_bin: /usr/bin/rsync&lt;br /&gt;rsync_version = 2&lt;br /&gt;slaves: pgdb02&lt;br /&gt;user: postgres&lt;br /&gt;timeout: 10&lt;br /&gt;notify_ok: echo OK&lt;br /&gt;notify_warning:  echo WARNING&lt;br /&gt;notify_critical: echo CRITICAL&lt;br /&gt;debug: on&lt;br /&gt;ssh_debug: off&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;初始化建归档目录&lt;br /&gt;&lt;pre&gt;$HOME/pitrtools-1.2/cmd_archiver -C $HOME/pitrtools-1.2/cmd_archiver.ini -I&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;We are initializing queues, one moment.&lt;br /&gt;&lt;br /&gt;NOTICE: init_env_func()&lt;br /&gt;NOTICE: generate_slave_list_func()&lt;br /&gt;NOTICE: Your slaves are: ['pgdb02']&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;为备库建归档日志目录&lt;br /&gt;&lt;pre&gt;ssh pgdb02 "mkdir -p /var/lib/pgsql/archive"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;为cmd_standby创建辅助函数&lt;br /&gt;&lt;pre&gt;psql -U postgres &amp;lt;$HOME/pitrtools-1.2/cmd_standby.sql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5. 主库打开归档模式&lt;br /&gt;&lt;pre&gt;sed -i &amp;quot;&lt;br /&gt;\$a \&lt;br /&gt;archive_mode = 'on'\\&lt;br /&gt;archive_command = '\$HOME/pitrtools-1.2/cmd_archiver -C \$HOME/pitrtools-1.2/cmd_archiver.ini -F %p \&amp;gt;\&amp;gt;\$HOME/pitrtools-1.2/cmd_archiver.\$(date \&amp;quot;+%%Y%%m%%d\&amp;quot;).log'&lt;br /&gt;/^archive_timeout/s/^/#/g&lt;br /&gt;/^archive_mode\|^archive_command/d&lt;br /&gt;&amp;quot; /var/lib/pgsql/data/postgresql.conf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;pg_ctl restart -m fast&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;6. 备库配置standby&lt;br /&gt;&lt;pre&gt;cat &amp;gt;$HOME/pitrtools-1.2/cmd_standby.ini &amp;lt;&amp;lt;EOF&lt;br /&gt;[DEFAULT]&lt;br /&gt;pgversion: 8.3&lt;br /&gt;numarchives: 10&lt;br /&gt;ssh: /usr/bin/ssh&lt;br /&gt;rsync: /usr/bin/rsync&lt;br /&gt;pg_standby: /usr/bin/pg_standby&lt;br /&gt;pg_ctl: /usr/bin/pg_ctl&lt;br /&gt;r_psql: /usr/bin/psql&lt;br /&gt;port: 5432&lt;br /&gt;master_public_ip: pgdb01&lt;br /&gt;master_local_ip: 127.0.0.1&lt;br /&gt;user: postgres&lt;br /&gt;debug: off&lt;br /&gt;ssh_timeout: 30&lt;br /&gt;archivedir: /var/lib/pgsql/archive&lt;br /&gt;pgdata: /var/lib/pgsql/data&lt;br /&gt;postgresql_conf: $HOME/pitrtools-1.2/postgresql.conf&lt;br /&gt;pg_hba_conf: $HOME/pitrtools-1.2/pg_hba.conf&lt;br /&gt;notify_critical: echo critical.&lt;br /&gt;notify_warning: echo warning.&lt;br /&gt;notify_ok: echo ok.&lt;br /&gt;action_failover: echo failover.&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;初始化创建备库目录&lt;br /&gt;&lt;pre&gt;scp pgdb01:/var/lib/pgsql/data/postgresql.conf $HOME/pitrtools-1.2/&lt;br /&gt;scp pgdb01:/var/lib/pgsql/data/pg_hba.conf $HOME/pitrtools-1.2/&lt;br /&gt;sed -i '/^archive_/s/^/#/g' $HOME/pitrtools-1.2/postgresql.conf&lt;br /&gt;rm -rf /var/lib/pgsql/data&lt;br /&gt;$HOME/pitrtools-1.2/cmd_standby -C $HOME/pitrtools-1.2/cmd_standby.ini -I&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;7. 备份主库到备库&lt;br /&gt;&lt;pre&gt;$HOME/pitrtools-1.2/cmd_standby -C $HOME/pitrtools-1.2/cmd_standby.ini -B&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;8. 启动备库&lt;br /&gt;&lt;pre&gt;cp -p $HOME/pitrtools-1.2/{postgresql.conf,pg_hba.conf} /var/lib/pgsql/data/&lt;br /&gt;$HOME/pitrtools-1.2/cmd_standby -C $HOME/pitrtools-1.2/cmd_standby.ini -S&lt;br /&gt;&lt;/pre&gt;至此备库配置完成&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;9. 测试主库是否连通&lt;br /&gt;&lt;pre class="console"&gt;$ $HOME/pitrtools-1.2/cmd_standby -C $HOME/pitrtools-1.2/cmd_standby.ini -P&lt;br /&gt;SUCCESS: Master returned: 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;10. 打开备库&lt;br /&gt;&lt;pre class="console"&gt;$ $HOME/pitrtools-1.2/cmd_standby -C $HOME/pitrtools-1.2/cmd_standby.ini -F999&lt;br /&gt;waiting for server to shut down... done&lt;br /&gt;server stopped&lt;br /&gt;server starting&lt;br /&gt;failover.&lt;br /&gt;NOTICE: Statistics are not replicated in warm standy mode.&lt;br /&gt;HINT: Execute ANALYZE on your databases&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;11. 总结&lt;br /&gt;同Walmgr相比, pitrtools用户必须手工创建一些目录和修改配置文件, 不够自动化, 不能保留主库备份, 程序也写得略显粗糙, 不够专业, 有不少有待完善的地方&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="http://www.slideshare.net/linuxpoet/pitr-made-easy-1265196"&gt;Pitr Made Easy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-2670116067873942750?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/2670116067873942750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=2670116067873942750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2670116067873942750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2670116067873942750'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/10/setting-up-pitrtools.html' title='setting up pitrtools'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-5464886650879179069</id><published>2009-10-13T17:59:00.002+08:00</published><updated>2009-10-13T18:03:36.100+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>setting up postgresql warm standby</title><content type='html'>setting up postgresql warm standby&lt;br /&gt;配置Postgresql备库&lt;br /&gt;&lt;br /&gt;其工作原理跟Oracle备库一样, Postgresql数据库也支持将所有操作记录到日志文件(write-ahead log, WAL), 支持定时归档日志文件, 传输到备库服务器上, 然后在备库服务器上应用归档日志, 连续进行基于时间点的恢复(Point-In-Time Recovery), 这种高可用功能被称为warm standby或log shipping.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;测试环境:&lt;br /&gt;主库服务器: pgdb01&lt;br /&gt;备库服务器: pgdb02&lt;br /&gt;数据库版本: Postgresql 8.3.7&lt;br /&gt;操作系统版本: CentOS 5.3&lt;br /&gt;&lt;br /&gt;1. 设置服务器之间ssh认证, 用于scp拷归档日志&lt;br /&gt;pgdb01上生成公私密钥文件, 配置认证信息, 并将同样的密钥文件和配置信息复制到pgdb02&lt;br /&gt;&lt;pre&gt;ssh-keygen -t dsa -N &amp;quot;&amp;quot; -f $HOME/.ssh/id_dsa&lt;br /&gt;[ -f ~/.ssh/authorized_keys ] &amp;amp;&amp;amp; sed -i '/'$(whoami)'@'$(hostname)'/d' ~/.ssh/authorized_keys&lt;br /&gt;cat ~/.ssh/id_dsa.pub &amp;gt;&amp;gt;~/.ssh/authorized_keys&lt;br /&gt;scp -pr $HOME/.ssh pgdb02:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;测试一下&lt;br /&gt;&lt;pre class="console"&gt;$ ssh pgdb02 &amp;quot;hostname -s&amp;quot;&lt;br /&gt;pgdb02&lt;br /&gt;$ ssh pgdb02 &amp;quot;ssh pgdb01 'hostname -s'&amp;quot;&lt;br /&gt;pgdb01&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. 主库pgdb01开启日志归档/传输功能&lt;br /&gt;备库pgdb02上创建归档日志存放目录:&lt;br /&gt;mkdir -p /var/lib/pgsql/archlog/&lt;br /&gt;&lt;br /&gt;编辑主库pgdb01配置文件&lt;br /&gt;&lt;pre&gt;vi /var/lib/pgsql/data/postgresql.conf&lt;br /&gt;&lt;/pre&gt;增加如下配置项&lt;br /&gt;&lt;pre&gt;archive_mode = on&lt;br /&gt;archive_command = 'scp -C -o ConnectTimeout=30 &amp;quot;%p&amp;quot; pgdb02:/var/lib/pgsql/archlog/&amp;quot;%f&amp;quot;'&lt;br /&gt;archive_timeout = 1800&lt;br /&gt;&lt;/pre&gt;archive_mode:on表示开启归档功能,off表示关闭. 重启后此参数才能生效&lt;br /&gt;archive_command:归档命令, 调用scp拷贝归档文件至备库&lt;br /&gt;archive_timeout:表示每隔多少秒强制归档一次&lt;br /&gt;&lt;br /&gt;重启数据库, 使配置生效&lt;br /&gt;&lt;pre&gt;pg_ctl restart -m fast&lt;br /&gt;&lt;/pre&gt;或用immediate参数停&lt;br /&gt;&lt;pre&gt;pg_ctl restart -m immediate&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. 检查日志传输情况&lt;br /&gt;调用pg_switch_xlog手工切换几次日志&lt;br /&gt;&lt;pre class="console"&gt;$ psql -c &amp;quot;select pg_switch_xlog();&amp;quot;&lt;br /&gt; pg_switch_xlog&lt;br /&gt;----------------&lt;br /&gt; 2/21000088&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;如果当前日志中没有任何事务, pg_switch_xlog不会切换日志, 见&lt;a href="http://www.postgresql.org/docs/8.3/interactive/functions-admin.html"&gt;9.23. System Administration Functions&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;查看pg_xlog目录&lt;br /&gt;&lt;pre class="console"&gt;$ psql -c &amp;quot;select pg_current_xlog_location();&amp;quot;&lt;br /&gt; pg_current_xlog_location&lt;br /&gt;--------------------------&lt;br /&gt; 2/82000000&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;$ ls -lR /var/lib/pgsql/data/pg_xlog&lt;br /&gt;/var/lib/pgsql/data/pg_xlog:&lt;br /&gt;total 49216&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:27 00000001000000020000007F&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:31 000000010000000200000080&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:32 000000010000000200000081&lt;br /&gt;drwxr-xr-x 2 postgres postgres     4096 Oct 12 07:32 archive_status&lt;br /&gt;&lt;br /&gt;/var/lib/pgsql/data/pg_xlog/archive_status:&lt;br /&gt;total 0&lt;br /&gt;-rw------- 1 postgres postgres 0 Oct 12 07:27 00000001000000020000007F.done&lt;br /&gt;-rw------- 1 postgres postgres 0 Oct 12 07:31 000000010000000200000080.done&lt;br /&gt;-rw------- 1 postgres postgres 0 Oct 12 07:32 000000010000000200000081.done&lt;br /&gt;&lt;/pre&gt;archive_status目录下.done文件表示已传输成功日志的编号, 由postgresql维护,自动删除&lt;br /&gt;&lt;br /&gt;查看pgdb02, 归档日志已传到指定目录&lt;br /&gt;&lt;pre class="console"&gt;$ ls -l /var/lib/pgsql/archlog/&lt;br /&gt;total 49212&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:27 00000001000000020000007F&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:31 000000010000000200000080&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:32 000000010000000200000081&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;4. 备份主库, 恢复到备库服务器上&lt;br /&gt;备库pgdb02停止数据库实例&lt;br /&gt;&lt;pre&gt;pg_ctl stop -m fast&lt;br /&gt;&lt;/pre&gt;删除data目录&lt;br /&gt;&lt;pre&gt;rm -rf /var/lib/pgsql/data&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;pgdb01备份主库, 传输至备库&lt;br /&gt;&lt;pre&gt;psql -c &amp;quot;checkpoint;select pg_start_backup('dbbackup');&amp;quot;&lt;br /&gt;tar -C /var/lib/pgsql/ -zcf - data |ssh pgdb02 &amp;quot;tar -C /var/lib/pgsql/ -zxf -&amp;quot;&lt;br /&gt;ssh pgdb02 'cd /var/lib/pgsql/data &amp;amp;&amp;amp; rm -rf pg_log/* &amp;amp;&amp;amp; find pg_xlog/ -type f -exec rm -f {} \;'&lt;br /&gt;psql -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;$ psql -c &amp;quot;checkpoint;select pg_start_backup('dbbackup');&amp;quot;&lt;br /&gt; pg_start_backup&lt;br /&gt;-----------------&lt;br /&gt; 2/820000B0&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;$ tar -C /var/lib/pgsql/ -zcf - data |ssh pgdb02 &amp;quot;tar -C /var/lib/pgsql/ -zxf -&amp;quot;&lt;br /&gt;$ ssh pgdb02 'cd /var/lib/pgsql/data &amp;amp;&amp;amp; rm -rf pg_log/* &amp;amp;&amp;amp; find pg_xlog/ -type f -exec rm -f {} \;'&lt;br /&gt;$ psql -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt; pg_stop_backup&lt;br /&gt;----------------&lt;br /&gt; 2/82000118&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;备份产生的.backup文件记录了备份信息&lt;br /&gt;&lt;pre class="console"&gt;$ ls -lR /var/lib/pgsql/data/pg_xlog/&lt;br /&gt;/var/lib/pgsql/data/pg_xlog/:&lt;br /&gt;total 65624&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:56 000000010000000200000082&lt;br /&gt;-rw------- 1 postgres postgres      244 Oct 12 07:56 000000010000000200000082.000000B0.backup&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:27 000000010000000200000083&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:32 000000010000000200000084&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:31 000000010000000200000085&lt;br /&gt;drwxr-xr-x 2 postgres postgres     4096 Oct 12 07:56 archive_status&lt;br /&gt;&lt;br /&gt;/var/lib/pgsql/data/pg_xlog/archive_status:&lt;br /&gt;total 0&lt;br /&gt;-rw------- 1 postgres postgres 0 Oct 12 07:56 000000010000000200000082.000000B0.backup.done&lt;br /&gt;-rw------- 1 postgres postgres 0 Oct 12 07:56 000000010000000200000082.done&lt;br /&gt;$ cat /var/lib/pgsql/data/pg_xlog/000000010000000200000082.000000B0.backup&lt;br /&gt;START WAL LOCATION: 2/820000B0 (file 000000010000000200000082)&lt;br /&gt;STOP WAL LOCATION: 2/82000118 (file 000000010000000200000082)&lt;br /&gt;CHECKPOINT LOCATION: 2/820000B0&lt;br /&gt;START TIME: 2009-10-12 07:55:13 UTC&lt;br /&gt;LABEL: dbbackup&lt;br /&gt;STOP TIME: 2009-10-12 07:56:28 UTC&lt;br /&gt;&lt;/pre&gt;表示是从000000B0这个位置开始备份的, 解释见&lt;a href="http://www.postgresql.org/docs/8.3/interactive/continuous-archiving.html#BACKUP-BASE-BACKUP"&gt;24.3.2. Making a Base Backup&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. 配置备库&lt;br /&gt;备库上不需要归档, 所以修改备库配置文件, 关闭归档&lt;br /&gt;&lt;pre&gt;sed -i '/^archive_/s/^/#/g' /var/lib/pgsql/data/postgresql.conf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;安装postgresql contrib软件包, 使用其中的pg_standby辅助工具&lt;br /&gt;&lt;pre&gt;sudo rpm -Uvh http://ftp9.us.postgresql.org/pub/mirrors/postgresql/binary/v8.3.7/linux/rpms/redhat/rhel-5-x86_64/postgresql-contrib-8.3.7-1PGDG.rhel5.x86_64.rpm&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;编辑恢复配置文件recovery.conf&lt;br /&gt;&lt;pre&gt;cat &amp;gt;/var/lib/pgsql/data/recovery.conf &amp;lt;&amp;lt;'EOF'&lt;br /&gt;restore_command = 'pg_standby -l -d -s 2 -t /tmp/pgsql.trigger.5432 /var/lib/pgsql/archlog %f %p %r 2&amp;gt;&amp;gt;pg_log/standby.log.$(date +%%Y%%m%%d)'&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;-l: 创建归档日志的符号链接, 而不是拷贝&lt;br /&gt;-d: 打开调试信息&lt;br /&gt;-s 2: 每2秒检查一次是否有新的归档日志&lt;br /&gt;-t /tmp/pgsql.trigger.5432: 一旦发现存在触发器文件, 将终止恢复过程, 然后打开备库&lt;br /&gt;各选项解释见&lt;a href="http://www.postgresql.org/docs/8.3/interactive/pgstandby.html"&gt;F.23. pg_standby&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;启动备库&lt;br /&gt;pg_ctl start&lt;br /&gt;&lt;br /&gt;日志显示已恢复了所有归档日志, 等待着下一个日志&lt;br /&gt;&lt;pre class="console"&gt;Trigger file            : /tmp/pgsql.trigger.5432&lt;br /&gt;Waiting for WAL file    : 00000001.history&lt;br /&gt;WAL file path           : /var/lib/pgsql/archlog/00000001.history&lt;br /&gt;Restoring to...         : pg_xlog/RECOVERYHISTORY&lt;br /&gt;Sleep interval          : 2 seconds&lt;br /&gt;Max wait interval       : 0 forever&lt;br /&gt;Command for restore     : ln -s -f &amp;quot;/var/lib/pgsql/archlog/00000001.history&amp;quot; &amp;quot;pg_xlog/RECOVERYHISTORY&amp;quot;&lt;br /&gt;Keep archive history    : 000000000000000000000000 and later&lt;br /&gt;running restore         : OK&lt;br /&gt;Trigger file            : /tmp/pgsql.trigger.5432&lt;br /&gt;Waiting for WAL file    : 000000010000000200000082.000000B0.backup&lt;br /&gt;WAL file path           : /var/lib/pgsql/archlog/000000010000000200000082.000000B0.backup&lt;br /&gt;Restoring to...         : pg_xlog/RECOVERYHISTORY&lt;br /&gt;Sleep interval          : 2 seconds&lt;br /&gt;Max wait interval       : 0 forever&lt;br /&gt;Command for restore     : ln -s -f &amp;quot;/var/lib/pgsql/archlog/000000010000000200000082.000000B0.backup&amp;quot; &amp;quot;pg_xlog/RECOVERYHISTORY&amp;quot;&lt;br /&gt;Keep archive history    : 000000000000000000000000 and later&lt;br /&gt;running restore         : OK&lt;br /&gt;Trigger file            : /tmp/pgsql.trigger.5432&lt;br /&gt;Waiting for WAL file    : 000000010000000200000082&lt;br /&gt;WAL file path           : /var/lib/pgsql/archlog/000000010000000200000082&lt;br /&gt;Restoring to...         : pg_xlog/RECOVERYXLOG&lt;br /&gt;Sleep interval          : 2 seconds&lt;br /&gt;Max wait interval       : 0 forever&lt;br /&gt;Command for restore     : ln -s -f &amp;quot;/var/lib/pgsql/archlog/000000010000000200000082&amp;quot; &amp;quot;pg_xlog/RECOVERYXLOG&amp;quot;&lt;br /&gt;Keep archive history    : 000000000000000000000000 and later&lt;br /&gt;running restore         : OK&lt;br /&gt;&lt;br /&gt;Trigger file            : /tmp/pgsql.trigger.5432&lt;br /&gt;Waiting for WAL file    : 000000010000000200000083&lt;br /&gt;WAL file path           : /var/lib/pgsql/archlog/000000010000000200000083&lt;br /&gt;Restoring to...         : pg_xlog/RECOVERYXLOG&lt;br /&gt;Sleep interval          : 2 seconds&lt;br /&gt;Max wait interval       : 0 forever&lt;br /&gt;Command for restore     : ln -s -f &amp;quot;/var/lib/pgsql/archlog/000000010000000200000083&amp;quot; &amp;quot;pg_xlog/RECOVERYXLOG&amp;quot;&lt;br /&gt;Keep archive history    : 000000010000000200000082 and later&lt;br /&gt;WAL file not present yet. Checking for trigger file...&lt;br /&gt;WAL file not present yet. Checking for trigger file...&lt;br /&gt;WAL file not present yet. Checking for trigger file...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="console"&gt;$ ls -lR /var/lib/pgsql/data/pg_xlog/&lt;br /&gt;/var/lib/pgsql/data/pg_xlog/:&lt;br /&gt;total 8&lt;br /&gt;drwxr-xr-x 2 postgres postgres 4096 Oct 12 07:55 archive_status&lt;br /&gt;lrwxrwxrwx 1 postgres postgres   63 Oct 12 08:11 RECOVERYHISTORY -&amp;gt; /var/lib/pgsql/archlog/000000010000000200000082.000000B0.backup&lt;br /&gt;&lt;br /&gt;/var/lib/pgsql/data/pg_xlog/archive_status:&lt;br /&gt;total 0&lt;br /&gt;[postgres@pgdb02.cloud101.bqa4.blurdev.com ~]$ ls -lR /var/lib/pgsql/archlog/&lt;br /&gt;/var/lib/pgsql/archlog/:&lt;br /&gt;total 65620&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:27 00000001000000020000007F&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:31 000000010000000200000080&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:32 000000010000000200000081&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 07:56 000000010000000200000082&lt;br /&gt;-rw------- 1 postgres postgres      244 Oct 12 07:56 000000010000000200000082.000000B0.backup&lt;br /&gt;&lt;/pre&gt;pg_xlog目录下RECOVERYHISTORY文件不知有什么用&lt;br /&gt;archlog目录下归档文件由postgresql维护, 成功恢复后, 会自动删除一些旧的&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6. 打开备库&lt;br /&gt;备库处在恢复状态时不能进行任何操作, 必须打开数据库后才能查询SQL&lt;br /&gt;&lt;pre class="console"&gt;$ psql&lt;br /&gt;psql: FATAL:  the database system is starting up&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;当pg_standby检测到触发器文件, 就会终止恢复过程, 打开数据库&lt;br /&gt;&lt;pre&gt;touch /tmp/pgsql.trigger.5432&lt;br /&gt;&lt;/pre&gt;日志:&lt;br /&gt;&lt;pre class="console"&gt;...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;WAL file not present yet. Checking for trigger file...&lt;br /&gt;WAL file not present yet. Checking for trigger file...&lt;br /&gt;WAL file not present yet. Checking for trigger file...trigger file found&lt;br /&gt;&lt;br /&gt;Trigger file            : /tmp/pgsql.trigger.5432&lt;br /&gt;Waiting for WAL file    : 000000010000000200000085&lt;br /&gt;WAL file path           : /var/lib/pgsql/archlog/000000010000000200000085&lt;br /&gt;Restoring to...         : pg_xlog/RECOVERYXLOG&lt;br /&gt;Sleep interval          : 2 seconds&lt;br /&gt;Max wait interval       : 0 forever&lt;br /&gt;Command for restore     : ln -s -f &amp;quot;/var/lib/pgsql/archlog/000000010000000200000085&amp;quot; &amp;quot;pg_xlog/RECOVERYXLOG&amp;quot;&lt;br /&gt;Keep archive history    : 000000000000000000000000 and later&lt;br /&gt;running restore         : OK&lt;br /&gt;&lt;br /&gt;Trigger file            : /tmp/pgsql.trigger.5432&lt;br /&gt;Waiting for WAL file    : 00000002.history&lt;br /&gt;WAL file path           : /var/lib/pgsql/archlog/00000002.history&lt;br /&gt;Restoring to...         : pg_xlog/RECOVERYHISTORY&lt;br /&gt;Sleep interval          : 2 seconds&lt;br /&gt;Max wait interval       : 0 forever&lt;br /&gt;Command for restore     : ln -s -f &amp;quot;/var/lib/pgsql/archlog/00000002.history&amp;quot; &amp;quot;pg_xlog/RECOVERYHISTORY&amp;quot;&lt;br /&gt;Keep archive history    : 000000000000000000000000 and later&lt;br /&gt;running restore         : OK&lt;br /&gt;Trigger file            : /tmp/pgsql.trigger.5432&lt;br /&gt;Waiting for WAL file    : 00000001.history&lt;br /&gt;WAL file path           : /var/lib/pgsql/archlog/00000001.history&lt;br /&gt;Restoring to...         : pg_xlog/RECOVERYHISTORY&lt;br /&gt;Sleep interval          : 2 seconds&lt;br /&gt;Max wait interval       : 0 forever&lt;br /&gt;Command for restore     : ln -s -f &amp;quot;/var/lib/pgsql/archlog/00000001.history&amp;quot; &amp;quot;pg_xlog/RECOVERYHISTORY&amp;quot;&lt;br /&gt;Keep archive history    : 000000000000000000000000 and later&lt;br /&gt;running restore         : OK&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;恢复过程停止后, recovery.conf被自动改名为recovery.done&lt;br /&gt;&lt;pre class="console"&gt;$ ls -lR /var/lib/pgsql/data/pg_xlog/&lt;br /&gt;/var/lib/pgsql/data/pg_xlog/:&lt;br /&gt;total 16412&lt;br /&gt;lrwxrwxrwx 1 postgres postgres       47 Oct 12 09:28 000000020000000200000085 -&amp;gt; /var/lib/pgsql/archlog/000000010000000200000085&lt;br /&gt;-rw------- 1 postgres postgres 16777216 Oct 12 09:28 000000020000000200000086&lt;br /&gt;-rw------- 1 postgres postgres       74 Oct 12 09:28 00000002.history&lt;br /&gt;drwxr-xr-x 2 postgres postgres     4096 Oct 12 09:28 archive_status&lt;br /&gt;&lt;br /&gt;/var/lib/pgsql/data/pg_xlog/archive_status:&lt;br /&gt;total 0&lt;br /&gt;-rw------- 1 postgres postgres 0 Oct 12 09:28 00000002.history.ready&lt;br /&gt;$ ls -lR /var/lib/pgsql/data/recovery.*&lt;br /&gt;-rw-r--r-- 1 postgres postgres 142 Oct 12 08:11 /var/lib/pgsql/data/recovery.done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;要注意的是, 一旦打开就无法再次进入恢复状态, 只能重建备库&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="http://www.postgresql.org/docs/8.3/interactive/high-availability.html"&gt;Chapter 25. High Availability, Load Balancing, and Replication&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.postgresql.org/docs/8.3/interactive/backup.html"&gt;Chapter 24. Backup and Restore&lt;/a&gt;&lt;br /&gt;&lt;a href="http://scale-out-blog.blogspot.com/2009/02/simple-ha-with-postgresql-point-in-time.html"&gt;Simple HA with PostgreSQL Point-In-Time Recovery&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.postgresql.org/docs/8.3/static/pgstandby.html"&gt;F.23. pg_standby&lt;/a&gt;&lt;br /&gt;&lt;a href="http://michsan.blogspot.com/2008/08/using-pgstandby-for-high-availability.html"&gt;Using pg_standby for high availability of Postgresql&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7. 记录级别的日志传送(Record-based Log Shipping)&lt;br /&gt;前面实现的是文件级别的日志传送, 以文件为单位进行恢复, 即使设置了定时强制归档, 恢复窗口也太大.&lt;br /&gt;Postgresql支持记录级别的日志传送, 见&lt;a href="http://www.postgresql.org/docs/8.3/interactive/warm-standby.html#WARM-STANDBY-RECORD"&gt;24.4.4. Record-based Log Shipping&lt;/a&gt;, 但没提供相应的工具. 所幸的是Skype公司开发了一套SkyTools, 给广大数据库管理员带去了福音, 其中一款工具walmgr可以方便的创建/管理备库, 并实现了记录级别的日志传送.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8. 安装SkyTools&lt;br /&gt;主备库服务器上安装SkyTools&lt;br /&gt;&lt;pre&gt;rpm -Uvh http://yum.pgsqlrpms.org/8.3/redhat/rhel-5-x86_64/compat-postgresql-libs-4-1PGDG.rhel5.x86_64.rpm&lt;br /&gt;yum -y install python-psycopg2.x86_64&lt;br /&gt;rpm -Uvh http://yum.pgsqlrpms.org/8.3/redhat/rhel-5-x86_64/skytools-2.1.10-1.rhel5.x86_64.rpm&lt;br /&gt;chmod +x /usr/bin/*.py&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;9. 配置walmgr&lt;br /&gt;说明见&lt;a href="http://skytools.projects.postgresql.org/doc/walmgr.html"&gt;walmgr(1)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;主库:&lt;br /&gt;&lt;pre&gt;mkdir -p /var/lib/pgsql/walmgr/logs&lt;br /&gt;cat &amp;gt;/var/lib/pgsql/walmgr/master.ini &amp;lt;&amp;lt;'EOF'&lt;br /&gt;[wal-master]&lt;br /&gt;job_name             = pgdb01.cloud101_walgmr_master&lt;br /&gt;logfile              = /var/lib/pgsql/walmgr/logs/master.log&lt;br /&gt;pidfile              = /var/lib/pgsql/walmgr/logs/master.pid&lt;br /&gt;master_db            = dbname=template1&lt;br /&gt;master_data          = /var/lib/pgsql/data&lt;br /&gt;master_config        = /var/lib/pgsql/data/postgresql.conf&lt;br /&gt;slave                = pgdb02:/var/lib/pgsql/walmgr/shipping&lt;br /&gt;slave_config         = /var/lib/pgsql/walmgr/slave.ini&lt;br /&gt;completed_wals       = %(slave)s/logs.complete&lt;br /&gt;partial_wals         = %(slave)s/logs.partial&lt;br /&gt;full_backup          = %(slave)s/data.master&lt;br /&gt;config_backup        = %(slave)s/config.backup&lt;br /&gt;loop_delay           = 10.0&lt;br /&gt;use_xlog_functions   = 1&lt;br /&gt;compression          = 1&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;备库:&lt;br /&gt;&lt;pre&gt;mkdir -p /var/lib/pgsql/walmgr/{logs,shipping/{logs.{complete,partial},data.master,config.backup}}&lt;br /&gt;cat &amp;gt;/var/lib/pgsql/walmgr/slave.ini &amp;lt;&amp;lt;'EOF'&lt;br /&gt;[wal-slave]&lt;br /&gt;job_name             = pgdb02.cloud101_walgmr_slave&lt;br /&gt;logfile              = /var/lib/pgsql/walmgr/logs/slave.log&lt;br /&gt;slave_data           = /var/lib/pgsql/data&lt;br /&gt;slave_stop_cmd       = sudo /etc/init.d/postgresql stop&lt;br /&gt;slave_start_cmd      = sudo /etc/init.d/postgresql start&lt;br /&gt;slave_config_dir     = /var/lib/pgsql/data&lt;br /&gt;slave                = /var/lib/pgsql/walmgr/shipping&lt;br /&gt;completed_wals       = %(slave)s/logs.complete&lt;br /&gt;partial_wals         = %(slave)s/logs.partial&lt;br /&gt;full_backup          = %(slave)s/data.master&lt;br /&gt;config_backup        = %(slave)s/config.backup&lt;br /&gt;keep_backups         = 5&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;10. 配置主库&lt;br /&gt;&lt;pre class="console"&gt;$ walmgr.py /var/lib/pgsql/walmgr/master.ini setup&lt;br /&gt;2009-10-12 10:09:58,499 29592 INFO Configuring WAL archiving&lt;br /&gt;2009-10-12 10:09:58,502 29592 WARNING database must be restarted to enable archiving&lt;br /&gt;2009-10-12 10:09:58,506 29592 INFO Sending SIGHUP to postmaster&lt;br /&gt;2009-10-12 10:09:59,222 29592 INFO Done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;运行完setup,配置文件增加了如下2条配置项&lt;br /&gt;&lt;pre class="console"&gt;archive_mode = 'on'&lt;br /&gt;archive_command = '/usr/bin/walmgr.py /var/lib/pgsql/walmgr/master.ini xarchive %p %f'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;重启使修改生效&lt;br /&gt;&lt;pre&gt;pg_ctl restart -m fast&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;11. 备份主库&lt;br /&gt;&lt;pre class="console"&gt;$ walmgr.py /var/lib/pgsql/walmgr/master.ini backup&lt;br /&gt;2009-10-12 10:27:05,706 18300 INFO Backup lock obtained.&lt;br /&gt;2009-10-12 10:27:05,706 18300 INFO got SystemExit(0), exiting&lt;br /&gt;2009-10-12 10:27:05,741 29813 INFO Execute SQL: select pg_start_backup('FullBackup'); [dbname=template1]&lt;br /&gt;2009-10-12 10:27:07,696 29813 INFO Checking tablespaces&lt;br /&gt;2009-10-12 10:27:08,776 29813 INFO Backup conf files from /var/lib/pgsql/data&lt;br /&gt;2009-10-12 10:27:09,268 18323 INFO First useful WAL file is: 00000001000000020000008B&lt;br /&gt;2009-10-12 10:27:09,744 18329 INFO Backup lock released.&lt;br /&gt;2009-10-12 10:27:09,785 29813 INFO Full backup successful&lt;br /&gt;&lt;/pre&gt;数据库备份到了备库服务器指定目录上&lt;br /&gt;数据文件放在/var/lib/pgsql/walmgr/shipping/data.master&lt;br /&gt;配置文件放在/var/lib/pgsql/walmgr/shipping/config.backup&lt;br /&gt;&lt;br /&gt;日志:&lt;br /&gt;&lt;pre class="console"&gt;2009-10-12 10:27:05,741 29813 INFO Execute SQL: select pg_start_backup('FullBackup'); [dbname=template1]&lt;br /&gt;2009-10-12 10:27:07,696 29813 INFO Checking tablespaces&lt;br /&gt;2009-10-12 10:27:08,776 29813 INFO Backup conf files from /var/lib/pgsql/data&lt;br /&gt;2009-10-12 10:27:09,785 29813 INFO Full backup successful&lt;br /&gt;2009-10-12 10:27:09,852 29825 INFO {count: 1, duration: 0.387887001038}&lt;br /&gt;2009-10-12 10:27:10,724 29829 INFO {count: 1, duration: 0.725953102112}&lt;br /&gt;2009-10-12 10:27:11,272 29832 INFO {count: 1, duration: 0.396477937698}&lt;br /&gt;2009-10-12 10:27:12,056 29835 INFO {count: 1, duration: 0.628087997437}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;12. 启用备库&lt;br /&gt;&lt;pre class="console"&gt;$ walmgr.py /var/lib/pgsql/walmgr/slave.ini restore data.master&lt;br /&gt;2009-10-12 10:28:32,363 18411 INFO Stopping postmaster: sudo /etc/init.d/postgresql stop&lt;br /&gt;Stopping postgresql service:                               [  OK  ]&lt;br /&gt;2009-10-12 10:28:35,535 18411 INFO Move /var/lib/pgsql/data to /var/lib/pgsql/data.2&lt;br /&gt;2009-10-12 10:28:35,536 18411 INFO Copy /var/lib/pgsql/walmgr/shipping/data.master to /var/lib/pgsql/data&lt;br /&gt;2009-10-12 10:28:36,001 18411 INFO Write /var/lib/pgsql/data/recovery.conf&lt;br /&gt;2009-10-12 10:28:36,003 18411 INFO Restoring configuration files&lt;br /&gt;2009-10-12 10:28:36,007 18411 INFO Starting postmaster: sudo /etc/init.d/postgresql start&lt;br /&gt;Starting postgresql service:                               [  OK  ]&lt;br /&gt;&lt;/pre&gt;这样备库就建好了&lt;br /&gt;&lt;br /&gt;日志:&lt;br /&gt;&lt;pre class="console"&gt;2009-10-12 10:28:32,363 18411 INFO Stopping postmaster: sudo /etc/init.d/postgresql stop&lt;br /&gt;2009-10-12 10:28:35,535 18411 INFO Move /var/lib/pgsql/data to /var/lib/pgsql/data.2&lt;br /&gt;2009-10-12 10:28:35,536 18411 INFO Copy /var/lib/pgsql/walmgr/shipping/data.master to /var/lib/pgsql/data&lt;br /&gt;2009-10-12 10:28:36,001 18411 INFO Write /var/lib/pgsql/data/recovery.conf&lt;br /&gt;2009-10-12 10:28:36,003 18411 INFO Restoring configuration files&lt;br /&gt;2009-10-12 10:28:36,007 18411 INFO Starting postmaster: sudo /etc/init.d/postgresql start&lt;br /&gt;2009-10-12 10:28:37,094 18511 INFO 00000001.history: not found, ignoring&lt;br /&gt;2009-10-12 10:28:37,094 18511 INFO got SystemExit(1), exiting&lt;br /&gt;2009-10-12 10:28:37,233 18512 INFO 00000001000000020000008B.00000020.backup: Found&lt;br /&gt;2009-10-12 10:28:37,243 18512 INFO {count: 1}&lt;br /&gt;2009-10-12 10:28:37,387 18514 INFO 00000001000000020000008B: Found&lt;br /&gt;2009-10-12 10:28:37,489 18514 INFO {count: 1}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;13. 手工同步&lt;br /&gt;在主库上运行&lt;br /&gt;&lt;pre class="console"&gt;$ walmgr.py /var/lib/pgsql/walmgr/master.ini sync&lt;br /&gt;2009-10-12 10:30:29,591 29862 INFO sent to slave: 00000001000000020000008B @ 0 +16777216&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;14. 打开备库&lt;br /&gt;&lt;pre class="console"&gt;$ walmgr.py /var/lib/pgsql/walmgr/slave.ini boot&lt;br /&gt;2009-10-12 10:31:38,781 18534 INFO Stopping recovery mode&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;日志:&lt;br /&gt;&lt;pre class="console"&gt;2009-10-12 10:31:38,781 18534 INFO Stopping recovery mode&lt;br /&gt;2009-10-12 10:31:39,485 18516 INFO 00000001000000020000008C: not found, stopping&lt;br /&gt;2009-10-12 10:31:39,485 18516 INFO got SystemExit(1), exiting&lt;br /&gt;2009-10-12 10:31:39,628 18536 INFO 00000001000000020000008B: Found&lt;br /&gt;2009-10-12 10:31:39,737 18536 INFO {count: 1}&lt;br /&gt;2009-10-12 10:31:39,881 18538 INFO 00000002.history: not found, ignoring&lt;br /&gt;2009-10-12 10:31:39,882 18538 INFO got SystemExit(1), exiting&lt;br /&gt;2009-10-12 10:31:40,024 18539 INFO 00000001.history: not found, ignoring&lt;br /&gt;2009-10-12 10:31:40,024 18539 INFO got SystemExit(1), exiting&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;15. 恢复备库&lt;br /&gt;备库打开后无法切换回恢复状态, 必须重新从备份重建. 操作同步骤12&lt;br /&gt;&lt;pre&gt;walmgr.py /var/lib/pgsql/walmgr/slave.ini restore data.master&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;16. 自动定时同步&lt;br /&gt;主库上运行&lt;br /&gt;&lt;pre&gt;nohup walmgr.py /var/lib/pgsql/walmgr/master.ini syncdaemon &amp;gt;&amp;gt;/var/lib/pgsql/walmgr/logs/syncdaemon.log 2&amp;gt;&amp;amp;1 &amp;lt;/dev/null &amp;amp;&lt;br /&gt;&lt;/pre&gt;按loop_delay指定的时间间隔同步&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;17. 切换主备库&lt;br /&gt;假设pgdb01是主库, pgdb02是备库, 切换主备库角色&lt;br /&gt;&lt;br /&gt;1) 按新的主备库角色编辑配置文件&lt;br /&gt;pgdb02:&lt;br /&gt;&lt;pre&gt;mkdir -p /var/lib/pgsql/walmgr/logs&lt;br /&gt;cat &amp;gt;/var/lib/pgsql/walmgr/master.ini &amp;lt;&amp;lt;'EOF'&lt;br /&gt;[wal-master]&lt;br /&gt;job_name             = pgdb02.cloud101_walgmr_master&lt;br /&gt;logfile              = /var/lib/pgsql/walmgr/logs/master.log&lt;br /&gt;pidfile              = /var/lib/pgsql/walmgr/logs/master.pid&lt;br /&gt;master_db            = dbname=template1&lt;br /&gt;master_data          = /var/lib/pgsql/data&lt;br /&gt;master_config        = /var/lib/pgsql/data/postgresql.conf&lt;br /&gt;slave                = pgdb01:/var/lib/pgsql/walmgr/shipping&lt;br /&gt;slave_config         = /var/lib/pgsql/walmgr/slave.ini&lt;br /&gt;completed_wals       = %(slave)s/logs.complete&lt;br /&gt;partial_wals         = %(slave)s/logs.partial&lt;br /&gt;full_backup          = %(slave)s/data.master&lt;br /&gt;config_backup        = %(slave)s/config.backup&lt;br /&gt;loop_delay           = 10.0&lt;br /&gt;use_xlog_functions   = 1&lt;br /&gt;compression          = 1&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;pgdb01:&lt;br /&gt;&lt;pre&gt;mkdir -p /var/lib/pgsql/walmgr/{logs,shipping/{logs.{complete,partial},data.master,config.backup}}&lt;br /&gt;cat &amp;gt;/var/lib/pgsql/walmgr/slave.ini &amp;lt;&amp;lt;'EOF'&lt;br /&gt;[wal-slave]&lt;br /&gt;job_name             = pgdb01.cloud101_walgmr_slave&lt;br /&gt;logfile              = /var/lib/pgsql/walmgr/logs/slave.log&lt;br /&gt;slave_data           = /var/lib/pgsql/data&lt;br /&gt;slave_stop_cmd       = sudo /etc/init.d/postgresql stop&lt;br /&gt;slave_start_cmd      = sudo /etc/init.d/postgresql start&lt;br /&gt;slave_config_dir     = /var/lib/pgsql/data&lt;br /&gt;slave                = /var/lib/pgsql/walmgr/shipping&lt;br /&gt;completed_wals       = %(slave)s/logs.complete&lt;br /&gt;partial_wals         = %(slave)s/logs.partial&lt;br /&gt;full_backup          = %(slave)s/data.master&lt;br /&gt;config_backup        = %(slave)s/config.backup&lt;br /&gt;keep_backups         = 5&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2) 停止应用程序, 将应用程序的数据库配置指向pgdb02&lt;br /&gt;&lt;br /&gt;3) pgdb01强制同步一次&lt;br /&gt;&lt;pre&gt;walmgr.py /var/lib/pgsql/walmgr/master.ini sync&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4) 停止pgdb01的后台同步进程&lt;br /&gt;&lt;pre&gt;kill $(cat /var/lib/pgsql/walmgr/logs/master.pid)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;5) 打开pgdb02&lt;br /&gt;&lt;pre&gt;walmgr.py /var/lib/pgsql/walmgr/slave.ini boot&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;6) 配置pgdb02, 启用归档&lt;br /&gt;&lt;pre&gt;walmgr.py /var/lib/pgsql/walmgr/master.ini setup&lt;br /&gt;pg_ctl restart -m fast&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;7) 现在pgdb02是主库, 启动应用程序, 连接pgdb02&lt;br /&gt;&lt;br /&gt;8) 备份pgdb02&lt;br /&gt;&lt;pre&gt;walmgr.py /var/lib/pgsql/walmgr/master.ini backup&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;9) 恢复到pgdb01&lt;br /&gt;&lt;pre&gt;walmgr.py /var/lib/pgsql/walmgr/slave.ini restore data.master&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;10) pgdb02启用后台自动定时同步&lt;br /&gt;&lt;pre&gt;nohup walmgr.py /var/lib/pgsql/walmgr/master.ini syncdaemon &amp;gt;&amp;gt;/var/lib/pgsql/walmgr/logs/syncdaemon.log 2&amp;gt;&amp;amp;1 &amp;lt;/dev/null &amp;amp;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;11) 完成&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="https://developer.skype.com/SkypeGarage/DbProjects/SkyTools/WalMgr"&gt;walmgr&lt;/a&gt;&lt;br /&gt;&lt;a href="http://skytools.projects.postgresql.org/doc/walmgr.html"&gt;walmgr(1)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.amd.co.at/robe/2009/05/testing-postgresql-replication-solutions-log-shipping-with-walmgr.html"&gt;Testing PostgreSQL replication solutions: Log shipping with walmgr&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.teragridforum.org/mediawiki/index.php?title=Core_Services_2.0_skytools_setup"&gt;Core Services 2.0 skytools setup&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;18. 其它复制/集群/高可用方案&lt;br /&gt;&lt;br /&gt;介绍:&lt;br /&gt;&lt;a href="http://wiki.postgresql.org/wiki/Replication%2C_Clustering%2C_and_Connection_Pooling"&gt;Replication, Clustering, and Connection Pooling&lt;/a&gt;&lt;br /&gt;&lt;a href="http://momjian.us/main/writings/pgsql/replication.pdf"&gt;PostgreSQL Replication Solutions - Presentation&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pugs.postgresql.org/files/replication_jul08.pdf"&gt;PostgreSQL Replication&lt;/a&gt;&lt;br /&gt;The Four Horsemen of Replication &lt;a href="http://it.toolbox.com/blogs/database-soup/the-four-horsemen-of-replication-8230"&gt;1&lt;/a&gt; &lt;a href="http://it.toolbox.com/blogs/database-soup/the-four-horsemen-of-replication-part-ii-8312"&gt;2&lt;/a&gt; &lt;a href="http://it.toolbox.com/blogs/database-soup/the-four-horsemen-of-replication-part-3-12140"&gt;3&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.scribd.com/doc/7116565/Getting-Smart-about-the-New-World-of-PostgreSQL-Replication"&gt;Getting Smart about the New World of PostgreSQL Replication&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;本人认为比较简单好用的几种:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Warm Standby: 基于日志的异步复制, 复制时备库不可用&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.postgresql.org/wiki/Hot_Standby"&gt;Hot Standby&lt;/a&gt;: 备库可读. postgresql当前版本不支持此功能, 8.5版本开始支持&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.commandprompt.com/products/mammothreplicator/"&gt;Mammoth Replicator&lt;/a&gt;: Postgresql的修改版, 支持主从异步复制, , 使用上有很多限制, 比如只支持复制一个数据库(schema)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.continuent.com/community/tungsten-replicator"&gt;Tungsten Replicator&lt;/a&gt;: 支持主从复制, 基于日志分析, 性能很差, 目前只支持Mysql,Oracle复制, 貌似很有前途, 值得一用&lt;br /&gt;链接:&lt;br /&gt;&lt;a href="http://tungsten.sourceforge.net/docs/Tungsten-Replicator-Guide/Tungsten-Replicator-Guide.html"&gt;Continuent Tungsten Replicator Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://scale-out-blog.blogspot.com/"&gt;The Scale-Out Blog&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rubyrep.org/"&gt;RubyRep&lt;/a&gt;: Ruby脚本编写的, 支持Mysql和Postgresql, 跟据主键或唯一索引比较2个数据库中表的不同, 进行同步. 可以实现主从或主主复制. 估计性能不行&lt;br /&gt;例子:&lt;a href="http://denishjpatel.blogspot.com/2009/08/yet-another-postgresql-replication-tool.html"&gt;Yet Another PostgreSQL Replication Tool - RubyRep&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;19. Postgresql数据库下载地址&lt;br /&gt;&lt;a href="http://www.postgresql.org/ftp/"&gt;http://www.postgresql.org/ftp/&lt;/a&gt;&lt;br /&gt;&lt;a href="https://projects.commandprompt.com/public/pgcore/wiki/direct_download"&gt;https://projects.commandprompt.com/public/pgcore/wiki/direct_download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-5464886650879179069?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/5464886650879179069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=5464886650879179069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/5464886650879179069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/5464886650879179069'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/10/setting-up-postgresql-warm-standby.html' title='setting up postgresql warm standby'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-4858431316976269383</id><published>2009-10-12T14:33:00.002+08:00</published><updated>2009-10-12T14:33:50.109+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>sort file by length of lines</title><content type='html'>sort file by length of lines&lt;br /&gt;按每行长度对文件内容排序&lt;br /&gt;&lt;br /&gt;比如文件包含一些人名, 想按名称长度进行排序&lt;br /&gt;&lt;pre&gt;cat &amp;gt;myfile &amp;lt;&amp;lt;EOF&lt;br /&gt;Andre Anichanov&lt;br /&gt;Andrew Mogrelia&lt;br /&gt;Antonio Vivaldi&lt;br /&gt;Antoni Wit&lt;br /&gt;Capella Istropolitana&lt;br /&gt;Christian Kohn&lt;br /&gt;Cologne Chamber Orchestra&lt;br /&gt;Daniel Rothert&lt;br /&gt;Daniel Taylor&lt;br /&gt;Einar Steen-Nokleberg&lt;br /&gt;Elena Papandreou&lt;br /&gt;Eteri Andjaparidze&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;awk得到每行的长度, 按长度排序后显示输出&lt;br /&gt;&lt;pre&gt;awk '{print length,$0}' myfile|sort -rn|cut -d&amp;quot; &amp;quot; -f2-&lt;br /&gt;&lt;/pre&gt;或者将管道写在print后&lt;br /&gt;awk '{print length,$0|&amp;quot;sort -rn|cut -d\&amp;quot; \&amp;quot; -f2-&amp;quot;}' myfile&lt;br /&gt;&lt;br /&gt;运行结果&lt;br /&gt;&lt;pre class="console"&gt;Cologne Chamber Orchestra&lt;br /&gt;Einar Steen-Nokleberg&lt;br /&gt;Capella Istropolitana&lt;br /&gt;Eteri Andjaparidze&lt;br /&gt;Elena Papandreou&lt;br /&gt;Antonio Vivaldi&lt;br /&gt;Andrew Mogrelia&lt;br /&gt;Andre Anichanov&lt;br /&gt;Daniel Rothert&lt;br /&gt;Christian Kohn&lt;br /&gt;Daniel Taylor&lt;br /&gt;Antoni Wit&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-4858431316976269383?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/4858431316976269383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=4858431316976269383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/4858431316976269383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/4858431316976269383'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/10/sort-file-by-length-of-lines.html' title='sort file by length of lines'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-7635841322770480188</id><published>2009-09-23T20:02:00.013+08:00</published><updated>2009-09-23T21:03:59.899+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><category scheme='http://www.blogger.com/atom/ns#' term='backup and recovery'/><title type='text'>introducing maatkit - parallel dump</title><content type='html'>introducing maatkit - parallel dump&lt;br /&gt;maatkit介绍 - 并行导出&lt;br /&gt;&lt;br /&gt;Maatkit是一组为MySQL提供的命令行工具集, 是由&lt;a href="http://www.percona.com/"&gt;Percona&lt;/a&gt;公司开发的开源软件&lt;br /&gt;该公司同时还开发了XtraDB存储引擎, XtraBackup热备工具, MySQL增强补丁版本Percona&lt;br /&gt;&lt;br /&gt;包括:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;mk-archiver 将表数据清除或归档到另外的表或文件&lt;/li&gt;&lt;li&gt;mk-audit 分析MySQL的配置,概要,操作, 生成报表&lt;/li&gt;&lt;li&gt;mk-checksum-filter mk-table-checksum的过滤器&lt;/li&gt;&lt;li&gt;mk-deadlock-logger 记录InnoDB的死锁信息&lt;/li&gt;&lt;li&gt;mk-duplicate-key-checker 查找重复或冗余的外键和索引&lt;/li&gt;&lt;li&gt;mk-fifo-split 将一个文件拆分为多个部分, 输出到FIFO管道(有用吗?)&lt;/li&gt;&lt;li&gt;mk-find 按指定规则查找表名, 然后执行操作&lt;/li&gt;&lt;li&gt;mk-heartbeat 监视数据库之间复制的延迟&lt;/li&gt;&lt;li&gt;mk-log-player 拆分并重演慢速查询日志&lt;/li&gt;&lt;li&gt;mk-parallel-dump 多线程导出&lt;/li&gt;&lt;li&gt;mk-parallel-restore 多线程导入&lt;/li&gt;&lt;li&gt;mk-profile-compact 压缩mk-query-profiler输出&lt;/li&gt;&lt;li&gt;mk-query-digest 分析日志&lt;/li&gt;&lt;li&gt;mk-query-profiler 查询性能分析工具&lt;/li&gt;&lt;li&gt;mk-show-grants 显示用户权限&lt;/li&gt;&lt;li&gt;mk-slave-delay 实现备库与主库之间一定的延时&lt;/li&gt;&lt;li&gt;mk-slave-find 查找/显示出备库的树型层次结构&lt;/li&gt;&lt;li&gt;mk-slave-move 在层次结构中移动备库(什么玩意?)&lt;/li&gt;&lt;li&gt;mk-slave-prefetch 在备库上运行SELECT查询语句, 使数据预读取到内存中&lt;/li&gt;&lt;li&gt;mk-slave-restart 监测备库发生的错误并重启&lt;/li&gt;&lt;li&gt;mk-table-checksum 快速检测两个表的数据是否相同. 可以用来检测备库和主库的数据一致性&lt;/li&gt;&lt;li&gt;mk-table-sync 发现并修复不同服务器上的两个表之间的数据差异&lt;/li&gt;&lt;li&gt;mk-upgrade 比较2个数据库中语句的运行结果&lt;/li&gt;&lt;li&gt;mk-visual-explain 以树形显示执行计划&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;1. 安装&lt;br /&gt;从&lt;a href="http://maatkit.googlecode.com/"&gt;http://maatkit.googlecode.com/&lt;/a&gt;处下载RPM包进行安装&lt;br /&gt;&lt;pre&gt;yum -y install perl-TermReadKey.x86_64&lt;br /&gt;rpm -Uvh http://maatkit.googlecode.com/files/maatkit-4623-1.noarch.rpm&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;依赖以下安装包&lt;br /&gt;&lt;pre class="console"&gt;# rpm -q --requires maatkit&lt;br /&gt;/usr/bin/env&lt;br /&gt;perl(DBD::mysql) &amp;gt;= 1.0&lt;br /&gt;perl(DBI)&lt;br /&gt;perl(DBI) &amp;gt;= 1.13&lt;br /&gt;perl(Data::Dumper)&lt;br /&gt;perl(Digest::MD5)&lt;br /&gt;perl(English)&lt;br /&gt;perl(Exporter)&lt;br /&gt;perl(File::Basename)&lt;br /&gt;perl(File::Find)&lt;br /&gt;perl(File::Spec)&lt;br /&gt;perl(File::Temp)&lt;br /&gt;perl(Getopt::Long)&lt;br /&gt;perl(IO::File)&lt;br /&gt;perl(List::Util)&lt;br /&gt;perl(POSIX)&lt;br /&gt;perl(Socket)&lt;br /&gt;perl(Term::ReadKey) &amp;gt;= 2.10&lt;br /&gt;perl(Time::HiRes)&lt;br /&gt;perl(Time::Local)&lt;br /&gt;perl(constant)&lt;br /&gt;perl(sigtrap)&lt;br /&gt;perl(strict)&lt;br /&gt;perl(warnings)&lt;br /&gt;rpmlib(CompressedFileNames) &amp;lt;= 3.0.4-1&lt;br /&gt;rpmlib(PayloadFilesHavePrefix) &amp;lt;= 4.0-1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. 并行导出mk-parallel-dump和导入mk-parallel-restore&lt;br /&gt;使用方法见:&lt;br /&gt;&lt;a href="http://www.maatkit.org/doc/mk-parallel-dump.html"&gt;mk-parallel-dump - Dump sets of MySQL tables in parallel.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.maatkit.org/doc/mk-parallel-restore.html"&gt;mk-parallel-restore - Load files into MySQL in parallel.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1) 生成测试表&lt;br /&gt;生成一个3百万行记录的测试表&lt;br /&gt;&lt;pre&gt;mysql --socket=/var/lib/mysql/data_3306/mysql.sock&lt;br /&gt;&lt;br /&gt;set autocommit=0;&lt;br /&gt;drop database if exists dbtest;&lt;br /&gt;create database dbtest;&lt;br /&gt;use dbtest;&lt;br /&gt;drop table if exists t1;&lt;br /&gt;create table t1 (&lt;br /&gt;  id int(9) not null auto_increment,&lt;br /&gt;  name varchar(20) not null,&lt;br /&gt;  age int(3) not null,&lt;br /&gt;  notes varchar(100),&lt;br /&gt;  primary key (id),&lt;br /&gt;  index ind_t1_name (name)&lt;br /&gt;);&lt;br /&gt;truncate table t1;&lt;br /&gt;insert into t1 (name, age, notes)&lt;br /&gt;select conv(floor(rand() * 99999999999999), 10, 36), floor(1+rand()*(100-1)), md5(rand())&lt;br /&gt;  from information_schema.COLUMNS a&lt;br /&gt;       , information_schema.COLUMNS b&lt;br /&gt;       , information_schema.COLUMNS c&lt;br /&gt; limit 3000000;&lt;br /&gt;commit;&lt;br /&gt;&lt;/pre&gt;大小300多M&lt;br /&gt;&lt;pre class="console"&gt;mysql&amp;gt; insert into t1 (name, age, notes)&lt;br /&gt;    -&amp;gt; select conv(floor(rand() * 99999999999999), 10, 36), floor(1+rand()*(100-1)), md5(rand())&lt;br /&gt;    -&amp;gt;   from information_schema.COLUMNS a&lt;br /&gt;    -&amp;gt;        , information_schema.COLUMNS b&lt;br /&gt;    -&amp;gt;        , information_schema.COLUMNS c&lt;br /&gt;    -&amp;gt;  limit 3000000;&lt;br /&gt;Query OK, 3000000 rows affected (3 min 30.61 sec)&lt;br /&gt;Records: 3000000  Duplicates: 0  Warnings: 0&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; commit;&lt;br /&gt;Query OK, 0 rows affected (0.07 sec)&lt;br /&gt;mysql&amp;gt; show table status like 't1';&lt;br /&gt;+------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------+&lt;br /&gt;| Name | Engine | Version | Row_format | Rows    | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment              |&lt;br /&gt;+------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------+&lt;br /&gt;| t1   | InnoDB |      10 | Compact    | 3000249 |             76 |   228294656 |               0 |     86654976 |         0 |        6000000 | 2009-09-23 05:26:34 | NULL        | NULL       | utf8_general_ci |     NULL |                | InnoDB free: 4096 kB |&lt;br /&gt;+------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------+&lt;br /&gt;1 row in set (0.08 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; system ls -l /var/lib/mysql/data_3306/dbtest&lt;br /&gt;total 319820&lt;br /&gt;-rw-rw---- 1 mysql mysql        61 Sep 23 04:17 db.opt&lt;br /&gt;-rw-rw---- 1 mysql mysql      8646 Sep 23 05:26 t1.frm&lt;br /&gt;-rw-rw---- 1 mysql mysql 327155712 Sep 23 05:30 t1.ibd&lt;br /&gt;mysql&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2) mk-parallel-dump和mysqldump分别导出该表作比较&lt;br /&gt;mysqldump导出表&lt;br /&gt;&lt;pre class="console"&gt;# mkdir -p $HOME/backup&lt;br /&gt;# cd $HOME/backup &amp;amp;&amp;amp; rm -rf *&lt;br /&gt;# time mysqldump --socket=/var/lib/mysql/data_3306/mysql.sock --opt dbtest t1 &amp;gt;dbback-dbtest-t1.sql&lt;br /&gt;&lt;br /&gt;real    0m11.316s&lt;br /&gt;user    0m2.348s&lt;br /&gt;sys     0m0.472s&lt;br /&gt;# ls -l dbback-dbtest-t1.sql&lt;br /&gt;-rw-r--r-- 1 root root 179090589 Sep 23 05:31 dbback-dbtest-t1.sql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;mk-parallel-dump导出表, 导出文件放在目录$HOME/backup/pdump1下, 不压缩, 不记录binlog的位置&lt;br /&gt;&lt;pre class="console"&gt;# time mk-parallel-dump --socket=/var/lib/mysql/data_3306/mysql.sock --base-dir=$HOME/backup/pdump1 --no-gzip --nobin-log-position --tables=&amp;quot;dbtest.t1&amp;quot;&lt;br /&gt;     default:              1 tables,     1 chunks,     1 successes,  0 failures,  11.40 wall-clock time,  11.31 dump time&lt;br /&gt;&lt;br /&gt;real    0m11.608s&lt;br /&gt;user    0m2.176s&lt;br /&gt;sys     0m0.556s&lt;br /&gt;# find pdump1 -ls&lt;br /&gt;7162198    4 drwxr-xr-x   3 root     root         4096 Sep 23 05:33 pdump1&lt;br /&gt;7162199    4 drwxr-xr-x   3 root     root         4096 Sep 23 05:33 pdump1/default&lt;br /&gt;7162200    4 drwxr-xr-x   2 root     root         4096 Sep 23 05:33 pdump1/default/dbtest&lt;br /&gt;7162201 175076 -rw-r--r--   1 root     root     179096039 Sep 23 05:33 pdump1/default/dbtest/t1.000000.sql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;mk-parallel-dump导出表, 增加每一百万条(近似值)导出一个文件&lt;br /&gt;&lt;pre class="console"&gt;# time mk-parallel-dump --socket=/var/lib/mysql/data_3306/mysql.sock --base-dir=$HOME/backup/pdump2 --no-gzip --nobin-log-position --tables=&amp;quot;dbtest.t1&amp;quot; --chunk-size=1000000&lt;br /&gt;     default:              1 tables,     4 chunks,     4 successes,  0 failures,  10.36 wall-clock time,  15.92 dump time&lt;br /&gt;&lt;br /&gt;real    0m10.509s&lt;br /&gt;user    0m2.580s&lt;br /&gt;sys     0m0.560s&lt;br /&gt;# find pdump2 -ls&lt;br /&gt;7162202    4 drwxr-xr-x   3 root     root         4096 Sep 23 05:33 pdump2&lt;br /&gt;7162203    4 drwxr-xr-x   3 root     root         4096 Sep 23 05:33 pdump2/default&lt;br /&gt;7162204    4 drwxr-xr-x   2 root     root         4096 Sep 23 05:33 pdump2/default/dbtest&lt;br /&gt;7162205    4 -rw-r--r--   1 root     root          101 Sep 23 05:33 pdump2/default/dbtest/t1.chunks&lt;br /&gt;7162208 58544 -rw-r--r--   1 root     root     59879876 Sep 23 05:33 pdump2/default/dbtest/t1.000001.sql&lt;br /&gt;7162206   16 -rw-r--r--   1 root     root        16365 Sep 23 05:33 pdump2/default/dbtest/t1.000003.sql&lt;br /&gt;7162209 58000 -rw-r--r--   1 root     root     59324125 Sep 23 05:33 pdump2/default/dbtest/t1.000000.sql&lt;br /&gt;7162207 58544 -rw-r--r--   1 root     root     59880064 Sep 23 05:33 pdump2/default/dbtest/t1.000002.sql&lt;br /&gt;# cat pdump2/default/dbtest/t1.chunks&lt;br /&gt;`id` &amp;lt; 1999835&lt;br /&gt;`id` &amp;gt;= 1999835 AND `id` &amp;lt; 3999669&lt;br /&gt;`id` &amp;gt;= 3999669 AND `id` &amp;lt; 5999503&lt;br /&gt;`id` &amp;gt;= 5999503&lt;br /&gt;&lt;/pre&gt;.chunks文件记录了分块规则&lt;br /&gt;&lt;br /&gt;mk-parallel-dump导出表, 增加启动4个线程同时导出(不指定则默认为2个线程)&lt;br /&gt;&lt;pre class="console"&gt;# time mk-parallel-dump --socket=/var/lib/mysql/data_3306/mysql.sock --base-dir=$HOME/backup/pdump3 --no-gzip --nobin-log-position --tables=&amp;quot;dbtest.t1&amp;quot; --chunk-size=1000000 --threads=4&lt;br /&gt;     default:              1 tables,     4 chunks,     4 successes,  0 failures,   9.37 wall-clock time,  25.29 dump time&lt;br /&gt;&lt;br /&gt;real    0m9.529s&lt;br /&gt;user    0m2.572s&lt;br /&gt;sys     0m0.516s&lt;br /&gt;# find pdump3 -ls&lt;br /&gt;7359077    4 drwxr-xr-x   3 root     root         4096 Sep 23 05:34 pdump3&lt;br /&gt;7359078    4 drwxr-xr-x   3 root     root         4096 Sep 23 05:34 pdump3/default&lt;br /&gt;7359079    4 drwxr-xr-x   2 root     root         4096 Sep 23 05:34 pdump3/default/dbtest&lt;br /&gt;7359080    4 -rw-r--r--   1 root     root          101 Sep 23 05:34 pdump3/default/dbtest/t1.chunks&lt;br /&gt;7359084 58544 -rw-r--r--   1 root     root     59879876 Sep 23 05:34 pdump3/default/dbtest/t1.000001.sql&lt;br /&gt;7359081   16 -rw-r--r--   1 root     root        16365 Sep 23 05:34 pdump3/default/dbtest/t1.000003.sql&lt;br /&gt;7359083 58000 -rw-r--r--   1 root     root     59324125 Sep 23 05:34 pdump3/default/dbtest/t1.000000.sql&lt;br /&gt;7359082 58544 -rw-r--r--   1 root     root     59880064 Sep 23 05:34 pdump3/default/dbtest/t1.000002.sql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;导出速度差不多, 无显著差异, 因为这是个单CPU的系统, 只导出一个表, 分块和多线程可能还会带来额外的开销.&lt;br /&gt;如果是多核多CPU系统导出多个表, mk-parallel-dump应该会更快些.&lt;br /&gt;&lt;br /&gt;3) 比较mk-parallel-dump和mysqldump导入&lt;br /&gt;mysql导入&lt;br /&gt;&lt;pre class="console"&gt;# time mysql --socket=/var/lib/mysql/data_3306/mysql.sock dbtest &amp;lt;dbback-dbtest-t1.sql&lt;br /&gt;&lt;br /&gt;real    3m16.760s&lt;br /&gt;user    0m1.672s&lt;br /&gt;sys     0m0.156s&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;mk-parallel-restore导入&lt;br /&gt;&lt;pre class="console"&gt;# time mk-parallel-restore --socket=/var/lib/mysql/data_3306/mysql.sock $HOME/backup/pdump1&lt;br /&gt;    1 tables,     1 files,     1 successes,  0 failures, 199.75 wall-clock time, 199.75 load time&lt;br /&gt;&lt;br /&gt;real    3m19.910s&lt;br /&gt;user    0m0.232s&lt;br /&gt;sys     0m0.136s&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;mk-parallel-restore导入多个文件&lt;br /&gt;&lt;pre class="console"&gt;# mysql --socket=/var/lib/mysql/data_3306/mysql.sock -e &amp;quot;drop table dbtest.t1;&amp;quot;&lt;br /&gt;# time mk-parallel-restore --socket=/var/lib/mysql/data_3306/mysql.sock $HOME/backup/pdump2&lt;br /&gt;    1 tables,     4 files,     1 successes,  0 failures, 196.55 wall-clock time, 196.54 load time&lt;br /&gt;&lt;br /&gt;real    3m16.653s&lt;br /&gt;user    0m0.268s&lt;br /&gt;sys     0m0.148s&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;mk-parallel-restore导入多个文件, 启4个线程&lt;br /&gt;&lt;pre class="console"&gt;# mysql --socket=/var/lib/mysql/data_3306/mysql.sock -e &amp;quot;drop table dbtest.t1;&amp;quot;&lt;br /&gt;# time mk-parallel-restore --socket=/var/lib/mysql/data_3306/mysql.sock $HOME/backup/pdump3 --threads=4&lt;br /&gt;    1 tables,     4 files,     1 successes,  0 failures, 194.19 wall-clock time, 194.19 load time&lt;br /&gt;&lt;br /&gt;real    3m14.606s&lt;br /&gt;user    0m0.204s&lt;br /&gt;sys     0m0.164s&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;速度也都差不多&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;总体感觉很一般啊, 以后再试试其它工具. 关于数据库复制, 日志/语句分析等工具可能还比较有用.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="http://www.maatkit.org/"&gt;Tools for MySQL - Maatkit makes MySQL - easier to manage.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/maatkit/"&gt;maatkit - A toolkit that provides advanced functionality for MySQL&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.paragon-cs.com/wordpress/2007/11/08/mysql-parallel-dump-test/"&gt;mysql-parallel-dump test&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-7635841322770480188?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/7635841322770480188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=7635841322770480188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/7635841322770480188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/7635841322770480188'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/09/introducing-maatkit-parallel-dump.html' title='introducing maatkit - parallel dump'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-8971201685142111004</id><published>2009-09-21T19:12:00.002+08:00</published><updated>2009-09-21T19:16:56.375+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>DML Error Logging</title><content type='html'>DML Error Logging&lt;br /&gt;&lt;br /&gt;提问:一个问题， 在存储过程中，有对20万条记录进行修改的一个UPDATE,当中间某个表由于字段长度问题而导致修改失败，在异常处理中，如何定位是哪条记录问题导致失败？&lt;br /&gt;&lt;br /&gt;这个无法显示哪行出现超出？你能定位到哪行??&lt;br /&gt;&lt;pre class="console"&gt;SQL&amp;gt; CREATE OR REPLACE PROCEDURE test111 AS&lt;br /&gt;  2 &lt;br /&gt;  3    v_sqlcode number;&lt;br /&gt;  4    v_sqlerrm varchar2(100);&lt;br /&gt;  5  BEGIN&lt;br /&gt;  6 &lt;br /&gt;  7 &lt;br /&gt;  8  update test set aa=aa||'string' ;&lt;br /&gt;  9      commit;&lt;br /&gt; 10  EXCEPTION&lt;br /&gt; 11      when others then&lt;br /&gt; 12      v_sqlcode:=Sqlcode;&lt;br /&gt; 13      v_sqlerrm:=Sqlerrm;&lt;br /&gt; 14       rollback;&lt;br /&gt; 15  DBMS_OUTPUT.PUT_LINE('AAA' || SQLCODE || SQLERRM || 'START');&lt;br /&gt; 16 &lt;br /&gt; 17  END;&lt;br /&gt; 18  /&lt;br /&gt; &lt;br /&gt;Procedure created.&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; set serveroutput on&lt;br /&gt;SQL&amp;gt; exec test111;&lt;br /&gt;AAA-12899ORA-12899: value too large for column &amp;quot;HR&amp;quot;.&amp;quot;TEST&amp;quot;.&amp;quot;AA&amp;quot; (actual: 11,&lt;br /&gt;maximum: 10)START&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;回答: 数据操纵语言错误记录(DML Error Logging)能够满足您的要求&lt;br /&gt;&lt;br /&gt;运行SQL语句, 如果只有一条记录出错, 也会立刻终止语句运行, 回滚事务, 导致对数据的修改全部失败, 尤其是当用一条语句批量处理大量记录时这个问题更加突出&lt;br /&gt;10gR2增加了DML错误记录功能, 在运行SQL语句发生某些异常时, 不会中断整个事务, 而是自动将错误信息记录到另一个指定的表, 然后继续处理&lt;br /&gt;&lt;br /&gt;1. 举例&lt;br /&gt;创建测试表&lt;br /&gt;&lt;pre&gt;set serveroutput on size unlimited&lt;br /&gt;set pages 50000 line 130&lt;br /&gt;drop table t purge;&lt;br /&gt;drop table err$_t purge;&lt;br /&gt;create table t(a number(1) primary key, b char);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;然后需要建一个记录错误信息的表, 用Oracle提供的DBMS_ERRLOG包自动创建或手工创建&lt;br /&gt;&lt;pre&gt;exec dbms_errlog.create_error_log('t');&lt;br /&gt;&lt;/pre&gt;缺省名称是ERR$_加原表名的前25个字符&lt;br /&gt;&lt;pre class="console"&gt;SQL&amp;gt; select * from tab;&lt;br /&gt;&lt;br /&gt;TNAME                          TABTYPE  CLUSTERID&lt;br /&gt;------------------------------ ------- ----------&lt;br /&gt;T                              TABLE&lt;br /&gt;ERR$_T                         TABLE&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; desc ERR$_T&lt;br /&gt; Name                                                                    Null?    Type&lt;br /&gt; ----------------------------------------------------------------------- -------- ------------------------------------------------&lt;br /&gt; ORA_ERR_NUMBER$                                                                  NUMBER&lt;br /&gt; ORA_ERR_MESG$                                                                    VARCHAR2(2000)&lt;br /&gt; ORA_ERR_ROWID$                                                                   ROWID&lt;br /&gt; ORA_ERR_OPTYP$                                                                   VARCHAR2(2)&lt;br /&gt; ORA_ERR_TAG$                                                                     VARCHAR2(2000)&lt;br /&gt; A                                                                                VARCHAR2(4000)&lt;br /&gt; B                                                                                VARCHAR2(4000)&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;&lt;/pre&gt;ORA_ERR_NUMBER$ 错误编号&lt;br /&gt;ORA_ERR_MESG$ 错误信息&lt;br /&gt;ORA_ERR_ROWID$ 出错行的rowid(只对update和delete)&lt;br /&gt;ORA_ERR_OPTYP$ 错误类型 I:插入 U:更新 D:删除&lt;br /&gt;ORA_ERR_TAG$ 由用户定义的标签&lt;br /&gt;(如果采用手工创建, 必须包括上述字段)&lt;br /&gt;后两个字段与原表对应, 数据类型为varchar2(4000), 用于存储出错的记录(数据类型转换见&lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/tables.htm#sthref2230"&gt;Table 15-2 Error Logging Table Column Data Types&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;用原始方式插入测试数据&lt;br /&gt;&lt;pre class="console"&gt;SQL&amp;gt; insert into t (a) select level from dual connect by level &amp;lt;= 12;&lt;br /&gt;insert into t (a) select level from dual connect by level &amp;lt;= 12&lt;br /&gt;                               *&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01438: value larger than specified precision allowed for this column&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;字段a只有一位数字, 不能超过9, 插入10导致出错了&lt;br /&gt;&lt;br /&gt;增加LOG ERRORS子句后&lt;br /&gt;&lt;pre class="console"&gt;SQL&amp;gt; insert into t (a) select level from dual connect by level &amp;lt;= 12 log errors reject limit unlimited;&lt;br /&gt;&lt;br /&gt;9 rows created.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select * from t;&lt;br /&gt;&lt;br /&gt;         A B&lt;br /&gt;---------- -&lt;br /&gt;         1&lt;br /&gt;         2&lt;br /&gt;         3&lt;br /&gt;         4&lt;br /&gt;         5&lt;br /&gt;         6&lt;br /&gt;         7&lt;br /&gt;         8&lt;br /&gt;         9&lt;br /&gt;&lt;br /&gt;9 rows selected.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; col ORA_ERR_MESG$ for a50&lt;br /&gt;SQL&amp;gt; col ORA_ERR_TAG$ for a10&lt;br /&gt;SQL&amp;gt; col ORA_ERR_ROWID$ for a10&lt;br /&gt;SQL&amp;gt; col A for a10&lt;br /&gt;SQL&amp;gt; col b for a10&lt;br /&gt;SQL&amp;gt; select * from err$_t;&lt;br /&gt;&lt;br /&gt;ORA_ERR_NUMBER$ ORA_ERR_MESG$                                      ORA_ERR_RO OR ORA_ERR_TA A          B&lt;br /&gt;--------------- -------------------------------------------------- ---------- -- ---------- ---------- ----------&lt;br /&gt;           1438 ORA-01438: value larger than specified precision a            I             10&lt;br /&gt;                llowed for this column&lt;br /&gt;&lt;br /&gt;           1438 ORA-01438: value larger than specified precision a            I             11&lt;br /&gt;                llowed for this column&lt;br /&gt;&lt;br /&gt;           1438 ORA-01438: value larger than specified precision a            I             12&lt;br /&gt;                llowed for this column&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;SQL语句运行成功并且将错误记录到了err$_t&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;2. 语法&lt;br /&gt;Error logging的语法是:&lt;br /&gt;LOG ERRORS [INTO [schema.]table] &lt;br /&gt;[ (simple_expression) ] &lt;br /&gt;[ REJECT LIMIT {integer|UNLIMITED} ]&lt;br /&gt;&lt;br /&gt;INTO子句可选, 缺省表名是err$_原表名的前25个字符&lt;br /&gt;simple_expression可以是一个由表达式构成字符串, 作为为标签插入到字段ORA_ERR_TAG$&lt;br /&gt;REJECT LIMIT表示最多允许记录多少个错误, 超过这个范围就抛出异常. 如果是0, 表示不记录错误(见下)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. REJECT LIMIT 子句&lt;br /&gt;在10.2.0.4测试结果和10gR2文档说的有些出入&lt;br /&gt;&lt;br /&gt;缺省情况也记录错误, 只记录一条错误&lt;br /&gt;&lt;pre class="console"&gt;SQL&amp;gt; truncate table t;&lt;br /&gt;&lt;br /&gt;Table truncated.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; truncate table err$_t;&lt;br /&gt;&lt;br /&gt;Table truncated.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; insert into t (a) select level from dual connect by level &amp;lt;= 13 log errors;&lt;br /&gt;insert into t (a) select level from dual connect by level &amp;lt;= 13 log errors&lt;br /&gt;                               *&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01438: value larger than specified precision allowed for this column&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select * from err$_t;&lt;br /&gt;&lt;br /&gt;ORA_ERR_NUMBER$ ORA_ERR_MESG$                                                          ORA_ERR_RO OR ORA_ERR_TA A&lt;br /&gt;--------------- ---------------------------------------------------------------------- ---------- -- ---------- ----------&lt;br /&gt;B&lt;br /&gt;----------&lt;br /&gt;           1438 ORA-01438: value larger than specified precision allowed for this colu            I             10&lt;br /&gt;                mn&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;如果指定了数量n, 会记录n+1条&lt;br /&gt;&lt;pre class="console"&gt;SQL&amp;gt; truncate table t;&lt;br /&gt;&lt;br /&gt;Table truncated.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; truncate table err$_t;&lt;br /&gt;&lt;br /&gt;Table truncated.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; insert into t (a) select level from dual connect by level &amp;lt;= 13 log errors reject limit 2;&lt;br /&gt;insert into t (a) select level from dual connect by level &amp;lt;= 13 log errors reject limit 2&lt;br /&gt;                               *&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01438: value larger than specified precision allowed for this column&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select * from err$_t;&lt;br /&gt;&lt;br /&gt;ORA_ERR_NUMBER$ ORA_ERR_MESG$                                                          ORA_ERR_RO OR ORA_ERR_TA A&lt;br /&gt;--------------- ---------------------------------------------------------------------- ---------- -- ---------- ----------&lt;br /&gt;B&lt;br /&gt;----------&lt;br /&gt;           1438 ORA-01438: value larger than specified precision allowed for this colu            I             10&lt;br /&gt;                mn&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           1438 ORA-01438: value larger than specified precision allowed for this colu            I             11&lt;br /&gt;                mn&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           1438 ORA-01438: value larger than specified precision allowed for this colu            I             12&lt;br /&gt;                mn&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;11gR1文档似乎修正了这个错误:&lt;br /&gt;This subclause indicates the maximum number of errors that can be encountered before the INSERT statement terminates and rolls back. You can also specify UNLIMITED. The default reject limit is zero, which means that upon encountering the first error, the error is logged and the statement rolls back. For parallel DML operations, the reject limit is applied to each parallel server.&lt;br /&gt;&lt;br /&gt;11gR2文档:&lt;br /&gt;If REJECT LIMIT X had been specified, the statement would have failed with the error message of error X=1. The error message can be different for different reject limits. In the case of a failing statement, only the DML statement is rolled back, not the insertion into the DML error logging table. The error logging table will contain X+1 rows.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. 错误记录表&lt;br /&gt;错误记录表不会自动清除, 以自治事务运行. 如超过REJECT LIMIT限制, DML语句回滚, 错误记录表不回滚&lt;br /&gt;错误记录表所属的用户和运行DML语句的用户可以不相同, 运行语句的用户对错误记录表必须具有插入权限&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. 使用限制&lt;br /&gt;对以下情况记录错误:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;列值太大&lt;/li&gt;&lt;li&gt;违反非空,唯一,引用(referential),或检查(check)约束条件&lt;/li&gt;&lt;li&gt;由触发器抛出的异常&lt;/li&gt;&lt;li&gt;数据类型转换错误&lt;/li&gt;&lt;li&gt;分区映射错误&lt;/li&gt;&lt;li&gt;某些merge操作错误(如 ORA-30926: Unable to get a stable set of rows for MERGE operation.)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;下述情况不记录错误:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;违反了延迟的(deferred)约束条件&lt;/li&gt;&lt;li&gt;空间不够&lt;/li&gt;&lt;li&gt;直接路径插入操作(insert或merge)抛出的唯一约束或唯一索引错误&lt;/li&gt;&lt;li&gt;更新操作(update或merge)抛出的唯一约束或唯一索引错误&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/sqlplsql.htm#sthref3393"&gt;DML Error Logging&lt;/a&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14223/transform.htm#sthref777"&gt;Error Logging and Handling Mechanisms&lt;/a&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/tables.htm#sthref2223"&gt;Inserting Data with DML Error Logging&lt;/a&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_errlog.htm"&gt;38  DBMS_ERRLOG&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/oramag/oracle/06-mar/o26performance.html"&gt;Faster Batch Processing By Mark Rittman&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.orafaq.com/node/76"&gt;10gR2 New Feature: DML Error Logging&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oracle-base.com/articles/10g/DmlErrorLogging_10gR2.php"&gt;DML Error Logging in Oracle 10g Database Release 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://psoug.org/reference/dbms_errlog.html"&gt;Oracle DBMS_ERRLOG&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.databasejournal.com/features/oracle/article.php/3626776/Oracle-DML-Error-Logging.htm"&gt;Oracle DML Error Logging&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oracle-developer.net/display.php?id=329"&gt;dml error logging in oracle 10g release 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-8971201685142111004?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/8971201685142111004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=8971201685142111004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/8971201685142111004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/8971201685142111004'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/09/dml-error-logging.html' title='DML Error Logging'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-3552507225397946643</id><published>2009-09-03T18:28:00.000+08:00</published><updated>2009-09-03T18:28:10.748+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualization'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='xen'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><title type='text'>no login prompt in vm console</title><content type='html'>no login prompt in vm console&lt;br /&gt;虚拟机终端没有登录提示&lt;br /&gt;&lt;br /&gt;用xm console命令登录Xen创建的虚拟机, 屏幕上只显示启动时的信息, 没有登录提示, 按多次回车也有没反应, 如下:&lt;br /&gt;&lt;pre class="console"&gt;Mounting other filesystems:  [  OK  ]&lt;br /&gt;Starting sshd: [  OK  ]&lt;br /&gt;Starting crond: [  OK  ]&lt;br /&gt;Starting anacron: [  OK  ]&lt;br /&gt;Starting atd: [  OK  ]&lt;br /&gt;Starting Avahi daemon... [  OK  ]&lt;br /&gt;Starting HAL daemon: [  OK  ]&lt;br /&gt;Starting puppet: [  OK  ]&lt;br /&gt;Starting smartd: [  OK  ]&lt;br /&gt;INIT: version 2.86 reloading&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;按文档&lt;a href="http://wiki.centos.org/TipsAndTricks/Xen"&gt;Console handling&lt;/a&gt;指示&lt;br /&gt;需要在/etc/inittab增加一行xvc0, 并注释其它tty配置&lt;br /&gt;&lt;pre&gt;co:2345:respawn:/sbin/agetty xvc0 9600 vt100-nav&lt;br /&gt;#1:2345:respawn:/sbin/mingetty tty1&lt;br /&gt;#2:2345:respawn:/sbin/mingetty tty2&lt;br /&gt;#3:2345:respawn:/sbin/mingetty tty3&lt;br /&gt;#4:2345:respawn:/sbin/mingetty tty4&lt;br /&gt;#5:2345:respawn:/sbin/mingetty tty5&lt;br /&gt;#6:2345:respawn:/sbin/mingetty tty6&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;在/etc/securetty增加一行&lt;br /&gt;&lt;pre&gt;xvc0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;修改完/etc/inittab后运行&lt;br /&gt;&lt;pre&gt;init q&lt;br /&gt;&lt;/pre&gt;使之生效&lt;br /&gt;&lt;br /&gt;再次连接虚拟机终端, 出现登录界面&lt;br /&gt;&lt;pre class="console"&gt;# xm console 14&lt;br /&gt;INIT: Sending processes the TERM signal&lt;br /&gt;&lt;br /&gt;CentOS release 5.3 (Final)&lt;br /&gt;Kernel 2.6.18-128.7.1.el5xen on an x86_64&lt;br /&gt;&lt;br /&gt;vm02.zone101.bj4.company.com login:&lt;br /&gt;CentOS release 5.3 (Final)&lt;br /&gt;Kernel 2.6.18-128.7.1.el5xen on an x86_64&lt;br /&gt;&lt;br /&gt;vm02.zone101.bj4.company.com login:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;至于为何没有自动添加参数, 原因不明, 有可能是BUG&lt;br /&gt;&lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=463855"&gt; Bug 463855 -  No login prompt after headless serial console installation with virtualization&lt;/a&gt;&lt;br /&gt;&lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=448429"&gt; Bug 448429 -  xm console requires DomU getty modification to point to xvc0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-3552507225397946643?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/3552507225397946643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=3552507225397946643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/3552507225397946643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/3552507225397946643'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/09/no-login-prompt-in-vm-console.html' title='no login prompt in vm console'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-5992566262144505494</id><published>2009-09-02T19:09:00.002+08:00</published><updated>2009-09-02T19:09:45.426+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><title type='text'>multitail</title><content type='html'>multitail&lt;br /&gt;&lt;br /&gt;multitail是一个小工具, 于tail和watch命令相比, 它的好处是可以用来同时查看多个文件或命令的输出, 还可以将多个文件或命令输出到一个窗口显示, 定义配色方案彩色显示, 按模式匹配关键字过滤或高亮显示.&lt;br /&gt;最新版本是2008-05-19发布的v5.2.2&lt;br /&gt;从源码编译安装或从rpmforge上rpm包直接安装&lt;br /&gt;&lt;br /&gt;使用方法:&lt;br /&gt;&lt;pre&gt;multitail file1 file2 ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;比如:&lt;br /&gt;&lt;pre class="console"&gt;multitail /var/log/messages /var/log/httpd/access_log&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://picasaweb.google.com/lh/photo/DyTXRzugVAQXSJzq8MY7PQ?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_DZ1u7Q8ZrVU/Sp5RQzUm_UI/AAAAAAAADTc/BuEJRQjZWts/s400/multitail-simple-090902.png" alt="multitail-simple-090902" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;复杂一点的, 缓冲10000行, 窗口分割为2列, 反显ERR|dhcpd|twitter字符, 同时显示2个日志文件, 运行iostat命令, 每隔5秒运行ls命令&lt;br /&gt;&lt;pre class="console"&gt;multitail -M 10000 -s 2 -EC "ERR|dhcpd|twitter" \&lt;br /&gt;/var/log/messages \&lt;br /&gt;/u01/blurlog/mysql/bqa2/cloud1/db01/logs/general.log \&lt;br /&gt;-l "iostat 3" \&lt;br /&gt;-R 5 -l "ls -l /var/log/messages"&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://picasaweb.google.com/lh/photo/5xuUebGvzjUWl1GE98Db1g?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_DZ1u7Q8ZrVU/Sp5RRPn1ptI/AAAAAAAADTg/m1C2oAc8RCI/s400/multitail-advanced-090902.png" alt="multitail-advanced-090902" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在后台观察发现其实调用的就是一些tail命令&lt;br /&gt;&lt;pre class="console"&gt;# ps -ef|grep 3454&lt;br /&gt;root      3454 32310  0 10:45 pts/6    00:00:00 multitail -M 10000 -s 2 -EC ERR|dhcpd|twitter /var/log/messages /u01/blurlog/mysql/bqa2/cloud1/db01/logs/general.log -l iostat 3 -R 5 -l ls -l /var/log/messages&lt;br /&gt;root      3455  3454  0 10:45 pts/6    00:00:00 tail --follow=name -n 62 /var/log/messages&lt;br /&gt;root      3456  3454  0 10:45 pts/6    00:00:00 tail --follow=name -n 62 /u01/blurlog/mysql/bqa2/cloud1/db01/logs/general.log&lt;br /&gt;root      3457  3454  0 10:45 pts/6    00:00:00 iostat 3&lt;br /&gt;root      7440  3454  0 10:50 pts/6    00:00:00 multitail -M 10000 -s 2 -EC ERR|dhcpd|twitter /var/log/messages /u01/blurlog/mysql/bqa2/cloud1/db01/logs/general.log -l iostat 3 -R 5 -l ls -l /var/log/messages&lt;br /&gt;root      7442  2641  0 10:50 pts/65   00:00:00 grep 3454&lt;br /&gt;&lt;/pre&gt;这个软件不是很稳定, 经常异常退出. 异常退出后, 必须手工杀掉后台的tail命令&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="http://www.vanheusden.com/multitail/"&gt;MultiTail&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ibm.com/developerworks/cn/aix/library/au-spunix_greattools/#multitail"&gt;用 multitail 查看许多文件 - 对话 UNIX: 适用于任何 UNIX 系统的 10 个出色的工具&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Multitail"&gt;Multitail&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tech.ccidnet.com/art/738/20041015/165646_1.html"&gt;使用MultiTail同时监控多个文件 &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-5992566262144505494?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/5992566262144505494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=5992566262144505494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/5992566262144505494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/5992566262144505494'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/09/multitail.html' title='multitail'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_DZ1u7Q8ZrVU/Sp5RQzUm_UI/AAAAAAAADTc/BuEJRQjZWts/s72-c/multitail-simple-090902.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-6361450715974728562</id><published>2009-08-27T19:27:00.002+08:00</published><updated>2009-08-27T19:27:30.510+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>how to find ip address of network interface</title><content type='html'>how to find ip address assigned to network interface&lt;br /&gt;如何取得网卡分配的IP地址&lt;br /&gt;&lt;br /&gt;运行脚本:&lt;br /&gt;&lt;pre&gt;/sbin/ifconfig -a|awk '&lt;br /&gt;{&lt;br /&gt;  if ( $0 ~ /^[^ ]/ ) {&lt;br /&gt;    ifname=$1&lt;br /&gt;    do {&lt;br /&gt;      getline&lt;br /&gt;      if ( $0 ~ /inet addr/ ) {&lt;br /&gt;        ifaddr=substr($2, index($2, &amp;quot;:&amp;quot;)+1)&lt;br /&gt;      }&lt;br /&gt;    } while ( $0 ~ /^[ ]/ )&lt;br /&gt;    print ifname, ifaddr&lt;br /&gt;    ifname=&amp;quot;&amp;quot;&lt;br /&gt;    ifaddr=&amp;quot;&amp;quot;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;'&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;bond0 192.168.11.18&lt;br /&gt;eth0&lt;br /&gt;eth1&lt;br /&gt;lo 127.0.0.1&lt;br /&gt;sit0&lt;br /&gt;tun0 172.16.220.94&lt;br /&gt;&lt;/pre&gt;列出系统中所有网卡对应的IPv4地址&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-6361450715974728562?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/6361450715974728562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=6361450715974728562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/6361450715974728562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/6361450715974728562'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/08/how-to-find-ip-address-of-network.html' title='how to find ip address of network interface'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-6240834208053529538</id><published>2009-08-27T12:17:00.001+08:00</published><updated>2009-08-27T12:19:12.310+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>red herring</title><content type='html'>red herring&lt;br /&gt;熏鲱鱼&lt;br /&gt;&lt;br /&gt;意指:&lt;br /&gt;1. 故意引起误导, 转移注意的虚假线索&lt;br /&gt;The way Barclay keeps his novels on the move is to put each book's protagonist up against a series of events that fall into a netherworld between clues and &lt;strong&gt;red herrings&lt;/strong&gt;.&lt;br /&gt;巴克莱推动小说情节发展的方式是设置真实和虚假的线索将故事中的主人公置于一系列陷入可怕的境地的事件中&lt;br /&gt;&lt;br /&gt;2. 提出无关话题, 借以从原主题转移注意力的一种逻辑谬论&lt;br /&gt;Cheney's 'Torture Works' Argument Is a &lt;strong&gt;Red Herring&lt;/strong&gt;&lt;br /&gt;切尼&amp;quot;虐囚有理&amp;quot;的争辩实属混淆视听&lt;br /&gt;&lt;br /&gt;3. 成语: 难以名状的, 非驴非马, 不伦不类&lt;br /&gt;&lt;strong&gt;neither fish nor fowl(flesh) (nor good red herring)&lt;/strong&gt;&lt;br /&gt;I guess that's why I'm a lukewarmer--neither fish nor fowl nor good red herring.&lt;br /&gt;我想这就是为什么我是个温和主义者--非驴非马&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;起源:&lt;br /&gt;通常认为, 起源于猎人在训练猎狗时用熏鲱鱼的气味干扰其追踪猎物.&lt;br /&gt;事实并非如此, 这种说法最早出现在19世纪初一名英国记者写的一篇小说中, 用来隐喻抨击当时新闻界的错误报道, 由于这个比喻广泛流传深入人心, 后来被人误认为是一种训练猎狗的方法.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Red_herring_%28idiom%29"&gt;Red herring (idiom)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wiktionary.org/wiki/red_herring"&gt;red herring&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.worldwidewords.org/articles/herring.htm"&gt;THE LURE OF THE RED HERRING&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nizkor.org/features/fallacies/red-herring.html"&gt;Fallacy: Red Herring &lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.fallacyfiles.org/redherrf.html"&gt;Red Herring&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.deproverbio.com/display.php?a=3&amp;r=41"&gt;&amp;quot;NEITHER FISH NOR FLESH&amp;quot; AND ITS VARIATIONS*&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Herring"&gt;Herring&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-6240834208053529538?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/6240834208053529538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=6240834208053529538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/6240834208053529538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/6240834208053529538'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/08/red-herring.html' title='red herring'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-1776182597377570250</id><published>2009-08-23T22:20:00.005+08:00</published><updated>2009-08-24T08:20:19.339+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>InnoDB Index Structure</title><content type='html'>InnoDB Index Structure&lt;br /&gt;InnoDB索引结构&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;题问:&lt;br /&gt;查看下面查询语句, 字段b是数字类型, 建立了索引, 查询条件是LIKE, 为何使用了索引全扫描(type=index)?&lt;br /&gt;&lt;pre class="console"&gt;mysql&amp;gt; desc t1;&lt;br /&gt;+-------+---------+------+-----+---------+-------+&lt;br /&gt;| Field | Type    | Null | Key | Default | Extra |&lt;br /&gt;+-------+---------+------+-----+---------+-------+&lt;br /&gt;| a     | int(11) | NO   | PRI | 0       |       |&lt;br /&gt;| b     | int(11) | YES  | MUL | NULL    |       |&lt;br /&gt;| c     | int(11) | YES  |     | NULL    |       |&lt;br /&gt;+-------+---------+------+-----+---------+-------+&lt;br /&gt;3 rows in set (0.01 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; explain select a, b from t1 where b like '50';&lt;br /&gt;+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+&lt;br /&gt;| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                    |&lt;br /&gt;+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+&lt;br /&gt;|  1 | SIMPLE      | t1    | index | b             | b    | 5       | NULL | 4866 | Using where; Using index |&lt;br /&gt;+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;回答:&lt;br /&gt;这条查询语句用到了覆盖索引(covering index), 跟InnoDB索引的结构有关.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;1. 存储结构&lt;br /&gt;InnoDB存储引擎中, 每一个表具有一个特殊的索引,叫聚集索引(clustered index, 又叫primary index), 行数据存储在该索引节点上, 这相当于Oracle的索引组织表的结构.&lt;br /&gt;聚集索引建立的规则如下:&lt;br /&gt;1)如果有主键, 那么选择该主键&lt;br /&gt;2)如果没有主键, 有非空列的唯一索引, 则选择第一个非空唯一索引&lt;br /&gt;3)否则, InnoDB存储引擎内部为每一条记录分配一个6字节的唯一标识(row id)&lt;br /&gt;以此作为行的唯一标识创建聚集索引, 每条记录的数据存储在聚集索引的叶子节点上, 所以InnoDB聚集索引就是表本身. &lt;br /&gt;&lt;br /&gt;其它索引称为二级索引(Secondary index)&lt;br /&gt;二级索引的节点不仅保存索引键值(索引字段的值), 还保存了对应行的聚集索引(primary key)的键值. 此值起到指针的作用, 查询通过它去访问聚集索引, 扫描主键(primary key)从而得到行数据.(Oracle IOT的二级索引保存的是逻辑行标识符[logical rowid]). 这意味着, 通过二级索引查询要扫描两个索引, 二级索引和聚集索引&lt;br /&gt;&lt;br /&gt;如图所示:&lt;br /&gt;&lt;pre&gt;.&lt;br /&gt;  primary key&lt;br /&gt;         o  &amp;lt;-------&lt;br /&gt;         |          |&lt;br /&gt;      -------       |&lt;br /&gt;     |       |      |&lt;br /&gt;     o       o      |&lt;br /&gt;     |       |      |&lt;br /&gt;    ---     ---     |&lt;br /&gt;   |   |   |   |    |&lt;br /&gt;   o   o   o   o    |&lt;br /&gt;  k+r k+r k+r k+r   |&lt;br /&gt;                    |&lt;br /&gt;  secondary key     |&lt;br /&gt;         o          |&lt;br /&gt;         |          |&lt;br /&gt;      -------       |&lt;br /&gt;     |       |      |&lt;br /&gt;     o       o      |&lt;br /&gt;     |       |      |&lt;br /&gt;    ---     ---     |&lt;br /&gt;   |   |   |   |    |&lt;br /&gt;   o   o   o   o    |&lt;br /&gt;  k+p k+p k+p k+p   |&lt;br /&gt;                |   |&lt;br /&gt;                 ---&lt;br /&gt;.&lt;br /&gt;primary key: 即primary index, 即聚集索引&lt;br /&gt;secondary key: 即secondary index&lt;br /&gt;k+r: key value + row data, 即索引键值和行数据&lt;br /&gt;k+p: key value + primary key values, 即索引键值和主键键值&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2. 选择主键&lt;br /&gt;由于InnoDB索引存储结构的特殊性, 因此在设计表时对主键的选择显得格外重要, 主要原则有:&lt;br /&gt;1) 显式指定主键, 不要让系统自动创建&lt;br /&gt;如果不指定主键, 系统会自动创建一个自增长类型的隐含的字段(row id)作为主键, 长6字节&lt;br /&gt;演示如下:&lt;br /&gt;建一个表, 不带主键, 查看事务锁的状态&lt;br /&gt;&lt;pre class="plsql_code"&gt;drop table if exists test;&lt;br /&gt;create table test(a int, b int, c int) engine=innodb;&lt;br /&gt;insert into test values(1, 16, 17), (2, 32, 34);&lt;br /&gt;-- connection 1:&lt;br /&gt;set transaction isolation level serializable;&lt;br /&gt;start transaction;&lt;br /&gt;select * from test;&lt;br /&gt;-- connection 2:&lt;br /&gt;set transaction isolation level serializable;&lt;br /&gt;start transaction;&lt;br /&gt;update test set a = 9;&lt;br /&gt;-- connection 3:&lt;br /&gt;SHOW ENGINE INNODB STATUS\G&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;------------&lt;br /&gt;TRANSACTIONS&lt;br /&gt;------------&lt;br /&gt;Trx id counter 0 5673&lt;br /&gt;Purge done for trx's n:o &amp;lt; 0 5672 undo n:o &amp;lt; 0 0&lt;br /&gt;History list length 24&lt;br /&gt;Total number of lock structs in row lock hash table 2&lt;br /&gt;LIST OF TRANSACTIONS FOR EACH SESSION:&lt;br /&gt;---TRANSACTION 0 0, not started, process no 4304, OS thread id 1162881344&lt;br /&gt;MySQL thread id 20, query id 7423 localhost root&lt;br /&gt;SHOW ENGINE INNODB STATUS&lt;br /&gt;---TRANSACTION 0 5672, ACTIVE 3 sec, process no 4304, OS thread id 1162615104 starting index read&lt;br /&gt;mysql tables in use 1, locked 1&lt;br /&gt;LOCK WAIT 2 lock struct(s), heap size 368&lt;br /&gt;MySQL thread id 19, query id 7422 localhost root Updating&lt;br /&gt;update test set a = 9&lt;br /&gt;------- TRX HAS BEEN WAITING 3 SEC FOR THIS LOCK TO BE GRANTED:&lt;br /&gt;RECORD LOCKS space id 35 page no 3 n bits 72 &lt;b&gt;index `GEN_CLUST_INDEX`&lt;/b&gt; of table `motoaccounts0/test` trx id 0 5672 lock_mode X waiting&lt;br /&gt;Record lock, heap no 2 PHYSICAL RECORD: &lt;b&gt;n_fields 6;&lt;/b&gt; compact format; info bits 0&lt;br /&gt; &lt;b&gt;0: len 6; hex 000000002604; asc     &amp;amp; ;;&lt;/b&gt; 1: len 6; hex 000000001625; asc      %;; 2: len 7; hex 80000000340110; asc     4  ;; 3: len 4; hex 80000001; asc     ;; 4: len 4; hex 80000010; asc     ;; 5: len 4; hex 80000011; asc     ;;&lt;br /&gt;&lt;br /&gt;------------------&lt;br /&gt;---TRANSACTION 0 5670, ACTIVE 8 sec, process no 4304, OS thread id 1162348864&lt;br /&gt;2 lock struct(s), heap size 368&lt;br /&gt;MySQL thread id 18, query id 7419 localhost root&lt;br /&gt;&lt;/pre&gt;系统创建的索引的名字是GEN_CLUST_INDEX&lt;br /&gt;索引结构中的字段个数(n_fields)为6, 第0个的长度是6字节(0: len 6;), 就是系统自动创建的隐含rowid; 后面两个1和2是系统内部使用的; 接下来第3,4,5代表表中的实际的字段&lt;br /&gt;&lt;br /&gt;表如果带主键, 则是另一种情况&lt;br /&gt;&lt;pre class="plsql_code"&gt;drop table if exists test;&lt;br /&gt;create table test(a int primary key, b int, c int) engine=innodb;&lt;br /&gt;insert into test values(1, 16, 17), (2, 32, 34);&lt;br /&gt;-- connection 1:&lt;br /&gt;set transaction isolation level serializable;&lt;br /&gt;start transaction;&lt;br /&gt;select * from test;&lt;br /&gt;-- connection 2:&lt;br /&gt;set transaction isolation level serializable;&lt;br /&gt;start transaction;&lt;br /&gt;update test set a = 9;&lt;br /&gt;-- connection 3:&lt;br /&gt;SHOW ENGINE INNODB STATUS\G&lt;br /&gt;&lt;/pre&gt;&lt;pre class="console"&gt;------------&lt;br /&gt;TRANSACTIONS&lt;br /&gt;------------&lt;br /&gt;Trx id counter 0 5682&lt;br /&gt;Purge done for trx's n:o &amp;lt; 0 5681 undo n:o &amp;lt; 0 0&lt;br /&gt;History list length 27&lt;br /&gt;Total number of lock structs in row lock hash table 2&lt;br /&gt;LIST OF TRANSACTIONS FOR EACH SESSION:&lt;br /&gt;---TRANSACTION 0 0, not started, process no 4304, OS thread id 1162881344&lt;br /&gt;MySQL thread id 20, query id 7434 localhost root&lt;br /&gt;SHOW ENGINE INNODB STATUS&lt;br /&gt;---TRANSACTION 0 5681, ACTIVE 2 sec, process no 4304, OS thread id 1162615104 starting index read&lt;br /&gt;mysql tables in use 1, locked 1&lt;br /&gt;LOCK WAIT 2 lock struct(s), heap size 368&lt;br /&gt;MySQL thread id 19, query id 7433 localhost root Searching rows for update&lt;br /&gt;update test set a = 9&lt;br /&gt;------- TRX HAS BEEN WAITING 2 SEC FOR THIS LOCK TO BE GRANTED:&lt;br /&gt;RECORD LOCKS space id 36 page no 3 n bits 72 &lt;b&gt;index `PRIMARY`&lt;/b&gt; of table `motoaccounts0/test` trx id 0 5681 lock_mode X waiting&lt;br /&gt;Record lock, heap no 2 PHYSICAL RECORD: &lt;b&gt;n_fields 5;&lt;/b&gt; compact format; info bits 0&lt;br /&gt; &lt;b&gt;0: len 4; hex 80000001; asc     ;;&lt;/b&gt; 1: len 6; hex 00000000162e; asc      .;; 2: len 7; hex 800000002d0110; asc     -  ;; 3: len 4; hex 80000010; asc     ;; 4: len 4; hex 80000011; asc     ;;&lt;br /&gt;&lt;br /&gt;------------------&lt;br /&gt;---TRANSACTION 0 5679, ACTIVE 6 sec, process no 4304, OS thread id 1162348864&lt;br /&gt;2 lock struct(s), heap size 368&lt;br /&gt;MySQL thread id 18, query id 7430 localhost root&lt;br /&gt;&lt;/pre&gt;索引变成PRIMARY. n_fields值减少了一个, 变为5(n_fields 5;). 第0个是主键字段(0: len 4; hex 80000001; asc     ;;).&lt;br /&gt;&lt;br /&gt;2) 因为数据是按主键顺序存储的, 如果插入记录, 主键的值是随机的, 为了保证索引树的平衡, 聚集索引将重组, 这会产生较多写操作, 并导致产生索引碎片. 所以记录应该按主键升序顺序插入, 可以选择自增长类型字段作为主键.&lt;br /&gt;&lt;br /&gt;3) 主键数据值应该尽可能小. 因为在所有索引中都包含了主键键值, 如果主键很大, 其它二级索引也会很大, 占用更多的空间. 如果自然主键很大, 可增加一个自增长列作主键.&lt;br /&gt;&lt;br /&gt;4) 对主键字段更新操作也会引起聚集索引重组, 导致索引节点上的行数据的移动, 因此应尽量避免主键更新.&lt;br /&gt;&lt;br /&gt;3. 问题解答&lt;br /&gt;&lt;pre class="plsql_code"&gt;select a, b from t1 where b like '50';&lt;br /&gt;&lt;/pre&gt;语句查询了a,b两个字段, 字段b上有二级索引, 因为二级索引节点内包含了主键, 从二级索引中可以得到主键的值, 所以不用去查询表, 只要查询此二级索引一次就可以得到a,b字段的值. 执行计划的extra信息显示出"Using index", 表明可以从索引中取得所有要查询的列, 这种方式被称为索引覆盖(index covering).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/innodb-table-and-index.html"&gt;13.6.10. InnoDB Table and Index Structures&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.scribd.com/doc/15014700/InnoDB-Internals-InnoDB-File-Formats-and-Source-Code-Structure"&gt;InnoDB Internals: InnoDB File Formats and Source Code Structure&lt;/a&gt;&lt;br /&gt;&lt;a href="http://books.google.com/books?id=BL0NNoFPuAQC&amp;pg=PA113"&gt;High performance MySQL By Baron Schwartz, Peter Zaitsev, Vadim Tkachenko, Jeremy D. Zawodny, Arjen Lentz, Derek Balling&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/"&gt;How to exploit MySQL index optimizations&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.johnjosephbachir.org/2006/10/22/everything-you-need-to-know-about-designing-mysql-innodb-primary-keys/"&gt;Everything you need to know about designing MySQL InnoDB primary keys&lt;/a&gt;&lt;br /&gt;&lt;a href="http://books.google.com/books?id=FAbmW1WdUWkC&amp;pg=PA57"&gt;Index Layouts - Pro MySQL By Michael Kruckenberg, Jay Pipes&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.scribd.com/doc/2085411/MySQL-UC-2007-Innodb-Performance-Optimization"&gt;Innodb Performance Optimization&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-1776182597377570250?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/1776182597377570250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=1776182597377570250' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/1776182597377570250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/1776182597377570250'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/08/innodb-index-structure.html' title='InnoDB Index Structure'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-9037368363777406626</id><published>2009-08-20T13:05:00.001+08:00</published><updated>2009-08-20T13:08:04.101+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='1z0-043'/><category scheme='http://www.blogger.com/atom/ns#' term='ocp'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>1z0-043 lesson 12 Automatic Storage Management</title><content type='html'>1z0-043 lesson 12&lt;br /&gt;&lt;br /&gt;&lt;input checked="no" name="cb_myanswer" onclick="toggleDisplayByName('myanswer',this.checked);" type="checkbox" /&gt; 是否显示鄙人做的答案&lt;br /&gt;&lt;input checked="yes" name="cb_mycomment" onclick="toggleDisplayByName('mycomment',this.checked);" type="checkbox" /&gt; 是否显示标准答案&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1.&lt;br /&gt;QUESTION 14:&lt;br /&gt;Consider the following configuration:&lt;br /&gt;/devices/D1 is a member of disk group dgroupA.&lt;br /&gt;/devices/D2 is a member of disk group dgroupA.&lt;br /&gt;/devices/D3 is a member of disk group dgroupA.&lt;br /&gt;You plan to add a new disk, /devices/D4, to then disk group dgroupA.&lt;br /&gt;You execute the following command:&lt;br /&gt;&lt;pre class="plsql_code"&gt;SQL&amp;gt; ALTER DISKGROUP dgroupA ADD DISK '/devices/D*';&lt;br /&gt;&lt;/pre&gt;Which task would be accomplished by the command?&lt;br /&gt;A. The command adds the new disk, D4, to the disk group.&lt;br /&gt;B. The command would result in an error because there is no disk by the name &amp;quot;'/devices/D*'&amp;quot;&lt;br /&gt;C. The commnad will be ignored because disks starting with &amp;quot;D&amp;quot; are already members of the disk group.&lt;br /&gt;D. The command would result in an error because no wildcard characters can be used in the disk name.&lt;br /&gt;E. The command fisrt detaches all the member disks start with &amp;quot;D&amp;quot;, and then reattaches them including the new disk.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;A&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;见教材12-28&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;2.&lt;br /&gt;QUESTION 16:&lt;br /&gt;Immediately after adding a new disk to or removing an existing disk from an Automatic Storage Management(ASM) instance, you find that the performance of the database decreases initially, until the addition or removal process is completed. Performance then gradually returns to normal levels. Which two activities could you perform to maintain a consistent performance of the database while adding or removing disks?(Choose tow.)&lt;br /&gt;A. increase the number of checkpoint processes&lt;br /&gt;B. define the POWER option while adding or removing the disks&lt;br /&gt;C. increase the number of DBWR processes by setting up a higher value for DB_WRITER_PROCESSES&lt;br /&gt;D. increase the number of slave database writer processes by setting up higher value for DBWR_IO_SLAVES&lt;br /&gt;E. increase the number of ASM Rebalance processes by setting up a higher value for ASM_POWER_LIMIT during the disk addition or removal&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;BE&lt;br /&gt;E不对, 应该是减少才对&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;BE&lt;br /&gt;见教材12-23&lt;br /&gt;重新平衡会导致额外的IO, 影响了数据库性能, 所以应该是减小ASM_POWER_LIMIT&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;3.&lt;br /&gt;QUESTION 19:&lt;br /&gt;You are using an Automatic Storage Management(ASM) instance to manage the files of your production database. You have two disk groups, DG1 and DG2 with one device each. In the parameter file of the production database, the following parameters have been specified:&lt;br /&gt;DB_CREATE_ONLINE_LOG_DEST_1='+dg1'&lt;br /&gt;DB_CREATE_ONLINE_LOG_DEST_2='+dg2'&lt;br /&gt;What would be the impact of this setting?&lt;br /&gt;A. When a new log group is added, it would have one member in each disk group.&lt;br /&gt;B. When a new log group is added, it would have two member in each disk group.&lt;br /&gt;C. When a new tablespace is added, it would have one data file in each disk group.&lt;br /&gt;D. When a new log file is added, it would have one member spread across the disk groups.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;D&lt;br /&gt;不知道&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;这个跟ASM没关系&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;4.&lt;br /&gt;QUESTION 37:&lt;br /&gt;Your production database uses an Automatic Storage Management(ASM) instance to manage its files. You want to add a new disk group to the ASM instance to manage the increased data load. What action would you perform to include the new disk group in the ASM instance without causing any impact on the currently connected users?&lt;br /&gt;A. mount the new disk group in the ASM instance&lt;br /&gt;B. restart the ASM instance and the production database instance&lt;br /&gt;C. register the new disk groups in the production database instance&lt;br /&gt;D. restart the ASM instance without restarting the production database instance&lt;br /&gt;E. include the new disk group in the ASM_DISKSTRING parameter in the parameter file and restart the ASM instance&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;A&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;教材12-4&lt;br /&gt;&amp;quot;This is done while the database is active.&amp;quot;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;5.&lt;br /&gt;QUESTION 39:&lt;br /&gt;In your production database you want to use an Automatic Storage Management(ASM) instance to manage the database files. Which option would you use to migrate the database files from a non-ASM instance to an ASM instance?&lt;br /&gt;A. Oracle Migration Assistant&lt;br /&gt;B. Recovery Manager(RMAN)&lt;br /&gt;C. Oracle Data Pump Export and Import&lt;br /&gt;D. conventional Oracle Export and Import&lt;br /&gt;E. operating system uilities to copy the files to the ASM instance&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;B&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;B&lt;br /&gt;教材12-34&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;6.&lt;br /&gt;QUESTION 81:&lt;br /&gt;You have a disk group, DGROUP1, with three disks and NORMAL redundancy. You execute the following command to create a template for the disk group:&lt;br /&gt;&lt;pre class="plsql_code"&gt;ALTER DISKGROUP dgroup1&lt;br /&gt;ADD TEMPLATE my_temp&lt;br /&gt;ATTRIBUTES(MIRROR FINE);&lt;br /&gt;&lt;/pre&gt;Which statement is true?&lt;br /&gt;A. When a file is created in DGROUP1 with the template, it would have three-way mirroring.&lt;br /&gt;B. When a file is created in DGROUP1, the MY_TEMP template becomes the default template.&lt;br /&gt;C. When a file is created in DGROUP1 with the template, it would have two-way mirroring and file striping.&lt;br /&gt;D. When a file is created in DGROUP1 with the template, it would have three-way mirroring and file striping.&lt;br /&gt;E. When a file is created in DGROUP1 with the template, it would have two-way mirroring but no file striping.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;C&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;C&lt;br /&gt;教材12-22, 缺省是两路镜像&lt;br /&gt;PDF教材14-36&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;7.&lt;br /&gt;QUESTION 91:&lt;br /&gt;Consider the following command to add a new disk group called &amp;quot;tdgroupA&amp;quot; with two failover groups:&lt;br /&gt;&lt;pre class="plsql_code"&gt;CREATE DISKGROUP tgroupA NORMAL REDUNDANCY&lt;br /&gt;FAILOVERGROUP control01 DISK&lt;br /&gt;'/devices/A1',&lt;br /&gt;'/devices/A2',&lt;br /&gt;'/devices/A3'&lt;br /&gt;FAILOVERGROUP control02 DISK&lt;br /&gt;'/devices/B1',&lt;br /&gt;'/devices/B2',&lt;br /&gt;'/devices/B3';&lt;br /&gt;&lt;/pre&gt;The disk &amp;quot;/devices/A1&amp;quot; is currently a member disk of a disk group by the name &amp;quot;tdgroup1&amp;quot;.&lt;br /&gt;Which task would be accomplished by the command?&lt;br /&gt;A. This command would result in an error because a disk group can have only on failover group.&lt;br /&gt;B. This command would result in an error because the /devices/A1 disk is a member of another disk group tdgroup1.&lt;br /&gt;C. A new disk group called tdgroupA will be added with two failover groups and the /devices/A1 disk will get reattached to the new disk group without being detached from the existing one.&lt;br /&gt;D. A new disk group called tdgroupA will be added with two failover groups and the /devices/A1 disk will be ignored for the new disk group becuase it is a member of an existing disk group tdgroup1.&lt;br /&gt;E. A new disk group called tdgroupA will be added with two failover groups and the /devices/A1 disk gets detached from the existing disk group tdgroup1 and atteched to the new disk group tdgroupA.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;B&lt;br /&gt;不知道&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;B&lt;br /&gt;教材12-27&lt;br /&gt;FORCE indicates that a specified disk should be added to the specified disk group even though the disk is already formatted as a member of an ASM disk group.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;8.&lt;br /&gt;QUESTION 98:&lt;br /&gt;Consider the following scenario:&lt;br /&gt;You have a directory, data, under the disk group tdgroupA. You want to create an alias for on of the data files and you execute the following command:&lt;br /&gt;&lt;pre class="plsql_code"&gt;ALTER DISKGROUP tdgroupA&lt;br /&gt;ADD ALIAS '+tdgroupA/data/datafile.dbf'&lt;br /&gt;FOR '+tdgroupA.231.45678';&lt;br /&gt;&lt;/pre&gt;Which task would be accomplished by the command?&lt;br /&gt;A. The command drops the file +tdgroupA.231.45678.&lt;br /&gt;B. The command physically relocated the file to +tdgroupA/data and renames the file to datafile.dbf.&lt;br /&gt;C. The command creates a copy of the +tdgroupA.231.45678 file and places it in +tdgroupA/data after renaming the file to datafile.dbf.&lt;br /&gt;D. The command creates an alias, datafile.dbf, and places it in +tdgroupA/data and does not remove the tdgroupA.231.45678 file.&lt;br /&gt;E. The command creates a file, datafile.dbf, in +tdgroupA/data and removed the references for +tdgroupA.231.45678 from the data.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;D&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;D&lt;br /&gt;Oracle Database Administrator Guide Ch12 P25&lt;br /&gt;&lt;br /&gt;PDF教材14-36&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;9.&lt;br /&gt;QUESTION 108:&lt;br /&gt;You have been assigned to manage a set of databases. The previous DBA did not leave you notes regarding the structure of each of the databases. While analyzing an instance, you notice that the system identifier(SID) for the instance is set to '+ASM'. What is the purpose for this instance?&lt;br /&gt;A. This instance is being used to manage the operating system files.&lt;br /&gt;B. This instance is being used to manage the files of other databases.&lt;br /&gt;C. This instance is being used to manage the instances of other databases.&lt;br /&gt;D. This instance is being used to manage the background processes of other instances.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;B&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;B&lt;br /&gt;教材12-9&lt;br /&gt;DB_UNIQUE_NAME specifies the service provider name for which this ASM instance manages disk groups. The default value of +ASM must be modified only if you run multiple ASM instances on the same node.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;10.&lt;br /&gt;QUESTION 129:&lt;br /&gt;Consider the following command to create a tablespace in your production database(which is using an Automatic Storage Management[ASM] instance to manage the database files):&lt;br /&gt;&lt;pre class="plsql_code"&gt;CREATE TABLESPACE user_tbsp&lt;br /&gt;DATAFILE '+dgroup3(user_temp)/user_files/user_tbsp' SIZE 200M;&lt;br /&gt;&lt;/pre&gt;What would be the result of this command?&lt;br /&gt;A. It would result in an error because the template cannot be used along with the disk group.&lt;br /&gt;B. It would result in an error because the path cannot be specified while creating a tablespace in a disk group.&lt;br /&gt;C. It would create a tablespace with a data file that has an alias, and its attributes are set by the user-defined template.&lt;br /&gt;D. It would create a tablespace with a data file that does not have an alias, and its attributes are set by the user-defined template.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;C&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;C&lt;br /&gt;&lt;br /&gt;PDF教材14-33讲了一点&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;11.&lt;br /&gt;QUESTION 134:&lt;br /&gt;Consider the following scenario:&lt;br /&gt;You have a directory, data, under the disk group tdgroupA. You want to create an alias for one of the data files and you execute the following command:&lt;br /&gt;&lt;pre class="plsql_code"&gt;ALTER DISKGROUP tdgroupA&lt;br /&gt;ADD ALIAS '+tdgroupA/data/datafile.dbf'&lt;br /&gt;FOR '+tdgroupA.231.45678';&lt;br /&gt;&lt;/pre&gt;Which task would be accomplished by the command?&lt;br /&gt;A. The command drops the file +tdgroupA.231.45678&lt;br /&gt;B. The command physically relocates the file to +tdgroupA/data and renames the file to datafile.dbf.&lt;br /&gt;C. The command creates a copy of the +tdgroupA.231.45678 file and places it in +tdgroupA/data after renaming the file to datafile.dbf.&lt;br /&gt;D. The command creates a synonym, datafile.dbf, and places it in +tdgroupA/data and dose not remove the +tdgroupA.231.45678 file.&lt;br /&gt;E. The command creates a file, datafile.dbf, in +tdgroupA/data and removes the references for +tdgroupA.231.45678 from the data dictionary views.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;D&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;D&lt;br /&gt;Alias names(or just&amp;quot;&amp;quot;aliases&amp;quot;) are intended to provide a more use-friendly means of referring to ASM files, rather than using the system-generated filenames. You can create an alias for a file when you create it in the database, or you can add an alias to an existing file using the ADD ALIAS clause of the ALTER DISKGROUP statement. You can create an alias in any system-generated or user-created ASM directory. You cannot create an alias at the root level(+), however. The following statement adds a new alias name for a system-generated file name:&lt;br /&gt;&lt;pre class="plsql_code"&gt;ALTER DISKGROUP dgroup1&lt;br /&gt;ADD ALIAS '+dgroup1/mydir/second.dbf'&lt;br /&gt;FOR '+dgroup1/sample/datafile/mytable.342.3';&lt;br /&gt;&lt;/pre&gt;REF.:Oracle(r) 10g Administrator Guide, 12-28&lt;br /&gt;&lt;br /&gt;同第8题&lt;br /&gt;PDF教材14-36&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;12.&lt;br /&gt;QUESTION 152:&lt;br /&gt;In your Automatic Storage Management(ASM) instance, one of the nonempty disk groups, DGROUP2, is no longer required and you want this disk group to be removed. You execute the following command to a achieve this objective:&lt;br /&gt;&lt;pre class="plsql_code"&gt;DROP DISKGROUP dgroup1 EXCLUDING CONTENTS;&lt;br /&gt;&lt;/pre&gt;What would be the result of this command?&lt;br /&gt;A. This command would result in an error because the disk group is not empty.&lt;br /&gt;B. The command would distribute the contents of the specified disk group among all other disk groups and then drop the specified disk group.&lt;br /&gt;C. The command would result in the contents being moved to the parent disk group and dropping of the disk group.&lt;br /&gt;D. The command would result in the disk group being marked as INVALID because it cannot be dropped.&lt;br /&gt;E. The command would drop the disk group, ignoring the EXCLUDING CONTENTS option.&lt;br /&gt;&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;A&lt;br /&gt;有EXCLUDING这么用的吗?&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;&lt;br /&gt;有&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/storeman.htm#sthref1745"&gt;Dropping Disk Groups&lt;/a&gt;&lt;br /&gt;The default is EXCLUDING CONTENTS, which provides syntactic consistency and prevents you from dropping the disk group if it has any contents&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_8013.htm#SQLRF01517"&gt;DROP DISKGROUP &lt;/a&gt;&lt;br /&gt;Specify EXCLUDING CONTENTS to ensure that Automatic Storage Management drops the disk group only when the disk group is empty. This is the default. If the disk group is not empty, an error will be returned.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;13.&lt;br /&gt;QUESTION 178:&lt;br /&gt;You have an Automatic Storage Management(ASM) instance managing the database files of your production database. The database contains ASM files and non-ASM files. Using Recovery Manager(RMAN), you migrate the complete production database to use the ASM instance. Which statement is true?&lt;br /&gt;A. RMAN would relocate all the data files to an ASM disk group and other files to an operating system location, defined using Oracle Managed Files(OMF).&lt;br /&gt;B. RMAN would relocate the ASM files to an ASM disk group and the non-ASM files to an operating system location, defined using OMF.&lt;br /&gt;C. RMAN would relocate all the database files to an ASM disk group.&lt;br /&gt;D. RMAN would change the file definitions in the control file to use the ASM but would not relocate the database files physically.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;C&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;C&lt;br /&gt;教材12-34&lt;br /&gt;Although files in a tablespace may be both ASM files and non-ASM files as a result of the tablespace history, RMAN commands enable non-ASM files to be relocated to an ASM disk group. &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;-----&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;14.&lt;br /&gt;32. An ASM disk group can manage database files from how many different databases?&lt;br /&gt;A. 1&lt;br /&gt;B. 2&lt;br /&gt;C. Limited only by disk space.&lt;br /&gt;D. ASM disk groups manage tablespaces, not database files.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;C&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;C&lt;br /&gt;C. An ASM disk group can manage database files for essentially an unlimited number of different databases. Creating ASM disk groups is discussed in Chapter 9.&lt;br /&gt;&lt;br /&gt;教材12-29&lt;br /&gt;However, a disk group may contain files belonging to several databases, and a single database may use storage from multiple disk groups.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;15.&lt;br /&gt;33. High redundancy disk groups must have how many failure groups? (Choose the best answer.)&lt;br /&gt;A. 1, because high redundancy disk groups rely on external RAID hardware or software&lt;br /&gt;B. 2&lt;br /&gt;C. Exactly 3&lt;br /&gt;D. 3 or more&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;D&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;D&lt;br /&gt;D. High redundancy disk groups require disks in at least three failure groups, but they can contain more if a higher level of redundancy or performance is desired. Controlling disk group redundancy is detailed in Chapter 9.&lt;br /&gt;&lt;br /&gt;教材12-22&lt;br /&gt;High redundancy:&lt;br /&gt;Three-way mirroring&lt;br /&gt;At least three failure groups&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;16.&lt;br /&gt;34. Automatic Storage Management (ASM) disk group mirroring is done at which level?&lt;br /&gt;A. Tablespace level&lt;br /&gt;B. Extent level&lt;br /&gt;C. Segment level&lt;br /&gt;D. Datafile level&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;B&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;B&lt;br /&gt;B. Disk group mirroring for ASM is done at the extent level. To learn about Automatic Storage Management mirroring, see Chapter 9.&lt;br /&gt;&lt;br /&gt;说的不准确, 应该是以分配单元(AU)为单位&lt;br /&gt;&lt;br /&gt;PDF教材14-21, (这个教材比较老, 所以说的不准确)&lt;br /&gt;ASM does not mirror disks; rather, it mirrors extents.&lt;br /&gt;&lt;br /&gt;教材12-20&lt;br /&gt;ASM always spreads files evenly in 1 MB allocation unit (AU) chunks across all the disks in a disk group.&lt;br /&gt;教材12-22&lt;br /&gt;ASM does not mirror disks; rather, it mirrors allocation units.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;17.&lt;br /&gt;35. Identify two valid types of Oracle instances.&lt;br /&gt;A. RMAN&lt;br /&gt;B. DSKMGR&lt;br /&gt;C. ASM&lt;br /&gt;D. DBMS&lt;br /&gt;E. RDBMS&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;CE&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;CE&lt;br /&gt;C, E. ASM instances manage ASM disk groups, and RDBMS instances are the traditional and only type of instance available before Oracle Database 10g. Configuring ASM and RDBMS instances for Automatic Storage Management is covered in Chapter 9.&lt;br /&gt;&lt;br /&gt;教材12-9&lt;br /&gt;INSTANCE_TYPE should be set to ASM for ASM instances.&lt;br /&gt;教材12-10&lt;br /&gt;INSTANCE_TYPE defaults to RDBMS and specifies that this instance is an RDBMS instance.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;18.&lt;br /&gt;1. Extents in an ASM file are allocated in units of which size?&lt;br /&gt;A. 100KB&lt;br /&gt;B. 10MB&lt;br /&gt;C. 1MB&lt;br /&gt;D. 64KB&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;C&lt;br /&gt;忘了&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;C&lt;br /&gt;C. ASM disks are partitioned in allocation units of one megabyte each.&lt;br /&gt;&lt;br /&gt;教材12-20&lt;br /&gt;ASM always spreads files evenly in 1 MB allocation unit (AU) chunks across all the disks in a disk group.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;19.&lt;br /&gt;2. To prevent connections to an ASM instance, you can use which of the following commands? (Choose the best answer.)&lt;br /&gt;A. ALTER SYSTEM ENABLE RESTRICTED SESSION&lt;br /&gt;B. SHUTDOWN IMMEDIATE&lt;br /&gt;C. ALTER SYSTEM DISABLE CONNECTIONS&lt;br /&gt;D. ALTER DATABASE ENABLE RESTRICTED SESSION&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;A&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;A. Similar to an RDBMS instance, you can use ALTER SYSTEM ENABLE RESTRICTED SESSION to prevent connections to the instance. While SHUTDOWN IMMEDIATE will prevent connections to the ASM instance, this is most likely overkill if all you want to do is temporarily prevent connections. Choices C and D are not valid commands and will generate an error message.&lt;br /&gt;&lt;br /&gt;PDF教材14-8&lt;br /&gt;Finally, you can prevent database instances from connecting to an ASM instance. When the command ALTER SYSTEM ENABLE RESTRICTED SESSION is issued to an ASM instance, database instances cannot connect to that ASM instance. Conversely, ALTER SYSTEM DISABLE RESTRICTED SESSION enables connections from database instances. This command permits an ASM instance to start up and mount disk groups for purposes of maintenance without allowing database instances to access the disk groups.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;20.&lt;br /&gt;3. Which initialization parameter in an ASM instance specifies the disk groups to be automatically mounted at instance startup?&lt;br /&gt;A. ASM_DISKMOUNT&lt;br /&gt;B. ASM_DISKGROUP&lt;br /&gt;C. ASM_DISKSTRING&lt;br /&gt;D. ASM_MOUNTGROUP&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;B&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;B&lt;br /&gt;B. The initialization parameter ASM_DISKGROUP, valid only in an ASM instance, specifies the disk groups to be automatically mounted when the ASM instance starts. ASM_DISKSTRING is operating system dependent and restricts the file system devices that can be used to create disk groups. ASM_DISKMOUNT and ASM_MOUNTGROUP are not valid initialization parameters.&lt;br /&gt;&lt;br /&gt;教材12-9&lt;br /&gt;ASM_DISKGROUPS is the list of names of disk groups to be mounted by an ASM instance at startup, or when the ALTER DISKGROUP ALL MOUNT command is used.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;21.&lt;br /&gt;4. Which of the following command options is not valid for an ASM instance?&lt;br /&gt;A. STARTUP OPEN&lt;br /&gt;B. STARTUP NOMOUNT&lt;br /&gt;C. STARTUP MOUNT&lt;br /&gt;D. STARTUP OPEN RESTRICT&lt;br /&gt;E. SHUTDOWN ABORT&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;A&lt;br /&gt;D也不行?&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;A. An ASM instance can be started up and shut down in the same way that an RDBMS database can, except that an ASM instance cannot be in the OPEN state because it does not have a data dictionary or a control file.&lt;br /&gt;&lt;br /&gt;为啥D可以?&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;22.&lt;br /&gt;5. When an ASM instance receives a SHUTDOWN NORMAL command, what command does it pass on to all database instances that rely on the ASM instance’s disk groups?&lt;br /&gt;A. TRANSACTIONAL&lt;br /&gt;B. IMMEDIATE&lt;br /&gt;C. ABORT&lt;br /&gt;D. NORMAL&lt;br /&gt;E. None of the above&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;D&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;D&lt;br /&gt;D. When an ASM instance receives a SHUTDOWN command, it passes the same option (NORMAL, IMMEDIATE or TRANSACTIONAL) to all database instances that rely on the ASM instance for disk group services.&lt;br /&gt;&lt;br /&gt;PDF教材14-18&lt;br /&gt;Upon receiving the shutdown command, the ASM instance forwards the shutdown command with the same shutdown mode (NORMAL, IMMEDIATE, TRANSACTIONAL) to all database instances dependent on the ASM instance.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;23.&lt;br /&gt;6. When creating a disk group, what keyword must be specified if you need to reuse a disk that has previously been used as part of another disk group?&lt;br /&gt;A. NOFORCE&lt;br /&gt;B. REUSE&lt;br /&gt;C. USE&lt;br /&gt;D. FORCE&lt;br /&gt;E. INCLUDING CONTENTS&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;D&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;D&lt;br /&gt;D. You must use FORCE if the disk has previously been used as part of a disk group. If the disk has never been used as part of a disk group, using the FORCE keyword returns an error.&lt;br /&gt;&lt;br /&gt;教材12-27&lt;br /&gt;FORCE indicates that a specified disk should be added to the specified disk group even though the disk is already formatted as a member of an ASM disk group.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;24.&lt;br /&gt;7. Which of the following ASM file templates is not striped as fine?&lt;br /&gt;A. FLASHBACK&lt;br /&gt;B. ARCHIVELOG&lt;br /&gt;C. CONTROLFILE&lt;br /&gt;D. ONLINELOG&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;A&lt;br /&gt;或者是B?&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;B&lt;br /&gt;B. Files such as ARCHIVELOG files use coarse-grained striping. Fine striping stripes the files every 128KB while coarse striping stripes the files every 1MB. All file types with the exception of FLASHBACK, CONTROLFILE, and ONLINELOG are striped coarse.&lt;br /&gt;&lt;br /&gt;见PDF教材14-35表格&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;25.&lt;br /&gt;8. You want to migrate your database to ASM, so you’ve done a clean shutdown, made a closed backup of the entire database, noted the location of your control files and online redo log files, and changed your SPFILE to use OMF. The last step is running an RMAN script to do the conversion. Using the following steps, what is the correct order in which the following RMAN commands should be executed?&lt;br /&gt;&lt;pre class="plsql_code"&gt;1. STARTUP NOMOUNT&lt;br /&gt;2. ALTER DATABASE OPEN RESETLOGS&lt;br /&gt;3. SQL "ALTER DATABASE RENAME 'logfile1 path' TO '+dgrp4 '"   # plus all other log files&lt;br /&gt;4. SWITCH DATABASE TO COPY&lt;br /&gt;5. BACKUP AS COPY DATABASE FORMAT '+dgrp4'&lt;br /&gt;6. ALTER DATABASE MOUNT&lt;br /&gt;7. RESTORE CONTROLFILE FROM 'controlfile_location'&lt;br /&gt;&lt;/pre&gt;A. 2, 5, 3, 1, 7, 6, 4&lt;br /&gt;B. 1, 7, 6, 5, 4, 3, 2&lt;br /&gt;C. 5, 1, 2, 7, 4, 6, 3&lt;br /&gt;D. 7, 3, 1, 5, 6, 2, 4&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;B&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;B&lt;br /&gt;B. After the RMAN script is run and the database is up and running successfully, you may delete the old database files.&lt;br /&gt;&lt;br /&gt;教材12-34&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;26.&lt;br /&gt;9. How can you reverse the effects of an ALTER DISKGROUP ... DROP DISK command if it has not yet completed?&lt;br /&gt;A. Issue the ALTER DISKGROUP ... ADD DISK command.&lt;br /&gt;B. Issue the ALTER DISKGROUP ... UNDROP DISKS command.&lt;br /&gt;C. Issue the ALTER DISKGROUP ... DROP DISK CANCEL command.&lt;br /&gt;D. Retrieve the disk from the recycle bin after the operation completes.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;B&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;B&lt;br /&gt;B. If the DROP DISK operation has not yet completed, you can cancel and roll back the entire DROP DISK operation by using ALTER DISKGROUP ... UNDROP DISKS, with the disk group still being continuously available to all users.&lt;br /&gt;&lt;br /&gt;教材12-30&lt;br /&gt;The third statement shows how to cancel a disk drop operation. The UNDROP command operates only on pending drops of disks; it has no effect on drops that have completed.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;27.&lt;br /&gt;10. To reference existing ASM files, you need to use a fully qualified ASM filename. Your development database has a disk group named DG2A, the database name is DEV19, and the ASM file that you want to reference is a datafile for the USERS02 tablespace. Which of the following is a valid ASM filename for this ASM file?&lt;br /&gt;A. dev19/+DG2A/datafile/users02.701.2&lt;br /&gt;B. +DG2A/dev19/datafile/users02.701.2&lt;br /&gt;C. +DG2A/dev19/users02/datafile.701.2&lt;br /&gt;D. +DG2A.701.2&lt;br /&gt;E. +DG2A/datafile/dev19.users.02.701.2&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;B&lt;br /&gt;好像D也是合法的?&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;B&lt;br /&gt;B. A fully qualified existing ASM filename has the format +group/dbname/filetype/tag.file.incarnation. In this case, filetype is datafile, and tag is the tablespace name to which it belongs, or users02.&lt;br /&gt;&lt;br /&gt;题目中问的是全称(fully qualified name), 所以不选D&lt;br /&gt;PDF教材14-32&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;28.&lt;br /&gt;11. Which background process coordinates the rebalance activity for disk groups?&lt;br /&gt;A. ORBn&lt;br /&gt;B. OSMB&lt;br /&gt;C. RBAL&lt;br /&gt;D. ASMn&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;C&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;C&lt;br /&gt;C. RBAL coordinates rebalance activity for a disk group in an ASM instance, ORBn actually performs the extent movement in an ASM instance, and OSMB acts as a bridge between the ASM instance and the RDBMS instance. There is no such process name ASMn.&lt;br /&gt;&lt;br /&gt;教材12-5&lt;br /&gt;One coordinates rebalance activity for disk groups. It is called RBAL.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;29.&lt;br /&gt;12. On the development database rac0 there are six raw devices: /dev/raw/raw1 through /dev/raw/raw6. /dev/raw/raw1 and /dev/raw/raw2 are 8GB each, and the rest are 6GB each. An existing disk group +DATA1, of NORMAL REDUNDANCY, uses /dev/raw/raw1 and /dev/raw/raw2. Which series of the following commands will drop one of the failure groups for +DATA1, create a new disk group +DATA2 using two of the remaining four raw devices, and then cancel the drop operation from +DATA1?&lt;br /&gt;A.&lt;br /&gt;&lt;pre class="plsql_code"&gt;ALTER DISKGROUP DATA1 DROP DISK DATA1_0001;&lt;br /&gt;CREATE DISKGROUP DATA2 NORMAL REDUNDANCY&lt;br /&gt;  FAILGROUP DATA1A DISK '/dev/raw/raw3'&lt;br /&gt;  FAILGROUP DATA1B DISK '/dev/raw/raw4';&lt;br /&gt;ALTER DISKGROUP DATA1 UNDROP DISKS;&lt;br /&gt;&lt;/pre&gt;B.&lt;br /&gt;&lt;pre class="plsql_code"&gt;ALTER DISKGROUP DATA1 DROP DISK DATA1_0001;&lt;br /&gt;CREATE DISKGROUP DATA2 HIGH REDUNDANCY&lt;br /&gt;  FAILGROUP DATA1A DISK '/dev/raw/raw3'&lt;br /&gt;  FAILGROUP DATA1B DISK '/dev/raw/raw4'&lt;br /&gt;ALTER DISKGROUP DATA1 UNDROP DISKS;&lt;br /&gt;&lt;/pre&gt;C.&lt;br /&gt;&lt;pre class="plsql_code"&gt;ALTER DISKGROUP DATA1 DROP DISK DATA1_0001;&lt;br /&gt;CREATE DISKGROUP DATA2 NORMAL REDUNDANCY&lt;br /&gt;  FAILGROUP DATA1A DISK '/dev/raw/raw3'&lt;br /&gt;  FAILGROUP DATA1B DISK '/dev/raw/raw4';&lt;br /&gt;ALTER DISKGROUP DATA1 UNDROP DATA1_0001;&lt;br /&gt;&lt;/pre&gt;D.&lt;br /&gt;&lt;pre class="plsql_code"&gt;ALTER DISKGROUP DATA1 DROP DISK DATA1_0001&lt;br /&gt;  ADD DISKGROUP DATA2 NORMAL REDUNDANCY&lt;br /&gt;  FAILGROUP DATA1A DISK '/dev/raw/raw3'&lt;br /&gt;  FAILGROUP DATA1B DISK '/dev/raw/raw4';&lt;br /&gt;ALTER DISKGROUP DATA1 UNDROP DISKS;&lt;br /&gt;&lt;/pre&gt;&lt;div class="myanswer" name="myanswer"&gt;A&lt;br /&gt;题意不清,B也对?&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;A. Note that the UNDROP operation will cancel a drop operation in progress but cannot reverse a drop operation that has already completed. For HIGH REDUNDANCY, at least three failure groups must be specified. While you can combine a drop and add operation into one command, the command can reference only one disk group.&lt;br /&gt;&lt;br /&gt;高冗余度至少需要3个硬盘, 所以不选B&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;30.&lt;br /&gt;13. Which type of database file is spread across all disks in a disk group?&lt;br /&gt;A. All types of files are spread across all disks in the disk group.&lt;br /&gt;B. Datafiles&lt;br /&gt;C. Redo log files&lt;br /&gt;D. Archived redo log files&lt;br /&gt;E. Control files&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;A&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;A. All types of database files are spread across all disks in the disk group to ensure redundancy unless the redundancy is set to EXTERNAL.&lt;br /&gt;&lt;br /&gt;教材12-19&lt;br /&gt;ASM files are always spread across all the ASM disks in the disk group.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;31.&lt;br /&gt;14. How can you reverse the effects of an ALTER DISKGROUP ... DROP DISK command if it has already completed?&lt;br /&gt;A. Issue the ALTER DISKGROUP ... ADD DISK command.&lt;br /&gt;B. Issue the ALTER DISKGROUP ... UNDROP DISKS command.&lt;br /&gt;C. Issue the ALTER DISKGROUP ... DROP DISK CANCEL command.&lt;br /&gt;D. Retrieve the disk from the recycle bin after the operation completes.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;B&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;A. If the DROP DISK operation has already completed, you must use ALTER DISKGROUP ... ADD DISK to add the disk back to the disk group. In any case, the disk group is continuously available to all users.&lt;br /&gt;&lt;br /&gt;教材12-30&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;32.&lt;br /&gt;15. Which of the following ALTER DISKGROUP commands does not use V$ASM_OPERATION to record the status of the operation?&lt;br /&gt;A. ADD DIRECTORY&lt;br /&gt;B. DROP DISK&lt;br /&gt;C. RESIZE DISK&lt;br /&gt;D. REBALANCE&lt;br /&gt;E. ADD FAILGROUP&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;A&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;A. The ADD DIRECTORY command does not use V$ASM_OPERATION to track its progress, because this operation adds only a small amount of metadata—a directory object—to the disk group and takes a minimal amount of time to complete.&lt;br /&gt;&lt;br /&gt;教材14-29&lt;br /&gt;The ALTER DISKGROUP DROP, RESIZE, and REBALANCE commands return before the operation is complete. To monitor progress of these long-running operations, you can query the V$ASM_OPERATION fixed view.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;33.&lt;br /&gt;16. If you use ALTER DISKGROUP ... ADD DISK and specify a wildcard for the discovery string, what happens to disks that are already a part of the same or another disk group?&lt;br /&gt;A. The command fails unless you specify the FORCE option.&lt;br /&gt;B. The command fails unless you specify the REUSE option.&lt;br /&gt;C. The command must be reissued with a more specific discovery string.&lt;br /&gt;D. The other disks already part of the disk group are ignored.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;D&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;D&lt;br /&gt;D. The ALTER DISKGROUP ... ADD DISK command adds all disks that match the discovery string but are not already part of the same or another disk group.&lt;br /&gt;&lt;br /&gt;教材12-28&lt;br /&gt;The second command adds A4 to the DGROUPA disk group. It ignores the other disks, even though they match the discovery string, because they are already part of the DGROUPA disk group.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;34.&lt;br /&gt;17. Choose the set of the following initialization parameters that is valid and recommended for an ASM instance.&lt;br /&gt;A. INSTANCE_TYPE=RDBMS&lt;br /&gt;ASM_POWER_LIMIT=2&lt;br /&gt;LARGE_POOL_SIZE=8MB&lt;br /&gt;DB_UNIQUE_NAME=+ASM&lt;br /&gt;ASM_DISKGROUPS=DATA1,DATA2&lt;br /&gt;B. INSTANCE_TYPE=ASM&lt;br /&gt;ASM_POWER_LIMIT=2&lt;br /&gt;LARGE_POOL_SIZE=8MB&lt;br /&gt;DB_UNIQUE_NAME=+ASM&lt;br /&gt;ASM_DISKGROUPS=DATA1,DATA2&lt;br /&gt;C. INSTANCE_TYPE=ASM&lt;br /&gt;ASM_POWER_LIMIT=15&lt;br /&gt;LARGE_POOL_SIZE=8MB&lt;br /&gt;DB_UNIQUE_NAME=+ASM&lt;br /&gt;ASM_DISKGROUPS=DATA1,DATA2&lt;br /&gt;D. INSTANCE_TYPE=ASM&lt;br /&gt;ASM_POWER_LIMIT=2&lt;br /&gt;LARGE_POOL_SIZE=4MB&lt;br /&gt;DB_UNIQUE_NAME=+ASM&lt;br /&gt;ASM_DISKGROUPS=DATA1,DATA2&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;B&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;B&lt;br /&gt;B. The INSTANCE_TYPE for an ASM instance is ASM; otherwise, it is RDBMS, whether it uses ASM or not. The ASM_POWER_LIMIT command controls the speed of a disk group rebalance, but its maximum value is 11. For an ASM instance, the minimum recommended value for LARGE_POOL_SIZE is 8MB.&lt;br /&gt;&lt;br /&gt;教材12-9&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;35.&lt;br /&gt;18. Which of the following scenarios concerning ASM instance shutdown is correct?&lt;br /&gt;A. When an ASM instance is shut down with NORMAL, IMMEDIATE, or TRANSACTIONAL, the same shutdown command is passed to the dependent instances and the ASM instance waits for all dependent instances to shut down before it shuts down.&lt;br /&gt;B. When an ASM instance shuts down with NORMAL, an alert is sent to all dependent instances, notifying the DBA to shut down the dependent instances manually before the ASM instance shuts down.&lt;br /&gt;C. When an ASM instance shuts down with the TRANSACTIONAL option, all dependent instances shut down with NORMAL, IMMEDIATE, or TRANSACTIONAL, depending on the dependent database’s default.&lt;br /&gt;D. When an ASM instance is shut down with NORMAL, IMMEDIATE, or TRANSACTIONAL, the same shutdown command is passed to the dependent instances and the ASM instance does not wait for all dependent instances to shut down before it shuts down.&lt;br /&gt;E. When an ASM instance shuts down with the IMMEDIATE option, the ASM instance shuts down immediately and all dependent instances shut down with ABORT.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;A&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;A. When an ASM instance shuts down with NORMAL, IMMEDIATE, or TRANSACTIONAL, the same shutdown option is passed to all dependent instances and the ASM instance waits for the dependent instances to shut down before shutting itself down. If an ASM instance shuts down with ABORT, it immediately shuts down, the dependent instances lose their connection to the ASM instance, and as a result, they shut down with ABORT either before or after the ASM instance shuts down completely.&lt;br /&gt;&lt;br /&gt;PDF教材14-18&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;36.&lt;br /&gt;19. A database can create datafiles in how many different disk groups? (Choose the best answer.)&lt;br /&gt;A. Each datafile in the database can reside in a different disk group.&lt;br /&gt;B. One&lt;br /&gt;C. Disk groups manage tablespaces, not datafiles.&lt;br /&gt;D. A maximum of two, one for SYSTEM and SYSAUX and the other tablespaces in another disk group.&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;A&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;A&lt;br /&gt;A. Each database datafile can reside in a different disk group; each disk group can also contain datafiles from other databases.&lt;br /&gt;&lt;br /&gt;教材12-19&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;37.&lt;br /&gt;20. ASM supports all of the following file types except for which of the following? (Choose all that apply.)&lt;br /&gt;A. Database files&lt;br /&gt;B. SPFILEs&lt;br /&gt;C. Redo log files&lt;br /&gt;D. Archived log files&lt;br /&gt;E. RMAN backup sets&lt;br /&gt;F. Password files&lt;br /&gt;G. init.ora files&lt;br /&gt;&lt;div class="myanswer" name="myanswer"&gt;FGB&lt;br /&gt;&lt;/div&gt;&lt;div class="mycomment" name="mycomment"&gt;FG&lt;br /&gt;F, G. ASM supports datafiles, log files, control files, archive logs, RMAN backup sets, SPFILEs, and other Oracle database file types, but not password files or init.ora files.&lt;br /&gt;&lt;br /&gt;PDF教材14-34表格&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-9037368363777406626?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/9037368363777406626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=9037368363777406626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/9037368363777406626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/9037368363777406626'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/08/1z0-043-lesson-12.html' title='1z0-043 lesson 12 Automatic Storage Management'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-2609859333108911708</id><published>2009-08-13T23:55:00.002+08:00</published><updated>2009-08-14T00:38:26.004+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>gone fishing</title><content type='html'>gone fishing&lt;br /&gt;&lt;br /&gt;去钓鱼就是指去度假(vacation)了, 大概因为美国人度假时比较喜欢钓鱼?&lt;br /&gt;有旷工的(absent from duty),关闭的(closed),停止服务(out of service)的意思&lt;br /&gt;&lt;br /&gt;例句:&lt;br /&gt;One Republican congressman complained that "it was hard for Mr. Bush to get his message out if the White House lectern had a ‘&lt;b&gt;Gone Fishing&lt;/b&gt;' sign on it."&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Gone Fishin'&lt;/b&gt;. Okay, not really. But after some consideration, I’ve decided to take the summer off from blogging.&lt;br /&gt;&lt;br /&gt;I've been looking through the documentation, and I don't seem to see mentioned anywhere how I can setup auto-replies, or canned replies on an account by account basis. I seem to remember having done this on other mailer systems using a .&lt;b&gt;gone-fishing&lt;/b&gt; or .vacation file.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-2609859333108911708?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/2609859333108911708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=2609859333108911708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2609859333108911708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/2609859333108911708'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/08/gone-fishing.html' title='gone fishing'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-4022407867483698870</id><published>2009-08-13T14:29:00.004+08:00</published><updated>2009-08-20T13:37:39.693+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><title type='text'>Slow queries issue</title><content type='html'>Troubleshooting case study: Slow queries issue&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;提问1&lt;/b&gt;&lt;br /&gt;Focus on the queries of this form:&lt;br /&gt;&lt;pre class="console"&gt;### 423 Queries &lt;br /&gt;### Total time: 13459, Average time: 31.8179669030733&lt;br /&gt;### Taking 13  to 74  seconds to complete&lt;br /&gt;### Rows analyzed 0 - 38&lt;br /&gt;use db1;&lt;br /&gt;SELECT *     FROM t_u_sch     WHERE s_time &amp;lt;= XXX     ORDER BY s_time ASC     LIMIT XXX     FOR UPDATE;&lt;br /&gt;&lt;br /&gt;use db1;&lt;br /&gt;SELECT *     FROM t_u_sch     WHERE s_time &amp;lt;= 1234567890     ORDER BY s_time ASC     LIMIT 38     FOR UPDATE;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;These are scheduler related queries in the DB1 for FB, Twitter, MySpace, etc.  We’re selecting a bunch of accounts to schedule work items for.  So we select then update the last scheduled sync time column.  We also insert new accts in these tables.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;回答1&lt;/b&gt;&lt;br /&gt;it's still hard to tell the root cause at the moment. but we found index of t_u_sch is fragmented,&lt;br /&gt;&lt;br /&gt;&lt;pre class="console"&gt;mysql&amp;gt; show table status like&lt;br /&gt;    -&amp;gt; 't_u_sch';&lt;br /&gt;+-------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+&lt;br /&gt;| Name              | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment                                                                          |&lt;br /&gt;+-------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+&lt;br /&gt;| t_u_sch           | InnoDB |      10 | Compact    | 1140 |            172 |      196608 |               0 |    &lt;b&gt;336592896&lt;/b&gt; |         0 |           NULL | 2009-06-29 23:59:29 | NULL        | NULL       | utf8_general_ci |     NULL |                | InnoDB free: 3072 kB; (`b_a_id      `) REFER `db1/t_u     `(`b_a_id      `) ON D |&lt;br /&gt;+-------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+&lt;br /&gt;1 row in set (0.13 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;as you can see index length is abnormally larger than the data length, it may be caused by frequently deletion and insertion on table. when an index becomes fragmented, index scan query will take longer time. to defrag it and free up spaces, you can use "optimize table ..." or "alter table ... engine=innodb"&lt;br /&gt;&lt;br /&gt;&lt;pre class="console"&gt;mysql&amp;gt; alter table t_u_sch ENGINE=INNODB;&lt;br /&gt;Query OK, 763 rows affected (0.25 sec)&lt;br /&gt;Records: 763  Duplicates: 0  Warnings: 0&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; show table status like 't_u_sch';&lt;br /&gt;+-------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+&lt;br /&gt;| Name              | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment                                                                          |&lt;br /&gt;+-------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+&lt;br /&gt;| t_u_sch           | InnoDB |      10 | Compact    |  871 |            131 |      114688 |               0 |        &lt;b&gt;49152&lt;/b&gt; |         0 |           NULL | 2009-08-06 10:46:00 | NULL        | NULL       | utf8_general_ci |     NULL |                | InnoDB free: 0 kB; (`b_a_id      `) REFER `db1/t_u     `(`b_a_id      `) ON DELE |&lt;br /&gt;+-------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;other *_u_sch* tables also need to be defragmented by this way.&lt;br /&gt;&lt;br /&gt;thanks.&lt;br /&gt;&lt;br /&gt;发现有些InnoDB表的索引很大, 而且随着时间推移不断的增大, 与实际数据量很不相符, 实际只有1000条左右的记录.&lt;br /&gt;对这个表的操作主要是大量的UPDATE, 怀疑索引因此产生了碎片或平衡树的结构&amp;quot;失衡&amp;quot;了(Oracle数据库中也有这种情况)&lt;br /&gt;但不能确定, 也不知道如何在测试系统上重现此错误(测试时发现如果不提交, UPDATE操作确实会导致索引一直变大, 但提交后, 发现过一段时间MySQL会自动收缩索引, 可以看到index_length变小)&lt;br /&gt;临时的解决方法是, 定期优化表(optimize table ...), 达到重建索引, 释放空间的目的&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;b&gt;提问2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We are continuing to get slow queries and used "SHOW TABLE STATUS' to see if there is index fragmentation.  For some tables, I am finding that 'Index_length' is zero even though there are indexes on the table.  This is happening on db.some.where.com.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;pre class="console"&gt;# Time: 090806 21:48:12&lt;br /&gt;# User@Host: user1[user1] @ a1.some.where.com [12.34.56.78]&lt;br /&gt;# Query_time: 7  Lock_time: 0  Rows_sent: 6  Rows_examined: 6&lt;br /&gt;use db1;&lt;br /&gt;SELECT * FROM t_s_ch      WHERE b_a_id = '123456ABC' AND           s_a &amp;gt;= 28924     ORDER BY s_a ASC     LIMIT 2147483647;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; show table status like 't_s_ch';&lt;br /&gt;+-------------------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+&lt;br /&gt;| Name              | Engine | Version | Row_format | Rows    | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment                                                                          |&lt;br /&gt;+-------------------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+&lt;br /&gt;| t_s_ch            | InnoDB |      10 | Compact    | 9462693 |            164 |  1559756800 |               0 |            0 |         0 |           NULL | 2009-04-24 17:21:19 | NULL        | NULL       | utf8_general_ci |     NULL |                | InnoDB free: 45056 kB; (`b_a_id      `) REFER `db1/f_u     `(`b_a_id      `) ON  | &lt;br /&gt;+-------------------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+&lt;br /&gt;1 row in set (0.70 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Is there a reason why 'Index_length' would be zero?  I am checking Google and I haven't found a reason so far.  Does this table not have an index anymore?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;回答2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I think it's an expected behavior. In InnoDB, every table must have a clustered index, data records are stored as leaf nodes of this index, which means clustered index is the data records, it is counted as data_length not index_length. In your case, the primacy key is the clustered index, and no other indexes exist, so index_length is zero.&lt;br /&gt;&lt;br /&gt;InnDB表都必须有一个聚集索引(clustered index), 记录数据存储在这个聚集索引中, 类似于Oracle的索引组织表(index-organized table).&lt;br /&gt;如果表上定义了主键, 则使用主键作为聚集索引&lt;br /&gt;否则选择第一个非空的唯一索引作为聚集索引&lt;br /&gt;如果都没有, 则内部创建一个隐藏的rowid单调递增列, 基于该列创建隐藏的聚集索引&lt;br /&gt;(参考&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/innodb-index-types.html"&gt;13.6.10.1. Clustered and Secondary Indexes&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;所以聚集索引也就是记录数据, 算作data_length,而不是index_length&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;回答3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.&lt;br /&gt;from mysqladmin status output and slow query log, it seems there are some slow queries using full table scans&lt;br /&gt;&lt;br /&gt;so we suggest:&lt;br /&gt;1)add an index on customer_tab(custid,deptid)&lt;br /&gt;&lt;br /&gt;2)extend the index in con_gr_tab/con_tab/con_id_tab/con_tab2 from (cust_id) to (cust_id,sn)&lt;br /&gt;&lt;br /&gt;3)for following select statement, it is better to use "=" for comparision rather than "like"&lt;br /&gt;&lt;pre class="plsql_code"&gt;SELECT d.deptid, d.customid, d.sn, d.version, d.email, d.dmi, d.area, d.provider, d.manufacturer, d.nation, d.number FROM custominfo d WHERE d.deptid LIKE '1234567890' LIMIT 100;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4)change dept_id in db_a_tab/db_base_tab/db_queue_tab/db_b_tab from varchar(80) to bigint(20)&lt;br /&gt;&lt;br /&gt;5)decrease the size of cust_id in customs_tab from varchar(512) to varchar(80)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.&lt;br /&gt;in dbs, general/slow query logs are growing huge,&lt;br /&gt;&lt;pre class="console"&gt;[db1.some.where.com]&lt;br /&gt;-rw-rw---- 1 mysql mysql           0 Aug 11 15:56 /mysql_logs/error.log&lt;br /&gt;-rw-rw---- 1 mysql mysql 41254683176 Aug 12 06:41 /mysql_logs/general.log&lt;br /&gt;-rw-rw---- 1 mysql mysql  2117239370 Aug 12 06:41 /mysql_logs/slow-queries.log&lt;br /&gt;[db2.some.where.com]&lt;br /&gt;-rw-rw---- 1 mysql mysql           0 Aug 11 15:56 /mysql_logs/error.log&lt;br /&gt;-rw-rw---- 1 mysql mysql 32935022398 Aug 12 06:41 /mysql_logs/general.log&lt;br /&gt;-rw-rw---- 1 mysql mysql   458081312 Aug 12 06:41 /mysql_logs/slow-queries.log&lt;br /&gt;[db3.some.where.com]&lt;br /&gt;-rw-rw---- 1 mysql mysql           0 Aug 11 15:56 /mysql_logs/error.log&lt;br /&gt;-rw-rw---- 1 mysql mysql 30089483757 Aug 12 06:41 /mysql_logs/general.log&lt;br /&gt;-rw-rw---- 1 mysql mysql  1156294323 Aug 12 06:41 /mysql_logs/slow-queries.log&lt;br /&gt;[db4.some.where.com]&lt;br /&gt;-rw-rw---- 1 mysql mysql           0 Aug 11 15:56 /mysql_logs/error.log&lt;br /&gt;-rw-rw---- 1 mysql mysql 29886541601 Aug 12 06:41 /mysql_logs/general.log&lt;br /&gt;-rw-rw---- 1 mysql mysql  1871892345 Aug 12 06:41 /mysql_logs/slow-queries.log&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;these logs need to be cleaned up, logrotate can do this, for example:&lt;br /&gt;&lt;pre class="console"&gt;# cat /etc/logrotate.d/mysql&lt;br /&gt;/mysql/logs/error.log /mysql/logs/general.log /mysql/logs/slow-queries.log {&lt;br /&gt;  daily&lt;br /&gt;  create 0660 mysql mysql&lt;br /&gt;  notifempty&lt;br /&gt;  #size 100M&lt;br /&gt;  missingok&lt;br /&gt;  nocompress&lt;br /&gt;  rotate 120&lt;br /&gt;  sharedscripts&lt;br /&gt;  postrotate&lt;br /&gt;    /usr/bin/mysqladmin flush-logs&lt;br /&gt;  endscript&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;# logrotate -f /etc/logrotate.d/mysql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;it is also recommended to turn on general query log only when needed, since it is probably an impact on performance. to disable it, a restart of mysql server is required.&lt;br /&gt;if using mysql 5.1, it can be disabled/enabled dynamically without restarting mysql.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. for better innodb performance, increase innodb_buffer_pool_size, for example to 6g. in general, it can be set up to 80% of phsical memory size.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1.使用命令&amp;quot;mysqladmin extented-status -r -i60&amp;quot;, 查看指定时间间隔内的数据库状态值的变化情况&lt;br /&gt;Select_scan,Sort_scan说明存在全表扫描&lt;br /&gt;通过查看慢速查询日志(slow query log), 能够发现运行时间超过指定时长的SQL语句&lt;br /&gt;2.Linux自带Logrotate工具实现Mysql查询日志的归档&lt;br /&gt;3.InnoDB缓冲池最好设大些, 比如通常可以设置为物理内存的80%&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-4022407867483698870?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/4022407867483698870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=4022407867483698870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/4022407867483698870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/4022407867483698870'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/08/slow-queries-issue.html' title='Slow queries issue'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-7868672331505676448</id><published>2009-08-11T17:03:00.006+08:00</published><updated>2009-09-24T12:53:24.921+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><title type='text'>Rotating MySQL log files</title><content type='html'>Rotating MySQL log files&lt;br /&gt;轮换MySQL日志文件&lt;br /&gt;&lt;br /&gt;用Logrotate维护MySQL日志&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;通常打开MySQL的普通查询日志(general query log)和慢速查询日志(slow query log), 以便查找(可能)出现的问题&lt;br /&gt;在繁忙的系统中, 日志文件增长很快, 对大文件查询起来不方便, 写日志文件本身也会影响磁盘性能&lt;br /&gt;&lt;br /&gt;MySQL 5.0中普通/慢速查询日志参数是个静态的参数,只能通过重启MySQL服务生效&lt;br /&gt;MySQL 5.1版本后普通/慢速查询日志参数是动态的, 能够动态的启用或关闭. 可以平时关闭普通查询日志, 当需要时再打开&lt;br /&gt;&lt;br /&gt;当日志文件增长过大时需要截断(truncate), 使用命令"&amp;gt; logfile"&lt;br /&gt;此命令清空文件全部内容,而不删除文件&lt;br /&gt;&lt;pre class="console"&gt;# ls -l install.log.bak&lt;br /&gt;-rw-r--r-- 1 root root 17244 Jun  1 09:29 install.log.bak&lt;br /&gt;# &amp;gt;install.log.bak&lt;br /&gt;# ls -l install.log.bak&lt;br /&gt;-rw-r--r-- 1 root root 0 Aug 11 06:45 install.log.bak&lt;br /&gt;#&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;截断日志文件后以前的内容就没有了, 所以这并非是一个理想的方案, 需要的是对日志进行归档, 保留旧的日志, 产生新的日志文件&lt;br /&gt;方法见MySQL参考手册:&lt;br /&gt;&lt;pre&gt;shell&gt; mv host_name.log host_name-old.log&lt;br /&gt;shell&gt; mysqladmin flush-logs&lt;br /&gt;shell&gt; cp host_name-old.log backup-directory&lt;br /&gt;shell&gt; rm host_name-old.log&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;日志文件改名, 这不会使MySQL服务终止, 所以不影响在线业务&lt;/li&gt;&lt;li&gt;运行flush-logs命令, 刷新日志文件(包括关闭/重新打开查询日志文件)&lt;/li&gt;&lt;li&gt;备份旧的日志文件&lt;/li&gt;&lt;li&gt;删除旧的日志文件&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;使用linux系统中logrotate自动工作, 配置文件如下:&lt;br /&gt;&lt;pre class="console"&gt;cat &amp;gt;/etc/logrotate.d/mysql &amp;lt;&amp;lt;'EOF'&lt;br /&gt;/mysql/logs/error.log /mysql/logs/general.log /mysql/logs/slow-queries.log {&lt;br /&gt;  daily&lt;br /&gt;  create 0660 mysql mysql&lt;br /&gt;  notifempty&lt;br /&gt;  #size 100M&lt;br /&gt;  missingok&lt;br /&gt;  nocompress&lt;br /&gt;  rotate 120&lt;br /&gt;  sharedscripts&lt;br /&gt;  postrotate&lt;br /&gt;    if test -x /usr/bin/mysqladmin &amp;amp;&amp;amp; \&lt;br /&gt;       /usr/bin/mysqladmin ping &amp;amp;&amp;gt;/dev/null&lt;br /&gt;    then&lt;br /&gt;       /usr/bin/mysqladmin flush-logs&lt;br /&gt;    fi&lt;br /&gt;  endscript&lt;br /&gt;}&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;daily: 每天归档一次&lt;br /&gt;create 0660 mysql mysql: 归档后创建新文件&lt;br /&gt;notifempty: 文件为空时不做处理&lt;br /&gt;#size 100M: 文件大小超过100M也归档&lt;br /&gt;missingok: 文件不存在时不报错&lt;br /&gt;nocompress: 不压缩归档文件&lt;br /&gt;rotate 120: 保留120个归档文件&lt;br /&gt;sharedscripts: 共享的脚本,意味着对所有文件只运行一次&lt;br /&gt;postrotate: 轮换后要运行的脚本&lt;br /&gt;&lt;br /&gt;试运行一下&lt;br /&gt;&lt;pre&gt;/usr/sbin/logrotate -vf /etc/logrotate.d/mysql&lt;br /&gt;&lt;/pre&gt;查看结果&lt;br /&gt;&lt;pre class="console"&gt;[root@db01 /mysql/logs]# ll&lt;br /&gt;total 1675432&lt;br /&gt;-rw-rw---- 1 mysql mysql        472 Aug 11  2009 error.log&lt;br /&gt;-rw-rw---- 1 mysql mysql        472 Aug 11 15:03 error.log.1&lt;br /&gt;-rw-rw---- 1 mysql mysql        472 Aug 11 14:57 error.log.2&lt;br /&gt;-rw-rw---- 1 mysql mysql          0 Aug 11 15:03 error.log-old&lt;br /&gt;-rw-rw---- 1 mysql mysql        687 Aug 11  2009 general.log&lt;br /&gt;-rw-rw---- 1 mysql mysql       1082 Aug 11 15:03 general.log.1&lt;br /&gt;-rw-rw---- 1 mysql mysql      37115 Aug 11 15:01 general.log.2&lt;br /&gt;-rw-rw---- 1 mysql mysql 1693930999 Aug 11 11:06 general.log.3&lt;br /&gt;-rw-rw---- 1 mysql mysql        354 Aug 11  2009 slow-queries.log&lt;br /&gt;-rw-rw---- 1 mysql mysql        354 Aug 11 15:03 slow-queries.log.1&lt;br /&gt;-rw-rw---- 1 mysql mysql   18263218 Aug 11 14:57 slow-queries.log.2&lt;br /&gt;[root@db01 /mysql/logs]# /usr/sbin/logrotate -v /etc/logrotate.d/mysql&lt;br /&gt;reading config file /etc/logrotate.d/mysql&lt;br /&gt;reading config info for /mysql/logs/error.log /mysql/logs/general.log /mysql/logs/slow-queries.log&lt;br /&gt;&lt;br /&gt;Handling 1 logs&lt;br /&gt;&lt;br /&gt;rotating pattern: /mysql/logs/error.log /mysql/logs/general.log /mysql/logs/slow-queries.log  after 1 days (120 rotations)&lt;br /&gt;empty log files are not rotated, old logs are removed&lt;br /&gt;considering log /mysql/logs/error.log&lt;br /&gt;  log does not need rotating&lt;br /&gt;considering log /mysql/logs/general.log&lt;br /&gt;  log does not need rotating&lt;br /&gt;considering log /mysql/logs/slow-queries.log&lt;br /&gt;  log does not need rotating&lt;br /&gt;not running postrotate script, since no logs were rotated&lt;br /&gt;[root@db01.cloud2.bqa3.blurdev.com /mysql/logs]# /usr/sbin/logrotate -vf /etc/logrotate.d/mysql&lt;br /&gt;reading config file /etc/logrotate.d/mysql&lt;br /&gt;reading config info for /mysql/logs/error.log /mysql/logs/general.log /mysql/logs/slow-queries.log&lt;br /&gt;&lt;br /&gt;Handling 1 logs&lt;br /&gt;&lt;br /&gt;rotating pattern: /mysql/logs/error.log /mysql/logs/general.log /mysql/logs/slow-queries.log  forced from command line (120 rotations)&lt;br /&gt;empty log files are not rotated, old logs are removed&lt;br /&gt;considering log /mysql/logs/error.log&lt;br /&gt;  log needs rotating&lt;br /&gt;considering log /mysql/logs/general.log&lt;br /&gt;  log needs rotating&lt;br /&gt;considering log /mysql/logs/slow-queries.log&lt;br /&gt;  log needs rotating&lt;br /&gt;rotating log /mysql/logs/error.log, log-&amp;gt;rotateCount is 120&lt;br /&gt;renaming /mysql/logs/error.log.120 to /mysql/logs/error.log.121 (rotatecount 120, logstart 1, i 120),&lt;br /&gt;old log /mysql/logs/error.log.120 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.119 to /mysql/logs/error.log.120 (rotatecount 120, logstart 1, i 119),&lt;br /&gt;old log /mysql/logs/error.log.119 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.118 to /mysql/logs/error.log.119 (rotatecount 120, logstart 1, i 118),&lt;br /&gt;old log /mysql/logs/error.log.118 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.117 to /mysql/logs/error.log.118 (rotatecount 120, logstart 1, i 117),&lt;br /&gt;old log /mysql/logs/error.log.117 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.116 to /mysql/logs/error.log.117 (rotatecount 120, logstart 1, i 116),&lt;br /&gt;old log /mysql/logs/error.log.116 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.115 to /mysql/logs/error.log.116 (rotatecount 120, logstart 1, i 115),&lt;br /&gt;old log /mysql/logs/error.log.115 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.114 to /mysql/logs/error.log.115 (rotatecount 120, logstart 1, i 114),&lt;br /&gt;old log /mysql/logs/error.log.114 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.113 to /mysql/logs/error.log.114 (rotatecount 120, logstart 1, i 113),&lt;br /&gt;old log /mysql/logs/error.log.113 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.112 to /mysql/logs/error.log.113 (rotatecount 120, logstart 1, i 112),&lt;br /&gt;old log /mysql/logs/error.log.112 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.111 to /mysql/logs/error.log.112 (rotatecount 120, logstart 1, i 111),&lt;br /&gt;old log /mysql/logs/error.log.111 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.110 to /mysql/logs/error.log.111 (rotatecount 120, logstart 1, i 110),&lt;br /&gt;old log /mysql/logs/error.log.110 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.109 to /mysql/logs/error.log.110 (rotatecount 120, logstart 1, i 109),&lt;br /&gt;old log /mysql/logs/error.log.109 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.108 to /mysql/logs/error.log.109 (rotatecount 120, logstart 1, i 108),&lt;br /&gt;old log /mysql/logs/error.log.108 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.107 to /mysql/logs/error.log.108 (rotatecount 120, logstart 1, i 107),&lt;br /&gt;old log /mysql/logs/error.log.107 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.106 to /mysql/logs/error.log.107 (rotatecount 120, logstart 1, i 106),&lt;br /&gt;old log /mysql/logs/error.log.106 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.105 to /mysql/logs/error.log.106 (rotatecount 120, logstart 1, i 105),&lt;br /&gt;old log /mysql/logs/error.log.105 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.104 to /mysql/logs/error.log.105 (rotatecount 120, logstart 1, i 104),&lt;br /&gt;old log /mysql/logs/error.log.104 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.103 to /mysql/logs/error.log.104 (rotatecount 120, logstart 1, i 103),&lt;br /&gt;old log /mysql/logs/error.log.103 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.102 to /mysql/logs/error.log.103 (rotatecount 120, logstart 1, i 102),&lt;br /&gt;old log /mysql/logs/error.log.102 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.101 to /mysql/logs/error.log.102 (rotatecount 120, logstart 1, i 101),&lt;br /&gt;old log /mysql/logs/error.log.101 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.100 to /mysql/logs/error.log.101 (rotatecount 120, logstart 1, i 100),&lt;br /&gt;old log /mysql/logs/error.log.100 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.99 to /mysql/logs/error.log.100 (rotatecount 120, logstart 1, i 99),&lt;br /&gt;old log /mysql/logs/error.log.99 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.98 to /mysql/logs/error.log.99 (rotatecount 120, logstart 1, i 98),&lt;br /&gt;old log /mysql/logs/error.log.98 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.97 to /mysql/logs/error.log.98 (rotatecount 120, logstart 1, i 97),&lt;br /&gt;old log /mysql/logs/error.log.97 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.96 to /mysql/logs/error.log.97 (rotatecount 120, logstart 1, i 96),&lt;br /&gt;old log /mysql/logs/error.log.96 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.95 to /mysql/logs/error.log.96 (rotatecount 120, logstart 1, i 95),&lt;br /&gt;old log /mysql/logs/error.log.95 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.94 to /mysql/logs/error.log.95 (rotatecount 120, logstart 1, i 94),&lt;br /&gt;old log /mysql/logs/error.log.94 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.93 to /mysql/logs/error.log.94 (rotatecount 120, logstart 1, i 93),&lt;br /&gt;old log /mysql/logs/error.log.93 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.92 to /mysql/logs/error.log.93 (rotatecount 120, logstart 1, i 92),&lt;br /&gt;old log /mysql/logs/error.log.92 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.91 to /mysql/logs/error.log.92 (rotatecount 120, logstart 1, i 91),&lt;br /&gt;old log /mysql/logs/error.log.91 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.90 to /mysql/logs/error.log.91 (rotatecount 120, logstart 1, i 90),&lt;br /&gt;old log /mysql/logs/error.log.90 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.89 to /mysql/logs/error.log.90 (rotatecount 120, logstart 1, i 89),&lt;br /&gt;old log /mysql/logs/error.log.89 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.88 to /mysql/logs/error.log.89 (rotatecount 120, logstart 1, i 88),&lt;br /&gt;old log /mysql/logs/error.log.88 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.87 to /mysql/logs/error.log.88 (rotatecount 120, logstart 1, i 87),&lt;br /&gt;old log /mysql/logs/error.log.87 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.86 to /mysql/logs/error.log.87 (rotatecount 120, logstart 1, i 86),&lt;br /&gt;old log /mysql/logs/error.log.86 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.85 to /mysql/logs/error.log.86 (rotatecount 120, logstart 1, i 85),&lt;br /&gt;old log /mysql/logs/error.log.85 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.84 to /mysql/logs/error.log.85 (rotatecount 120, logstart 1, i 84),&lt;br /&gt;old log /mysql/logs/error.log.84 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.83 to /mysql/logs/error.log.84 (rotatecount 120, logstart 1, i 83),&lt;br /&gt;old log /mysql/logs/error.log.83 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.82 to /mysql/logs/error.log.83 (rotatecount 120, logstart 1, i 82),&lt;br /&gt;old log /mysql/logs/error.log.82 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.81 to /mysql/logs/error.log.82 (rotatecount 120, logstart 1, i 81),&lt;br /&gt;old log /mysql/logs/error.log.81 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.80 to /mysql/logs/error.log.81 (rotatecount 120, logstart 1, i 80),&lt;br /&gt;old log /mysql/logs/error.log.80 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.79 to /mysql/logs/error.log.80 (rotatecount 120, logstart 1, i 79),&lt;br /&gt;old log /mysql/logs/error.log.79 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.78 to /mysql/logs/error.log.79 (rotatecount 120, logstart 1, i 78),&lt;br /&gt;old log /mysql/logs/error.log.78 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.77 to /mysql/logs/error.log.78 (rotatecount 120, logstart 1, i 77),&lt;br /&gt;old log /mysql/logs/error.log.77 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.76 to /mysql/logs/error.log.77 (rotatecount 120, logstart 1, i 76),&lt;br /&gt;old log /mysql/logs/error.log.76 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.75 to /mysql/logs/error.log.76 (rotatecount 120, logstart 1, i 75),&lt;br /&gt;old log /mysql/logs/error.log.75 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.74 to /mysql/logs/error.log.75 (rotatecount 120, logstart 1, i 74),&lt;br /&gt;old log /mysql/logs/error.log.74 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.73 to /mysql/logs/error.log.74 (rotatecount 120, logstart 1, i 73),&lt;br /&gt;old log /mysql/logs/error.log.73 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.72 to /mysql/logs/error.log.73 (rotatecount 120, logstart 1, i 72),&lt;br /&gt;old log /mysql/logs/error.log.72 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.71 to /mysql/logs/error.log.72 (rotatecount 120, logstart 1, i 71),&lt;br /&gt;old log /mysql/logs/error.log.71 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.70 to /mysql/logs/error.log.71 (rotatecount 120, logstart 1, i 70),&lt;br /&gt;old log /mysql/logs/error.log.70 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.69 to /mysql/logs/error.log.70 (rotatecount 120, logstart 1, i 69),&lt;br /&gt;old log /mysql/logs/error.log.69 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.68 to /mysql/logs/error.log.69 (rotatecount 120, logstart 1, i 68),&lt;br /&gt;old log /mysql/logs/error.log.68 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.67 to /mysql/logs/error.log.68 (rotatecount 120, logstart 1, i 67),&lt;br /&gt;old log /mysql/logs/error.log.67 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.66 to /mysql/logs/error.log.67 (rotatecount 120, logstart 1, i 66),&lt;br /&gt;old log /mysql/logs/error.log.66 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.65 to /mysql/logs/error.log.66 (rotatecount 120, logstart 1, i 65),&lt;br /&gt;old log /mysql/logs/error.log.65 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.64 to /mysql/logs/error.log.65 (rotatecount 120, logstart 1, i 64),&lt;br /&gt;old log /mysql/logs/error.log.64 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.63 to /mysql/logs/error.log.64 (rotatecount 120, logstart 1, i 63),&lt;br /&gt;old log /mysql/logs/error.log.63 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.62 to /mysql/logs/error.log.63 (rotatecount 120, logstart 1, i 62),&lt;br /&gt;old log /mysql/logs/error.log.62 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.61 to /mysql/logs/error.log.62 (rotatecount 120, logstart 1, i 61),&lt;br /&gt;old log /mysql/logs/error.log.61 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.60 to /mysql/logs/error.log.61 (rotatecount 120, logstart 1, i 60),&lt;br /&gt;old log /mysql/logs/error.log.60 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.59 to /mysql/logs/error.log.60 (rotatecount 120, logstart 1, i 59),&lt;br /&gt;old log /mysql/logs/error.log.59 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.58 to /mysql/logs/error.log.59 (rotatecount 120, logstart 1, i 58),&lt;br /&gt;old log /mysql/logs/error.log.58 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.57 to /mysql/logs/error.log.58 (rotatecount 120, logstart 1, i 57),&lt;br /&gt;old log /mysql/logs/error.log.57 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.56 to /mysql/logs/error.log.57 (rotatecount 120, logstart 1, i 56),&lt;br /&gt;old log /mysql/logs/error.log.56 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.55 to /mysql/logs/error.log.56 (rotatecount 120, logstart 1, i 55),&lt;br /&gt;old log /mysql/logs/error.log.55 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.54 to /mysql/logs/error.log.55 (rotatecount 120, logstart 1, i 54),&lt;br /&gt;old log /mysql/logs/error.log.54 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.53 to /mysql/logs/error.log.54 (rotatecount 120, logstart 1, i 53),&lt;br /&gt;old log /mysql/logs/error.log.53 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.52 to /mysql/logs/error.log.53 (rotatecount 120, logstart 1, i 52),&lt;br /&gt;old log /mysql/logs/error.log.52 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.51 to /mysql/logs/error.log.52 (rotatecount 120, logstart 1, i 51),&lt;br /&gt;old log /mysql/logs/error.log.51 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.50 to /mysql/logs/error.log.51 (rotatecount 120, logstart 1, i 50),&lt;br /&gt;old log /mysql/logs/error.log.50 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.49 to /mysql/logs/error.log.50 (rotatecount 120, logstart 1, i 49),&lt;br /&gt;old log /mysql/logs/error.log.49 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.48 to /mysql/logs/error.log.49 (rotatecount 120, logstart 1, i 48),&lt;br /&gt;old log /mysql/logs/error.log.48 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.47 to /mysql/logs/error.log.48 (rotatecount 120, logstart 1, i 47),&lt;br /&gt;old log /mysql/logs/error.log.47 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.46 to /mysql/logs/error.log.47 (rotatecount 120, logstart 1, i 46),&lt;br /&gt;old log /mysql/logs/error.log.46 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.45 to /mysql/logs/error.log.46 (rotatecount 120, logstart 1, i 45),&lt;br /&gt;old log /mysql/logs/error.log.45 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.44 to /mysql/logs/error.log.45 (rotatecount 120, logstart 1, i 44),&lt;br /&gt;old log /mysql/logs/error.log.44 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.43 to /mysql/logs/error.log.44 (rotatecount 120, logstart 1, i 43),&lt;br /&gt;old log /mysql/logs/error.log.43 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.42 to /mysql/logs/error.log.43 (rotatecount 120, logstart 1, i 42),&lt;br /&gt;old log /mysql/logs/error.log.42 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.41 to /mysql/logs/error.log.42 (rotatecount 120, logstart 1, i 41),&lt;br /&gt;old log /mysql/logs/error.log.41 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.40 to /mysql/logs/error.log.41 (rotatecount 120, logstart 1, i 40),&lt;br /&gt;old log /mysql/logs/error.log.40 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.39 to /mysql/logs/error.log.40 (rotatecount 120, logstart 1, i 39),&lt;br /&gt;old log /mysql/logs/error.log.39 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.38 to /mysql/logs/error.log.39 (rotatecount 120, logstart 1, i 38),&lt;br /&gt;old log /mysql/logs/error.log.38 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.37 to /mysql/logs/error.log.38 (rotatecount 120, logstart 1, i 37),&lt;br /&gt;old log /mysql/logs/error.log.37 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.36 to /mysql/logs/error.log.37 (rotatecount 120, logstart 1, i 36),&lt;br /&gt;old log /mysql/logs/error.log.36 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.35 to /mysql/logs/error.log.36 (rotatecount 120, logstart 1, i 35),&lt;br /&gt;old log /mysql/logs/error.log.35 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.34 to /mysql/logs/error.log.35 (rotatecount 120, logstart 1, i 34),&lt;br /&gt;old log /mysql/logs/error.log.34 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.33 to /mysql/logs/error.log.34 (rotatecount 120, logstart 1, i 33),&lt;br /&gt;old log /mysql/logs/error.log.33 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.32 to /mysql/logs/error.log.33 (rotatecount 120, logstart 1, i 32),&lt;br /&gt;old log /mysql/logs/error.log.32 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.31 to /mysql/logs/error.log.32 (rotatecount 120, logstart 1, i 31),&lt;br /&gt;old log /mysql/logs/error.log.31 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.30 to /mysql/logs/error.log.31 (rotatecount 120, logstart 1, i 30),&lt;br /&gt;old log /mysql/logs/error.log.30 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.29 to /mysql/logs/error.log.30 (rotatecount 120, logstart 1, i 29),&lt;br /&gt;old log /mysql/logs/error.log.29 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.28 to /mysql/logs/error.log.29 (rotatecount 120, logstart 1, i 28),&lt;br /&gt;old log /mysql/logs/error.log.28 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.27 to /mysql/logs/error.log.28 (rotatecount 120, logstart 1, i 27),&lt;br /&gt;old log /mysql/logs/error.log.27 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.26 to /mysql/logs/error.log.27 (rotatecount 120, logstart 1, i 26),&lt;br /&gt;old log /mysql/logs/error.log.26 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.25 to /mysql/logs/error.log.26 (rotatecount 120, logstart 1, i 25),&lt;br /&gt;old log /mysql/logs/error.log.25 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.24 to /mysql/logs/error.log.25 (rotatecount 120, logstart 1, i 24),&lt;br /&gt;old log /mysql/logs/error.log.24 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.23 to /mysql/logs/error.log.24 (rotatecount 120, logstart 1, i 23),&lt;br /&gt;old log /mysql/logs/error.log.23 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.22 to /mysql/logs/error.log.23 (rotatecount 120, logstart 1, i 22),&lt;br /&gt;old log /mysql/logs/error.log.22 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.21 to /mysql/logs/error.log.22 (rotatecount 120, logstart 1, i 21),&lt;br /&gt;old log /mysql/logs/error.log.21 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.20 to /mysql/logs/error.log.21 (rotatecount 120, logstart 1, i 20),&lt;br /&gt;old log /mysql/logs/error.log.20 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.19 to /mysql/logs/error.log.20 (rotatecount 120, logstart 1, i 19),&lt;br /&gt;old log /mysql/logs/error.log.19 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.18 to /mysql/logs/error.log.19 (rotatecount 120, logstart 1, i 18),&lt;br /&gt;old log /mysql/logs/error.log.18 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.17 to /mysql/logs/error.log.18 (rotatecount 120, logstart 1, i 17),&lt;br /&gt;old log /mysql/logs/error.log.17 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.16 to /mysql/logs/error.log.17 (rotatecount 120, logstart 1, i 16),&lt;br /&gt;old log /mysql/logs/error.log.16 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.15 to /mysql/logs/error.log.16 (rotatecount 120, logstart 1, i 15),&lt;br /&gt;old log /mysql/logs/error.log.15 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.14 to /mysql/logs/error.log.15 (rotatecount 120, logstart 1, i 14),&lt;br /&gt;old log /mysql/logs/error.log.14 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.13 to /mysql/logs/error.log.14 (rotatecount 120, logstart 1, i 13),&lt;br /&gt;old log /mysql/logs/error.log.13 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.12 to /mysql/logs/error.log.13 (rotatecount 120, logstart 1, i 12),&lt;br /&gt;old log /mysql/logs/error.log.12 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.11 to /mysql/logs/error.log.12 (rotatecount 120, logstart 1, i 11),&lt;br /&gt;old log /mysql/logs/error.log.11 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.10 to /mysql/logs/error.log.11 (rotatecount 120, logstart 1, i 10),&lt;br /&gt;old log /mysql/logs/error.log.10 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.9 to /mysql/logs/error.log.10 (rotatecount 120, logstart 1, i 9),&lt;br /&gt;old log /mysql/logs/error.log.9 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.8 to /mysql/logs/error.log.9 (rotatecount 120, logstart 1, i 8),&lt;br /&gt;old log /mysql/logs/error.log.8 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.7 to /mysql/logs/error.log.8 (rotatecount 120, logstart 1, i 7),&lt;br /&gt;old log /mysql/logs/error.log.7 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.6 to /mysql/logs/error.log.7 (rotatecount 120, logstart 1, i 6),&lt;br /&gt;old log /mysql/logs/error.log.6 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.5 to /mysql/logs/error.log.6 (rotatecount 120, logstart 1, i 5),&lt;br /&gt;old log /mysql/logs/error.log.5 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.4 to /mysql/logs/error.log.5 (rotatecount 120, logstart 1, i 4),&lt;br /&gt;old log /mysql/logs/error.log.4 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.3 to /mysql/logs/error.log.4 (rotatecount 120, logstart 1, i 3),&lt;br /&gt;old log /mysql/logs/error.log.3 does not exist&lt;br /&gt;renaming /mysql/logs/error.log.2 to /mysql/logs/error.log.3 (rotatecount 120, logstart 1, i 2),&lt;br /&gt;renaming /mysql/logs/error.log.1 to /mysql/logs/error.log.2 (rotatecount 120, logstart 1, i 1),&lt;br /&gt;renaming /mysql/logs/error.log.0 to /mysql/logs/error.log.1 (rotatecount 120, logstart 1, i 0),&lt;br /&gt;old log /mysql/logs/error.log.0 does not exist&lt;br /&gt;log /mysql/logs/error.log.121 doesn't exist -- won't try to dispose of it&lt;br /&gt;rotating log /mysql/logs/general.log, log-&amp;gt;rotateCount is 120&lt;br /&gt;renaming /mysql/logs/general.log.120 to /mysql/logs/general.log.121 (rotatecount 120, logstart 1, i 120),&lt;br /&gt;old log /mysql/logs/general.log.120 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.119 to /mysql/logs/general.log.120 (rotatecount 120, logstart 1, i 119),&lt;br /&gt;old log /mysql/logs/general.log.119 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.118 to /mysql/logs/general.log.119 (rotatecount 120, logstart 1, i 118),&lt;br /&gt;old log /mysql/logs/general.log.118 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.117 to /mysql/logs/general.log.118 (rotatecount 120, logstart 1, i 117),&lt;br /&gt;old log /mysql/logs/general.log.117 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.116 to /mysql/logs/general.log.117 (rotatecount 120, logstart 1, i 116),&lt;br /&gt;old log /mysql/logs/general.log.116 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.115 to /mysql/logs/general.log.116 (rotatecount 120, logstart 1, i 115),&lt;br /&gt;old log /mysql/logs/general.log.115 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.114 to /mysql/logs/general.log.115 (rotatecount 120, logstart 1, i 114),&lt;br /&gt;old log /mysql/logs/general.log.114 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.113 to /mysql/logs/general.log.114 (rotatecount 120, logstart 1, i 113),&lt;br /&gt;old log /mysql/logs/general.log.113 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.112 to /mysql/logs/general.log.113 (rotatecount 120, logstart 1, i 112),&lt;br /&gt;old log /mysql/logs/general.log.112 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.111 to /mysql/logs/general.log.112 (rotatecount 120, logstart 1, i 111),&lt;br /&gt;old log /mysql/logs/general.log.111 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.110 to /mysql/logs/general.log.111 (rotatecount 120, logstart 1, i 110),&lt;br /&gt;old log /mysql/logs/general.log.110 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.109 to /mysql/logs/general.log.110 (rotatecount 120, logstart 1, i 109),&lt;br /&gt;old log /mysql/logs/general.log.109 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.108 to /mysql/logs/general.log.109 (rotatecount 120, logstart 1, i 108),&lt;br /&gt;old log /mysql/logs/general.log.108 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.107 to /mysql/logs/general.log.108 (rotatecount 120, logstart 1, i 107),&lt;br /&gt;old log /mysql/logs/general.log.107 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.106 to /mysql/logs/general.log.107 (rotatecount 120, logstart 1, i 106),&lt;br /&gt;old log /mysql/logs/general.log.106 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.105 to /mysql/logs/general.log.106 (rotatecount 120, logstart 1, i 105),&lt;br /&gt;old log /mysql/logs/general.log.105 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.104 to /mysql/logs/general.log.105 (rotatecount 120, logstart 1, i 104),&lt;br /&gt;old log /mysql/logs/general.log.104 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.103 to /mysql/logs/general.log.104 (rotatecount 120, logstart 1, i 103),&lt;br /&gt;old log /mysql/logs/general.log.103 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.102 to /mysql/logs/general.log.103 (rotatecount 120, logstart 1, i 102),&lt;br /&gt;old log /mysql/logs/general.log.102 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.101 to /mysql/logs/general.log.102 (rotatecount 120, logstart 1, i 101),&lt;br /&gt;old log /mysql/logs/general.log.101 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.100 to /mysql/logs/general.log.101 (rotatecount 120, logstart 1, i 100),&lt;br /&gt;old log /mysql/logs/general.log.100 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.99 to /mysql/logs/general.log.100 (rotatecount 120, logstart 1, i 99),&lt;br /&gt;old log /mysql/logs/general.log.99 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.98 to /mysql/logs/general.log.99 (rotatecount 120, logstart 1, i 98),&lt;br /&gt;old log /mysql/logs/general.log.98 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.97 to /mysql/logs/general.log.98 (rotatecount 120, logstart 1, i 97),&lt;br /&gt;old log /mysql/logs/general.log.97 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.96 to /mysql/logs/general.log.97 (rotatecount 120, logstart 1, i 96),&lt;br /&gt;old log /mysql/logs/general.log.96 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.95 to /mysql/logs/general.log.96 (rotatecount 120, logstart 1, i 95),&lt;br /&gt;old log /mysql/logs/general.log.95 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.94 to /mysql/logs/general.log.95 (rotatecount 120, logstart 1, i 94),&lt;br /&gt;old log /mysql/logs/general.log.94 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.93 to /mysql/logs/general.log.94 (rotatecount 120, logstart 1, i 93),&lt;br /&gt;old log /mysql/logs/general.log.93 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.92 to /mysql/logs/general.log.93 (rotatecount 120, logstart 1, i 92),&lt;br /&gt;old log /mysql/logs/general.log.92 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.91 to /mysql/logs/general.log.92 (rotatecount 120, logstart 1, i 91),&lt;br /&gt;old log /mysql/logs/general.log.91 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.90 to /mysql/logs/general.log.91 (rotatecount 120, logstart 1, i 90),&lt;br /&gt;old log /mysql/logs/general.log.90 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.89 to /mysql/logs/general.log.90 (rotatecount 120, logstart 1, i 89),&lt;br /&gt;old log /mysql/logs/general.log.89 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.88 to /mysql/logs/general.log.89 (rotatecount 120, logstart 1, i 88),&lt;br /&gt;old log /mysql/logs/general.log.88 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.87 to /mysql/logs/general.log.88 (rotatecount 120, logstart 1, i 87),&lt;br /&gt;old log /mysql/logs/general.log.87 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.86 to /mysql/logs/general.log.87 (rotatecount 120, logstart 1, i 86),&lt;br /&gt;old log /mysql/logs/general.log.86 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.85 to /mysql/logs/general.log.86 (rotatecount 120, logstart 1, i 85),&lt;br /&gt;old log /mysql/logs/general.log.85 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.84 to /mysql/logs/general.log.85 (rotatecount 120, logstart 1, i 84),&lt;br /&gt;old log /mysql/logs/general.log.84 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.83 to /mysql/logs/general.log.84 (rotatecount 120, logstart 1, i 83),&lt;br /&gt;old log /mysql/logs/general.log.83 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.82 to /mysql/logs/general.log.83 (rotatecount 120, logstart 1, i 82),&lt;br /&gt;old log /mysql/logs/general.log.82 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.81 to /mysql/logs/general.log.82 (rotatecount 120, logstart 1, i 81),&lt;br /&gt;old log /mysql/logs/general.log.81 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.80 to /mysql/logs/general.log.81 (rotatecount 120, logstart 1, i 80),&lt;br /&gt;old log /mysql/logs/general.log.80 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.79 to /mysql/logs/general.log.80 (rotatecount 120, logstart 1, i 79),&lt;br /&gt;old log /mysql/logs/general.log.79 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.78 to /mysql/logs/general.log.79 (rotatecount 120, logstart 1, i 78),&lt;br /&gt;old log /mysql/logs/general.log.78 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.77 to /mysql/logs/general.log.78 (rotatecount 120, logstart 1, i 77),&lt;br /&gt;old log /mysql/logs/general.log.77 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.76 to /mysql/logs/general.log.77 (rotatecount 120, logstart 1, i 76),&lt;br /&gt;old log /mysql/logs/general.log.76 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.75 to /mysql/logs/general.log.76 (rotatecount 120, logstart 1, i 75),&lt;br /&gt;old log /mysql/logs/general.log.75 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.74 to /mysql/logs/general.log.75 (rotatecount 120, logstart 1, i 74),&lt;br /&gt;old log /mysql/logs/general.log.74 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.73 to /mysql/logs/general.log.74 (rotatecount 120, logstart 1, i 73),&lt;br /&gt;old log /mysql/logs/general.log.73 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.72 to /mysql/logs/general.log.73 (rotatecount 120, logstart 1, i 72),&lt;br /&gt;old log /mysql/logs/general.log.72 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.71 to /mysql/logs/general.log.72 (rotatecount 120, logstart 1, i 71),&lt;br /&gt;old log /mysql/logs/general.log.71 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.70 to /mysql/logs/general.log.71 (rotatecount 120, logstart 1, i 70),&lt;br /&gt;old log /mysql/logs/general.log.70 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.69 to /mysql/logs/general.log.70 (rotatecount 120, logstart 1, i 69),&lt;br /&gt;old log /mysql/logs/general.log.69 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.68 to /mysql/logs/general.log.69 (rotatecount 120, logstart 1, i 68),&lt;br /&gt;old log /mysql/logs/general.log.68 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.67 to /mysql/logs/general.log.68 (rotatecount 120, logstart 1, i 67),&lt;br /&gt;old log /mysql/logs/general.log.67 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.66 to /mysql/logs/general.log.67 (rotatecount 120, logstart 1, i 66),&lt;br /&gt;old log /mysql/logs/general.log.66 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.65 to /mysql/logs/general.log.66 (rotatecount 120, logstart 1, i 65),&lt;br /&gt;old log /mysql/logs/general.log.65 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.64 to /mysql/logs/general.log.65 (rotatecount 120, logstart 1, i 64),&lt;br /&gt;old log /mysql/logs/general.log.64 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.63 to /mysql/logs/general.log.64 (rotatecount 120, logstart 1, i 63),&lt;br /&gt;old log /mysql/logs/general.log.63 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.62 to /mysql/logs/general.log.63 (rotatecount 120, logstart 1, i 62),&lt;br /&gt;old log /mysql/logs/general.log.62 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.61 to /mysql/logs/general.log.62 (rotatecount 120, logstart 1, i 61),&lt;br /&gt;old log /mysql/logs/general.log.61 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.60 to /mysql/logs/general.log.61 (rotatecount 120, logstart 1, i 60),&lt;br /&gt;old log /mysql/logs/general.log.60 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.59 to /mysql/logs/general.log.60 (rotatecount 120, logstart 1, i 59),&lt;br /&gt;old log /mysql/logs/general.log.59 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.58 to /mysql/logs/general.log.59 (rotatecount 120, logstart 1, i 58),&lt;br /&gt;old log /mysql/logs/general.log.58 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.57 to /mysql/logs/general.log.58 (rotatecount 120, logstart 1, i 57),&lt;br /&gt;old log /mysql/logs/general.log.57 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.56 to /mysql/logs/general.log.57 (rotatecount 120, logstart 1, i 56),&lt;br /&gt;old log /mysql/logs/general.log.56 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.55 to /mysql/logs/general.log.56 (rotatecount 120, logstart 1, i 55),&lt;br /&gt;old log /mysql/logs/general.log.55 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.54 to /mysql/logs/general.log.55 (rotatecount 120, logstart 1, i 54),&lt;br /&gt;old log /mysql/logs/general.log.54 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.53 to /mysql/logs/general.log.54 (rotatecount 120, logstart 1, i 53),&lt;br /&gt;old log /mysql/logs/general.log.53 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.52 to /mysql/logs/general.log.53 (rotatecount 120, logstart 1, i 52),&lt;br /&gt;old log /mysql/logs/general.log.52 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.51 to /mysql/logs/general.log.52 (rotatecount 120, logstart 1, i 51),&lt;br /&gt;old log /mysql/logs/general.log.51 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.50 to /mysql/logs/general.log.51 (rotatecount 120, logstart 1, i 50),&lt;br /&gt;old log /mysql/logs/general.log.50 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.49 to /mysql/logs/general.log.50 (rotatecount 120, logstart 1, i 49),&lt;br /&gt;old log /mysql/logs/general.log.49 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.48 to /mysql/logs/general.log.49 (rotatecount 120, logstart 1, i 48),&lt;br /&gt;old log /mysql/logs/general.log.48 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.47 to /mysql/logs/general.log.48 (rotatecount 120, logstart 1, i 47),&lt;br /&gt;old log /mysql/logs/general.log.47 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.46 to /mysql/logs/general.log.47 (rotatecount 120, logstart 1, i 46),&lt;br /&gt;old log /mysql/logs/general.log.46 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.45 to /mysql/logs/general.log.46 (rotatecount 120, logstart 1, i 45),&lt;br /&gt;old log /mysql/logs/general.log.45 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.44 to /mysql/logs/general.log.45 (rotatecount 120, logstart 1, i 44),&lt;br /&gt;old log /mysql/logs/general.log.44 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.43 to /mysql/logs/general.log.44 (rotatecount 120, logstart 1, i 43),&lt;br /&gt;old log /mysql/logs/general.log.43 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.42 to /mysql/logs/general.log.43 (rotatecount 120, logstart 1, i 42),&lt;br /&gt;old log /mysql/logs/general.log.42 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.41 to /mysql/logs/general.log.42 (rotatecount 120, logstart 1, i 41),&lt;br /&gt;old log /mysql/logs/general.log.41 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.40 to /mysql/logs/general.log.41 (rotatecount 120, logstart 1, i 40),&lt;br /&gt;old log /mysql/logs/general.log.40 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.39 to /mysql/logs/general.log.40 (rotatecount 120, logstart 1, i 39),&lt;br /&gt;old log /mysql/logs/general.log.39 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.38 to /mysql/logs/general.log.39 (rotatecount 120, logstart 1, i 38),&lt;br /&gt;old log /mysql/logs/general.log.38 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.37 to /mysql/logs/general.log.38 (rotatecount 120, logstart 1, i 37),&lt;br /&gt;old log /mysql/logs/general.log.37 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.36 to /mysql/logs/general.log.37 (rotatecount 120, logstart 1, i 36),&lt;br /&gt;old log /mysql/logs/general.log.36 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.35 to /mysql/logs/general.log.36 (rotatecount 120, logstart 1, i 35),&lt;br /&gt;old log /mysql/logs/general.log.35 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.34 to /mysql/logs/general.log.35 (rotatecount 120, logstart 1, i 34),&lt;br /&gt;old log /mysql/logs/general.log.34 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.33 to /mysql/logs/general.log.34 (rotatecount 120, logstart 1, i 33),&lt;br /&gt;old log /mysql/logs/general.log.33 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.32 to /mysql/logs/general.log.33 (rotatecount 120, logstart 1, i 32),&lt;br /&gt;old log /mysql/logs/general.log.32 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.31 to /mysql/logs/general.log.32 (rotatecount 120, logstart 1, i 31),&lt;br /&gt;old log /mysql/logs/general.log.31 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.30 to /mysql/logs/general.log.31 (rotatecount 120, logstart 1, i 30),&lt;br /&gt;old log /mysql/logs/general.log.30 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.29 to /mysql/logs/general.log.30 (rotatecount 120, logstart 1, i 29),&lt;br /&gt;old log /mysql/logs/general.log.29 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.28 to /mysql/logs/general.log.29 (rotatecount 120, logstart 1, i 28),&lt;br /&gt;old log /mysql/logs/general.log.28 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.27 to /mysql/logs/general.log.28 (rotatecount 120, logstart 1, i 27),&lt;br /&gt;old log /mysql/logs/general.log.27 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.26 to /mysql/logs/general.log.27 (rotatecount 120, logstart 1, i 26),&lt;br /&gt;old log /mysql/logs/general.log.26 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.25 to /mysql/logs/general.log.26 (rotatecount 120, logstart 1, i 25),&lt;br /&gt;old log /mysql/logs/general.log.25 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.24 to /mysql/logs/general.log.25 (rotatecount 120, logstart 1, i 24),&lt;br /&gt;old log /mysql/logs/general.log.24 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.23 to /mysql/logs/general.log.24 (rotatecount 120, logstart 1, i 23),&lt;br /&gt;old log /mysql/logs/general.log.23 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.22 to /mysql/logs/general.log.23 (rotatecount 120, logstart 1, i 22),&lt;br /&gt;old log /mysql/logs/general.log.22 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.21 to /mysql/logs/general.log.22 (rotatecount 120, logstart 1, i 21),&lt;br /&gt;old log /mysql/logs/general.log.21 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.20 to /mysql/logs/general.log.21 (rotatecount 120, logstart 1, i 20),&lt;br /&gt;old log /mysql/logs/general.log.20 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.19 to /mysql/logs/general.log.20 (rotatecount 120, logstart 1, i 19),&lt;br /&gt;old log /mysql/logs/general.log.19 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.18 to /mysql/logs/general.log.19 (rotatecount 120, logstart 1, i 18),&lt;br /&gt;old log /mysql/logs/general.log.18 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.17 to /mysql/logs/general.log.18 (rotatecount 120, logstart 1, i 17),&lt;br /&gt;old log /mysql/logs/general.log.17 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.16 to /mysql/logs/general.log.17 (rotatecount 120, logstart 1, i 16),&lt;br /&gt;old log /mysql/logs/general.log.16 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.15 to /mysql/logs/general.log.16 (rotatecount 120, logstart 1, i 15),&lt;br /&gt;old log /mysql/logs/general.log.15 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.14 to /mysql/logs/general.log.15 (rotatecount 120, logstart 1, i 14),&lt;br /&gt;old log /mysql/logs/general.log.14 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.13 to /mysql/logs/general.log.14 (rotatecount 120, logstart 1, i 13),&lt;br /&gt;old log /mysql/logs/general.log.13 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.12 to /mysql/logs/general.log.13 (rotatecount 120, logstart 1, i 12),&lt;br /&gt;old log /mysql/logs/general.log.12 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.11 to /mysql/logs/general.log.12 (rotatecount 120, logstart 1, i 11),&lt;br /&gt;old log /mysql/logs/general.log.11 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.10 to /mysql/logs/general.log.11 (rotatecount 120, logstart 1, i 10),&lt;br /&gt;old log /mysql/logs/general.log.10 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.9 to /mysql/logs/general.log.10 (rotatecount 120, logstart 1, i 9),&lt;br /&gt;old log /mysql/logs/general.log.9 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.8 to /mysql/logs/general.log.9 (rotatecount 120, logstart 1, i 8),&lt;br /&gt;old log /mysql/logs/general.log.8 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.7 to /mysql/logs/general.log.8 (rotatecount 120, logstart 1, i 7),&lt;br /&gt;old log /mysql/logs/general.log.7 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.6 to /mysql/logs/general.log.7 (rotatecount 120, logstart 1, i 6),&lt;br /&gt;old log /mysql/logs/general.log.6 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.5 to /mysql/logs/general.log.6 (rotatecount 120, logstart 1, i 5),&lt;br /&gt;old log /mysql/logs/general.log.5 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.4 to /mysql/logs/general.log.5 (rotatecount 120, logstart 1, i 4),&lt;br /&gt;old log /mysql/logs/general.log.4 does not exist&lt;br /&gt;renaming /mysql/logs/general.log.3 to /mysql/logs/general.log.4 (rotatecount 120, logstart 1, i 3),&lt;br /&gt;renaming /mysql/logs/general.log.2 to /mysql/logs/general.log.3 (rotatecount 120, logstart 1, i 2),&lt;br /&gt;renaming /mysql/logs/general.log.1 to /mysql/logs/general.log.2 (rotatecount 120, logstart 1, i 1),&lt;br /&gt;renaming /mysql/logs/general.log.0 to /mysql/logs/general.log.1 (rotatecount 120, logstart 1, i 0),&lt;br /&gt;old log /mysql/logs/general.log.0 does not exist&lt;br /&gt;log /mysql/logs/general.log.121 doesn't exist -- won't try to dispose of it&lt;br /&gt;rotating log /mysql/logs/slow-queries.log, log-&amp;gt;rotateCount is 120&lt;br /&gt;renaming /mysql/logs/slow-queries.log.120 to /mysql/logs/slow-queries.log.121 (rotatecount 120, logstart 1, i 120),&lt;br /&gt;old log /mysql/logs/slow-queries.log.120 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.119 to /mysql/logs/slow-queries.log.120 (rotatecount 120, logstart 1, i 119),&lt;br /&gt;old log /mysql/logs/slow-queries.log.119 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.118 to /mysql/logs/slow-queries.log.119 (rotatecount 120, logstart 1, i 118),&lt;br /&gt;old log /mysql/logs/slow-queries.log.118 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.117 to /mysql/logs/slow-queries.log.118 (rotatecount 120, logstart 1, i 117),&lt;br /&gt;old log /mysql/logs/slow-queries.log.117 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.116 to /mysql/logs/slow-queries.log.117 (rotatecount 120, logstart 1, i 116),&lt;br /&gt;old log /mysql/logs/slow-queries.log.116 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.115 to /mysql/logs/slow-queries.log.116 (rotatecount 120, logstart 1, i 115),&lt;br /&gt;old log /mysql/logs/slow-queries.log.115 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.114 to /mysql/logs/slow-queries.log.115 (rotatecount 120, logstart 1, i 114),&lt;br /&gt;old log /mysql/logs/slow-queries.log.114 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.113 to /mysql/logs/slow-queries.log.114 (rotatecount 120, logstart 1, i 113),&lt;br /&gt;old log /mysql/logs/slow-queries.log.113 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.112 to /mysql/logs/slow-queries.log.113 (rotatecount 120, logstart 1, i 112),&lt;br /&gt;old log /mysql/logs/slow-queries.log.112 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.111 to /mysql/logs/slow-queries.log.112 (rotatecount 120, logstart 1, i 111),&lt;br /&gt;old log /mysql/logs/slow-queries.log.111 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.110 to /mysql/logs/slow-queries.log.111 (rotatecount 120, logstart 1, i 110),&lt;br /&gt;old log /mysql/logs/slow-queries.log.110 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.109 to /mysql/logs/slow-queries.log.110 (rotatecount 120, logstart 1, i 109),&lt;br /&gt;old log /mysql/logs/slow-queries.log.109 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.108 to /mysql/logs/slow-queries.log.109 (rotatecount 120, logstart 1, i 108),&lt;br /&gt;old log /mysql/logs/slow-queries.log.108 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.107 to /mysql/logs/slow-queries.log.108 (rotatecount 120, logstart 1, i 107),&lt;br /&gt;old log /mysql/logs/slow-queries.log.107 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.106 to /mysql/logs/slow-queries.log.107 (rotatecount 120, logstart 1, i 106),&lt;br /&gt;old log /mysql/logs/slow-queries.log.106 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.105 to /mysql/logs/slow-queries.log.106 (rotatecount 120, logstart 1, i 105),&lt;br /&gt;old log /mysql/logs/slow-queries.log.105 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.104 to /mysql/logs/slow-queries.log.105 (rotatecount 120, logstart 1, i 104),&lt;br /&gt;old log /mysql/logs/slow-queries.log.104 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.103 to /mysql/logs/slow-queries.log.104 (rotatecount 120, logstart 1, i 103),&lt;br /&gt;old log /mysql/logs/slow-queries.log.103 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.102 to /mysql/logs/slow-queries.log.103 (rotatecount 120, logstart 1, i 102),&lt;br /&gt;old log /mysql/logs/slow-queries.log.102 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.101 to /mysql/logs/slow-queries.log.102 (rotatecount 120, logstart 1, i 101),&lt;br /&gt;old log /mysql/logs/slow-queries.log.101 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.100 to /mysql/logs/slow-queries.log.101 (rotatecount 120, logstart 1, i 100),&lt;br /&gt;old log /mysql/logs/slow-queries.log.100 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.99 to /mysql/logs/slow-queries.log.100 (rotatecount 120, logstart 1, i 99),&lt;br /&gt;old log /mysql/logs/slow-queries.log.99 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.98 to /mysql/logs/slow-queries.log.99 (rotatecount 120, logstart 1, i 98),&lt;br /&gt;old log /mysql/logs/slow-queries.log.98 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.97 to /mysql/logs/slow-queries.log.98 (rotatecount 120, logstart 1, i 97),&lt;br /&gt;old log /mysql/logs/slow-queries.log.97 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.96 to /mysql/logs/slow-queries.log.97 (rotatecount 120, logstart 1, i 96),&lt;br /&gt;old log /mysql/logs/slow-queries.log.96 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.95 to /mysql/logs/slow-queries.log.96 (rotatecount 120, logstart 1, i 95),&lt;br /&gt;old log /mysql/logs/slow-queries.log.95 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.94 to /mysql/logs/slow-queries.log.95 (rotatecount 120, logstart 1, i 94),&lt;br /&gt;old log /mysql/logs/slow-queries.log.94 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.93 to /mysql/logs/slow-queries.log.94 (rotatecount 120, logstart 1, i 93),&lt;br /&gt;old log /mysql/logs/slow-queries.log.93 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.92 to /mysql/logs/slow-queries.log.93 (rotatecount 120, logstart 1, i 92),&lt;br /&gt;old log /mysql/logs/slow-queries.log.92 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.91 to /mysql/logs/slow-queries.log.92 (rotatecount 120, logstart 1, i 91),&lt;br /&gt;old log /mysql/logs/slow-queries.log.91 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.90 to /mysql/logs/slow-queries.log.91 (rotatecount 120, logstart 1, i 90),&lt;br /&gt;old log /mysql/logs/slow-queries.log.90 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.89 to /mysql/logs/slow-queries.log.90 (rotatecount 120, logstart 1, i 89),&lt;br /&gt;old log /mysql/logs/slow-queries.log.89 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.88 to /mysql/logs/slow-queries.log.89 (rotatecount 120, logstart 1, i 88),&lt;br /&gt;old log /mysql/logs/slow-queries.log.88 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.87 to /mysql/logs/slow-queries.log.88 (rotatecount 120, logstart 1, i 87),&lt;br /&gt;old log /mysql/logs/slow-queries.log.87 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.86 to /mysql/logs/slow-queries.log.87 (rotatecount 120, logstart 1, i 86),&lt;br /&gt;old log /mysql/logs/slow-queries.log.86 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.85 to /mysql/logs/slow-queries.log.86 (rotatecount 120, logstart 1, i 85),&lt;br /&gt;old log /mysql/logs/slow-queries.log.85 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.84 to /mysql/logs/slow-queries.log.85 (rotatecount 120, logstart 1, i 84),&lt;br /&gt;old log /mysql/logs/slow-queries.log.84 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.83 to /mysql/logs/slow-queries.log.84 (rotatecount 120, logstart 1, i 83),&lt;br /&gt;old log /mysql/logs/slow-queries.log.83 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.82 to /mysql/logs/slow-queries.log.83 (rotatecount 120, logstart 1, i 82),&lt;br /&gt;old log /mysql/logs/slow-queries.log.82 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.81 to /mysql/logs/slow-queries.log.82 (rotatecount 120, logstart 1, i 81),&lt;br /&gt;old log /mysql/logs/slow-queries.log.81 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.80 to /mysql/logs/slow-queries.log.81 (rotatecount 120, logstart 1, i 80),&lt;br /&gt;old log /mysql/logs/slow-queries.log.80 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.79 to /mysql/logs/slow-queries.log.80 (rotatecount 120, logstart 1, i 79),&lt;br /&gt;old log /mysql/logs/slow-queries.log.79 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.78 to /mysql/logs/slow-queries.log.79 (rotatecount 120, logstart 1, i 78),&lt;br /&gt;old log /mysql/logs/slow-queries.log.78 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.77 to /mysql/logs/slow-queries.log.78 (rotatecount 120, logstart 1, i 77),&lt;br /&gt;old log /mysql/logs/slow-queries.log.77 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.76 to /mysql/logs/slow-queries.log.77 (rotatecount 120, logstart 1, i 76),&lt;br /&gt;old log /mysql/logs/slow-queries.log.76 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.75 to /mysql/logs/slow-queries.log.76 (rotatecount 120, logstart 1, i 75),&lt;br /&gt;old log /mysql/logs/slow-queries.log.75 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.74 to /mysql/logs/slow-queries.log.75 (rotatecount 120, logstart 1, i 74),&lt;br /&gt;old log /mysql/logs/slow-queries.log.74 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.73 to /mysql/logs/slow-queries.log.74 (rotatecount 120, logstart 1, i 73),&lt;br /&gt;old log /mysql/logs/slow-queries.log.73 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.72 to /mysql/logs/slow-queries.log.73 (rotatecount 120, logstart 1, i 72),&lt;br /&gt;old log /mysql/logs/slow-queries.log.72 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.71 to /mysql/logs/slow-queries.log.72 (rotatecount 120, logstart 1, i 71),&lt;br /&gt;old log /mysql/logs/slow-queries.log.71 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.70 to /mysql/logs/slow-queries.log.71 (rotatecount 120, logstart 1, i 70),&lt;br /&gt;old log /mysql/logs/slow-queries.log.70 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.69 to /mysql/logs/slow-queries.log.70 (rotatecount 120, logstart 1, i 69),&lt;br /&gt;old log /mysql/logs/slow-queries.log.69 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.68 to /mysql/logs/slow-queries.log.69 (rotatecount 120, logstart 1, i 68),&lt;br /&gt;old log /mysql/logs/slow-queries.log.68 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.67 to /mysql/logs/slow-queries.log.68 (rotatecount 120, logstart 1, i 67),&lt;br /&gt;old log /mysql/logs/slow-queries.log.67 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.66 to /mysql/logs/slow-queries.log.67 (rotatecount 120, logstart 1, i 66),&lt;br /&gt;old log /mysql/logs/slow-queries.log.66 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.65 to /mysql/logs/slow-queries.log.66 (rotatecount 120, logstart 1, i 65),&lt;br /&gt;old log /mysql/logs/slow-queries.log.65 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.64 to /mysql/logs/slow-queries.log.65 (rotatecount 120, logstart 1, i 64),&lt;br /&gt;old log /mysql/logs/slow-queries.log.64 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.63 to /mysql/logs/slow-queries.log.64 (rotatecount 120, logstart 1, i 63),&lt;br /&gt;old log /mysql/logs/slow-queries.log.63 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.62 to /mysql/logs/slow-queries.log.63 (rotatecount 120, logstart 1, i 62),&lt;br /&gt;old log /mysql/logs/slow-queries.log.62 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.61 to /mysql/logs/slow-queries.log.62 (rotatecount 120, logstart 1, i 61),&lt;br /&gt;old log /mysql/logs/slow-queries.log.61 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.60 to /mysql/logs/slow-queries.log.61 (rotatecount 120, logstart 1, i 60),&lt;br /&gt;old log /mysql/logs/slow-queries.log.60 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.59 to /mysql/logs/slow-queries.log.60 (rotatecount 120, logstart 1, i 59),&lt;br /&gt;old log /mysql/logs/slow-queries.log.59 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.58 to /mysql/logs/slow-queries.log.59 (rotatecount 120, logstart 1, i 58),&lt;br /&gt;old log /mysql/logs/slow-queries.log.58 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.57 to /mysql/logs/slow-queries.log.58 (rotatecount 120, logstart 1, i 57),&lt;br /&gt;old log /mysql/logs/slow-queries.log.57 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.56 to /mysql/logs/slow-queries.log.57 (rotatecount 120, logstart 1, i 56),&lt;br /&gt;old log /mysql/logs/slow-queries.log.56 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.55 to /mysql/logs/slow-queries.log.56 (rotatecount 120, logstart 1, i 55),&lt;br /&gt;old log /mysql/logs/slow-queries.log.55 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.54 to /mysql/logs/slow-queries.log.55 (rotatecount 120, logstart 1, i 54),&lt;br /&gt;old log /mysql/logs/slow-queries.log.54 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.53 to /mysql/logs/slow-queries.log.54 (rotatecount 120, logstart 1, i 53),&lt;br /&gt;old log /mysql/logs/slow-queries.log.53 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.52 to /mysql/logs/slow-queries.log.53 (rotatecount 120, logstart 1, i 52),&lt;br /&gt;old log /mysql/logs/slow-queries.log.52 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.51 to /mysql/logs/slow-queries.log.52 (rotatecount 120, logstart 1, i 51),&lt;br /&gt;old log /mysql/logs/slow-queries.log.51 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.50 to /mysql/logs/slow-queries.log.51 (rotatecount 120, logstart 1, i 50),&lt;br /&gt;old log /mysql/logs/slow-queries.log.50 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.49 to /mysql/logs/slow-queries.log.50 (rotatecount 120, logstart 1, i 49),&lt;br /&gt;old log /mysql/logs/slow-queries.log.49 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.48 to /mysql/logs/slow-queries.log.49 (rotatecount 120, logstart 1, i 48),&lt;br /&gt;old log /mysql/logs/slow-queries.log.48 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.47 to /mysql/logs/slow-queries.log.48 (rotatecount 120, logstart 1, i 47),&lt;br /&gt;old log /mysql/logs/slow-queries.log.47 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.46 to /mysql/logs/slow-queries.log.47 (rotatecount 120, logstart 1, i 46),&lt;br /&gt;old log /mysql/logs/slow-queries.log.46 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.45 to /mysql/logs/slow-queries.log.46 (rotatecount 120, logstart 1, i 45),&lt;br /&gt;old log /mysql/logs/slow-queries.log.45 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.44 to /mysql/logs/slow-queries.log.45 (rotatecount 120, logstart 1, i 44),&lt;br /&gt;old log /mysql/logs/slow-queries.log.44 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.43 to /mysql/logs/slow-queries.log.44 (rotatecount 120, logstart 1, i 43),&lt;br /&gt;old log /mysql/logs/slow-queries.log.43 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.42 to /mysql/logs/slow-queries.log.43 (rotatecount 120, logstart 1, i 42),&lt;br /&gt;old log /mysql/logs/slow-queries.log.42 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.41 to /mysql/logs/slow-queries.log.42 (rotatecount 120, logstart 1, i 41),&lt;br /&gt;old log /mysql/logs/slow-queries.log.41 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.40 to /mysql/logs/slow-queries.log.41 (rotatecount 120, logstart 1, i 40),&lt;br /&gt;old log /mysql/logs/slow-queries.log.40 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.39 to /mysql/logs/slow-queries.log.40 (rotatecount 120, logstart 1, i 39),&lt;br /&gt;old log /mysql/logs/slow-queries.log.39 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.38 to /mysql/logs/slow-queries.log.39 (rotatecount 120, logstart 1, i 38),&lt;br /&gt;old log /mysql/logs/slow-queries.log.38 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.37 to /mysql/logs/slow-queries.log.38 (rotatecount 120, logstart 1, i 37),&lt;br /&gt;old log /mysql/logs/slow-queries.log.37 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.36 to /mysql/logs/slow-queries.log.37 (rotatecount 120, logstart 1, i 36),&lt;br /&gt;old log /mysql/logs/slow-queries.log.36 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.35 to /mysql/logs/slow-queries.log.36 (rotatecount 120, logstart 1, i 35),&lt;br /&gt;old log /mysql/logs/slow-queries.log.35 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.34 to /mysql/logs/slow-queries.log.35 (rotatecount 120, logstart 1, i 34),&lt;br /&gt;old log /mysql/logs/slow-queries.log.34 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.33 to /mysql/logs/slow-queries.log.34 (rotatecount 120, logstart 1, i 33),&lt;br /&gt;old log /mysql/logs/slow-queries.log.33 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.32 to /mysql/logs/slow-queries.log.33 (rotatecount 120, logstart 1, i 32),&lt;br /&gt;old log /mysql/logs/slow-queries.log.32 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.31 to /mysql/logs/slow-queries.log.32 (rotatecount 120, logstart 1, i 31),&lt;br /&gt;old log /mysql/logs/slow-queries.log.31 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.30 to /mysql/logs/slow-queries.log.31 (rotatecount 120, logstart 1, i 30),&lt;br /&gt;old log /mysql/logs/slow-queries.log.30 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.29 to /mysql/logs/slow-queries.log.30 (rotatecount 120, logstart 1, i 29),&lt;br /&gt;old log /mysql/logs/slow-queries.log.29 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.28 to /mysql/logs/slow-queries.log.29 (rotatecount 120, logstart 1, i 28),&lt;br /&gt;old log /mysql/logs/slow-queries.log.28 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.27 to /mysql/logs/slow-queries.log.28 (rotatecount 120, logstart 1, i 27),&lt;br /&gt;old log /mysql/logs/slow-queries.log.27 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.26 to /mysql/logs/slow-queries.log.27 (rotatecount 120, logstart 1, i 26),&lt;br /&gt;old log /mysql/logs/slow-queries.log.26 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.25 to /mysql/logs/slow-queries.log.26 (rotatecount 120, logstart 1, i 25),&lt;br /&gt;old log /mysql/logs/slow-queries.log.25 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.24 to /mysql/logs/slow-queries.log.25 (rotatecount 120, logstart 1, i 24),&lt;br /&gt;old log /mysql/logs/slow-queries.log.24 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.23 to /mysql/logs/slow-queries.log.24 (rotatecount 120, logstart 1, i 23),&lt;br /&gt;old log /mysql/logs/slow-queries.log.23 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.22 to /mysql/logs/slow-queries.log.23 (rotatecount 120, logstart 1, i 22),&lt;br /&gt;old log /mysql/logs/slow-queries.log.22 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.21 to /mysql/logs/slow-queries.log.22 (rotatecount 120, logstart 1, i 21),&lt;br /&gt;old log /mysql/logs/slow-queries.log.21 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.20 to /mysql/logs/slow-queries.log.21 (rotatecount 120, logstart 1, i 20),&lt;br /&gt;old log /mysql/logs/slow-queries.log.20 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.19 to /mysql/logs/slow-queries.log.20 (rotatecount 120, logstart 1, i 19),&lt;br /&gt;old log /mysql/logs/slow-queries.log.19 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.18 to /mysql/logs/slow-queries.log.19 (rotatecount 120, logstart 1, i 18),&lt;br /&gt;old log /mysql/logs/slow-queries.log.18 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.17 to /mysql/logs/slow-queries.log.18 (rotatecount 120, logstart 1, i 17),&lt;br /&gt;old log /mysql/logs/slow-queries.log.17 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.16 to /mysql/logs/slow-queries.log.17 (rotatecount 120, logstart 1, i 16),&lt;br /&gt;old log /mysql/logs/slow-queries.log.16 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.15 to /mysql/logs/slow-queries.log.16 (rotatecount 120, logstart 1, i 15),&lt;br /&gt;old log /mysql/logs/slow-queries.log.15 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.14 to /mysql/logs/slow-queries.log.15 (rotatecount 120, logstart 1, i 14),&lt;br /&gt;old log /mysql/logs/slow-queries.log.14 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.13 to /mysql/logs/slow-queries.log.14 (rotatecount 120, logstart 1, i 13),&lt;br /&gt;old log /mysql/logs/slow-queries.log.13 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.12 to /mysql/logs/slow-queries.log.13 (rotatecount 120, logstart 1, i 12),&lt;br /&gt;old log /mysql/logs/slow-queries.log.12 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.11 to /mysql/logs/slow-queries.log.12 (rotatecount 120, logstart 1, i 11),&lt;br /&gt;old log /mysql/logs/slow-queries.log.11 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.10 to /mysql/logs/slow-queries.log.11 (rotatecount 120, logstart 1, i 10),&lt;br /&gt;old log /mysql/logs/slow-queries.log.10 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.9 to /mysql/logs/slow-queries.log.10 (rotatecount 120, logstart 1, i 9),&lt;br /&gt;old log /mysql/logs/slow-queries.log.9 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.8 to /mysql/logs/slow-queries.log.9 (rotatecount 120, logstart 1, i 8),&lt;br /&gt;old log /mysql/logs/slow-queries.log.8 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.7 to /mysql/logs/slow-queries.log.8 (rotatecount 120, logstart 1, i 7),&lt;br /&gt;old log /mysql/logs/slow-queries.log.7 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.6 to /mysql/logs/slow-queries.log.7 (rotatecount 120, logstart 1, i 6),&lt;br /&gt;old log /mysql/logs/slow-queries.log.6 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.5 to /mysql/logs/slow-queries.log.6 (rotatecount 120, logstart 1, i 5),&lt;br /&gt;old log /mysql/logs/slow-queries.log.5 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.4 to /mysql/logs/slow-queries.log.5 (rotatecount 120, logstart 1, i 4),&lt;br /&gt;old log /mysql/logs/slow-queries.log.4 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.3 to /mysql/logs/slow-queries.log.4 (rotatecount 120, logstart 1, i 3),&lt;br /&gt;old log /mysql/logs/slow-queries.log.3 does not exist&lt;br /&gt;renaming /mysql/logs/slow-queries.log.2 to /mysql/logs/slow-queries.log.3 (rotatecount 120, logstart 1, i 2),&lt;br /&gt;renaming /mysql/logs/slow-queries.log.1 to /mysql/logs/slow-queries.log.2 (rotatecount 120, logstart 1, i 1),&lt;br /&gt;renaming /mysql/logs/slow-queries.log.0 to /mysql/logs/slow-queries.log.1 (rotatecount 120, logstart 1, i 0),&lt;br /&gt;old log /mysql/logs/slow-queries.log.0 does not exist&lt;br /&gt;log /mysql/logs/slow-queries.log.121 doesn't exist -- won't try to dispose of it&lt;br /&gt;renaming /mysql/logs/error.log to /mysql/logs/error.log.1&lt;br /&gt;creating new log mode = 0660 uid = 27 gid = 27&lt;br /&gt;renaming /mysql/logs/general.log to /mysql/logs/general.log.1&lt;br /&gt;creating new log mode = 0660 uid = 27 gid = 27&lt;br /&gt;renaming /mysql/logs/slow-queries.log to /mysql/logs/slow-queries.log.1&lt;br /&gt;creating new log mode = 0660 uid = 27 gid = 27&lt;br /&gt;running postrotate script&lt;br /&gt;[root@db01 /mysql/logs]# ll&lt;br /&gt;total 1675440&lt;br /&gt;-rw-rw---- 1 mysql mysql          0 Aug 11  2009 error.log&lt;br /&gt;-rw-rw---- 1 mysql mysql        472 Aug 11  2009 error.log.1&lt;br /&gt;-rw-rw---- 1 mysql mysql        472 Aug 11 15:03 error.log.2&lt;br /&gt;-rw-rw---- 1 mysql mysql        472 Aug 11 14:57 error.log.3&lt;br /&gt;-rw-rw---- 1 mysql mysql          0 Aug 11  2009 error.log-old&lt;br /&gt;-rw-rw---- 1 mysql mysql        213 Aug 11  2009 general.log&lt;br /&gt;-rw-rw---- 1 mysql mysql        827 Aug 11  2009 general.log.1&lt;br /&gt;-rw-rw---- 1 mysql mysql       1082 Aug 11 15:03 general.log.2&lt;br /&gt;-rw-rw---- 1 mysql mysql      37115 Aug 11 15:01 general.log.3&lt;br /&gt;-rw-rw---- 1 mysql mysql 1693930999 Aug 11 11:06 general.log.4&lt;br /&gt;-rw-rw---- 1 mysql mysql        177 Aug 11  2009 slow-queries.log&lt;br /&gt;-rw-rw---- 1 mysql mysql        354 Aug 11  2009 slow-queries.log.1&lt;br /&gt;-rw-rw---- 1 mysql mysql        354 Aug 11 15:03 slow-queries.log.2&lt;br /&gt;-rw-rw---- 1 mysql mysql   18263218 Aug 11 14:57 slow-queries.log.3&lt;br /&gt;[root@db01 /mysql/logs]#&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;外部链接:&lt;br /&gt;&lt;a href="http://themattreid.com/wordpress/?p=34"&gt;Rotating General Query &amp;amp; Slow Logs&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mysqlperformanceblog.com/2007/12/09/be-careful-rotating-mysql-logs/"&gt;Be careful rotating MySQL logs&lt;/a&gt;&lt;br /&gt;&lt;a href="http://books.google.com/books?id=S25PEH4c4nEC&amp;pg=PA522"&gt;Rotating logs - MySQL Administrator's Bible By Sheeri K. Cabral, Keith Murphy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/log-file-maintenance.html"&gt;5.2.6. Server Log Maintenance&lt;/a&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/query-log.html"&gt;5.2.3. The General Query Log&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kevinminnick.blogspot.com/2006/11/truncating-mysql-log-files.html"&gt;Truncating MySQL Log Files&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cherry.world.edoors.com/CzsenOiBnF-0"&gt;How to logrotate mysq slow log files?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mail-archive.com/rhelv5-list@redhat.com/msg00787.html"&gt;[rhelv5-list] where is mysql-log-rotate in RH EL 4/5 ?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;参考MySQL某发行版本的配置文件&lt;br /&gt;&lt;pre&gt;# This logname can be set in /etc/my.cnf&lt;br /&gt;# by setting the variable &amp;quot;err-log&amp;quot;&lt;br /&gt;# in the [safe_mysqld] section as follows:&lt;br /&gt;#&lt;br /&gt;# [safe_mysqld]&lt;br /&gt;# err-log=/var/lib/mysql/mysqld.log&lt;br /&gt;#&lt;br /&gt;# If the root user has a password you have to create a&lt;br /&gt;# /root/.my.cnf configuration file with the following&lt;br /&gt;# content:&lt;br /&gt;#&lt;br /&gt;# [mysqladmin]&lt;br /&gt;# password = &amp;lt;secret&amp;gt;&lt;br /&gt;# user= root&lt;br /&gt;#&lt;br /&gt;# where &amp;quot;&amp;lt;secret&amp;gt;&amp;quot; is the password.&lt;br /&gt;#&lt;br /&gt;# ATTENTION: This /root/.my.cnf should be readable ONLY&lt;br /&gt;# for root !&lt;br /&gt;&lt;br /&gt;/var/lib/mysql/mysqld.log {&lt;br /&gt;        # create 600 mysql mysql&lt;br /&gt;        notifempty&lt;br /&gt;        daily&lt;br /&gt;        rotate 3&lt;br /&gt;        missingok&lt;br /&gt;        compress&lt;br /&gt;    postrotate&lt;br /&gt;        # just if mysqld is really running&lt;br /&gt;        if test -x /usr/bin/mysqladmin &amp;amp;&amp;amp; \&lt;br /&gt;           /usr/bin/mysqladmin ping &amp;amp;&amp;gt;/dev/null&lt;br /&gt;        then&lt;br /&gt;           /usr/bin/mysqladmin flush-logs&lt;br /&gt;        fi&lt;br /&gt;    endscript&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-7868672331505676448?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/7868672331505676448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=7868672331505676448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/7868672331505676448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/7868672331505676448'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/08/rotating-mysql-log-files.html' title='Rotating MySQL log files'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-5499198922848248128</id><published>2009-07-28T07:55:00.003+08:00</published><updated>2009-07-28T07:59:49.075+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>less than stellar</title><content type='html'>less than stellar&lt;br /&gt;&lt;br /&gt;less-than-stellar&lt;br /&gt;不尽如人意的,二流的&lt;br /&gt;&lt;br /&gt;解释:&lt;br /&gt;&lt;a href="http://everything2.com/title/less%2520than%2520stellar"&gt;less-than-stellar&lt;/a&gt;&lt;br /&gt;An english term meaning that something doesn't meet the expectations set in it or is less good than a similar thing coming before or after it. It is commonly used in the media and sometimes written like this: less-than-stellar.&lt;br /&gt;&lt;br /&gt;Usage:&lt;br /&gt;Those sales figures are less than stellar.&lt;br /&gt;Godzilla 2000 was a less-than-stellar movie, and Dean Devlin's acting was less than stellar too.&lt;br /&gt;&lt;br /&gt;Example from knifegirl's w/u on Falco:&lt;br /&gt;Falco's third album, Falco 3, contained the single Rock Me Amadeus, which reached the top of those charts that measure such things in the U.S., Germany, Austria, and England. ... A few less-than-stellar albums followed,...&lt;br /&gt;&lt;br /&gt;Similar terms:&lt;br /&gt;substandard; dissatisfactory, half assed&lt;br /&gt;&lt;br /&gt;例句:&lt;br /&gt;&lt;a href="http://www.nytimes.com/2009/07/23/sports/basketball/23basketball.html"&gt;In China, a Rocky Ascent for Basketball &lt;/a&gt;&lt;br /&gt;Bonzi Wells, a &lt;b&gt;less than stellar&lt;/b&gt; player in the N.B.A., frequently scored more than 40 points a game in the Chinese Basketball Association.&lt;br /&gt;&lt;br /&gt;TV ratings soared, and foreign players found starring roles -- the top 15 scorers were non-Chinese, and players like Bonzi Wells and Dontae' Jones -- who had &lt;b&gt;less than stellar&lt;/b&gt; N.B.A. careers -- frequently scored more than 40 points a game.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cnn.com/2009/SHOWBIZ/TV/07/27/kandi.real.housewives/"&gt;'Real Housewives of Atlanta' adds new face&lt;/a&gt;&lt;br /&gt;Last season, fans of the show -- and some of the other housewives -- slammed Zolciak for her &lt;b&gt;less-than-stellar&lt;/b&gt; voice.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;-fin-&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8883038670969461735-5499198922848248128?l=mrxiesdatabase.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mrxiesdatabase.blogspot.com/feeds/5499198922848248128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8883038670969461735&amp;postID=5499198922848248128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/5499198922848248128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8883038670969461735/posts/default/5499198922848248128'/><link rel='alternate' type='text/html' href='http://mrxiesdatabase.blogspot.com/2009/07/less-than-stellar.html' title='less than stellar'/><author><name>wen xie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8883038670969461735.post-6003561570883706143</id><published>2009-07-24T16:10:00.000+08:00</published><updated>2009-07-24T16:10:16.540+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='em'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>agent status shows negative available disk space</title><content type='html'>EM agent status shows negative available disk space&lt;br /&gt;企业管理器代理状态显示可用磁盘空间为负数&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;问题:&lt;br /&gt;&lt;pre class="console"&gt;Available disk space on upload filesystem    :    -7.17%&lt;br /&gt;Collection Status                            : Disabled by Upload Manager&lt;br /&gt;emctl status agent&lt;br /&gt;&lt;/pre&gt;出现上面的问题&lt;br /&gt;但是df -h&lt;br /&gt;才不到60%&lt;br /&gt;10T，才用了6T&lt;br /&gt;&lt;br /&gt;我都清了&lt;br /&gt;也不成&lt;br /&gt;&lt;br /&gt;&lt;pre class="console"&gt;Thread-35183520 ERROR upload: Exceeded max. amount of upload data: 2 files, 0.006033 MB Data. 104.26% of disk used. Disabling collections.&lt;br /&gt;2009-07-21 20:13:42 Thread-35183520 WARN  collector: Disable collector&lt;br /&gt;2009-07-21 20:13:42 Thread-35183520 ERROR collector: Collector state files cleaned, severity will be resent&lt;br /&gt;2009-07-21 20:13:42 Thread-35183520 ERROR upload: Disabling Logging and Tracing: 1&lt;br /&gt;&lt;/pre&gt;这个就是错误&lt;br /&gt;&lt;br /&gt;系统 是32位的&lt;br /&gt;而patch只有64位的&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;回答:&lt;br /&gt;&lt;br /&gt;你现在的文件大小超过设定的阈值了&lt;br /&gt;所以显示为负的? &lt;br /&gt;或者是你的硬盘太大了, 计算溢出了, 也是有可能的 &lt;br /&gt;&lt;br /&gt;先排除了如下问题&lt;br /&gt;&lt;a href="https://metalink.oracle.com/metalink/plsql/showdoc?db=NOT&amp;id=396238.1"&gt;Problem: 'emctl status agent' Command Shows Collection Status Disabled By Upload Manager&lt;/a&gt;&lt;br /&gt;upload目录文件大小超过了设定的阈值&lt;br /&gt;&lt;br /&gt;后怀疑是硬盘太大导致, 果然发现是个BUG, &lt;a href="https://metalink.oracle.com/metalink/plsql/showdoc?db=Bug&amp;id=6318004"&gt;AVAILABLE DISK SPACE ON UPLOAD FILESY
