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

<channel>
	<title>Big Head DBA</title>
	<atom:link href="http://www.bigheaddba.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.bigheaddba.net</link>
	<description>幸福在远方，我在路上......</description>
	<pubDate>Tue, 09 Mar 2010 07:52:59 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mysql管理必备工具Maatkit详解之十五(mk-slave-restart)</title>
		<link>http://www.bigheaddba.net/article/y2010/530_mysql%e7%ae%a1%e7%90%86%e5%bf%85%e5%a4%87%e5%b7%a5%e5%85%b7maatkit%e8%af%a6%e8%a7%a3%e4%b9%8b%e5%8d%81%e4%ba%94mk-slave-restart.html</link>
		<comments>http://www.bigheaddba.net/article/y2010/530_mysql%e7%ae%a1%e7%90%86%e5%bf%85%e5%a4%87%e5%b7%a5%e5%85%b7maatkit%e8%af%a6%e8%a7%a3%e4%b9%8b%e5%8d%81%e4%ba%94mk-slave-restart.html#comments</comments>
		<pubDate>Tue, 09 Mar 2010 07:52:59 +0000</pubDate>
		<dc:creator>大头刚</dc:creator>
		
		<category><![CDATA[Mysql]]></category>

		<category><![CDATA[Maatkit]]></category>

		<category><![CDATA[mk-slave-restart]]></category>

		<guid isPermaLink="false">http://www.bigheaddba.net/?p=530</guid>
		<description><![CDATA[mk-slave-restart - 对slave进行监控，以及在slave报错后，重启slave。安装方法查看这里。
其实可以理解成在slave执行了如下命令：

stop slave;
set global sql_slave_skip_counter=1;
start slave;

下面举例说明：
先模拟一个slave报错，在主库建表，然后在从库删除，再去主库删除。报错如下：

Last_SQL_Errno: 1051
Last_SQL_Error: Error 'Unknown table 'test_sg'' on query. Default database: 'test'. Query: 'drop table test_sg'

在利用mk-slave-restart去重启这个slave;

[root@mysql2 ~]# mk-slave-restart -u xxx -p xxx -h xxx --run-time 3 --skip-count 1
2010-03-09T14:01:57 h=xxx,p=...,u=xxx slave-relay-bin.000215    74173942 1051

解释下参数：
run-time:指监控slave的时间，单位是秒；
skip-count:指跳过log的数量；

解释下输出：
1、time
2、slave IP
3、user
4、passwd
5、MASTER_LOG_FILE
6、MASTER_LOG_POS
7、Last_SQL_Errno

很显然mk-slave-restart是一个很不错的slave监控工具，当salve出错后能及时报警，并直接重启slave。同时输出了报错的相关信息，方便后面查询在哪出错，是什么错。下面给出它的帮助:

[root@mysql2 ~]# mk-slave-restart --help
mk-slave-restart watches one or more MySQL replication slaves for errors, and
tries to [...]]]></description>
			<content:encoded><![CDATA[<p>mk-slave-restart - 对slave进行监控，以及在slave报错后，重启slave。安装方法查看<a href="http://www.bigheaddba.net/article/y2009/159_mysql%e7%ae%a1%e7%90%86%e5%bf%85%e5%a4%87%e5%b7%a5%e5%85%b7maatkit%e8%af%a6%e8%a7%a3%e4%b8%80%ef%bc%88%e5%ae%89%e8%a3%85maatkit%ef%bc%89.html">这里</a>。</p>
<p>其实可以理解成在slave执行了如下命令：</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">stop slave;
set global sql_slave_skip_counter=1;
start slave;</pre></div></div>

<p>下面举例说明：<br />
先模拟一个slave报错，在主库建表，然后在从库删除，再去主库删除。报错如下：</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">Last_SQL_Errno: 1051
Last_SQL_Error: Error 'Unknown table 'test_sg'' on query. Default database: 'test'. Query: 'drop table test_sg'</pre></div></div>

<p>在利用mk-slave-restart去重启这个slave;</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">[root@mysql2 ~]# mk-slave-restart -u xxx -p xxx -h xxx --run-time 3 --skip-count 1
2010-03-09T14:01:57 h=xxx,p=...,u=xxx slave-relay-bin.000215    74173942 1051</pre></div></div>

<p>解释下参数：<br />
run-time:指监控slave的时间，单位是秒；<br />
skip-count:指跳过log的数量；</p>
<p></br></p>
<p>解释下输出：<br />
1、time<br />
2、slave IP<br />
3、user<br />
4、passwd<br />
5、MASTER_LOG_FILE<br />
6、MASTER_LOG_POS<br />
7、Last_SQL_Errno</p>
<p></br></p>
<p>很显然mk-slave-restart是一个很不错的slave监控工具，当salve出错后能及时报警，并直接重启slave。同时输出了报错的相关信息，方便后面查询在哪出错，是什么错。下面给出它的帮助:</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">[root@mysql2 ~]# mk-slave-restart --help
mk-slave-restart watches one or more MySQL replication slaves for errors, and
tries to restart replication if it stops.  For more details, please use the
--help option, or try 'perldoc /usr/bin/mk-slave-restart' for complete
documentation.
&nbsp;
Usage: /usr/bin/mk-slave-restart &lt;options&gt;
&nbsp;
Options:
  --always            Start slaves even when there is no error
  --ask-pass          Prompt for a password when connecting to MySQL
  --charset       -A  Default character set
  --config            Read this comma-separated list of config files; if
                      specified, this must be the first option on the command
                      line
  --daemonize         Fork to background and detach (POSIX only)
  --database      -D  Database to use
  --defaults-file -F  Only read mysql options from the given file
  --error-length      Max length of error message to print
  --error-numbers     Only restart this comma-separated list of errors
  --error-text        Only restart errors that match this pattern
  --help              Show help and exit
  --host          -h  Connect to host
  --log               Print all output to this file when daemonized
  --max-sleep         Maximum sleep seconds (default 64)
  --min-sleep         The minimum time mk-slave-restart will sleep before
                      polling the slave again (default 0.015625)
  --monitor           Whether to monitor the slave (default)
  --password      -p  Password to use when connecting
  --pid               Create the given PID file when daemonized
  --port          -P  Port number to use for connection
  --quiet         -q  Suppresses normal output (disables --verbose)
  --recurse           Watch slaves of the specified server, up to the specified
                      number of servers deep in the hierarchy
  --run-time          Time to run before exiting.  Optional suffix s=seconds,
                      m=minutes, h=hours, d=days; if no suffix, s is used.
  --sentinel          Exit if this file exists (default
                      /tmp/mk-slave-restart-sentinel)
  --set-vars          Set these MySQL variables (default wait_timeout=10000)
  --skip-count        Number of statements to skip when restarting the slave
                      (default 1)
  --sleep             Initial sleep seconds between checking the slave (default
                      1)
  --socket        -S  Socket file to use for connection
  --stop              Stop running instances by creating the sentinel file
  --until-master      Run until this master log file and position
  --until-relay       Run until this relay log file and position
  --user          -u  User for login if not current user
  --verbose       -v  Be verbose; can specify multiple times (default 1)
  --version           Show version and exit
&nbsp;
Options and values after processing arguments:
  --always            FALSE
  --ask-pass          FALSE
  --charset           (No value)
  --config            /etc/maatkit/maatkit.conf,/etc/maatkit/mk-slave-restart.conf,/root/.maatkit.conf,/root/.mk-slave-
&nbsp;
restart.conf
  --daemonize         FALSE
  --database          (No value)
  --defaults-file     (No value)
  --error-length      (No value)
  --error-numbers     (No value)
  --error-text        (No value)
  --help              TRUE
  --host              (No value)
  --log               (No value)
  --max-sleep         64
  --min-sleep         0.015625
  --monitor           TRUE
  --password          (No value)
  --pid               (No value)
  --port              (No value)
  --quiet             FALSE
  --recurse           (No value)
  --run-time          (No value)
  --sentinel          /tmp/mk-slave-restart-sentinel
  --set-vars          wait_timeout=10000
  --skip-count        1
  --sleep             1
  --socket            (No value)
  --stop              FALSE
  --until-master      (No value)
  --until-relay       (No value)
  --user              (No value)
  --verbose           1
  --version           FALSE</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.bigheaddba.net/article/y2010/530_mysql%e7%ae%a1%e7%90%86%e5%bf%85%e5%a4%87%e5%b7%a5%e5%85%b7maatkit%e8%af%a6%e8%a7%a3%e4%b9%8b%e5%8d%81%e4%ba%94mk-slave-restart.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>利用RMAN的DUPLICATE创建STANDBY将单实例数据库升级为RAC环境</title>
		<link>http://www.bigheaddba.net/article/y2010/513_%e5%88%a9%e7%94%a8rman%e7%9a%84duplicate%e5%88%9b%e5%bb%bastandby%e5%b0%86%e5%8d%95%e5%ae%9e%e4%be%8b%e6%95%b0%e6%8d%ae%e5%ba%93%e5%8d%87%e7%ba%a7%e4%b8%barac%e7%8e%af%e5%a2%83.html</link>
		<comments>http://www.bigheaddba.net/article/y2010/513_%e5%88%a9%e7%94%a8rman%e7%9a%84duplicate%e5%88%9b%e5%bb%bastandby%e5%b0%86%e5%8d%95%e5%ae%9e%e4%be%8b%e6%95%b0%e6%8d%ae%e5%ba%93%e5%8d%87%e7%ba%a7%e4%b8%barac%e7%8e%af%e5%a2%83.html#comments</comments>
		<pubDate>Fri, 05 Mar 2010 09:51:19 +0000</pubDate>
		<dc:creator>大头刚</dc:creator>
		
		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[DUPLICATE]]></category>

		<category><![CDATA[RAC]]></category>

		<category><![CDATA[standby]]></category>

		<guid isPermaLink="false">http://www.bigheaddba.net/?p=513</guid>
		<description><![CDATA[利用RMAN的DUPLICATE创建STANDBY,可以在不停机的情况下将单实例数据库迁移到RAC数据库。当然这种不停机是指相对的，在DG进行切换的时候，停机时间可以保证在5分钟之内完成。
首先确保目标服务器上的RAC环境已经建立，由于RMAN的DUPLICATE创建STANDBY，没有办法将数据文件放到远端的ASM磁盘组中，本次测试使用OCFS2做为RAC的共享存储文件系统。如果使用ASM作为存储机制，无法实现不停机迁移。
测试环境：

primary sid         : test
primary ip          : 192.168.1.200
&#160;
standby sid         : testrac01,testrac03,testrac03
standby Public  ip  : 192.168.1.101,192.168.1.102,192.168.1.103
standby Virtual ip  : 192.168.1.201,192.168.1.202,192.168.1.203
standby Private ip  : 10.0.0.1,10.0.0.2,10.0.0.3

RAC数据库环境如下：

SYS@test_rac01&#38;gt;select * FROM v$version;
BANNER
----------------------------------------------------------------
Oracle DATABASE [...]]]></description>
			<content:encoded><![CDATA[<p>利用RMAN的DUPLICATE创建STANDBY,可以在不停机的情况下将单实例数据库迁移到RAC数据库。当然这种不停机是指相对的，在DG进行切换的时候，停机时间可以保证在5分钟之内完成。</p>
<p>首先确保目标服务器上的RAC环境已经建立，由于RMAN的DUPLICATE创建STANDBY，没有办法将数据文件放到远端的ASM磁盘组中，本次测试使用OCFS2做为RAC的共享存储文件系统。如果使用ASM作为存储机制，无法实现不停机迁移。<br />
测试环境：</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">primary sid         : test
primary ip          : 192.168.1.200
&nbsp;
standby sid         : testrac01,testrac03,testrac03
standby Public  ip  : 192.168.1.101,192.168.1.102,192.168.1.103
standby Virtual ip  : 192.168.1.201,192.168.1.202,192.168.1.203
standby Private ip  : 10.0.0.1,10.0.0.2,10.0.0.3</pre></div></div>

<p>RAC数据库环境如下：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SYS@test_rac01&amp;gt;select <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> v$version;
BANNER
<span style="color: #808080; font-style: italic;">----------------------------------------------------------------</span>
Oracle <span style="color: #993333; font-weight: bold;">DATABASE</span> 10g Enterprise Edition Release 10<span style="color: #66cc66;">.</span>2<span style="color: #66cc66;">.</span>0<span style="color: #66cc66;">.</span>3<span style="color: #66cc66;">.</span>0 <span style="color: #66cc66;">-</span> 64bi
PL<span style="color: #66cc66;">/</span>SQL Release 10<span style="color: #66cc66;">.</span>2<span style="color: #66cc66;">.</span>0<span style="color: #66cc66;">.</span>3<span style="color: #66cc66;">.</span>0 <span style="color: #66cc66;">-</span> Production
CORE	10<span style="color: #66cc66;">.</span>2<span style="color: #66cc66;">.</span>0<span style="color: #66cc66;">.</span>3<span style="color: #66cc66;">.</span>0	Production
TNS <span style="color: #993333; font-weight: bold;">FOR</span> Linux: Version 10<span style="color: #66cc66;">.</span>2<span style="color: #66cc66;">.</span>0<span style="color: #66cc66;">.</span>3<span style="color: #66cc66;">.</span>0 <span style="color: #66cc66;">-</span> Production
NLSRTL Version 10<span style="color: #66cc66;">.</span>2<span style="color: #66cc66;">.</span>0<span style="color: #66cc66;">.</span>3<span style="color: #66cc66;">.</span>0 <span style="color: #66cc66;">-</span> Production
&nbsp;
SYS@test_rac01&amp;gt;select instance_name<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">STATUS</span> <span style="color: #993333; font-weight: bold;">FROM</span> gv$instance;
&nbsp;
INSTANCE_NAME	 <span style="color: #993333; font-weight: bold;">STATUS</span>
<span style="color: #808080; font-style: italic;">---------------- ------------</span>
testrac01	 OPEN
testrac02	 OPEN
testrac03	 OPEN</pre></div></div>

<p>RAC的数据文件路径和primary的路径一直，共享磁盘挂载到对应的路径</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda     ocfs2    1.4T  202G  1.2T  15% /u01/app/oracle/oradata</pre></div></div>

<p>一、由于要进行将目标数据库升级为RAC环境，因此需要添加UNDOTBS和THREAD对应的日志,因为我们是3个节点，需要UNDOTBS2、UNDOTBS3和THREAD2、THREAD3</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">&nbsp;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">CREATE</span> UNDO TABLESPACE UNDOTBS2 DATAFILE <span style="color: #ff0000;">'/u01/app/oracle/oradata/test/undotbs02.dbf'</span> SIZE 4096M;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">CREATE</span> UNDO TABLESPACE UNDOTBS3 DATAFILE <span style="color: #ff0000;">'/u01/app/oracle/oradata/test/undotbs03.dbf'</span> SIZE 4096M;
&nbsp;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #993333; font-weight: bold;">ADD</span> LOGFILE THREAD <span style="color: #cc66cc;">2</span> <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #cc66cc;">11</span> <span style="color: #ff0000;">'/u01/app/oracle/oradata/test/redo11.log'</span> SIZE 300M;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #993333; font-weight: bold;">ADD</span> LOGFILE THREAD <span style="color: #cc66cc;">2</span> <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #cc66cc;">12</span> <span style="color: #ff0000;">'/u01/app/oracle/oradata/test/redo12.log'</span> SIZE 300M;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #993333; font-weight: bold;">ADD</span> LOGFILE THREAD <span style="color: #cc66cc;">2</span> <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #cc66cc;">13</span> <span style="color: #ff0000;">'/u01/app/oracle/oradata/test/redo13.log'</span> SIZE 300M;
&nbsp;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #993333; font-weight: bold;">ADD</span> LOGFILE THREAD <span style="color: #cc66cc;">3</span> <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #cc66cc;">14</span> <span style="color: #ff0000;">'/u01/app/oracle/oradata/test/redo14.log'</span> SIZE 300M;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #993333; font-weight: bold;">ADD</span> LOGFILE THREAD <span style="color: #cc66cc;">3</span> <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #cc66cc;">15</span> <span style="color: #ff0000;">'/u01/app/oracle/oradata/test/redo15.log'</span> SIZE 300M;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #993333; font-weight: bold;">ADD</span> LOGFILE THREAD <span style="color: #cc66cc;">3</span> <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #cc66cc;">16</span> <span style="color: #ff0000;">'/u01/app/oracle/oradata/test/redo16.log'</span> SIZE 300M;
&nbsp;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> ENABLE THREAD <span style="color: #cc66cc;">2</span>;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> ENABLE THREAD <span style="color: #cc66cc;">3</span>;</pre></div></div>

<p>二、下面可以在主库修改初始化参数文件：<br />
修改primary的监听。</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">testrac  =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.201)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = testrac01)
    )
  )</pre></div></div>

<p>修改primary的DG参数</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">ALTER SYSTEM SET log_archive_config='DG_CONFIG=(test,testrac)' scope=both;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=testrac LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)' scope=both;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE scope=both;</pre></div></div>

<p>在primary执行，利用当前的初始化参数，创建PFILE，修改后用于STANBY数据库的启动，同时生成STANDBY CONTROLFILE，与修改后的PFILE文件一起放到目标服务器上：</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">SQL&gt; CREATE PFILE='/u01/app/oracle/inittestrac.ora' FROM SPFILE;
SQL&gt; ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/u01/app/oracle/stb_control01.ctl';</pre></div></div>

<p>修改参数，添加RAC参数</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">*.audit_file_dest='/u01/app/oracle/admin/test/adump'
*.background_dump_dest='/u01/app/oracle/admin/test/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/test/trol.ctl'   （到共享磁盘）
*.core_dump_dest='/u01/app/oracle/admin/test/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='testcent'
*.job_queue_processes=10
*.FAL_CLIENT='testcent'
*.FAL_SERVER='testcenter'
*.log_archive_config='DG_CONFIG=(test,testrac)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/oradata/flash_recovery_area VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testrac'  (归档目录放到共享磁盘)
*.log_archive_dest_2='SERVICE=test LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.job_queue_processes=10
*.log_archive_format='%t_%s_%r.dbf'
*.open_cursors=300
*.pga_aggregate_target=1349151744
*.processes=2500
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=2755
*.sga_max_size=1589934592
*.sga_target=1589934592
*.undo_management='AUTO'
*.user_dump_dest='/u01/app/oracle/admin/test/udump'
*.cluster_database=true
*.cluster_database_instances=3
*.db_unique_name='testrac'
testcent1.undo_tablespace='UNDOTBS1'
testcent2.undo_tablespace='UNDOTBS2'
testcent3.undo_tablespace='UNDOTBS3'
testcent1.instance_number=1
testcent2.instance_number=2
testcent3.instance_number=3
testcent1.thread=1
testcent2.thread=2
testcent3.thread=3
testcent1.local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.201)(PORT=1521))'
testcent2.local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.202)(PORT=1521))'
testcent3.local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.203)(PORT=1521))'
&nbsp;
#有BUG，切换完毕在改回来。
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=100G
&nbsp;
#如果数据文件路径没变就不用设置，改变了需要设置这2个参数
*.log_file_name_convert=('', '')
*.db_file_name_convert=('', '')</pre></div></div>

<p>在STANDBY的RAC环境的3个节点上分别拷贝密码文件,在节点1,2,3上，密码文件应该重命名为orapwtestrac01,orapwtestrac02,orapwtestrac03。</p>
<p>三、确保两个节点上的对应目录都已经建立。</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">/u01/app/oracle/admin/test/bdump
/u01/app/oracle/admin/test/adump
/u01/app/oracle/admin/test/cdump
/u01/app/oracle/admin/test/bdump
/u01/app/oracle/oradata/test
/u01/app/oracle/oradata/flash_recovery_area/</pre></div></div>

<p>四、在主库创建数据全备</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">rman target /
sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
backup AS COMPRESSED BACKUPSET DATABASE format '/u01/backup/rman_backup/data/test_full_%U_$DATE.dbf' ;</pre></div></div>

<p>在备库把备份拷贝过来,放到相同的目录。</p>
<p>五、确保STANDBY数据库可以通过服务名访问主库，每个节点都设置。</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">[oracle@test-rac01 admin]$ tnsping test
TNS Ping Utility for Linux: Version 10.2.0.3.0 - Production on 25-JAN-2010 17:37:42
Copyright (c) 1997, 2006, Oracle.  All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.200)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = test))
OK (10 msec)</pre></div></div>

<p>六、利用RMAN的DUPLICATE创建STANDBY,把节点2、3先关闭，只开启节点1。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQL<span style="color: #66cc66;">&gt;</span> conn <span style="color: #66cc66;">/</span><span style="color: #993333; font-weight: bold;">AS</span> sysdba
Connected <span style="color: #993333; font-weight: bold;">TO</span> an idle instance<span style="color: #66cc66;">.</span>
SQsql<span style="color: #66cc66;">&gt;</span> startup nomount pfile<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'xxxxxxxxx/orapwtestrac01'</span></pre></div></div>

<p>必须是nomount状态，否则无法进行duplicate操作<br />
登陆RMAN并且登陆到备库</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #66cc66;">&#91;</span>oracle@test<span style="color: #66cc66;">-</span>rac01 ~<span style="color: #66cc66;">&#93;</span>$ rman target sys<span style="color: #66cc66;">/</span>XXXX@test auxiliary <span style="color: #66cc66;">/</span>
RMAN<span style="color: #66cc66;">&gt;</span>connect auxiliary sys<span style="color: #66cc66;">/</span>XXX@testrac01
connected <span style="color: #993333; font-weight: bold;">TO</span> auxiliary <span style="color: #993333; font-weight: bold;">DATABASE</span>: testrac01<span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">NOT</span> mounted<span style="color: #66cc66;">&#41;</span>
&nbsp;
RMAN<span style="color: #66cc66;">&gt;</span>duplicate target <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #993333; font-weight: bold;">FOR</span> standby nofilenamecheck;</pre></div></div>

<p>然后从库即可启动进行恢复:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> mount standby <span style="color: #993333; font-weight: bold;">DATABASE</span>;
<span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> mount standby <span style="color: #993333; font-weight: bold;">DATABASE</span>
<span style="color: #66cc66;">*</span>
ERROR at line <span style="color: #cc66cc;">1</span>:
ORA<span style="color: #66cc66;">-</span>01100: <span style="color: #993333; font-weight: bold;">DATABASE</span> already mounted
&nbsp;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> recover managed standby <span style="color: #993333; font-weight: bold;">DATABASE</span> disconnect <span style="color: #993333; font-weight: bold;">FROM</span> session;
<span style="color: #993333; font-weight: bold;">DATABASE</span> altered<span style="color: #66cc66;">.</span></pre></div></div>

<p>在共享磁盘上创建共享的SPFILE文件：</p>

<div class="wp_syntax"><div class="code"><pre class="en" style="font-family:monospace;">SQL&gt; create spfile =  from pfile;
建议把参数文件放共享磁盘，每个节点去调用，例如:
[root@boss-rac01 dbs]# cat inittestrac01.ora
spfile=/u01/app/oracle/oradata/spfiletestrac.ora</pre></div></div>

<p>下面关闭恢复归档状态，并已只读方式打开数据库：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> recover managed standby <span style="color: #993333; font-weight: bold;">DATABASE</span> cancel;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> open <span style="color: #993333; font-weight: bold;">READ</span> only;
&nbsp;
在实例<span style="color: #cc66cc;">2</span>，<span style="color: #cc66cc;">3</span>对应的节点上，尝试只读方式打开数据库：
<span style="color: #66cc66;">&#91;</span>oracle@test<span style="color: #66cc66;">-</span>rac02 dbs<span style="color: #66cc66;">&#93;</span>$ cat inittestrac02<span style="color: #66cc66;">.</span>ora
spfile<span style="color: #66cc66;">=/</span>u01<span style="color: #66cc66;">/</span>app<span style="color: #66cc66;">/</span>oracle<span style="color: #66cc66;">/</span>oradata<span style="color: #66cc66;">/</span>spfiletestrac02<span style="color: #66cc66;">.</span>ora
&nbsp;
SQsql<span style="color: #66cc66;">&gt;</span> startup;
SQsql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> instance_name<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">STATUS</span> <span style="color: #993333; font-weight: bold;">FROM</span> gv$instance;
&nbsp;
INSTANCE_NAME	 <span style="color: #993333; font-weight: bold;">STATUS</span>
<span style="color: #808080; font-style: italic;">---------------- ------------</span>
testrac02	 OPEN
testrac01	 OPEN
testrac03	 OPEN</pre></div></div>

<p>七、执行SWITCHOVER</p>
<p>下面为了执行SWITCHOVER操作，可以先关闭实例2、3，确认主库和备库归档应用已经同步。由于RAC环境STANDBY在SWITCHOVER时，很容易由于设置DB_RECOVERY_FILE_DEST导致bug的出现,因此在STANDBY数据库建立初始化参数文件的时候就没有加载DB_RECOVERY_FILE_DEST等参数，这里将主库的相应参数也去掉：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SHOW</span> parameter db_recovery_file_dest
NAME TYPE VALUE
<span style="color: #808080; font-style: italic;">------------------------------------ ---------------------- ------------------------------</span>
db_recovery_file_dest string
db_recovery_file_dest_size big integer 4G
&nbsp;
SYS@testcenter&amp;gt;alter system <span style="color: #993333; font-weight: bold;">SET</span> db_recovery_file_dest<span style="color: #66cc66;">=</span><span style="color: #ff0000;">''</span> scope<span style="color: #66cc66;">=</span>spfile;
System altered<span style="color: #66cc66;">.</span></pre></div></div>

<p>在主库执行SWITCHOVER操作：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> commit <span style="color: #993333; font-weight: bold;">TO</span> switchover <span style="color: #993333; font-weight: bold;">TO</span> physical standby;
SQL<span style="color: #66cc66;">&gt;</span> shutdown immediate
SQL<span style="color: #66cc66;">&gt;</span> startup mount
&nbsp;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> name<span style="color: #66cc66;">,</span> db_unique_name<span style="color: #66cc66;">,</span> database_role<span style="color: #66cc66;">,</span> switchover_status <span style="color: #993333; font-weight: bold;">FROM</span> v$database;
&nbsp;
NAME	  DB_UNIQUE_NAME		 DATABASE_ROLE	  SWITCHOVER_STATUS
<span style="color: #808080; font-style: italic;">--------- ------------------------------ ---------------- --------------------</span>
test      test			         PHYSICAL STANDBY SESSIONS ACTIVE</pre></div></div>

<p>下面切换到RAC环境的STANDBY数据库，检查状态：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQLSQsql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> name<span style="color: #66cc66;">,</span> db_unique_name<span style="color: #66cc66;">,</span> database_role<span style="color: #66cc66;">,</span> switchover_status <span style="color: #993333; font-weight: bold;">FROM</span> v$database;</pre></div></div>

<p>执行SWITCHOVER切换到主库，并打开数据库：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> commit <span style="color: #993333; font-weight: bold;">TO</span> switchover <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span>;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> open;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> name<span style="color: #66cc66;">,</span> db_unique_name<span style="color: #66cc66;">,</span> database_role<span style="color: #66cc66;">,</span> switchover_status <span style="color: #993333; font-weight: bold;">FROM</span> v$database;
&nbsp;
NAME	  DB_UNIQUE_NAME		 DATABASE_ROLE	  SWITCHOVER_STATUS
<span style="color: #808080; font-style: italic;">--------- ------------------------------ ---------------- --------------------</span>
TESTRAC   testrac			 <span style="color: #993333; font-weight: bold;">PRIMARY</span>	  SESSIONS ACTIVE</pre></div></div>

<p>切换成功。<br />
在原主数据库，也就是切换完成后的STANDBY主库执行：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> recover managed standby <span style="color: #993333; font-weight: bold;">DATABASE</span> disconnect <span style="color: #993333; font-weight: bold;">FROM</span> session;</pre></div></div>

<p>使得STANDBY数据库应用主库的归档。</p>
<p>在新的主数据库的节点2，3上，启动实例：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">sqlplus <span style="color: #ff0000;">&quot;/ as sysdba&quot;</span>
SQL<span style="color: #66cc66;">&gt;</span> startup;
SQL<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> instance_name<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">STATUS</span> <span style="color: #993333; font-weight: bold;">FROM</span> gv$instance;
&nbsp;
INSTANCE_NAME	 <span style="color: #993333; font-weight: bold;">STATUS</span>
<span style="color: #808080; font-style: italic;">---------------- ------------</span>
testcent2	 OPEN
testcent1	 OPEN
testcent3	 OPEN</pre></div></div>

<p>至此，单实例数据库到RAC环境STANDBY的SWITCHOVER操作完成。同时，单实例数据库升级到RAC环境数据库的操作也完成了。如果一旦升级后RAC环境出现问题，或者不适应系统的压力。可以通过SWITCHOVER的方法快速的切换为原始环境，且不会丢失任何的数据。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bigheaddba.net/article/y2010/513_%e5%88%a9%e7%94%a8rman%e7%9a%84duplicate%e5%88%9b%e5%bb%bastandby%e5%b0%86%e5%8d%95%e5%ae%9e%e4%be%8b%e6%95%b0%e6%8d%ae%e5%ba%93%e5%8d%87%e7%ba%a7%e4%b8%barac%e7%8e%af%e5%a2%83.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>北京某大型互联网公司招聘DBA</title>
		<link>http://www.bigheaddba.net/article/y2010/511_%e5%8c%97%e4%ba%ac%e6%9f%90%e5%a4%a7%e5%9e%8b%e4%ba%92%e8%81%94%e7%bd%91%e5%85%ac%e5%8f%b8%e6%8b%9b%e8%81%98dba.html</link>
		<comments>http://www.bigheaddba.net/article/y2010/511_%e5%8c%97%e4%ba%ac%e6%9f%90%e5%a4%a7%e5%9e%8b%e4%ba%92%e8%81%94%e7%bd%91%e5%85%ac%e5%8f%b8%e6%8b%9b%e8%81%98dba.html#comments</comments>
		<pubDate>Mon, 01 Mar 2010 03:24:10 +0000</pubDate>
		<dc:creator>大头刚</dc:creator>
		
		<category><![CDATA[生活点滴]]></category>

		<category><![CDATA[招聘，DBA]]></category>

		<guid isPermaLink="false">http://www.bigheaddba.net/?p=511</guid>
		<description><![CDATA[    北京某大型互联网公司招聘DBA一名，从事DBA一年以上，待遇面谈，肯定不会比同行业差。其实要求都不是硬性的，学习能力强、责任心强、能抗压才是最重要的。有意向的朋友可以联系我。联系方式：
MSN:shengang34(at)hotmail.com
Email:kys-sg(at)jiayuan.com
Oracle DBA
1、精通/熟悉Oracle数据库体系结构，基础扎实
2、精通/熟悉Data Guard/RAC等高可用技术，能顺利的配置和管理data Guard
3、精通/熟悉Oracle的备份与恢复技术
4、熟悉unix/linux操作系统的使用
5、熟悉shell&#038;perl编程，能使用脚本编写工具提升工作效率
6、熟悉SQL和PL/SQL，能编写日常维护需要的脚本
MySQL DBA
1、精通/熟悉MySQL数据库的运行机制和体系架构
2、精通/熟悉MySQL数据库的管理，对于MySQL的参数有深入理解
3、精通/熟悉MySQL复制
4、精通/熟悉SQL
5、熟悉linux操作系统的使用
6、熟悉shell&#038;perl编程
]]></description>
			<content:encoded><![CDATA[<p>    北京某大型互联网公司招聘DBA一名，从事DBA一年以上，待遇面谈，肯定不会比同行业差。其实要求都不是硬性的，学习能力强、责任心强、能抗压才是最重要的。有意向的朋友可以联系我。联系方式：<br />
MSN:shengang34(at)hotmail.com<br />
Email:kys-sg(at)jiayuan.com</p>
<p>Oracle DBA<br />
1、精通/熟悉Oracle数据库体系结构，基础扎实<br />
2、精通/熟悉Data Guard/RAC等高可用技术，能顺利的配置和管理data Guard<br />
3、精通/熟悉Oracle的备份与恢复技术<br />
4、熟悉unix/linux操作系统的使用<br />
5、熟悉shell&#038;perl编程，能使用脚本编写工具提升工作效率<br />
6、熟悉SQL和PL/SQL，能编写日常维护需要的脚本</p>
<p>MySQL DBA<br />
1、精通/熟悉MySQL数据库的运行机制和体系架构<br />
2、精通/熟悉MySQL数据库的管理，对于MySQL的参数有深入理解<br />
3、精通/熟悉MySQL复制<br />
4、精通/熟悉SQL<br />
5、熟悉linux操作系统的使用<br />
6、熟悉shell&#038;perl编程</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bigheaddba.net/article/y2010/511_%e5%8c%97%e4%ba%ac%e6%9f%90%e5%a4%a7%e5%9e%8b%e4%ba%92%e8%81%94%e7%bd%91%e5%85%ac%e5%8f%b8%e6%8b%9b%e8%81%98dba.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>。。。</title>
		<link>http://www.bigheaddba.net/article/y2010/510_%e3%80%82%e3%80%82%e3%80%82.html</link>
		<comments>http://www.bigheaddba.net/article/y2010/510_%e3%80%82%e3%80%82%e3%80%82.html#comments</comments>
		<pubDate>Fri, 19 Feb 2010 06:58:02 +0000</pubDate>
		<dc:creator>apple</dc:creator>
		
		<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://www.bigheaddba.net/article/y2010/510_%e3%80%82%e3%80%82%e3%80%82.html</guid>
		<description><![CDATA[ 同样的一瓶饮料，便利店里 2 块钱，五星饭店里 60 块，很多的时候，一个人的价值取决于所在的位置。 
]]></description>
			<content:encoded><![CDATA[<p> 同样的一瓶饮料，便利店里 2 块钱，五星饭店里 60 块，很多的时候，一个人的价值取决于所在的位置。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.bigheaddba.net/article/y2010/510_%e3%80%82%e3%80%82%e3%80%82.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Mysql实现split函数</title>
		<link>http://www.bigheaddba.net/article/y2010/506_mysql%e5%ae%9e%e7%8e%b0split%e5%87%bd%e6%95%b0.html</link>
		<comments>http://www.bigheaddba.net/article/y2010/506_mysql%e5%ae%9e%e7%8e%b0split%e5%87%bd%e6%95%b0.html#comments</comments>
		<pubDate>Thu, 14 Jan 2010 08:18:44 +0000</pubDate>
		<dc:creator>大头刚</dc:creator>
		
		<category><![CDATA[Mysql]]></category>

		<category><![CDATA[split]]></category>

		<guid isPermaLink="false">http://www.bigheaddba.net/?p=506</guid>
		<description><![CDATA[一个朋友遇到点问题，想在mysql里把一段用固定符号分隔的字符串，按分隔符分别列出来。就是一个典型的split应用，但是mysql却没有自带这个函数，在网上搜了一把。可以通过自建函数来解决，以下的函数来自互联网。

DELIMITER $$
CREATE FUNCTION `func_get_split_string_total`&#40;
f_string varchar&#40;1000&#41;,f_delimiter varchar&#40;5&#41;
&#41; RETURNS int&#40;11&#41;
BEGIN
  return 1+&#40;length&#40;f_string&#41; - length&#40;replace&#40;f_string,f_delimiter,''&#41;&#41;&#41;;
END$$
DELIMITER ;
&#160;
&#160;
DELIMITER $$
CREATE FUNCTION `func_get_split_string`&#40;
f_string varchar&#40;1000&#41;,f_delimiter varchar&#40;5&#41;,f_order int&#41; RETURNS varchar&#40;255&#41; CHARSET utf8
BEGIN
  declare result varchar&#40;255&#41; default '';
  set result = reverse&#40;substring_index&#40;reverse&#40;substring_index&#40;f_string,f_delimiter,f_order&#41;&#41;,f_delimiter,1&#41;&#41;;
  return result;
END$$
DELIMITER ;

需要设置下参数：

SET GLOBAL log_bin_trust_function_creators = 1;

下面我们来测试下：

 CREATE TABLE &#34;t&#34; &#40;
    -&#62;   &#34;t1&#34; varchar&#40;100&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>一个朋友遇到点问题，想在mysql里把一段用固定符号分隔的字符串，按分隔符分别列出来。就是一个典型的split应用，但是mysql却没有自带这个函数，在网上搜了一把。可以通过自建函数来解决，以下的函数来自互联网。</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;">DELIMITER $$
<span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">FUNCTION</span> <span style="color: #008000;">`func<span style="color: #008080; font-weight: bold;">_</span>get<span style="color: #008080; font-weight: bold;">_</span>split<span style="color: #008080; font-weight: bold;">_</span>string<span style="color: #008080; font-weight: bold;">_</span>total`</span><span style="color: #FF00FF;">&#40;</span>
f_string <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">1000</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>f_delimiter <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">5</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">RETURNS</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">11</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">BEGIN</span>
  return <span style="color: #008080;">1</span><span style="color: #CC0099;">+</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">length</span><span style="color: #FF00FF;">&#40;</span>f_string<span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">-</span> <span style="color: #000099;">length</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">replace</span><span style="color: #FF00FF;">&#40;</span>f_string<span style="color: #000033;">,</span>f_delimiter<span style="color: #000033;">,</span><span style="color: #008000;">''</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
<span style="color: #009900;">END</span>$$
DELIMITER <span style="color: #000033;">;</span>
&nbsp;
&nbsp;
DELIMITER $$
<span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">FUNCTION</span> <span style="color: #008000;">`func<span style="color: #008080; font-weight: bold;">_</span>get<span style="color: #008080; font-weight: bold;">_</span>split<span style="color: #008080; font-weight: bold;">_</span>string`</span><span style="color: #FF00FF;">&#40;</span>
f_string <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">1000</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>f_delimiter <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">5</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>f_order <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">RETURNS</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">255</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">CHARSET</span> utf8
<span style="color: #990099; font-weight: bold;">BEGIN</span>
  <span style="color: #990099; font-weight: bold;">declare</span> result <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">255</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">default</span> <span style="color: #008000;">''</span><span style="color: #000033;">;</span>
  <span style="color: #990099; font-weight: bold;">set</span> result <span style="color: #CC0099;">=</span> <span style="color: #000099;">reverse</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">substring_index</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">reverse</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">substring_index</span><span style="color: #FF00FF;">&#40;</span>f_string<span style="color: #000033;">,</span>f_delimiter<span style="color: #000033;">,</span>f_order<span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>f_delimiter<span style="color: #000033;">,</span><span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
  return result<span style="color: #000033;">;</span>
<span style="color: #009900;">END</span>$$
DELIMITER <span style="color: #000033;">;</span></pre></div></div>

<p>需要设置下参数：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SET</span> <span style="color: #990099; font-weight: bold;">GLOBAL</span> log_bin_trust_function_creators <span style="color: #CC0099;">=</span> <span style="color: #008080;">1</span><span style="color: #000033;">;</span></pre></div></div>

<p>下面我们来测试下：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"> <span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #008000;">&quot;t&quot;</span> <span style="color: #FF00FF;">&#40;</span>
    <span style="color: #CC0099;">-&gt;</span>   <span style="color: #008000;">&quot;t1&quot;</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">100</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
    <span style="color: #CC0099;">-&gt;</span>   <span style="color: #008000;">&quot;t2&quot;</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">11</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span>
    <span style="color: #CC0099;">-&gt;</span> <span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ENGINE</span><span style="color: #CC0099;">=</span>MyISAM <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #FF9900; font-weight: bold;">CHARSET</span><span style="color: #CC0099;">=</span>utf8<span style="color: #000033;">;</span>
&nbsp;
mysql<span style="color: #CC0099;">&gt;</span> <span style="color: #990099; font-weight: bold;">insert</span> <span style="color: #990099; font-weight: bold;">into</span> t<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span>t2<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">values</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'a,b,c,d'</span><span style="color: #000033;">,</span><span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
Query OK<span style="color: #000033;">,</span> <span style="color: #008080;">1</span> row affected <span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">0.00</span> sec<span style="color: #FF00FF;">&#41;</span>
&nbsp;
mysql<span style="color: #CC0099;">&gt;</span> <span style="color: #990099; font-weight: bold;">insert</span> <span style="color: #990099; font-weight: bold;">into</span> t<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span>t2<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">values</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'a b c d'</span><span style="color: #000033;">,</span><span style="color: #008080;">2</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
Query OK<span style="color: #000033;">,</span> <span style="color: #008080;">1</span> row affected <span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">0.00</span> sec<span style="color: #FF00FF;">&#41;</span>
&nbsp;
mysql<span style="color: #CC0099;">&gt;</span> <span style="color: #990099; font-weight: bold;">select</span> <span style="color: #CC0099;">*</span> <span style="color: #990099; font-weight: bold;">from</span> t<span style="color: #000033;">;</span>
<span style="color: #CC0099;">+---------+------+</span>
<span style="color: #CC0099;">|</span> t1      <span style="color: #CC0099;">|</span> t2   <span style="color: #CC0099;">|</span>
<span style="color: #CC0099;">+---------+------+</span>
<span style="color: #CC0099;">|</span> a<span style="color: #000033;">,</span>b<span style="color: #000033;">,</span>c<span style="color: #000033;">,</span>d <span style="color: #CC0099;">|</span>    <span style="color: #008080;">1</span> <span style="color: #CC0099;">|</span> 
<span style="color: #CC0099;">|</span> a b c d <span style="color: #CC0099;">|</span>    <span style="color: #008080;">2</span> <span style="color: #CC0099;">|</span> 
<span style="color: #CC0099;">+---------+------+</span>
<span style="color: #008080;">2</span> rows <span style="color: #990099; font-weight: bold;">in</span> <span style="color: #990099; font-weight: bold;">set</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">0.00</span> sec<span style="color: #FF00FF;">&#41;</span></pre></div></div>

<p>首先用func_get_split_string_total函数得到符合匹配的数量</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;">mysql<span style="color: #CC0099;">&gt;</span> <span style="color: #990099; font-weight: bold;">select</span> func_get_split_string_total<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span><span style="color: #008000;">','</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">from</span> t <span style="color: #990099; font-weight: bold;">where</span> t2<span style="color: #CC0099;">=</span><span style="color: #008080;">1</span><span style="color: #000033;">;</span>
<span style="color: #CC0099;">+-------------------------------------+</span>
<span style="color: #CC0099;">|</span> func_get_split_string_total<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span><span style="color: #008000;">','</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">|</span>
<span style="color: #CC0099;">+-------------------------------------+</span>
<span style="color: #CC0099;">|</span>                                   <span style="color: #008080;">4</span> <span style="color: #CC0099;">|</span> 
<span style="color: #CC0099;">+-------------------------------------+</span>
<span style="color: #008080;">1</span> row <span style="color: #990099; font-weight: bold;">in</span> <span style="color: #990099; font-weight: bold;">set</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">0.00</span> sec<span style="color: #FF00FF;">&#41;</span></pre></div></div>

<p>然后用func_get_split_string得出你想要的字符串</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;">mysql<span style="color: #CC0099;">&gt;</span> <span style="color: #990099; font-weight: bold;">select</span> func_get_split_string<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span><span style="color: #008000;">','</span><span style="color: #000033;">,</span><span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">from</span> t <span style="color: #990099; font-weight: bold;">where</span> t2<span style="color: #CC0099;">=</span><span style="color: #008080;">1</span><span style="color: #000033;">;</span>
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #CC0099;">|</span> func_get_split_string<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span><span style="color: #008000;">','</span><span style="color: #000033;">,</span><span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">|</span>
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #CC0099;">|</span> a                               <span style="color: #CC0099;">|</span> 
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #008080;">1</span> row <span style="color: #990099; font-weight: bold;">in</span> <span style="color: #990099; font-weight: bold;">set</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">0.00</span> sec<span style="color: #FF00FF;">&#41;</span>
&nbsp;
mysql<span style="color: #CC0099;">&gt;</span> <span style="color: #990099; font-weight: bold;">select</span> func_get_split_string<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span><span style="color: #008000;">','</span><span style="color: #000033;">,</span><span style="color: #008080;">2</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">from</span> t <span style="color: #990099; font-weight: bold;">where</span> t2<span style="color: #CC0099;">=</span><span style="color: #008080;">1</span><span style="color: #000033;">;</span>
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #CC0099;">|</span> func_get_split_string<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span><span style="color: #008000;">','</span><span style="color: #000033;">,</span><span style="color: #008080;">2</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">|</span>
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #CC0099;">|</span> b                               <span style="color: #CC0099;">|</span> 
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #008080;">1</span> row <span style="color: #990099; font-weight: bold;">in</span> <span style="color: #990099; font-weight: bold;">set</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">0.00</span> sec<span style="color: #FF00FF;">&#41;</span>
&nbsp;
mysql<span style="color: #CC0099;">&gt;</span> <span style="color: #990099; font-weight: bold;">select</span> func_get_split_string<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span><span style="color: #008000;">','</span><span style="color: #000033;">,</span><span style="color: #008080;">3</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">from</span> t <span style="color: #990099; font-weight: bold;">where</span> t2<span style="color: #CC0099;">=</span><span style="color: #008080;">1</span><span style="color: #000033;">;</span>
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #CC0099;">|</span> func_get_split_string<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span><span style="color: #008000;">','</span><span style="color: #000033;">,</span><span style="color: #008080;">3</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">|</span>
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #CC0099;">|</span> c                               <span style="color: #CC0099;">|</span> 
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #008080;">1</span> row <span style="color: #990099; font-weight: bold;">in</span> <span style="color: #990099; font-weight: bold;">set</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">0.00</span> sec<span style="color: #FF00FF;">&#41;</span>
&nbsp;
mysql<span style="color: #CC0099;">&gt;</span> <span style="color: #990099; font-weight: bold;">select</span> func_get_split_string<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span><span style="color: #008000;">','</span><span style="color: #000033;">,</span><span style="color: #008080;">4</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">from</span> t <span style="color: #990099; font-weight: bold;">where</span> t2<span style="color: #CC0099;">=</span><span style="color: #008080;">1</span><span style="color: #000033;">;</span>
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #CC0099;">|</span> func_get_split_string<span style="color: #FF00FF;">&#40;</span>t1<span style="color: #000033;">,</span><span style="color: #008000;">','</span><span style="color: #000033;">,</span><span style="color: #008080;">4</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">|</span>
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #CC0099;">|</span> d                               <span style="color: #CC0099;">|</span> 
<span style="color: #CC0099;">+---------------------------------+</span>
<span style="color: #008080;">1</span> row <span style="color: #990099; font-weight: bold;">in</span> <span style="color: #990099; font-weight: bold;">set</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">0.00</span> sec<span style="color: #FF00FF;">&#41;</span></pre></div></div>

<p>当然，这只是个思路，如果你想把所有字符串都列出来，可以写个过程，在里面循环一下。</p>
<p>希望能对这位朋友有帮助。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bigheaddba.net/article/y2010/506_mysql%e5%ae%9e%e7%8e%b0split%e5%87%bd%e6%95%b0.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
