<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/TaobaoDBA" type="application/rss+xml" ref="self"></atom:link><fs:self_link href="http://feed.feedsky.com/TaobaoDBA" type="application/rss+xml"></fs:self_link><lastBuildDate>Tue, 22 Jul 2008 06:51:44 GMT</lastBuildDate><title>DBA@Taobao</title><description>Taobao DBA Team</description><image><url>http://www.feedsky.com/feed/TaobaoDBA/sc/gif</url><title>DBA@Taobao</title><link>http://rdc.taobao.com/blog/dba</link></image><link>http://rdc.taobao.com/blog/dba</link><language>en</language><pubDate>Tue, 22 Jul 2008 06:51:44 GMT</pubDate><dc:date>2008-07-22T06:51:44Z</dc:date><dc:language>en</dc:language><item><title>Linux下如何迁移VG及文件系统</title><link>http://item.feedsky.com/~feedsky/TaobaoDBA/~6677730/96596949/4541478/1/item.html</link><content:encoded>&lt;p&gt;在LINUX下，如果需要将一台主机上的文件系统迁移至另外一台主机上，并且文件系统是基于LVM创建的，那么可以使用VG导入导出功能将VG和LV在不同主机上迁移。&lt;/p&gt;
&lt;p&gt;源主机上操作：&lt;/p&gt;
&lt;p&gt;首先在源主机上将文件系统umount：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;umount /u05&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;再将LV和VG inactive：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;lvchange -an /dev/vg_u05/lv_u05&lt;br /&gt;
vgchange -an vg_u05&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;最后导出VG：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;vgexport vg_u05&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;目标主机上操作：&lt;/p&gt;
&lt;p&gt;导入VG：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;vgimport vg_u05&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;激活VG，MOUNT 文件系统：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;vgchange -ay vg_u05&lt;br /&gt;
mkdir /u05&lt;br /&gt;
mount /dev/vg_u05/lv_u05 /u05&lt;/p&gt;&lt;/blockquote&gt;</content:encoded><wfw:commentRss>http://rdc.taobao.com/blog/dba/html/195_linux-export-import-v.html/feed</wfw:commentRss><description>在LINUX下，如果需要将一台主机上的文件系统迁移至另外一台主机上，并且文件系统是基于LVM创建的，那么可以使用VG导入导出功能将VG和LV在不同主机上迁移。
源主机上操作：
首先在源主机上...</description><category>linux</category><category>主机存储</category><category>vgexport</category><category>vgimport</category><pubDate>Tue, 22 Jul 2008 14:51:44 +0800</pubDate><author>流云</author><comments>http://rdc.taobao.com/blog/dba/html/195_linux-export-import-v.html#comments</comments><guid isPermaLink="false">http://rdc.taobao.com/blog/dba/?p=195</guid><dc:creator>流云</dc:creator><fs:srclink>http://rdc.taobao.com/blog/dba/html/195_linux-export-import-v.html</fs:srclink><fs:srcfeed>http://www.taobaodba.com/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/TaobaoDBA/~6677730/96596949/4541478</fs:itemid></item><item><title>Oracle 9i和10g在create index和rebuild index的统计信息的区别</title><link>http://item.feedsky.com/~feedsky/TaobaoDBA/~6677730/96596950/4541478/1/item.html</link><content:encoded>&lt;p&gt;在9.2.0.6和10.2.0.4做了个小小的试验，演示9i和10g对于create index和rebuild index时统计信息的区别。这里列出试验的过程，由于结果比较明显，就懒得写太多文字做说明了。其中&lt;strong&gt;tbsql&lt;/strong&gt;是一个常用脚本的集成环境，tbsql tabstat用户输出一个表以及列和索引的信息，其实就是关联dba_tables/dba_indexes/dba_tab_columns的一个查询。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;先来看9.2.0.6的情况：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
SQL&gt; create table t as select * from all_objects;
Table created.

SQL&gt; create index t_id on t(object_id);
Index created.
&lt;/pre&gt;
&lt;pre&gt;
$tbsql tabstat t
           Table    Number           Empty  Average    Chain  Average
OWNER      Name    of Rows  Blocks  Blocks    Space    Count  Row Len
---------- ------ -------- ------- ------- -------- -------- --------
SYS        T

Column             Column                   Distinct
Name               Details                    Values Density
------------------ ------------------------ -------- -------
OWNER              VARCHAR2(30) NOT NULL
OBJECT_NAME        VARCHAR2(30) NOT NULL
SUBOBJECT_NAME     VARCHAR2(30)
OBJECT_ID          NUMBER(22) NOT NULL
DATA_OBJECT_ID     NUMBER(22)
OBJECT_TYPE        VARCHAR2(18)
CREATED            DATE NOT NULL
LAST_DDL_TIME      DATE NOT NULL
TIMESTAMP          VARCHAR2(19)
STATUS             VARCHAR2(7)
TEMPORARY          VARCHAR2(1)
GENERATED          VARCHAR2(1)
SECONDARY          VARCHAR2(1)

13 rows selected.

                        B                          Average     Average
Index                Tree  Leaf       Distinct Leaf Blocks Data Blocks Cluster
Name      Unique    Level  Blks           Keys     Per Key     Per Key  Factor
--------- --------- ----- ----- -------------- ----------- ----------- -------
T_ID      NONUNIQUE                                                    

Index     Column           Col Column
Name      Name             Pos Details
--------- --------------- ---- ------------------------
T_ID      OBJECT_ID                 1 NUMBER(22) NOT NULL
&lt;/pre&gt;
&lt;p&gt;可以看到到表，列和索引都没有统计信息。&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-192&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;
SQL&gt; alter index t_id rebuild online compute statistics;
Index altered.
&lt;/pre&gt;
&lt;pre&gt;
$tbsql tabstat t

        Table    Number           Empty  Average    Chain  Average
OWNER   Name    of Rows  Blocks  Blocks    Space    Count  Row Len
------- ------ -------- ------- ------- -------- -------- --------
SYS     T        25,420     348       0        0        0      100

Column            Column                    Distinct
Name              Details                     Values Density
----------------- ------------------------ --------- -------
OWNER             VARCHAR2(30) NOT NULL
OBJECT_NAME       VARCHAR2(30) NOT NULL
SUBOBJECT_NAME    VARCHAR2(30)
OBJECT_ID         NUMBER(22) NOT NULL         25,420       0
DATA_OBJECT_ID    NUMBER(22)
OBJECT_TYPE       VARCHAR2(18)
CREATED           DATE NOT NULL
LAST_DDL_TIME     DATE NOT NULL
TIMESTAMP         VARCHAR2(19)
STATUS            VARCHAR2(7)
TEMPORARY         VARCHAR2(1)
GENERATED         VARCHAR2(1)
SECONDARY         VARCHAR2(1)

13 rows selected.

                       B                     Average     Average
Index               Tree  Leaf  Distinct Leaf Blocks Data Blocks Cluster
Name     Unique    Level  Blks      Keys     Per Key     Per Key  Factor
-------- --------- ----- ----- --------- ----------- ----------- -------
T_ID     NONUNIQUE     1    56    25,420           1           1  22,731

Index   Column      Col Column
Name    Name        Pos Details
------- ---------- ---- ------------------------
T_ID    OBJECT_ID     1 NUMBER(22) NOT NULL
&lt;/pre&gt;
&lt;p&gt;注意到表，object_id列和索引都有统计信息了&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;再来看10.2.0.4的情况&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
SQL&gt; create table t as select * from all_objects;
Table created.

SQL&gt; create index t_id on t(object_id);
Index created.
&lt;/pre&gt;
&lt;pre&gt;
$tbsql tabstat t
           Table     Number           Empty  Average  Chain  Average
OWNER      Name     of Rows  Blocks  Blocks    Space  Count  Row Len
---------- ------- -------- ------- ------- -------- ------ --------
SYS        T

Column           Column                   Distinct
Name             Details                    Values Density
---------------- ----------------------- --------- -------
OWNER            VARCHAR2(30) NOT NULL
OBJECT_NAME      VARCHAR2(30) NOT NULL
SUBOBJECT_NAME   VARCHAR2(30)
OBJECT_ID        NUMBER(22) NOT NULL
DATA_OBJECT_ID   NUMBER(22)
OBJECT_TYPE      VARCHAR2(19)
CREATED          DATE NOT NULL
LAST_DDL_TIME    DATE NOT NULL
TIMESTAMP        VARCHAR2(19)
STATUS           VARCHAR2(7)
TEMPORARY        VARCHAR2(1)
GENERATED        VARCHAR2(1)
SECONDARY        VARCHAR2(1)

13 rows selected.

                      B                      Average     Average
Index              Tree   Leaf  Distinct Leaf Blocks Data Blocks  Cluster
Name    Unique    Level   Blks      Keys     Per Key     Per Key   Factor
------- --------- ----- ------ --------- ----------- ----------- --------
T_ID    NONUNIQUE     1     21     9,610           1           1      134

Index     Column        Col Column
Name      Name          Pos Details
--------- ------------ ---- ------------------------
T_ID      OBJECT_ID       1 NUMBER(22) NOT NULL
&lt;/pre&gt;
&lt;p&gt;注意到表和列都没有统计信息，而索引有统计信息&lt;/p&gt;
&lt;pre&gt;
SQL&gt; alter index t_id rebuild online compute statistics;
Index altered.
&lt;/pre&gt;
&lt;pre&gt;
$tbsql tabstat t
        Table     Number           Empty  Average   Chain  Average
OWNER   Name     of Rows  Blocks  Blocks    Space   Count  Row Len
------- ------- -------- ------- ------- -------- ------- --------
SYS     T

Column            Column                       Distinct
Name              Details                        Values Density
----------------- ------------------------ ------------ -------
OWNER             VARCHAR2(30) NOT NULL
OBJECT_NAME       VARCHAR2(30) NOT NULL
SUBOBJECT_NAME    VARCHAR2(30)
OBJECT_ID         NUMBER(22) NOT NULL
DATA_OBJECT_ID    NUMBER(22)
OBJECT_TYPE       VARCHAR2(19)
CREATED           DATE NOT NULL
LAST_DDL_TIME     DATE NOT NULL
TIMESTAMP         VARCHAR2(19)
STATUS            VARCHAR2(7)
TEMPORARY         VARCHAR2(1)
GENERATED         VARCHAR2(1)
SECONDARY         VARCHAR2(1)

13 rows selected.

                       B                       Average     Average
Index               Tree   Leaf   Distinct Leaf Blocks Data Blocks  Cluster
Name     Unique    Level   Blks       Keys     Per Key     Per Key   Factor
-------- --------- ----- ------ ---------- ----------- ----------- --------
T_ID     NONUNIQUE     1     21      9,610           1           1      134

Index      Column         Col Column
Name       Name           Pos Details
---------- ------------- ---- ------------------------
T_ID       OBJECT_ID        1 NUMBER(22) NOT NULL
&lt;/pre&gt;
&lt;p&gt;注意到表和列还是没有统计信息，索引有统计信息。&lt;/p&gt;
&lt;p&gt;应该说，10g的处理方式要更加合理一些。我只是alert index rebuild online compute statistics，9i却同时收集了表，列和索引的统计信息，这有点属于自做主张，而10g则正确的按照语法，只计算了索引的统计信息。有个时候，收集列的统计信息，可能导致执行计划选择错误，尤其是这个列是递增列的时候，一定要注意到9i和10g的这个差异。&lt;/p&gt;</content:encoded><wfw:commentRss>http://rdc.taobao.com/blog/dba/html/192_differencts_for_statistics_create_or_rebuild_index_9i_10g.html/feed</wfw:commentRss><description>在9.2.0.6和10.2.0.4做了个小小的试验，演示9i和10g对于create index和rebuild index时统计信息的区别。这里列出试验的过程，由于结果比较明显，就懒得写太多文字做说明了。其中tbsql是一个常用脚本的...</description><category>create index</category><category>oracle</category><category>alert index</category><category>数据库</category><category>index</category><pubDate>Tue, 22 Jul 2008 14:29:46 +0800</pubDate><author>江枫</author><comments>http://rdc.taobao.com/blog/dba/html/192_differencts_for_statistics_create_or_rebuild_index_9i_10g.html#comments</comments><guid isPermaLink="false">http://rdc.taobao.com/blog/dba/?p=192</guid><dc:creator>江枫</dc:creator><fs:srclink>http://rdc.taobao.com/blog/dba/html/192_differencts_for_statistics_create_or_rebuild_index_9i_10g.html</fs:srclink><fs:srcfeed>http://www.taobaodba.com/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/TaobaoDBA/~6677730/96596950/4541478</fs:itemid></item><item><title>如何转换RAC中RDS和UDP互联</title><link>http://item.feedsky.com/~feedsky/TaobaoDBA/~6677730/96596951/4541478/1/item.html</link><content:encoded>&lt;p&gt;配置基于Infiniband RDS内部互联方案的RAC时，需要重新build Oracle library。在操作之前需要先把整个RAC中的ASM实例和数据库实例都停止掉，然后进行BUILD：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;$ cd $ORACLE_HOME/rdbms/lib&lt;br /&gt;
$ make -f ins_rdbms.mk ipc_rds ioracle&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而将RDS切换回普通的UDP协议时，则比较简单：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;$ cd $ORACLE_HOME/rdbms/lib&lt;br /&gt;
$ make -f ins_rdbms.mk ipc_g ioracle&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><wfw:commentRss>http://rdc.taobao.com/blog/dba/html/194_change_rac_rds_ud.html/feed</wfw:commentRss><description>配置基于Infiniband RDS内部互联方案的RAC时，需要重新build Oracle library。在操作之前需要先把整个RAC中的ASM实例和数据库实例都停止掉，然后进行BUILD：
$ cd $ORACLE_HOME/rdbms/lib
$ make -f ins_rdbms.mk ipc_rds...</description><category>interconnect</category><category>udp</category><category>RDS</category><category>rac</category><category>数据库</category><pubDate>Fri, 18 Jul 2008 14:44:36 +0800</pubDate><author>流云</author><comments>http://rdc.taobao.com/blog/dba/html/194_change_rac_rds_ud.html#comments</comments><guid isPermaLink="false">http://rdc.taobao.com/blog/dba/?p=194</guid><dc:creator>流云</dc:creator><fs:srclink>http://rdc.taobao.com/blog/dba/html/194_change_rac_rds_ud.html</fs:srclink><fs:srcfeed>http://www.taobaodba.com/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/TaobaoDBA/~6677730/96596951/4541478</fs:itemid></item><item><title>Solaris安装RAC运行root.sh失败解决一例</title><link>http://item.feedsky.com/~feedsky/TaobaoDBA/~6677730/96596952/4541478/1/item.html</link><content:encoded>&lt;p&gt;前段时间一个朋友在安装Solaris上的RAC时，安装clusterware最后一步运行root.sh总是无法成功，报如下的错：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;# ./root.sh WARNING: directory &amp;#8216;/oracle/product/10.2&amp;#8242; is not owned by root&lt;br /&gt;
WARNING: directory &amp;#8216;/oracle/product&amp;#8217; is not owned by root&lt;br /&gt;
WARNING: directory &amp;#8216;/oracle&amp;#8217; is not owned by root&lt;br /&gt;
 Checking to see if Oracle CRS stack is already configured&lt;br /&gt;
Setting the permissions on OCR backup directory&lt;br /&gt;
Setting up NS directories&lt;br /&gt;
Failed to upgrade Oracle Cluster Registry configuration r&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span id=&quot;more-193&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;看了一下crs的alert日志：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;2008-07-01 23:51:53.642 [client(2216)]CRS-1006:The OCR location /oracle/OCR_A is inaccessible. Details i n /oracle/product/10.2/cluster/log/db1/client/ocrconfig_2216.log. 2008-07-01 23:51:53.807 [client(2216)]CRS-1001:The OCR was formatted using version 2. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;细看/oracle/product/10.2/cluster/log/db1/client/ocrconfig_2216.log：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Oracle Database 10g CRS Release 10.2.0.1.0 Production Copyright 1996, 2005 Oracl e. All rights reserved. 2008-07-01 23:51:53.612: [ OCRCONF][1]ocrconfig starts&amp;#8230; 2008-07-01 23:51:53.612: [ OCRCONF][1]Upgrading OCR data 2008-07-01 23:51:53.630: [ OCRRAW][1]propriogid:1: INVALID FORMAT 2008-07-01 23:51:53.631: [ OCRRAW][1]ibctx:1:ERROR: INVALID FORMAT 2008-07-01 23:51:53.631: [ OCRRAW][1]propri&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;发现在格式化OCR的盘时出错。第一个反应是祼设备权限的问题，折腾几次后发现这个并不存在问题。最终定位到问题是由于ocr和voting disk对应的祼设备用了cylinder 0，而Solaris上祼设备的cylinder 0是要预留给系统使用的，因此才会导致格式化OCR失败。解决办法便是重建OCR和VOTING DISK对应的祼设备，跳过CYLINDER 0。&lt;/p&gt;</content:encoded><wfw:commentRss>http://rdc.taobao.com/blog/dba/html/193_solaris_rac_install_issu.html/feed</wfw:commentRss><description>前段时间一个朋友在安装Solaris上的RAC时，安装clusterware最后一步运行root.sh总是无法成功，报如下的错：
# ./root.sh WARNING: directory &amp;#8216;/oracle/product/10.2&amp;#8242; is not owned by root
WARNING: directory &amp;#8216;/ora...</description><category>solaris</category><category>rac</category><category>数据库</category><category>root.sh</category><pubDate>Thu, 17 Jul 2008 14:42:45 +0800</pubDate><author>流云</author><comments>http://rdc.taobao.com/blog/dba/html/193_solaris_rac_install_issu.html#comments</comments><guid isPermaLink="false">http://rdc.taobao.com/blog/dba/?p=193</guid><dc:creator>流云</dc:creator><fs:srclink>http://rdc.taobao.com/blog/dba/html/193_solaris_rac_install_issu.html</fs:srclink><fs:srcfeed>http://www.taobaodba.com/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/TaobaoDBA/~6677730/96596952/4541478</fs:itemid></item><item><title>RAC中如何更改对外网卡和内部互联网卡的配置、IP及VIP</title><link>http://item.feedsky.com/~feedsky/TaobaoDBA/~6677730/96551825/4541478/1/item.html</link><content:encoded>&lt;p&gt;在RAC环境中，有时候由于需要会更改网卡或IP地址，这边简单记录一下操作步骤（参考metalink文档：283684.1）。&lt;span id=&quot;more-191&quot;&gt;&lt;/span&gt;&lt;br /&gt;
1、查看当前PUBLIC网卡和PRIVATE网卡的配置：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;test1:/home/oracle&gt;$oifcfg getif&lt;br /&gt;
eth1  10.0.100.0  global  cluster_interconnect&lt;br /&gt;
eth0  172.19.20.0  global  public&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2、更改PUBLIC网卡或者IP：&lt;br /&gt;
比如我们需要将PUBLIC网卡从eth0改为bond0，IP地址由172.19.20.0 改为172.13.20.0 。那么首先必须用oifcfg delif 命令删除原先的PUBLIC网卡设置，然后再用oifcfg setif 命令更改网卡及IP配置，这步只要在任意一个节点执行就可以了。（注意：在更改PUBLIC或者PRIVATE网卡及IP之前都需要将RAC中的资源停止，可以使用crs_stop -all来停止）&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;test1:/home/oracle&gt;$oifcfg delif -global eth0&lt;br /&gt;
test1:/home/oracle&gt;$oifcfg setif -global bond0/172.13.20.0:public &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;再查看可以看到PUBLIC网卡及IP都更改过来了：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;test1:/home/oracle&gt;$oifcfg getif&lt;br /&gt;
eth1     10.0.100.0  global  cluster_interconnect&lt;br /&gt;
bond0  172.13.20.0  global  public&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;3、更改PRIVATE网卡或者IP：&lt;br /&gt;
这一步和更改PUBLIC网卡大同小异，比如说我们需要将PRIVATE网卡从eth1改为ib1：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;test1:/home/oracle&gt;$oifcfg delif -global eth1&lt;br /&gt;
test1:/home/oracle&gt;$oifcfg setif -global ib1/10.1.0.0:cluster_interconnect &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;4、更改VIP配置：&lt;br /&gt;
更改PUBLIC网卡后，那么RAC各个节点的VIP必须重新配置，以便CRS知道VIP对应PUBLIC网卡名称的变更（注意：更改VIP的配置必须以root用户来更改）：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;test1:/home/oracle&gt;$srvctl modify nodeapps -n test1 -A 172.13.20.1/255.255.255.0/bond0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这样执行完以后，整个更改便完成了。&lt;/p&gt;</content:encoded><wfw:commentRss>http://rdc.taobao.com/blog/dba/html/191_rac_network_chang.html/feed</wfw:commentRss><description>在RAC环境中，有时候由于需要会更改网卡或IP地址，这边简单记录一下操作步骤（参考metalink文档：283684.1）。
1、查看当前PUBLIC网卡和PRIVATE网卡的配置：
test1:/home/oracle&gt;$oifcfg getif
eth1  10.0.100.0  g...</description><category>vip</category><category>interconnect</category><category>public</category><category>private</category><category>rac</category><category>change</category><category>数据库</category><pubDate>Wed, 16 Jul 2008 11:41:00 +0800</pubDate><author>流云</author><comments>http://rdc.taobao.com/blog/dba/html/191_rac_network_chang.html#comments</comments><guid isPermaLink="false">http://rdc.taobao.com/blog/dba/?p=191</guid><dc:creator>流云</dc:creator><fs:srclink>http://rdc.taobao.com/blog/dba/html/191_rac_network_chang.html</fs:srclink><fs:srcfeed>http://www.taobaodba.com/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/TaobaoDBA/~6677730/96551825/4541478</fs:itemid></item><item><title>从业务上优化系统</title><link>http://item.feedsky.com/~feedsky/TaobaoDBA/~6677730/96551826/4541478/1/item.html</link><content:encoded>&lt;p&gt;某些时候，如果从语句的本身上来说，已经很难优化了。如我们电子客票系统中有一个查询语句就是如此。我不便写出语句，但是我可以还原场景给大家看看。&lt;br /&gt;
我们的&lt;a href=&quot;http://jipiao.taobao.com/index.htm&quot;&gt;电子客票系统&lt;/a&gt;中，在首页有个特价机票展示区域，如下所示：&lt;br /&gt;
&lt;span id=&quot;more-187&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;img src='http://rdc.taobao.com/blog/dba/wp-content/dbauploads/2008/07/1.jpg' alt='特价机票首页表示区' class='aligncenter' /&gt;&lt;br /&gt;
当我们点击“更多单程特价票”/“更多往返特价票”的时候，会转到如下的结果list分页页面：&lt;br /&gt;
&lt;img src='http://rdc.taobao.com/blog/dba/wp-content/dbauploads/2008/07/2.jpg' alt='所有特价机票结果显示分页页面首页' class='alignnone' /&gt;&lt;br /&gt;
这个里面就显示了所有的单程特价票或者是往返特价票，默认根据特价票最近被修改时间来排序。&lt;br /&gt;
我们现在来分析一下这个业务的合理性，或者说这种展示方式存在的必要性。&lt;br /&gt;
用户从首页的特价展示区中点击更多进入此list页面，看到的是所有的特价机票，通常来说，这对用户是没有必要的。因为，一般来说用户不会去关心整个中国的所有的特价机票，他们一般只会关心自己所在的城市的特价机票，或者是自己要去的某个城市的特价机票。比方说我人在杭州，要去北京，我想要看的肯定是从杭州出发的特价机票，最好是直接能看到从杭州出发到北京的特价机票，或者是想看从北京出发到杭州的特价机票，因为我要回来。我根本不会去关心从合肥到香港的特价机票，因为这对我来说没有意义。基于以上推理中的大部分用户行为，全部特价机票的首页信息几乎没用，更不会去点第二页，第三页，而是去重新从输入框中输入相关的起飞城市等信息后查询。&lt;br /&gt;
从以上的分析中，我与开发人员以及产品经理等讨论，最终说服他们。在用户点击“更多……”时的行为上，增加一个判断，根据用户的IP判断用户所在城市（或离其最近的有机场的城市），然后默认显示这个城市的特价机票，即把原来的“所有城市”变成“所在城市”，在美化上，开发做了些变更，最终特价机票显示页变成了如下这种形式：&lt;br /&gt;
&lt;img src='http://rdc.taobao.com/blog/dba/wp-content/dbauploads/2008/07/3.jpg' alt='改造后的特价票默认显示页' class='aligncenter' /&gt;&lt;br /&gt;
这种从业务角度的优化，带来了如下的好处：&lt;br /&gt;
1、用户点击“更多……”时刻，所执行的sql语句得到了大大的优化，逻辑读从3w左右降至300以内甚至几十。&lt;br /&gt;
2、本来显示所有特价机票的无用信息，被更换成显示用户所在城市的特价机票信息，绝大多数情况下，恰好提供了用户所需的有用信息，提高了用户体验。&lt;br /&gt;
3、以前，用户进入所有特价机票首页后，一般情况下要自己重新输入条件搜索自己所在城市特价机票信息，浪费了大量的用户劳动力；优化后，这批劳动力亦节省下来。&lt;br /&gt;
   另，欢迎大家&lt;a href=&quot;http://jipiao.taobao.com/index.htm&quot;&gt;来淘宝网预定机票和酒店&lt;/a&gt; &lt;img src='http://rdc.taobao.com/blog/dba/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://rdc.taobao.com/blog/dba/html/187_optimize_from_business.html/feed</wfw:commentRss><description>某些时候，如果从语句的本身上来说，已经很难优化了。如我们电子客票系统中有一个查询语句就是如此。我不便写出语句，但是我可以还原场景给大家看看。
我们的电子客票系统中，在首页...</description><category>optimization</category><category>机票</category><category>oracle</category><category>酒店</category><category>数据库</category><pubDate>Tue, 15 Jul 2008 15:08:11 +0800</pubDate><author>胜通</author><comments>http://rdc.taobao.com/blog/dba/html/187_optimize_from_business.html#comments</comments><guid isPermaLink="false">http://rdc.taobao.com/blog/dba/?p=187</guid><dc:creator>胜通</dc:creator><fs:srclink>http://rdc.taobao.com/blog/dba/html/187_optimize_from_business.html</fs:srclink><fs:srcfeed>http://www.taobaodba.com/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/TaobaoDBA/~6677730/96551826/4541478</fs:itemid></item><item><title>mysql的参数变量</title><link>http://item.feedsky.com/~feedsky/TaobaoDBA/~6677730/96551827/4541478/1/item.html</link><content:encoded>&lt;p&gt;    mysql服务器的系统变量,mysql server system viriables，其实我更愿意叫它为“系统参数”！&lt;br /&gt;
    每一个系统变量都有一个默认值，这个默认值是在编译mysql系统的时候确定的。对系统变量的指定，一般可以在server启动的时候在命令行指定选项或者通过选项文件来指定，当然，大部分的系统变量，可以在系统的运行时，通过set命令指定其值。&lt;br /&gt;
    mysql的系统参数（系统变量）一共分为2类，全局变量（global variables）和会话变量（session variables），它们的含义与区别如其各占的名称所示。session variables是在session级别的，对其的变更只会影响到本session。global variables是系统级别的，对其的变更会影响所有新session（变更时已经存在session不受影响）至下次mysql server重启动，注意它的变更影响不能跨重启，要想再mysql server重启时也使用新的值，那么就只有通过在命令行指定变量选项或者更改选项文件来指定，而通过SET变更是达不到跨重启的。&lt;br /&gt;
&lt;span id=&quot;more-186&quot;&gt;&lt;/span&gt;&lt;br /&gt;
    当系统启动是，它会初始化所有的global变量为它们对应的默认值，这些默认值可以通过命令行指定选项或者选项文件来改变。当一个新的连接建立后，系统也会初始化一批session变量，把它们的值初始化对应的系统变量的值。可见任何一个session变量都有一个global变量与其对应，但是未必每个global变量都有对应的session变量。&lt;br /&gt;
    系统变量的变更，如果它的值是数字的，你可以通过简化使用K/M/G作为单位来指定。下面就来介绍一下几种变更系统变量的方法：&lt;br /&gt;
    1、在mysql server启动的时候，命令行选项中指定&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysqld --query_cache_size=16M --max_allowed_packet=1G&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    2、在mysql server启动的时候，通过选项文件中指定&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;[mysqld]&lt;br /&gt;query_cache_size=16M&lt;br /&gt;max_allowed_packet=1G&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    如果你想限制某个变量的最大值，那么在系统启动的时候通过&amp;#8211;maximum-var_name=value方式来指定，如果假设我要限制max_allowed_packet最多设置为4G，那么我只需要通过1、2方法指定：&amp;#8211;maximum_allowed_packet=4G,就可以了，这样在后面的动态改动中，都无法指定大于4G。&lt;br /&gt;
    3、在mysql server运行的时候，通过SET命令动态指定&lt;br /&gt;
    有很多的系统变量，都可以在mysql server运行时，通过SET命令来动态指定她的值，这样的系统变量，我们又称之为“动态系统变量”（Dynamic System Variables）。&lt;br /&gt;
    我们首先来看看SET命令的语法：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;SET variable_assignment [, variable_assignment] &amp;#8230;&lt;br /&gt;
variable_assignment:&lt;br /&gt;
      user_var_name = expr&lt;br /&gt;
    | [GLOBAL | SESSION] system_var_name = expr&lt;br /&gt;
    | [@@global. | @@session. | @@]system_var_name = expr&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;  i）：如果要修改global系统变量值，你必须要显示指定“GLOBAL”或者“@@global.”，同时注意，你必须要有SUPER权限。&lt;br /&gt;
    ii）：如果要修改session变量值，可以指定“SESSION”或者“@@session.”或者“@@”或者“LOCAL”或者“@@local.”，或者什么都不使用。&lt;/p&gt;
&lt;p&gt;    有没有办法，将session变量值设置为对应的global变量值呢？有，采用如下方式：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;SET @@session.var_name=@@global.var_name;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;    有没有办法，将session变量值设置为mysql编译时候的默认值呢？有，采用如下方式：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;SET var_name=DEFAULT;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;    这里要注意的是，并不是所有的系统变量都能被设置为DEFAULT，如果你设置这些变量为DEFAULT则会返回错误。&lt;/p&gt;
&lt;p&gt;    上面说了如何设置变量，下面来介绍如何查询变量。&lt;br /&gt;
    1、使用SELECT @@global.var_name等来查询。&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysql&amp;gt; select @@session.table_type,@@local.table_type,@@table_type;&lt;br /&gt;+----------------------+--------------------+--------------+&lt;br /&gt;| @@session.table_type | @@local.table_type | @@table_type |&lt;br /&gt;+----------------------+--------------------+--------------+&lt;br /&gt;| InnoDB&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| InnoDB&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| InnoDB&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &lt;br /&gt;+----------------------+--------------------+--------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select @@global.table_type;&lt;br /&gt;+---------------------+&lt;br /&gt;| @@global.table_type |&lt;br /&gt;+---------------------+&lt;br /&gt;| InnoDB&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;br /&gt;+---------------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    这里要注意的是，如果你查询session变量的值，如果没有这个session设置了值则返回其值，如果没有设置则其对应的global变量的值，这里与SET的时候是不一样滴。&lt;br /&gt;
    2、使用SHOW VARIABLES语法：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;SHOW [GLOBAL | SESSION] VARIABLES&lt;br /&gt;
    [LIKE &amp;#8216;pattern&amp;#8217; | WHERE expr]&lt;/p&gt;&lt;/blockquote&gt;</content:encoded><wfw:commentRss>http://rdc.taobao.com/blog/dba/html/186_mysql_server_system_variables.html/feed</wfw:commentRss><description>mysql服务器的系统变量,mysql server system viriables，其实我更愿意叫它为“系统参数”！
    每一个系统变量都有一个默认值，这个默认值是在编译mysql系统的时候确定的。对系统变量的指定，一...</description><category>mysql</category><category>数据库</category><category>variables</category><pubDate>Thu, 10 Jul 2008 17:21:41 +0800</pubDate><author>胜通</author><comments>http://rdc.taobao.com/blog/dba/html/186_mysql_server_system_variables.html#comments</comments><guid isPermaLink="false">http://rdc.taobao.com/blog/dba/?p=186</guid><dc:creator>胜通</dc:creator><fs:srclink>http://rdc.taobao.com/blog/dba/html/186_mysql_server_system_variables.html</fs:srclink><fs:srcfeed>http://www.taobaodba.com/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/TaobaoDBA/~6677730/96551827/4541478</fs:itemid></item><item><title>部署Linux系统的网络自动安装</title><link>http://item.feedsky.com/~feedsky/TaobaoDBA/~6677730/96551828/4541478/1/item.html</link><content:encoded>&lt;p&gt;部署比较简单,开启如下服务( dhcpd,tftp,nfs,portmap ) 再修改几个配置文件就可以;&lt;/p&gt;
&lt;p&gt;一, 开启dhcp服务&lt;br /&gt;
修改/etc/dhcpd.conf  文件,修改网络ip信息就可以,然后重启dhcpd服务;&lt;br /&gt;
&lt;code&gt;#ddns-update-style interim;&lt;br /&gt;
ddns-update-style ad-hoc;&lt;br /&gt;
ignore client-updates;&lt;br /&gt;
allow booting;&lt;br /&gt;
allow bootp;&lt;br /&gt;
option nis-domain               &quot;domain.org&quot;;&lt;br /&gt;
#option domain-name             &quot;pxeserver&quot;;&lt;br /&gt;
option time-offset              -18000; # Eastern Standard Time&lt;br /&gt;
default-lease-time 1000;&lt;br /&gt;
max-lease-time 1600;&lt;/p&gt;
&lt;p&gt;subnet 10.9.200.0 netmask 255.255.255.0 {&lt;br /&gt;
        option routers                  10.9.200.247;&lt;br /&gt;
        option subnet-mask              255.255.255.0;&lt;br /&gt;
        option domain-name-servers      111.0.25.132;&lt;/p&gt;
&lt;p&gt;        range dynamic-bootp 10.9.200.201 10.9.200.211;&lt;/p&gt;
&lt;p&gt;        filename &quot;linux-install/pxelinux.0&quot;;&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
二, 开启tftp服务&lt;br /&gt;
&lt;span id=&quot;more-185&quot;&gt;&lt;/span&gt;&lt;br /&gt;
开启服务的命令: chkconfig xinetd on ,  chkconfig tftp on&lt;br /&gt;
修改/tftpboot/linux-install/pxelinux.cfg/default  文件;&lt;br /&gt;
解释:dba_rhel4u5_x86_64 是配置名称&lt;br /&gt;
解释:label dba_rhel4u5_x86_64 是配置具体内容&lt;br /&gt;
解释:kernel rhel4-u5-x86_64/vmlinuz 是指/tftpboot/linux-install/rhel4-u5-x86_64/vmlinuz&lt;br /&gt;
解释:rhel4-u5-x86_64/initrd.img 是指/tftpboot/linux-install/rhel4-u5-x86_64/initrd.img&lt;br /&gt;
解释:/home/os/rhel4-u5-x86_64/ks.cfg.dba  编辑kickstart文件; 默认口令是 hello123&lt;/p&gt;
&lt;p&gt;&lt;code&gt;default dba_rhel4u5_x86_64&lt;br /&gt;
prompt 1&lt;br /&gt;
timeout 30&lt;br /&gt;
display msgs/boot.msg&lt;br /&gt;
F1 msgs/boot.msg&lt;br /&gt;
F2 msgs/general.msg&lt;br /&gt;
F3 msgs/expert.msg&lt;br /&gt;
F4 msgs/param.msg&lt;br /&gt;
F5 msgs/rescue.msg&lt;br /&gt;
F7 msgs/snake.msg&lt;/p&gt;
&lt;p&gt;label dba_rhel4u5_x86_64&lt;br /&gt;
  kernel rhel4-u5-x86_64/vmlinuz&lt;br /&gt;
  append ks=nfs:10.9.200.151:/home/os/rhel4-u5-x86_64/ks.cfg.dba ksdevice=eth0 initrd=rhel4-u5-x86_64/initrd.img devfs=nomount ramdisk_size=16384 nofb &lt;/code&gt;&lt;br /&gt;
Kickstart文件如下:&lt;br /&gt;
cat /home/os/rhel4-u5-x86_64/ks.cfg.dba&lt;br /&gt;
&lt;code&gt;# ks.cfg.app&lt;br /&gt;
# kickstart file for search server&lt;br /&gt;
#Generated by Kickstart Configurator&lt;/p&gt;
&lt;p&gt;#System  language&lt;br /&gt;
lang en_US&lt;br /&gt;
#Language modules to install&lt;br /&gt;
langsupport zh_CN.GB18030 --default=en_US&lt;br /&gt;
#System keyboard&lt;br /&gt;
keyboard us&lt;br /&gt;
#System mouse&lt;br /&gt;
mouse generic3ps/2&lt;br /&gt;
#Sytem timezone&lt;br /&gt;
timezone Asia/Shanghai&lt;br /&gt;
#Root password&lt;br /&gt;
rootpw --iscrypted $1$UHlWseBT$Bbyz7d/cVx5Is2ojBKWVO/&lt;br /&gt;
#Reboot after installation&lt;br /&gt;
reboot&lt;br /&gt;
#Install Red Hat Linux instead of upgrade&lt;br /&gt;
install&lt;br /&gt;
#Use NFS installation Media&lt;br /&gt;
nfs --server=10.9.68.250 --dir=/home/os/rhel4-u5-x86_64&lt;br /&gt;
#System bootloader configuration&lt;br /&gt;
bootloader --location=mbr&lt;br /&gt;
#Clear the Master Boot Record&lt;br /&gt;
zerombr yes&lt;br /&gt;
#Partition clearing information&lt;br /&gt;
clearpart --all --initlabel&lt;br /&gt;
#Disk partitioning information&lt;br /&gt;
part /boot --fstype ext3 --size 128   --asprimary   --ondisk cciss/c0d0&lt;br /&gt;
part swap                --size 16384  --asprimary  --ondisk cciss/c0d0&lt;br /&gt;
part /     --fstype ext3 --size 1  --grow           --ondisk cciss/c0d0&lt;br /&gt;
part /u01  --fstype ext3 --size 1 --grow           --ondisk cciss/c0d1&lt;br /&gt;
#System authorization infomation&lt;br /&gt;
auth  --useshadow  --enablemd5&lt;br /&gt;
#Network information&lt;br /&gt;
network --bootproto=dhcp --device=eth0&lt;br /&gt;
#Firewall configuration&lt;br /&gt;
firewall --disabled&lt;br /&gt;
selinux  --disabled&lt;br /&gt;
#Do not configure XWindows&lt;br /&gt;
skipx&lt;br /&gt;
#Package install information&lt;br /&gt;
%packages --resolvedeps&lt;br /&gt;
@ everything&lt;br /&gt;
#%pre&lt;br /&gt;
#mkdir /mnt/temp-pre&lt;br /&gt;
#mount -o nolock 10.9.19.222:/opt/iso/rhel4-u4 /mnt/temp-pre&lt;br /&gt;
#open -s -w -- /mnt/temp/preinst.sh&lt;br /&gt;
#umount /mnt/temp-pre&lt;/p&gt;
&lt;p&gt;#%post&lt;br /&gt;
#umount /mnt/temp&lt;/code&gt;&lt;br /&gt;
三,开启nfs,portmap 两个服务,用chkconfig命令;&lt;br /&gt;
编辑 /etc/exports 添加一行记录;&lt;br /&gt;
/home/os    *(ro,sync)&lt;/p&gt;
&lt;p&gt;四, 安装文件与Kickstart文件&lt;br /&gt;
find /home/os&lt;br /&gt;
/home/os&lt;br /&gt;
/home/os/rhel4-u5-x86_64&lt;br /&gt;
/home/os/rhel4-u5-x86_64/RHEL4-U5-x86_64-AS-disc4.iso&lt;br /&gt;
/home/os/rhel4-u5-x86_64/RHEL4-U5-x86_64-AS-disc1.iso&lt;br /&gt;
/home/os/rhel4-u5-x86_64/md5.txt&lt;br /&gt;
/home/os/rhel4-u5-x86_64/RHEL4-U5-x86_64-AS-disc5.iso&lt;br /&gt;
/home/os/rhel4-u5-x86_64/RHEL4-U5-x86_64-AS-disc3.iso&lt;br /&gt;
/home/os/rhel4-u5-x86_64/RHEL4-U5-x86_64-AS-disc2.iso&lt;br /&gt;
/home/os/rhel4-u5-x86_64/ks.cfg.dba&lt;/p&gt;
&lt;p&gt;完成以上步骤就完成了在本地网段通过网络自动安装linux系统的配置; 启动hp服务器,按 F12 选择网络启动就可以;&lt;/p&gt;
&lt;p&gt;五, 附录(hp ilo 远程控制卡的使用)&lt;br /&gt;
ilo 远程控制卡默认都是配置了admin用户 口令是:xx&lt;br /&gt;
ilo 的默认ip地址都是 相应网段的 xxx.xxx.0.xxx; 例如: 10.9.68.125 的远程控制卡ip就是 10.9.0.125;&lt;br /&gt;
在windows的ie界面输入ip地址就能打开界面;&lt;/p&gt;</content:encoded><wfw:commentRss>http://rdc.taobao.com/blog/dba/html/185_%e9%83%a8%e7%bd%b2linux%e7%b3%bb%e7%bb%9f%e7%9a%84%e7%bd%91%e7%bb%9c%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85.html/feed</wfw:commentRss><description>部署比较简单,开启如下服务( dhcpd,tftp,nfs,portmap ) 再修改几个配置文件就可以;
一, 开启dhcp服务
修改/etc/dhcpd.conf  文件,修改网络ip信息就可以,然后重启dhcpd服务;
#ddns-update-style interim;
ddns-update-style...</description><category>操作系统</category><pubDate>Tue, 08 Jul 2008 21:29:54 +0800</pubDate><author>松溪</author><comments>http://rdc.taobao.com/blog/dba/html/185_%e9%83%a8%e7%bd%b2linux%e7%b3%bb%e7%bb%9f%e7%9a%84%e7%bd%91%e7%bb%9c%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85.html#comments</comments><guid isPermaLink="false">http://rdc.taobao.com/blog/dba/?p=185</guid><dc:creator>松溪</dc:creator><fs:srclink>http://rdc.taobao.com/blog/dba/html/185_%e9%83%a8%e7%bd%b2linux%e7%b3%bb%e7%bb%9f%e7%9a%84%e7%bd%91%e7%bb%9c%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85.html</fs:srclink><fs:srcfeed>http://www.taobaodba.com/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/TaobaoDBA/~6677730/96551828/4541478</fs:itemid></item><item><title>mysql连接通道中的字符集和校验规则</title><link>http://item.feedsky.com/~feedsky/TaobaoDBA/~6677730/96551829/4541478/1/item.html</link><content:encoded>&lt;p&gt;    这里首先需要解释的是，我想应该就是连接通道的含义了。那什么是连接通道呢？&lt;br /&gt;
    所谓连接通道，就是客户端和服务器端保持连接的一个通道，它是逻辑上的一个概念。客户端通过连接通道发送sql语句到服务器端，服务端执行，将结果再通过连接通道返回至客户端。the connection is the pass when you connect to the server.&lt;/p&gt;
&lt;p&gt;    这个过程中，有几个临界点（逻辑上概念），是我们需要注意的，mysql也就在这几个临界点上做了文章。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;1、当语句离开客户端的时候：&lt;br /&gt;
    从客户端出来的，包括sql语句本身（这里里面就包含字符串和关键字等了），以及character_set_client系统变量。为什么要包含这个变量呢？这个变量的作用说明2点，也是它的作用：一是表示该语句中的字符集是使用character_set_client指定的字符集编码的，二是通过此系统变量来告诉服务器所发送来的语句中的字符集编码。&lt;br /&gt;
    2、当服务器端接受到客户端的语句的时候：&lt;br /&gt;
    mysql会使用character_set_connection/collation_connection指定的字符集以及校验规则，将客户端的字符串，做一个从character_set_client到character_set_connection的转换。&lt;br /&gt;
    3、当服务器处理好结果以后，在把结果传给客户端前：&lt;br /&gt;
    mysql会先将结果转换成character_set_results指定的字符集，然后传回给客户端。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;span id=&quot;more-184&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;    当字符串在mysql服务器的时候，最终以什么格式存储到mysql数据库中，这个是受到具体的数据表级别、列级别字符集设置的控制了。&lt;/p&gt;
&lt;p&gt;    从上面的介绍中，我们就知道和连接通道相关几个参数了，他们分别是character_set_client/connection/results，可以如下查看：&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysql&amp;gt; show variables like 'char%';&lt;br /&gt;+--------------------------+-------------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+--------------------------+-------------------+&lt;br /&gt;| character_set_client&amp;nbsp; &amp;nbsp; &amp;nbsp;| latin1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_connection | latin1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_database&amp;nbsp; &amp;nbsp;| gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| character_set_results&amp;nbsp; &amp;nbsp; | latin1&amp;nbsp; &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; |&lt;br /&gt;+--------------------------+-------------------+&lt;br /&gt;8 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; show variables like 'colla%';&lt;br /&gt;+----------------------+-------------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+----------------------+-------------------+&lt;br /&gt;| collation_connection | latin1_swedish_ci |&lt;br /&gt;| collation_database&amp;nbsp; &amp;nbsp;| gbk_bin&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| collation_server&amp;nbsp; &amp;nbsp; &amp;nbsp;| latin1_swedish_ci |&lt;br /&gt;+----------------------+-------------------+&lt;br /&gt;3 rows in set (0.00 sec)&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    下面我们来做个实验，来证明一下这个结果：&lt;br /&gt;
    首先保证character_set_connection与character_set_results以及底层存储字符集的一致性，看看character_set_client的效果。&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysql&amp;gt; show variables like 'char%';&lt;br /&gt;+--------------------------+------------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;+--------------------------+------------------+&lt;br /&gt;| character_set_client&amp;nbsp; &amp;nbsp; &amp;nbsp;| latin1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| character_set_connection | gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_database&amp;nbsp; &amp;nbsp;| gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_results&amp;nbsp; &amp;nbsp; | gbk&amp;nbsp; &amp;nbsp; &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;|&lt;br /&gt;+--------------------------+------------------+&lt;br /&gt;8 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; create table t (a varchar(10));&amp;nbsp; --&amp;nbsp; 这里没有指定字符集，就默认使用了database的字符集gbk了&lt;br /&gt;Query OK, 0 rows affected (0.08 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; insert into t values('中国');&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select * from t;&lt;br /&gt;+-------+&lt;br /&gt;| a&amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+-------+&lt;br /&gt;| ???ú |&lt;br /&gt;+-------+&lt;br /&gt;1 row in set (0.00 sec)&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    由此可以看到由于latin1与gbk对汉字的编码方式不一样（或者说latin1根本就不能正确编码汉字），在这个collection过程中，从character_set_client到character_set_connection转换时，就把你输入的好好的汉字转换成乱码了。那么，如果让过程不发生转换呢？&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysql&amp;gt; set character_set_client=gbk;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; insert into t values('人民');&lt;br /&gt;Query OK, 1 row affected (0.02 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select * from t;&lt;br /&gt;+-------+&lt;br /&gt;| a&amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+-------+&lt;br /&gt;| ???ú |&lt;br /&gt;| 人民&amp;nbsp; |&lt;br /&gt;+-------+&lt;br /&gt;2 rows in set (0.00 sec)&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    可见，这里是能正确存储和显示的，很简单，因为任何转换都没有发生，当然就不会出现乱码了。&lt;/p&gt;
&lt;p&gt;    接着做实验，我们让character_set_connection发生变化：&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysql&amp;gt; set character_set_connection=latin1;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; insert into t values ('共和国');&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select * from t;&lt;br /&gt;+-------+&lt;br /&gt;| a&amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+-------+&lt;br /&gt;| ???ú |&lt;br /&gt;| 人民&amp;nbsp; |&lt;br /&gt;| ???&amp;nbsp; &amp;nbsp;|&lt;br /&gt;+-------+&lt;br /&gt;3 rows in set (0.00 sec)&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    可见，这里character_set_client=gbk,character_set_connection=latin1,character_set_database=gbk。首先，client到connection过程中，汉字被转换成乱码（这个过程可能就会丢失信息）；然后存储数据的时候，又从connection到存储的字符集（gbk）发生一次转换，乱码被转换成“更”乱码。这里如果connection与client的字符集有种包容性关系的话，如character_set_client=gbk, character_set_connection=utf8,character_set_results=gbk,底层存储也是gbk编码，由于utf8“兼容”所有的字符集，故在转换过程中不会发生信息丢失，查询的时候也不会是乱码，如下：&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysql&amp;gt; show variables like 'char%';&lt;br /&gt;+--------------------------+-----------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+--------------------------+-----------------+&lt;br /&gt;| character_set_client&amp;nbsp; &amp;nbsp; &amp;nbsp;| gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| character_set_connection | utf8&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_database&amp;nbsp; &amp;nbsp;| gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| character_set_results&amp;nbsp; &amp;nbsp; | gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| .........................| ......&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;+--------------------------+-----------------+&lt;br /&gt;8 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; create table t (a varchar(10)) charset=gbk;&lt;br /&gt;Query OK, 0 rows affected (0.05 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; insert into t values('中国');&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select * from t;&lt;br /&gt;+------+&lt;br /&gt;| a&amp;nbsp; &amp;nbsp; |&lt;br /&gt;+------+&lt;br /&gt;| 中国 |&lt;br /&gt;+------+&lt;br /&gt;1 rows in set (0.00 sec)&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    我来解释一下这个过程，假设“中国”的gbk编码是1234，而utf8的编码是4321，utf8的编码为1234的假设是“淘宝”。client的“中国”的编码1234进入connection，仍然是1234（但实际上它的含义已经发生变化为“淘宝”），存储的时候connection的1234编码到表存储也是1234，刚好正确表达了“中国”的意思，查询返回时，由于results也是gbk，所以不发生转换，正确显示。很显然，如果results又是一种与gbk不兼容的字符集如latin1，查询又会出问题，如下：&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysql&amp;gt; set character_set_results=latin1;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select * from t;&lt;br /&gt;+------+&lt;br /&gt;| a&amp;nbsp; &amp;nbsp; |&lt;br /&gt;+------+&lt;br /&gt;| ??&amp;nbsp; &amp;nbsp;|&lt;br /&gt;+------+&lt;br /&gt;1 rows in set (0.00 sec)&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    当我们改变底层存储的字符集的时候，会怎样？请看如下实验：&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysql&amp;gt; show variables like 'char%';&lt;br /&gt;+--------------------------+---------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+--------------------------+---------------+&lt;br /&gt;| character_set_client&amp;nbsp; &amp;nbsp; &amp;nbsp;| gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| character_set_connection | gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| character_set_database&amp;nbsp; &amp;nbsp;| gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| character_set_results&amp;nbsp; &amp;nbsp; | gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| .........................| ......&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;+--------------------------+---------------+&lt;br /&gt;8 rows in set (0.01 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; create table t (a varchar(10)) charset=latin1;&lt;br /&gt;Query OK, 0 rows affected (0.05 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; insert into t values('淘宝');&lt;br /&gt;Query OK, 1 row affected, 1 warning (0.02 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select * from t;&lt;br /&gt;+------+&lt;br /&gt;| a&amp;nbsp; &amp;nbsp; |&lt;br /&gt;+------+&lt;br /&gt;| ??&amp;nbsp; &amp;nbsp;|&lt;br /&gt;+------+&lt;br /&gt;1 row in set (0.00 sec)&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;   很显然，由于latin1字符集无法存储汉字，故出现乱码。&lt;br /&gt;
   下面，我们只改变results字符集，看看效果如何：&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysql&amp;gt; show variables like 'char%';&lt;br /&gt;+--------------------------+----------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;+--------------------------+----------------+&lt;br /&gt;| character_set_client&amp;nbsp; &amp;nbsp; &amp;nbsp;| gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_connection | gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_database&amp;nbsp; &amp;nbsp;| gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_results&amp;nbsp; &amp;nbsp; | latin1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| .........................| ......&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+--------------------------+----------------+&lt;br /&gt;8 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; create table t (a varchar(10)) charset=gbk;&lt;br /&gt;Query OK, 0 rows affected (0.08 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; insert into t values('淘宝');&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select * from t;&lt;br /&gt;+------+&lt;br /&gt;| a&amp;nbsp; &amp;nbsp; |&lt;br /&gt;+------+&lt;br /&gt;| ??&amp;nbsp; &amp;nbsp;|&lt;br /&gt;+------+&lt;br /&gt;1 row in set (0.00 sec)&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    很显然，底层为gbk编码的字符串转换成latin1的字符集的字符，变成乱码，传给客户端，再次转换成gbk字符集，变成“更”乱码，故显示乱码。&lt;/p&gt;
&lt;p&gt;    下面，我再介绍几个“简约”命令。&lt;br /&gt;
    SET NAMES &amp;#8216;x&amp;#8217;，(SET NAMES &amp;#8216;charset_name&amp;#8217; COLLATE &amp;#8216;collation_name&amp;#8217;)相当于：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;SET character_set_client = x;&lt;br /&gt;
SET character_set_results = x;&lt;br /&gt;
SET character_set_connection = x;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;实验如下：&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysql&amp;gt; show variables like 'char%';&lt;br /&gt;+--------------------------+----------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;+--------------------------+----------------+&lt;br /&gt;| character_set_client&amp;nbsp; &amp;nbsp; &amp;nbsp;| gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_connection | gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_results&amp;nbsp; &amp;nbsp; | latin1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| .........................| ......&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+--------------------------+----------------+&lt;br /&gt;8 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; set names 'ascii';&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; show variables like 'char%';&lt;br /&gt;+--------------------------+----------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;+--------------------------+----------------+&lt;br /&gt;| character_set_client&amp;nbsp; &amp;nbsp; &amp;nbsp;| ascii&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_connection | ascii&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_results&amp;nbsp; &amp;nbsp; | ascii&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| .........................| ......&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+--------------------------+----------------+&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    SET CHARACTER SET &amp;#8216;x&amp;#8217;,相当于：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;SET character_set_client = x;&lt;br /&gt;
SET character_set_results = x;&lt;br /&gt;
SET collation_connection = @@collation_database;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;    这里collation_connection = @@collation_database的意思就是把collation_connection的设置的collation_database的值，由于collation肯定能确定character set，故其又相当于多做了个设置：把character_set_connetion设置成character_set_database的值。请看如下实验：&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;mysql&amp;gt; show variables like 'char%';&lt;br /&gt;+--------------------------+-------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+--------------------------+-------------+&lt;br /&gt;| character_set_client&amp;nbsp; &amp;nbsp; &amp;nbsp;| latin1&amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_connection | latin1&amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| character_set_database&amp;nbsp; &amp;nbsp;| gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| character_set_results&amp;nbsp; &amp;nbsp; | latin1&amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| .......................&amp;nbsp; | ......&amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;+--------------------------+-------------+&lt;br /&gt;8 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; show variables like 'collat%';&lt;br /&gt;+----------------------+-------------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+----------------------+-------------------+&lt;br /&gt;| collation_connection | latin1_swedish_ci |&lt;br /&gt;| collation_database&amp;nbsp; &amp;nbsp;| gbk_bin&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| collation_server&amp;nbsp; &amp;nbsp; &amp;nbsp;| latin1_swedish_ci |&lt;br /&gt;+----------------------+-------------------+&lt;br /&gt;3 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; set character set 'ascii';&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; show variables like 'char%';&lt;br /&gt;+--------------------------+-------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+--------------------------+-------------+&lt;br /&gt;| character_set_client&amp;nbsp; &amp;nbsp; &amp;nbsp;| ascii&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| character_set_connection | gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| character_set_database&amp;nbsp; &amp;nbsp;| gbk&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| character_set_results&amp;nbsp; &amp;nbsp; | ascii&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| .......................&amp;nbsp; | ......&amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;+--------------------------+-------------+&lt;br /&gt;8 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; show variables like 'collat%';&lt;br /&gt;+----------------------+-------------------+&lt;br /&gt;| Variable_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Value&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+----------------------+-------------------+&lt;br /&gt;| collation_connection | gbk_bin&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| collation_database&amp;nbsp; &amp;nbsp;| gbk_bin&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| collation_server&amp;nbsp; &amp;nbsp; &amp;nbsp;| latin1_swedish_ci |&lt;br /&gt;+----------------------+-------------------+&lt;br /&gt;3 rows in set (0.00 sec)&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;    通过以上的介绍，所以为了防止出现乱码，我们可以把character_set_client,character_set_connection,character_set_database,character_set_results设置成同样的值，把collation_connection和collation_database也设置成同样的值，这样就“一劳永逸”了。程序连接mysql的时候，一般都会显示设置character_set_client的值，如java连接中，一般都有如下的一段代码来显示设置这个值：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;jdbc:mysql://10.1.6.174:3306/notify?connectTimeout=1000&amp;#038;characterEncoding=utf8&lt;/p&gt;&lt;/blockquote&gt;</content:encoded><wfw:commentRss>http://rdc.taobao.com/blog/dba/html/184_mysql_connect_charset_collation.html/feed</wfw:commentRss><description>这里首先需要解释的是，我想应该就是连接通道的含义了。那什么是连接通道呢？
    所谓连接通道，就是客户端和服务器端保持连接的一个通道，它是逻辑上的一个概念。客户端通过连接...</description><category>connection</category><category>mysql</category><category>character set</category><category>数据库</category><category>collation</category><pubDate>Tue, 08 Jul 2008 21:11:45 +0800</pubDate><author>胜通</author><comments>http://rdc.taobao.com/blog/dba/html/184_mysql_connect_charset_collation.html#comments</comments><guid isPermaLink="false">http://rdc.taobao.com/blog/dba/?p=184</guid><dc:creator>胜通</dc:creator><fs:srclink>http://rdc.taobao.com/blog/dba/html/184_mysql_connect_charset_collation.html</fs:srclink><fs:srcfeed>http://www.taobaodba.com/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/TaobaoDBA/~6677730/96551829/4541478</fs:itemid></item><item><title>MySQL如何获取当前执行的SQL</title><link>http://item.feedsky.com/~feedsky/TaobaoDBA/~6677730/96551830/4541478/1/item.html</link><content:encoded>&lt;p&gt;在MySQL的客户端中通过&lt;strong&gt;show [full] processlist&lt;/strong&gt;可以看到当前所有线程，以及线程的状态，当然也包括执行中的sql，但是显示的语句不完全，并且有很多空闲线程会造成干扰。&lt;/p&gt;
&lt;p&gt;这里要介绍一个非常好用的开源工具&lt;a href=&quot;http://sourceforge.net/projects/innotop&quot;&gt;innotop&lt;/a&gt;（sourceforge已经被墙了，要过去先找梯子），由于是用perl写的，所以需要安装相关的perl模块，包括&lt;strong&gt;DBI&lt;/strong&gt;，&lt;strong&gt;DBD::mysql&lt;/strong&gt;，&lt;strong&gt;Term::ReadKey&lt;/strong&gt;和&lt;strong&gt;Time::HiRes&lt;/strong&gt;，这些模块都可以到&lt;a href=&quot;http://search.cpan.org&quot;&gt;CPAN&lt;/a&gt;找到。&lt;/p&gt;
&lt;p&gt;用&lt;strong&gt;innotop&lt;/strong&gt;的Q模式则可以完美的解决获取当前运行的SQL的问题。innotop -m Q 或者innotop进入后再按shift+q进入Query list模式：&lt;/p&gt;
&lt;pre&gt;
Query List (? for help) mysql01, 75+03:16:16, 774.20 QPS, 83 thd, 5.1.24-rc-log

CXN    When   Load  QPS     Slow  QCacheHit  KCacheHit  BpsIn    BpsOut
my120  Now    0.00  774.20     0     40.22%    100.00%  207.98k    1.46M
my120  Total  0.00  212.69     2     29.70%    100.00%   56.90k  402.15k

CXN     Cmd    ID      User    Host           DB      Time   Query
mysql01   Query   20936  poster  192.168.1.1    poster  00:00  select a.poster_id,
a.pic_id, a.gmt_create, a.gmt_modified, a.url, a.no
&lt;/pre&gt;
&lt;p&gt;然后按e并输入thread ID显示执行计划或者按f显示完整sql语句，或者按o显示系统优化过的语句（需要MySQL的版本支持EXPLAIN EXTENDED）。个人感觉，还是e最有用，其他两个选项，则有点鸡肋了。&lt;/p&gt;
&lt;pre&gt;
Query List (? for help)  mysql01, 75+03:16:16, 774.20 QPS, 83 thd, 5.1.24-rc-log
EXPLAIN PARTITIONS
select a.poster_id, a.pic_id, a.gmt_create, a.gmt_modified, a.url, a.notes,
a.type, a.indexed, a.user_id, a.user_nick, b.pic_path from poster.poster_pic a
inner join poster.picture b on (a.pic_id = b.id) where a.poster_id = 3390
order by a.indexed
______________ Sub-Part 1 ______________  ________ Sub-Part 1 ________
Select Type: SIMPLE                       Select Type: SIMPLE
      Table: a                                  Table: b
 Partitions:                               Partitions:
       Type: ref                                 Type: eq_ref
 Poss. Keys: PRIMARY                       Poss. Keys: PRIMARY
      Index: PRIMARY                            Index: PRIMARY
 Key Length: 4                             Key Length: 8
  Index Ref: const                          Index Ref: poster.a.PIC_ID
  Row Count: 14                             Row Count: 1
    Special: Using where; Using filesort      Special:                

Press e to explain, f for full query, o for optimized query
&lt;/pre&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;pre&gt;
Query List (? for help)  mysql01, 75+03:16:16, 774.20 QPS, 83 thd, 5.1.24-rc-log
select a.poster_id, a.pic_id, a.gmt_create, a.gmt_modified, a.url, a.notes,
a.type, a.indexed, a.user_id, a.user_nick, b.pic_path from poster.poster_pic a
inner join poster.picture b on (a.pic_id = b.id) where a.poster_id = 3390
order by a.indexed

Press e to explain, f for full query, o for optimized query
&lt;/pre&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;pre&gt;
Query List (? for help)  mysql01, 75+03:16:16, 774.20 QPS, 83 thd, 5.1.24-rc-log
select a.poster_id, a.pic_id, a.gmt_create, a.gmt_modified, a.url, a.notes,
 a.type, a.indexed, a.user_id, a.user_nick, b.pic_path from poster.poster_pic a
 inner join poster.picture b on (a.pic_id = b.id) where a.poster_id = 3390
order by a.indexed

Note:
select `poster`.`a`.`POSTER_ID` AS `poster_id`,`poster`.`a`.`PIC_ID` AS
`pic_id`,`poster`.`a`.`GMT_CREATE` AS `gmt_create`,`poster`.`a`.`GMT_MODIFIED`
AS `gmt_modified`,`poster`.`a`.`URL` AS `url`,`poster`.`a`.`NOTES` AS
`notes`,`poster`.`a`.`TYPE` AS `type`,`poster`.`a`.`INDEXED` AS
`indexed`,`poster`.`a`.`USER_ID` AS `user_id`,`poster`.`a`.`user_nick` AS
`user_nick`,`poster`.`b`.`PIC_PATH` AS `pic_path`
from `poster`.`poster_pic` `a`  join `poster`.`picture` `b`
 where ((`poster`.`b`.`ID` = `poster`.`a`.`PIC_ID`)
and (`poster`.`a`.`POSTER_ID` = 3390)) order by `poster`.`a`.`INDEXED`

Press e to explain, f for full query, o for optimized query
&lt;/pre&gt;
&lt;p&gt;那么&lt;strong&gt;innotop&lt;/strong&gt;是从哪里取的数据呢？应该是通过&lt;strong&gt;information_schema.processlist&lt;/strong&gt;来获得完整的sql语句，并且根据COMMAND来过滤掉空闲线程的。&lt;/p&gt;
&lt;pre&gt;
mysql&gt; desc information_schema.processlist;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| ID      | bigint(4)   | NO   |     | 0       |       |
| USER    | varchar(16) | NO   |     |         |       |
| HOST    | varchar(64) | NO   |     |         |       |
| DB      | varchar(64) | YES  |     | NULL    |       |
| COMMAND | varchar(16) | NO   |     |         |       |
| TIME    | bigint(7)   | NO   |     | 0       |       |
| STATE   | varchar(64) | YES  |     | NULL    |       |
| INFO    | longtext    | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
&lt;/pre&gt;</content:encoded><wfw:commentRss>http://rdc.taobao.com/blog/dba/html/182_how_mysql_get_current_running_sql_statements.html/feed</wfw:commentRss><description>在MySQL的客户端中通过show [full] processlist可以看到当前所有线程，以及线程的状态，当然也包括执行中的sql，但是显示的语句不完全，并且有很多空闲线程会造成干扰。
这里要介绍一个非常好用...</description><category>mysql</category><category>perl</category><category>innotop</category><category>数据库</category><pubDate>Mon, 07 Jul 2008 14:16:54 +0800</pubDate><author>江枫</author><comments>http://rdc.taobao.com/blog/dba/html/182_how_mysql_get_current_running_sql_statements.html#comments</comments><guid isPermaLink="false">http://rdc.taobao.com/blog/dba/?p=182</guid><dc:creator>江枫</dc:creator><fs:srclink>http://rdc.taobao.com/blog/dba/html/182_how_mysql_get_current_running_sql_statements.html</fs:srclink><fs:srcfeed>http://www.taobaodba.com/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/TaobaoDBA/~6677730/96551830/4541478</fs:itemid></item></channel></rss>