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

<channel>
	<title>Google Stop Blog - Make a change &#187; Database</title>
	<atom:link href="http://googlestop.com/blog/category/database/feed/" rel="self" type="application/rss+xml" />
	<link>http://googlestop.com/blog</link>
	<description>Just another weblog of Charry</description>
	<lastBuildDate>Sat, 07 Jan 2012 09:51:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>JDBC的批量更新测试</title>
		<link>http://googlestop.com/blog/2011/08/jdbc-batch-update/</link>
		<comments>http://googlestop.com/blog/2011/08/jdbc-batch-update/#comments</comments>
		<pubDate>Sun, 07 Aug 2011 03:34:10 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Database]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/?p=800</guid>
		<description><![CDATA[上回书说道MySQL的auto-reconnect的问题，可以通过重新建立Connection的方法解决之，于是我就更新了一下该数据库封装类。这里介绍一下背景：为了使用方便，一些小型项目中，我倾向于直接使用JDBC，这样执行效率和开发效率相对而言都比较高，而实际使用中，所有的数据库操作，都被封装在一个DatabaseFactory类中（有时间我会考虑一下，整理一下Open Source It）。 在修改这个类的过程中，顺便研究了下数据批量更新的效率问题，分析结果如下。由于对于不同的数据库，效果也不尽相同，这里以MySQL和Oracle为例，并分开描述： MySQL： MySQL本身并不支持批量更新，只是驱动程序提供了这个特性，只有高版本才支持该特性，并且连接URL上必须加上 rewriteBatchedStatements=true 这样的参数，这样驱动程序会自动将多条SQL语句拼接成一条，从而提高了执行效率。 ... for (int i = 0; i &#60; sqlList.size(); i++) { stmt.addBatch(sqlList.get(i)); } stmt.executeBatch(); connection.commit(); 效率提升是必然的，原因很简单：非批量更新方式，autoCommit=true，每一条SQL语句都会自动提交，都会产生网络数据包、磁盘IO。而批量更新方式，只会产生少量的数据包，因为很多条SQL语句被打成一个数据包，一次性的通过网络传输到服务器，相应的，服务器的IO操作也少了很多，当然效率自然会提高。 就是因为这个和网路相关，所以网络环境不同，产生的提升效果也不相同，经测试，在比较快速的网络环境下，比如局域网，我的试验结果是：10万条SQL语句，在非批量情况下，使用了约36秒，而批量操作只使用了约9秒，效率提高了3倍。 如果在比较差的网络环境下，提升的效果会更明显，我使用VPN从家里连接到公司的内网，更新1万条数据，非批量方式，大概需要270秒左右，而批量方式大约9秒，提升了近30倍。效率提升的倍数和很多因素相关，比如刚才提到的网络环境，每次提交多少条SQL语句也很关键，并且MySQL表的类型也会影响这个：MyISAM类型的表的提升效率就远远的高于InnoDB类型的表。 注：上述的所有的所有测试都没有使用Prepared Statement，只是使用普通的Statement和executeBatch()，如果使用Prepared Statement，几乎没有任何效率提升，后来发现是因为我用的mysql-connector-java的版本过低(5.1.8)，替换为5.1.17后，VPN状态，效率提升50倍左右。 Oracle： 和MySQL相反，Oracle使用批量更新，如果不使用Prepared Statement，效果可能会更差，使用了Prepared Statement，我用VPN连接到公司的内网，效率提高了75倍左右。可能是因为我用的Oracle JDBC驱动对非Prepared Statement的支持不够好吧。 MSSQL: 待测试，稍后更新&#8230; 小结 数据库更新的效率提升，由很多原因决定：网络环境，服务器内存、服务器I/O、驱动版本、代码编写方式、数据库的版本、表的类型等。我们必须综合考量所有因素，才能达到理想的效果。推荐你在你实际的环境中做相应的测试，找出最优的方法，别人的优化方法，不一定完全适用于你，比如这里提到的提升倍数，每个人的试验结果肯定不一样。]]></description>
			<content:encoded><![CDATA[<p>上回书说道MySQL的auto-reconnect的问题，可以通过重新建立Connection的方法解决之，于是我就更新了一下该数据库封装类。这里介绍一下背景：为了使用方便，一些小型项目中，我倾向于直接使用JDBC，这样执行效率和开发效率相对而言都比较高，而实际使用中，所有的数据库操作，都被封装在一个DatabaseFactory类中（有时间我会考虑一下，整理一下Open Source It）。</p>
<p>在修改这个类的过程中，顺便研究了下数据批量更新的效率问题，分析结果如下。由于对于不同的数据库，效果也不尽相同，这里以MySQL和Oracle为例，并分开描述：</p>
<h3>MySQL：</h3>
<p>MySQL本身并不支持批量更新，只是驱动程序提供了这个特性，只有高版本才支持该特性，并且连接URL上必须加上</p>
<pre>rewriteBatchedStatements=true</pre>
<p>这样的参数，这样驱动程序会自动将多条SQL语句拼接成一条，从而提高了执行效率。</p>
<pre>
...
for (int i = 0; i &lt; sqlList.size(); i++) {
stmt.addBatch(sqlList.get(i));
}

stmt.executeBatch();
connection.commit();
</pre>
<p>效率提升是必然的，原因很简单：非批量更新方式，autoCommit=true，每一条SQL语句都会自动提交，都会产生网络数据包、磁盘IO。而批量更新方式，只会产生少量的数据包，因为很多条SQL语句被打成一个数据包，一次性的通过网络传输到服务器，相应的，服务器的IO操作也少了很多，当然效率自然会提高。</p>
<p>就是因为这个和网路相关，所以网络环境不同，产生的提升效果也不相同，经测试，在比较快速的网络环境下，比如局域网，我的试验结果是：10万条SQL语句，在非批量情况下，使用了约36秒，而批量操作只使用了约9秒，效率提高了3倍。</p>
<p>如果<strong>在比较差的网络环境下，提升的效果会更明显</strong>，我使用VPN从家里连接到公司的内网，更新1万条数据，非批量方式，大概需要270秒左右，而批量方式大约9秒，提升了近30倍。效率提升的倍数和很多因素相关，比如刚才提到的网络环境，每次提交多少条SQL语句也很关键，并且MySQL表的类型也会影响这个：MyISAM类型的表的提升效率就远远的高于InnoDB类型的表。</p>
<p>注：上述的所有的所有测试都没有使用Prepared Statement，只是使用普通的Statement和executeBatch()，如果使用Prepared Statement，几乎没有任何效率提升，后来发现是因为我用的mysql-connector-java的版本过低(5.1.8)，替换为5.1.17后，VPN状态，效率提升50倍左右。</p>
<h3>Oracle：</h3>
<p>和MySQL相反，Oracle使用批量更新，如果不使用Prepared Statement，效果可能会更差，使用了Prepared Statement，我用VPN连接到公司的内网，效率提高了75倍左右。可能是因为我用的Oracle JDBC驱动对非Prepared Statement的支持不够好吧。</p>
<h3>MSSQL:</h3>
<p>待测试，稍后更新&#8230;</p>
<h3>小结</h3>
<p>数据库更新的效率提升，由很多原因决定：网络环境，服务器内存、服务器I/O、驱动版本、代码编写方式、数据库的版本、表的类型等。我们必须综合考量所有因素，才能达到理想的效果。<strong>推荐你在你实际的环境中做相应的测试，找出最优的方法</strong>，别人的优化方法，不一定完全适用于你，比如这里提到的提升倍数，每个人的试验结果肯定不一样。</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2011/08/jdbc-batch-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL的Connection自动断开问题</title>
		<link>http://googlestop.com/blog/2011/07/mysql-auto-reconnect-issue/</link>
		<comments>http://googlestop.com/blog/2011/07/mysql-auto-reconnect-issue/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 13:28:31 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Database]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/?p=795</guid>
		<description><![CDATA[MySQL缺省配置下，会自动断开那些idle超过8小时的Connection，如果应用程序保持这个连接，8个小时(wait_timeout=28800秒)后，用JDBC，再次访问数据库，会有异常抛出，据说用autoReconnect=true可以避免这个问题，不管你信不信，反正我信了，而且好多年前，我就这么做的。 直到最近，在一个鲜有人访问的应用中发现，问题依旧，8小时候后的第一次访问，总是失败，刷新一下页面，就正常了。Google了一下，才知道MySQL不推荐使用autoReconnect=true来解决此问题，http://bugs.mysql.com/bug.php?id=5020，如下： [12 Aug 2004 18:46] Mark Matthews Note: Autoreconnect functionality will be depcreated and eventually removed in future releases. The reason this isn't working for your particular case is that the methodolgy for autoreconnect was changed to be safer after 3.0.11, and is related to autoCommit state, which will also cause the current 'in-flight' [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL缺省配置下，会自动断开那些idle超过8小时的Connection，如果应用程序保持这个连接，8个小时(wait_timeout=28800秒)后，用JDBC，再次访问数据库，会有异常抛出，据说用autoReconnect=true可以避免这个问题，不管你信不信，反正我信了，而且好多年前，我就这么做的。</p>
<p>直到最近，在一个鲜有人访问的应用中发现，问题依旧，8小时候后的第一次访问，总是失败，刷新一下页面，就正常了。Google了一下，才知道MySQL不推荐使用autoReconnect=true来解决此问题，<a href="http://bugs.mysql.com/bug.php?id=5020">http://bugs.mysql.com/bug.php?id=5020</a>，如下：</p>
<div>[12 Aug 2004 18:46] Mark Matthews</div>
<pre>Note: Autoreconnect functionality will be depcreated and eventually removed in future
releases. 

The reason this isn't working for your particular case is that the methodolgy for
autoreconnect was changed to be safer after 3.0.11, and is related to autoCommit state,
which will also cause the current 'in-flight' transaction to fail (if you attempt your
transaction again _after_ the failure, the driver will reconnect). Please see the docs
for the explanation on how to correctly use this feature in the 'Troubleshooting'
section.

In any case, there is no 100% safe way that a JDBC driver can re-connect automatically if
a TCP/IP connection dies without risking corruption of the database 'state' (even _with_
transactional semantics), which is why this feature will eventually be removed.

The JDBC spec does not specify that a connection is alive no matter what happens to the
underlying network for this very reason. 

Clients of JDBC drivers are responsible for dealing with network failures, as only the
application itself (really the developer of the application) 'knows' what the 'correct'
response to a transaction failing due to the network going down is. 'Wait_timeout'
expiring on the server is basically a 'forced' network failure by the server. You can
correct this in a non-robust way by setting 'wait_timeout' higher, however, you as a
developer should be handling SQL exceptions in your code and taking appropriate recovery
actions, not just passing them up the call stack.</pre>
<p>解决也很简单，记录最近一次的Connection访问时间，如果超过了8小时，就重新建立这个连接，经验证是可行的。另外也可以在建立Connection的同时，创建一个线程定时的去执行一个SELECT 1语句，前面的方法比较简单。</p>
<p>这里要指出的是，用Connection的isValid()方法去检测Connection是否有效是不行的，程序会死在那里（未调查原因），试图用isClosed()去判断Connection是否断开也是行不通的，因为只有明确的调用了Connection的close()方法后，你才能用isClosed()去判断，也就是说Connection在idle超过8小时候后，这个时候你如果去打印它的isClosed()的值，它还是显示false，但实际上却不能使用。</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2011/07/mysql-auto-reconnect-issue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benchmarking Metrics for MySQL Data Purge</title>
		<link>http://googlestop.com/blog/2009/09/benchmarking-metrics-for-mysql-data-purge/</link>
		<comments>http://googlestop.com/blog/2009/09/benchmarking-metrics-for-mysql-data-purge/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 13:00:06 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Database]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/2009/09/benchmarking-metrics-for-mysql-data-purge/</guid>
		<description><![CDATA[MySQL是个非常优秀的免费数据库，下面是我周末做Data Purge的部分记录，可以用做将来的参考之用： 硬件：AMD Opteron 265 1.8G(Cache 1M), RAM:1G, HD: 350G，算是配置比较差的一台服务器。请注意，下面所提到的数据和您的服务器性能有很大的关系。 // Delete Data 2009-09-03 19:45:45 Start&#8230; Row Count: 46500394(46M) DELETE FROM atedata WHERE DATE &#60; &#8217;2009-06-01 00:00:00&#8242; Row Count: 22699749(22M) 2009-09-03 21:18:06 End&#8230; 从上面可以看出，删除数据是比较慢的操作，46M条的数据，删除到22M条，总共用了大概93分钟，大概255,921rows/min。删除操作所需时间主要和将要删除的数据量是成正比的，删除的记录数越多，所用的时间也越多。 // Optimize Table 2009-09-04 21:33:54 Start&#8230; Row Count: 23051455(23M) &#8211; 7.1GiB optimize table atedata Row Count: 23051455(23M) &#8211; 3.4GiB 2009-09-04 22:15:37 [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL是个非常优秀的免费数据库，下面是我周末做Data Purge的部分记录，可以用做将来的参考之用：</p>
<p>硬件：AMD Opteron 265 1.8G(Cache 1M), RAM:1G, HD: 350G，算是配置比较差的一台服务器。请注意，下面所提到的数据和您的服务器性能有很大的关系。</p>
<blockquote><p>// Delete Data<br />
2009-09-03 19:45:45 Start&#8230;<br />
Row Count: 46500394(46M)<br />
DELETE FROM atedata WHERE DATE &lt; &#8217;2009-06-01 00:00:00&#8242;<br />
Row Count: 22699749(22M)<br />
2009-09-03 21:18:06 End&#8230;</p></blockquote>
<p>从上面可以看出，删除数据是比较慢的操作，46M条的数据，删除到22M条，总共用了大概93分钟，大概255,921rows/min。<strong>删除操作所需时间主要和将要删除的数据量是成正比的</strong>，删除的记录数越多，所用的时间也越多。</p>
<blockquote><p>// Optimize Table<br />
2009-09-04 21:33:54 Start&#8230;<br />
Row Count: 23051455(23M) &#8211; <strong>7.1GiB<br />
</strong>optimize table atedata<br />
Row Count: 23051455(23M) &#8211; <strong>3.4GiB</strong><br />
2009-09-04 22:15:37 End&#8230;</p></blockquote>
<p>对于数据量比较大的表，比如超过1G，如果只是简单的用DELETE删除了数据，这些数据所占据的磁盘空间并没有被释放，在MySQL里我们称之为：Overhead。只有对表做了OPTIMIZE操作，才能真正的释放它。</p>
<p>从上面的数据可以看出，优化前，表大小是7.1G，优化后表大小为3.4G，表的记录数没有变化，用时42分钟，平均88MiB每分钟。<strong>该操作耗时大致和(Table Size – Overhead)的差成正比</strong>。对于那种比较大的表，千万不要删除了几百条记录就做Optimize操作，因为它太耗费时间了，我们可以累积到一定数量再做。</p>
<p>Optimize命令执行后，MySQL会生产一个临时的.TMD文件，MySQL的状态显示Repair by sorting，它其实就是优化后的表。这个过程很漫长，做完后，还有一步是重建索引，MySQL状态显示Repair with Keycache，结束的时候会有个.TMM的临时文件生成，它可能就是.MYI文件的拷贝，不过官方文档没有说明，只是猜测。</p>
<p>在创建索引文件的过程中(Repair with Keycache)，它的耗时和表的索引多少有很大的关系，我没有验证，但我们可以猜测：<strong>索引越多，这个过程就越长</strong>。</p>
<p>由于在表很大的情况下，做类似DELETE、OPTIMIZE、ALTER等操作，都是非常的耗时间，所以我们在设计系统的时候就需要提前考虑到：</p>
<ol>
<li>保存数据的时间长度</li>
<li>做Data Purge的周期、方法策略</li>
<li>数据备份的策略</li>
<li>Data Purge的过程中，系统该如何应对（<strong>以上操作都会造成MySQL被锁定，数据库无法使用</strong>）</li>
<li>等等</li>
</ol>
<p>如果数据量不大的话，另当别论。</p>
<p>[ad]</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2009/09/benchmarking-metrics-for-mysql-data-purge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Replication Setup</title>
		<link>http://googlestop.com/blog/2008/09/mysql-replication-setup/</link>
		<comments>http://googlestop.com/blog/2008/09/mysql-replication-setup/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 09:33:08 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Database]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/2008/09/12/mysql-replication-setup/</guid>
		<description><![CDATA[MySQL虽然是一款免费的服务器，但其功能和性能均表现不错，下面简单的介绍一下如何设置Replication Server，即主从热备份。这样做的好处之一是可以把比较耗资源的查询操作转移到从服务器上，从而提高系统整体性能。(比如，本文的background是：有一两百台producer服务器向master的MySQL进行查询和修改操作，并同时还有若干的外部系统(consumer)需要查询这个master数据库，为了分担master的loading，所以我们引入了一个或者多个slave，让外部的系统转而查询slave，达到某种意义上的负载均衡) 本操作的环境为： CentOS 5.2 MySQL-server-community-5.1.23-0.rhel4 需要同步的数据库por和misc中有旧的数据，如果是空的库，下面的操作就简单一些了。 这里待复制的两个库por和misc均使用MyISAM引擎 Step I： 首先编辑主服务器的my.cnf，下面是个例子： [mysqld] … log-bin=mysql-bin binlog-do-db=por binlog-do-db=misc binlog-ignore-db=mysql server-id=1   …     Replaction是基于log文件的，所以这里必须打开MySQL的log功能，log-bin参数指明log文件的前缀，binlog-do-db参数指明你要同步的数据库名，binlog-ignore-db指明你不想同步的数据库名(在本次安装方案中，有些多余，不过我没有测试去掉它会如何) 还有一个重要的是要设置master服务器的ID，也就是serer-id。接下来，在master上创建一个用户同步的用户： mysql&#62; GRANT REPLICATION SLAVE ON *.* -&#62; TO 'repl'@'%' IDENTIFIED BY 'this_is_your_password'; Step II 重启MySQL服务器，这样就会生成log文件，通常在/var/lib/mysql下，然后用root登录，执行如下命令 mysql&#62; FLUSH TABLES WITH READ LOCK; 这样做的目的是，让master服务器停止更新操作，可以为接下来的同步数据做一个干净的copy。 Step III 进入/var/lib/mysql 将你要同步的的数据库打包，比如这里为：por.tar和misc.tar 然后在MySQL命令行下执行： show master status; 系统提示： [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL虽然是一款免费的服务器，但其功能和性能均表现不错，下面简单的介绍一下如何设置Replication Server，即主从热备份。这样做的好处之一是可以把比较耗资源的查询操作转移到从服务器上，从而提高系统整体性能。(比如，本文的background是：有一两百台producer服务器向master的MySQL进行查询和修改操作，并同时还有若干的外部系统(consumer)需要查询这个master数据库，为了分担master的loading，所以我们引入了一个或者多个slave，让外部的系统转而查询slave，达到某种意义上的负载均衡)</p>
<p>本操作的环境为：</p>
<ul>
<li>CentOS 5.2</li>
<li>MySQL-server-community-5.1.23-0.rhel4</li>
<li>需要同步的数据库por和misc中有旧的数据，如果是空的库，下面的操作就简单一些了。</li>
<li>这里待复制的两个库por和misc均使用MyISAM引擎</li>
</ul>
<p>Step I：</p>
<p>首先编辑主服务器的my.cnf，下面是个例子：</p>
<blockquote><p>[mysqld]</p>
<p>…</p>
<p>log-bin=mysql-bin</p>
<p>binlog-do-db=por</p>
<p>binlog-do-db=misc</p>
<p>binlog-ignore-db=mysql</p>
<p>server-id=1</p>
<p> </p>
<p>…</p></blockquote>
<p> </p>
<p> </p>
<p>Replaction是基于log文件的，所以这里必须打开MySQL的log功能，log-bin参数指明log文件的前缀，binlog-do-db参数指明你要同步的数据库名，binlog-ignore-db指明你不想同步的数据库名(在本次安装方案中，有些多余，不过我没有测试去掉它会如何)</p>
<p>还有一个重要的是要设置master服务器的ID，也就是serer-id。接下来，在master上创建一个用户同步的用户：</p>
<blockquote>
<pre>mysql&gt; GRANT REPLICATION SLAVE ON *.*
    -&gt; TO 'repl'@'%' IDENTIFIED BY 'this_is_your_password';</pre>
</blockquote>
<p>Step II</p>
<p>重启MySQL服务器，这样就会生成log文件，通常在/var/lib/mysql下，然后用root登录，执行如下命令</p>
<blockquote>
<pre>mysql&gt; FLUSH TABLES WITH READ LOCK;</pre>
</blockquote>
<p>这样做的目的是，让master服务器停止更新操作，可以为接下来的同步数据做一个干净的copy。</p>
<p>Step III</p>
<p>进入/var/lib/mysql 将你要同步的的数据库打包，比如这里为：por.tar和misc.tar</p>
<p>然后在MySQL命令行下执行：</p>
<blockquote><p>show master status;</p></blockquote>
<p>系统提示：</p>
<blockquote><p>mysql&gt; show master status;</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>| File | Position | Binlog_Do_DB | Binlog_Ignore_DB        |</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>| mysql-bin.000001 | 106| por,misc,por,misc | mysql,mysql |</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>1 row in set (0.00 sec)</p></blockquote>
<p>这时候你就可以解除锁定了：</p>
<blockquote>
<pre>mysql&gt; UNLOCK TABLES;</pre>
</blockquote>
<p>Step IV：</p>
<p>下面开始设置slave server</p>
<p>编辑slave 的my.cnf如下：</p>
<blockquote><p>[mysqld]</p>
<p>…</p>
<p>server-id=2</p>
<p>master-host=165.204.233.38</p>
<p>master-user=repl</p>
<p>master-password=this_is_your_password</p>
<p>master-port=3306</p>
<p>master-connect-retry=60</p>
<p>…</p></blockquote>
<p>Step V:</p>
<p>重启Slave，用root登录，执行如下命令：</p>
<blockquote><p>&gt;stop slave;</p>
<p>&gt; change master to</p>
<p>-&gt; master_host=&#8217;165.204.233.38&#8242;,</p>
<p>-&gt; master_user=&#8217;repl&#8217;,</p>
<p>-&gt; master_password=&#8217;this_is_your_password&#8217;,</p>
<p>-&gt; master_log_file=&#8217;mysql-bin.000001&#8242;, // 注意这里的文件名就是上面提到的 show master status中显示的文件名</p>
<p>-&gt; master_log_pos=106;                       // 注意这里的便宜值就是上面提到的 show master status中显示的偏移值</p>
<p>&gt; slave start;</p></blockquote>
<p>完毕。</p>
<p> </p>
<p>测试一下吧，在master里面建一个新的table，看看是否在slave中出现。</p>
<p>附录：</p>
<ol>
<li>如果你同步不成功，请查看MySQL的日志 缺省位于：/var/log/mysqld.log</li>
<li>最好主从服务器使用同一版本的MySQL</li>
<li>这里所配置的只是Replication Server，不是MySQL Cluster，不要混为一谈</li>
</ol>
<p>[ad]</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2008/09/mysql-replication-setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

