<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[阿权的书房]]></title> 
<link>http://www.aslibra.com/blog/index.php</link> 
<description><![CDATA[技术经验分享，资料收集，偶尔晾几张相片，感言生活]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[阿权的书房]]></copyright>
<item>
<link>http://www.aslibra.com/blog/post/mysql_replicate_database.php</link>
<title><![CDATA[mysql如何仅仅同步一个数据库]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Tue, 31 Aug 2010 11:57:41 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/mysql_replicate_database.php</guid> 
<description>
<![CDATA[ 
	此需求的可能性：<br/><br/>做所有的数据库同步需要很多无用的空间，如果仅仅用到其中一个数据库，那就做一个数据库的同步就足够了。<br/><br/><strong>步骤一 主数据库开通replication用户</strong><br/><br/>按需求不一样名称和密码以及IP不同：<br/><div class="code">CREATE USER &#039;slave&#039;@&#039;192.168.1.2&#039; IDENTIFIED BY &#039;***&#039;;<br/>GRANT REPLICATION SLAVE ON * . * TO &#039;slave&#039;@&#039;192.168.1.2&#039; IDENTIFIED BY &#039;***&#039; WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;</div><br/><br/><strong>步骤二 取得当前数据备份，备份mysql库和你要的database2</strong><br/><br/>方式1 从master取得<br/><br/><div class="code">FLUSH TABLES WITH READ LOCK; //锁定所有表<br/>show master status; //取得当前日志点<br/>//打包文件或者是直接导出数据，比停止服务好的地方就是有一段读数据库的时间<br/>unlock tables; //解锁</div><br/><br/>方式2 从只读的slave取得（假设可以暂停同步一些时间）<br/><div class="code">slave stop; //先停止同步<br/>show slave status; //取得当前日志点<br/>//打包文件或者是直接导出数据<br/>slave start; //解锁</div><br/><br/>注：日志点要拿到如下信息：<br/>Master_Log_File: mysql-bin.000019<br/>Read_Master_Log_Pos: 154055761<br/><br/>注：全部是MyISAM的表，可以直接打包<br/>如果不需要同步用户权限，那mysql库可以忽略了<br/><br/><div class="code">tar cfz tmp.tgz /path/to/mysql /path/to/database2</div><br/><br/><strong>步骤三 安装好mysql，覆盖此两份数据库文件到var目录</strong><br/><br/><strong>步骤四 配置mysql</strong><br/><br/>比普通的slave配置多写两行，意为同步database2，其它都忽略<br/><br/><div class="code">replicate-do-db=database2<br/>replicate_wild_ignore_table=%.%</div><br/><br/>如果没有加上忽略的表，那会导致类似的错误发生，即当前处于'database2'，而操作'database1'的数据会出错，因为没有该数据库：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">100831 11:07:49 [ERROR] Slave SQL: Error 'Table 'database1.feed' doesn't exist' on query. Default database: 'database2'. Query: 'insert into database1.feed set appid=1,url='http://www.aslibra.com/'', Error_code: 1146</div></div><br/><br/><strong>步骤五 开始同步</strong><br/><br/><div class="code">CHANGE MASTER TO<br/>MASTER_HOST=&#039;192.168.1.4&#039;,<br/>MASTER_PORT=3306,<br/>MASTER_USER=&#039;slave&#039;,<br/>MASTER_PASSWORD=&#039;slave&#039;,<br/>MASTER_LOG_FILE=&#039;mysql-bin.000019&#039;,<br/>MASTER_LOG_POS=154055761;<br/>slave start;</div><br/><br/><strong>参考阅读：</strong><br/><br/>1 关于没有忽略别的表而产生的问题 <a href="http://www.itlearner.com/article/4440" target="_blank">小心使用replicate_do_db和replicate_ignore_db</a><br/>2 关于同步的忽略表的检查顺序 <a href="http://www.cublog.cn/u2/70049/showart_2061642.html" target="_blank">mysql数据库镜像配置</a> <br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://www.aslibra.com/blog/go.php/tags/replicate/" rel="tag">replicate</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/mysql_support_files.php</link>
<title><![CDATA[Mysql的几个默认配置]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Thu, 04 Mar 2010 14:37:38 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/mysql_support_files.php</guid> 
<description>
<![CDATA[ 
	mysql的安装目录里有support-files，里面有几份默认的配置<br/>分别是 huge large medium 等，还有高压力的InnoDB的参考：<br/><br/>[root@aslibra support-files]# grep -v ^# my-huge.cnf<br/>key_buffer = 384M<br/>table_cache = 512<br/>sort_buffer_size = 2M<br/>read_buffer_size = 2M<br/>read_rnd_buffer_size = 8M<br/>myisam_sort_buffer_size = 64M<br/>thread_cache_size = 8<br/>query_cache_size = 32M<br/>thread_concurrency = 8<br/><br/>[root@aslibra support-files]# grep -v ^# my-large.cnf<br/>key_buffer = 256M<br/>table_cache = 256<br/>sort_buffer_size = 1M<br/>read_buffer_size = 1M<br/>read_rnd_buffer_size = 4M<br/>myisam_sort_buffer_size = 64M<br/>thread_cache_size = 8<br/>query_cache_size= 16M<br/>thread_concurrency = 8<br/><br/>[root@aslibra support-files]# grep -v ^# my-medium.cnf<br/>key_buffer = 16M<br/>table_cache = 64<br/>sort_buffer_size = 512K<br/>net_buffer_length = 8K<br/>read_buffer_size = 256K<br/>read_rnd_buffer_size = 512K<br/>myisam_sort_buffer_size = 8M<br/><br/>[root@aslibra support-files]# cat my-innodb-heavy-4G.cnf&#124;grep -v ^#&#124;grep -v "^$"<br/>back_log = 50<br/>max_connections = 100<br/>max_connect_errors = 10<br/>table_cache = 2048<br/>max_allowed_packet = 16M<br/>binlog_cache_size = 1M<br/>max_heap_table_size = 64M<br/>sort_buffer_size = 8M<br/>join_buffer_size = 8M<br/>thread_cache_size = 8<br/>thread_concurrency = 8<br/>query_cache_size = 64M<br/>query_cache_limit = 2M<br/>ft_min_word_len = 4<br/>default_table_type = MYISAM<br/>thread_stack = 192K<br/>transaction_isolation = REPEATABLE-READ<br/>tmp_table_size = 64M<br/>log-bin=mysql-bin<br/>log_slow_queries<br/>long_query_time = 2<br/>log_long_format<br/>server-id = 1<br/>key_buffer_size = 32M<br/>read_buffer_size = 2M<br/>read_rnd_buffer_size = 16M<br/>bulk_insert_buffer_size = 64M<br/>myisam_sort_buffer_size = 128M<br/>myisam_max_sort_file_size = 10G<br/>myisam_max_extra_sort_file_size = 10G<br/>myisam_repair_threads = 1<br/>myisam_recover<br/><br/>一般情况下，自己根据机器的情况，复制一份到默认的配置文件的位置，替代默认配置<br/>比如纯数据库的机器，有1-2G以上的内存，可以拷贝huge的那份，要不然默认配置效率不高，比如查询时容易用到磁盘做临时文件，这份可以提高内存的使用率。<br/><br/><strong>对比一下几份配置的同一参数：</strong><br/><br/>key_buffer = 16M<br/>key_buffer = 256M<br/>key_buffer = 384M<br/>myisam_sort_buffer_size = 8M<br/>myisam_sort_buffer_size = 64M<br/>myisam_sort_buffer_size = 64M<br/>myisam_sort_buffer_size = 128M<br/>query_cache_size= 16M<br/>query_cache_size = 32M<br/>query_cache_size = 64M<br/>read_buffer_size = 256K<br/>read_buffer_size = 1M<br/>read_buffer_size = 2M<br/>read_buffer_size = 2M<br/>read_rnd_buffer_size = 512K<br/>read_rnd_buffer_size = 4M<br/>read_rnd_buffer_size = 8M<br/>read_rnd_buffer_size = 16M<br/>sort_buffer_size = 512K<br/>sort_buffer_size = 1M<br/>sort_buffer_size = 2M<br/>sort_buffer_size = 8M<br/>table_cache = 64<br/>table_cache = 256<br/>table_cache = 512<br/>table_cache = 2048<br/><br/>没有细节的技术可以解析，细节信息还是得查资料，这里只是列举对比一下，也许可以提醒大家使用内存和修改配置来优化mysql<br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/mysql/" rel="tag">mysql</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/mysql_slave_server_id_uniq.php</link>
<title><![CDATA[小心mysql的server-id]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Wed, 30 Dec 2009 09:59:52 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/mysql_slave_server_id_uniq.php</guid> 
<description>
<![CDATA[ 
	<strong>案例：</strong><br/><br/>希望增加一台只读的从数据库，已经有主从配置。<br/>这里就不必停止主服务器做主从了，从服务器拷贝一份就直接能够处理。<br/><br/><strong>方法：</strong><br/><br/>先停止从服务器的同步 slave stop<br/>这样，从服务器就是处于一个没有更新的且只读的状态，如果没有inodb类型的，那整个数据库文件夹拷贝一份就可以了，我的配置文件在此文件夹里。<br/>拷贝完毕，执行 slave start 继续同步。<br/><br/><strong>启用另外一台：</strong><br/><br/>把拷贝的那份放另外一个机器上运行，能够正常运行，没有太留意问题。<br/>正常状态应该是在主服务器看到slave的进程的状态是：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">Has sent all binlog to slave; waiting for binlog to be updated</div></div><br/>比较奇怪的是，我有三台slave，只有两个进程看的到，另外一台的进程看不到。<br/>在另外一台上查看状态是<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">Queueing master event to the relay log</div></div><br/>还非常奇怪，一直都是这个状态，明显可以检查出来，数据更新延后了，半天时间过去了也这样。<br/><br/><strong>问题所在：</strong><br/><br/>想起来配置文件没有修改，server-id是一样的，这个可能是问题。<br/>遂修改所有slave服务器为唯一的id，问题解决。<br/>三个slave的进程都在主服务器进程，状态都是<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">Has sent all binlog to slave; waiting for binlog to be updated</div></div><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/mysql/" rel="tag">mysql</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/Amoeba_for_Mysql_problems.php</link>
<title><![CDATA[Amoeba for Mysql 试用小结]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Mon, 18 May 2009 13:35:29 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/Amoeba_for_Mysql_problems.php</guid> 
<description>
<![CDATA[ 
	最近在生产环境使用了amoeba，发现一些问题：<br/><br/>1 sql语句不支持，产生大量错误日志<br/>2 有重复执行的迹象，发生数据重复插入到master，还不确定这问题是否amoeba的问题<br/>3 读写分离会在master出现读进程<br/><br/>第二点，就目前的使用情况而言，amoeba还是很稳定的，只是不太清楚是什么问题，如果重复插入数据的问题不是amoeba产生的，那对于应用而言没有错误发生。<br/><br/>对于第一点和第三点，我觉得是这么一个过程：<br/><br/>1 读写分离时会分析sql语句<br/>2 如果语句属于检查范围的则正常进行读写判断，读操作发送到writePool，写操作发送至readPool，未知的sql语句则发送至defaultPool<br/>3 一般defaultPool和写操作是master，所以在master发现select语句很正常，肯定是判断不出来的语句<br/><br/>sql出现的问题比较多，在log里面有找到以下性质的语句错误记录：<br/><br/><div class="code">1 TRUNCATE TABLE XXX<br/>2 EXPLAIN XXX<br/>3 SELECT * FROM xx FORCE INDEX (xx)<br/>4 insert into xx values(&#039;&#92;&#039;test&#92;&#039;&#039;) 转义的单引号<br/>5 order by rand()</div><br/><br/>希望amoeba可以正常运行，不产生第二点错误就很满意了。<br/>对于读操作，使用amoeba肯定是不错。<br/><br/>另外，master重启可能导致主从同步会不太稳定，多个从服务器的话比较长的时间才能稳定下来。<br/>比较经常出现“Queueing master event to the relay log”，slave进程都没有持续，可能导致更新不够及时。<br/><br/>@20100105 补充：以上可能是<a href="http://www.aslibra.com/blog/post/mysql_slave_server_id_uniq.php" target="_blank">server-id的问题，参考这里</a><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/amoeba/" rel="tag">amoeba</a> , <a href="http://www.aslibra.com/blog/go.php/tags/mysql/" rel="tag">mysql</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/amoeba_mysql_proxy_rw_split.php</link>
<title><![CDATA[amoeba-mysql的安装使用和读写分离]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Wed, 13 May 2009 13:26:47 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/amoeba_mysql_proxy_rw_split.php</guid> 
<description>
<![CDATA[ 
	amoeba真的是不错的稳定而灵活的数据库解决方案，阿里巴巴的技术陈思儒开始的一个开源项目，它是分布式数据库Proxy解决方案。<br/><br/><a href="http://amoeba.meidusa.com/wordpress/?page_id=2" target="_blank">About Amoeba </a><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">Amoeba(变形虫)项目，专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户<br/>端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请<br/>求多台数据库合并结果。<br/>主要解决：<br/>* 降低 数据切分带来的复杂多数据库结构<br/>* 提供切分规则并降低 数据切分规则 给应用带来的影响<br/>* 降低db 与客户端的连接数<br/>* 读写分离<br/>* 制定一种规则可支持DB线性扩容<br/><br/>目前在amoeba 框架上面已经实现了 amoeba for mysql.</div></div><br/><br/><strong>找寻到amoeba是出于想要做读写分离，目前可以有三种解决方式：</strong><br/><br/>1 程序修改mysql操作类<br/>可以参考<a href="http://code.google.com/p/mysql-rw-php/" target="_blank">PHP实现的Mysql读写分离</a>，阿权开始的本项目，以php程序解决此需求。<br/>优点：直接和数据库通信，简单快捷的读写分离和随机的方式实现的负载均衡，权限独立分配<br/>缺点：自己维护更新，增减服务器在代码处理<br/><br/>2 amoeba<br/>参考官网：<a href="http://amoeba.meidusa.com/" target="_blank">http://amoeba.meidusa.com/</a><br/>优点：直接实现读写分离和负载均衡，不用修改代码，有很灵活的数据解决方案<br/>缺点：自己分配账户，和后端数据库权限管理独立，权限处理不够灵活<br/><br/>3 mysql-proxy<br/>参考 <a href="http://dev.mysql.com/downloads/mysql-proxy/index.html" target="_blank">mysql-proxy</a>。<br/>优点：直接实现读写分离和负载均衡，不用修改代码，master和slave用一样的帐号<br/>缺点：字符集问题，lua语言编程，还只是alpha版本，时间消耗有点高<br/><br/>如果你不能安装软件来解决读写分离，那可以尝试阿权的项目解决思路。<br/>如果你可以安装软件，那amoeba是不错的，mysql-proxy不太建议，目前只有alpha版本，效率还不太理想，amoeba目前在阿里巴巴是内部项目，正在生产环境使用的。<br/><br/><strong>amoeba的安装使用</strong><br/><br/>1 安装java环境，需要Java SE 1.5 或以上<br/>2 配置xml文件<br/><br/>下载地址: <a href="http://www.sf.net/projects/amoeba" target="_blank">http://www.sf.net/projects/amoeba</a><br/>解压就可以使用的，顺便说一下，打包的习惯似乎不是太好，最好解压后是自己的文件夹<br/><br/>运行很简单 bin/amoeba 即可，后台运行 bin/amoeba &<br/>如果没有配置JAVA_HOME，则会有如下提示:<br/><br/><div class="code">&#91;root@aslibra amoeba-mysql&#93;# bin/amoeba<br/>Error: JAVA_HOME environment variable is not set.</div><br/><br/>如果你是比1.5低，比如1.4的，运行会有错误提示:<br/><br/><div class="code">&#91;root@aslibra amoeba-mysql&#93;# bin/amoeba <br/>Exception in thread &quot;main&quot; java.lang.UnsupportedClassVersionError: com/meidusa/amoeba/mysql/server/MysqlProxyServer (Unsupported major.minor version 49.0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at java.lang.ClassLoader.defineClass0(Native Method)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at java.lang.ClassLoader.defineClass(ClassLoader.java:539)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)<br/>.....</div><br/><br/>安装配置java环境对于不玩java的人不太熟悉，我也不是行家，把自己的配置过程作一下分享：<br/><br/>首先根据你的操作系统下载相应的文件，比如jdk-1.5.0，文件下载地址：<br/><a href="http://java.sun.com/javase/downloads/index.jsp" target="_blank">http://java.sun.com/javase/downloads/index.jsp</a><br/><br/>下载回来的是bin文件，加执行属性，然后执行后就能有一个rpm文件，然后安装即可：<br/><br/><div class="code">&#91;root@aslibra amoeba-mysql&#93;# rpm -ivh jdk-1_5_0_15-linux-i586.rpm <br/>Preparing...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;########################################### &#91;100%&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package jdk-1.5.0_15-fcs is already installed</div><br/><br/><strong>配置JAVA_HOME变量：</strong><br/><br/><div class="code">&#91;root@aslibra amoeba-mysql&#93;# cd /usr/java/<br/>&#91;root@aslibra java&#93;# ll<br/>total 16<br/>drwxr-xr-x&nbsp;&nbsp;8 root root 4096 Apr 27 17:50 j2sdk1.4.2_15<br/>lrwxrwxrwx&nbsp;&nbsp;1 root root&nbsp;&nbsp; 13 Apr 27 17:52 jdk -&gt; j2sdk1.4.2_15<br/>drwxr-xr-x&nbsp;&nbsp;9 root root 4096 May 13 09:14 jdk1.5.0_15<br/>&#91;root@aslibra java&#93;# rm jdk<br/>rm: remove symbolic link `jdk&#039;? y<br/>&#91;root@aslibra java&#93;# ln -s jdk1.5.0_15/ jdk<br/>&#91;root@aslibra java&#93;# ll<br/>total 16<br/>drwxr-xr-x&nbsp;&nbsp;8 root root 4096 May 13 09:20 j2sdk1.4.2_15<br/>lrwxrwxrwx&nbsp;&nbsp;1 root root&nbsp;&nbsp; 12 May 13 09:21 jdk -&gt; jdk1.5.0_15/<br/>drwxr-xr-x&nbsp;&nbsp;9 root root 4096 May 13 09:14 jdk1.5.0_15</div><br/><br/>可以编辑 /etc/profile以便启动时变量生效，末尾加上<br/><br/><div class="code">##############&nbsp;&nbsp;java&nbsp;&nbsp;###########<br/><br/>JAVA_HOME=/usr/java/jdk<br/>PATH=$PATH:JAVA_HOME/bin<br/>export JAVA_HOME PATH</div><br/><br/>依次运行此三句，配置好xml后，即可立刻使用amoeba：<br/><br/><div class="code">&#91;root@aslibra amoeba-mysql&#93;# bin/amoeba<br/>log4j:WARN log4j config load completed from file:/Data/apps/amoeba-mysql/conf/log4j.xml<br/>log4j:WARN ip access config load completed from file:/Data/apps/amoeba-mysql/conf/access_list.conf<br/>2009-05-13 09:22:04,306 INFO&nbsp;&nbsp;net.ServerableConnectionManager - Server listening on /192.168.1.5:9306.</div><br/><br/><strong>配置amoeba：</strong><br/><br/>conf/amoeba.xml 配置mysql数据库，简单说明一下：<br/><br/>1 server节点定义amoeba为接受client访问的数据库，可以当作是mysql看待的，用户名和密码是访问时使用的，这个似乎不能定义多个用户名密码，也就是只有一个权限控制，这个对于多应用似乎不大方便。<br/>2 dbServerList里面可以定义很多实际的mysql数据库，增加dbServer节点即可，这里的用户名密码是作为amoeba操作数据库使用的，要有足够权限。dbServer可以是虚拟的，比如要做负载均衡时可用定义多个数据库归属到此虚拟数据库。<br/>3 queryRouter节点定义读写的分配情况，也就是读写该发往那个dbServer。<br/><br/>读写分离的配置示例片段：<br/><br/><div class="code">&lt;dbServerList&gt;<br/>&nbsp;&nbsp;&lt;dbServer name=&quot;master&quot;&gt;<br/>&nbsp;&nbsp;....<br/>&nbsp;&nbsp;&lt;/dbServer&gt;<br/>&nbsp;&nbsp;&lt;dbServer name=&quot;slave1&quot;&gt;<br/>&nbsp;&nbsp;....<br/>&nbsp;&nbsp;&lt;/dbServer&gt;<br/>&nbsp;&nbsp;&lt;dbServer name=&quot;slave2&quot;&gt;<br/>&nbsp;&nbsp;....<br/>&nbsp;&nbsp;&lt;/dbServer&gt;<br/>&nbsp;&nbsp;&lt;dbServer name=&quot;slave3&quot;&gt;<br/>&nbsp;&nbsp;....<br/>&nbsp;&nbsp;&lt;/dbServer&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&lt;dbServer name=&quot;multiPool&quot; virtual=&quot;true&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;poolConfig class=&quot;com.meidusa.amoeba.server.MultipleServerPool&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&quot;loadbalance&quot;&gt;1&lt;/property&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&quot;poolNames&quot;&gt;slave1,slave2,slave3&lt;/property&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/poolConfig&gt;<br/>&nbsp;&nbsp;&lt;/dbServer&gt;<br/>&lt;/dbServerList&gt;&nbsp;&nbsp;<br/>&lt;queryRouter class=&quot;com.meidusa.amoeba.mysql.parser.MysqlQueryRouter&quot;&gt;<br/>&nbsp;&nbsp;&lt;property name=&quot;LRUMapSize&quot;&gt;1500&lt;/property&gt;<br/>&nbsp;&nbsp;&lt;property name=&quot;defaultPool&quot;&gt;master&lt;/property&gt;<br/>&nbsp;&nbsp;&lt;property name=&quot;writePool&quot;&gt;master&lt;/property&gt;<br/>&nbsp;&nbsp;&lt;property name=&quot;readPool&quot;&gt;multiPool&lt;/property&gt;<br/>&lt;/queryRouter&gt;</div><br/><br/>另外一个需要修改一下的是 conf/log4j.xml，定义日志内容：<br/><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">在可用性测试已经完成的情况下，建议将log4j.xml 中关于日志输出level为debug的全部设置成warn或者error 级别。<br/>日志是非常消耗系统性能的，在没有必要的情况下可以不使用debug。</div></div><br/>参考：<a href="http://amoeba.meidusa.com/wordpress/?p=14" target="_blank">关于amoeba 性能测试注意的几点</a><br/><br/>不算复杂的处理就完成了amoeba的配置和使用了，更加复杂的应用请参考官网介绍资料：<br/>amoeba 中文文档下载地址：<a href="http://amoeba.meidusa.com/amoeba.pdf" target="_blank">http://amoeba.meidusa.com/amoeba.pdf</a><br/><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://www.aslibra.com/blog/go.php/tags/amoeba/" rel="tag">amoeba</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/mysql_log_slow_queries.php</link>
<title><![CDATA[Mysql记录长时间的查询]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Mon, 11 May 2009 13:10:56 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/mysql_log_slow_queries.php</guid> 
<description>
<![CDATA[ 
	记录长时间的查询很有必要，这个对检查问题发生的原因有很大帮助，因为一般是长时间的查询会导致排队严重或者导致表锁定。<br/><br/>在配置文件里面加上几句即可：<br/><br/><div class="code">long_query_time = 2<br/>log_slow_queries = slow_queries<br/>#log_queries_not_using_indexes = true</div><br/><br/>看字面即可理解设置的含义了，设置多长时间算是长时间的查询，设置日志名称，最后是否记录没有使用索引的查询。<br/><br/>日志名称如果是用/开头的，要注意日志写入权限，否则会出错。用一个名称则会放置在数据库目录var内。<br/>没有使用索引的查询可能会很多，如果有必要那可以记录，但日志会出现好多<br/><br/>分析日志主要是查找到哪些查询占用时间比较长，这样可以优化数据库和程序。<br/><br/>比如如下日志片段：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content"># Time: 090511 11:57:19<br/># User@Host: user[password] @&nbsp;&nbsp;[192.168.1.2]<br/># Query_time: 5&nbsp;&nbsp;Lock_time: 0&nbsp;&nbsp;Rows_sent: 10&nbsp;&nbsp;Rows_examined: 414839<br/>SELECT (XXXX省略) ORDER BY s.friendnum DESC LIMIT 0,10;</div></div><br/><br/>最简单的改善方案是给该表的 friendnum 字段加索引。<br/><br/>日志分析没有做过，可以参考一下别人写的工具介绍：<a href="http://www.javaeye.com/topic/242516" target="_blank">五款常用mysql slow log分析工具的比较</a><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/mysql/" rel="tag">mysql</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/mysql_select_db_slave_uchome_error.php</link>
<title><![CDATA[没有使用指定数据库会导致mysql同步失败]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Mon, 11 May 2009 10:34:50 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/mysql_select_db_slave_uchome_error.php</guid> 
<description>
<![CDATA[ 
	一直有一个数据库没有同步的，非常的奇怪。<br/><br/>1 重新做一次同步，其它数据库都同步正常，唯独此数据库不同步<br/>2 在phpmyadmin上操作，是可以正常同步到slave<br/><br/>由此可以大概判断是程序上可能有点问题了，可能是使用上的问题。<br/><br/>程序是uchome1.5版本的，经过检查，是数据库操作是没有选择相应的数据库：<br/><br/>文件：uc_client/model/base.php<br/><br/><div class="code">/**<br/> * 实例化数据库类<br/> *<br/> */<br/>function init_db() &#123;<br/>&nbsp;&nbsp;require_once UC_ROOT.&#039;lib/db.class.php&#039;;<br/>&nbsp;&nbsp;$this-&gt;db = new db();<br/>&nbsp;&nbsp;$this-&gt;db-&gt;connect(UC_DBHOST, UC_DBUSER, UC_DBPW, &#039;&#039;, UC_DBCHARSET, UC_DBCONNECT, UC_DBTABLEPRE);<br/>&#125;</div><br/><br/>上面居然强制传了空的数据库名称，所以导致程序没有操作选择数据库：<br/>文件：uc_client/lib/db.class.php<br/><br/><div class="code">function connect($dbhost, $dbuser, $dbpw, $dbname = &#039;&#039;, $dbcharset = &#039;&#039;, $pconnect = 0, $tablepre=&#039;&#039;, $time = 0) &#123;<br/>&nbsp;&nbsp;//省略部分代码<br/>&nbsp;&nbsp;if($dbname) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;mysql_select_db($dbname, $this-&gt;link);<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;</div><br/><br/>没有dbname，所以没有进行mysql_select_db操作导致master没有记录，从而没有参与同步到slave。<br/>小修改即可：<br/><br/><div class="code">$this-&gt;db-&gt;connect(UC_DBHOST, UC_DBUSER, UC_DBPW, UC_DBNAME, UC_DBCHARSET, UC_DBCONNECT, UC_DBTABLEPRE);</div><br/><br/>这样就修复了程序的错误，重新处理同步即可。<br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://www.aslibra.com/blog/go.php/tags/uchome/" rel="tag">uchome</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/mysql_database_transfer_hotcopy_dump.php</link>
<title><![CDATA[Mysql数据库转移]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Wed, 15 Apr 2009 13:55:43 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/mysql_database_transfer_hotcopy_dump.php</guid> 
<description>
<![CDATA[ 
	在使用中的环境如何在尽量少影响的情况下做数据库转移，这个有很多问题需要注意的，需要考虑周全。<br/>这次要转移的数据库是MyISAM，转移起来比较简单，但目标数据库是Master-Slave方式的，所以转移起来需要注意：<br/><br/>1 转移到Master时，Master-Slave的数据应该是一样的，否则会导致同步出问题<br/>2 转移到Master时，切换时间尽可能短<br/><br/><strong>转移过程大概有以下阶段：</strong><br/><br/>1 导出当前数据库的数据<br/>2 导入到新的数据库<br/>3 更改连接数据库的方式<br/><br/><strong>第一阶段有好多方式:</strong><br/><br/>1 导出sql文件mysqldump<br/>&nbsp;&nbsp;适合数据不多而且有InnoDB的数据表的情况。<br/><div class="code">mysqldump -S /Data/mysqldb/3306/mysql.sock -uusername -ppassword aslibra&gt;backup.sql<br/>-S 是sock文件的位置</div><br/>2 复制数据库mysqlhotcopy<br/>&nbsp;&nbsp;适合MyISAM数据表<br/><div class="code">mysqlhotcopy -S /Data/mysqldb/3306/mysql.sock -u username -p password --addtodest aslibra /backup/mysql/<br/>-S 是sock文件的位置<br/>--addtodest 是覆盖现有数据库文件<br/>会复制一份在/backup/mysql/aslibra/XXX</div><br/>3 停止数据库，直接复制文件<br/>&nbsp;&nbsp;适合懒人不怕停止服务的情况<br/><br/><strong>第二阶段主要看你选择的第一阶段了：</strong><br/><br/>1 导入sql文件<br/><div class="code">mysql -S /Data/mysqldb/3306/mysql.sock -uusername -ppassword aslibra&lt;backup.sql</div><br/>如果没有相应的数据库，需要创建<br/>可以远程导入的，导入到Master数据库就可以了，slave会自动传输的<br/>2 复制数据库文件<br/>这里就简单的复制了，打包传输然后到目标数据库解压也就ok了<br/>或者scp传输文件，NFS共享文件<br/>Master和Slave都传输一样的文件，记得文件在目标服务器需要是mysql可读写的<br/><br/>第三阶段是在第二阶段完成后立刻做的，这里有一个快捷的方式来应对有很多PHP文件需要修改的情况：<br/><br/>假设原先的数据库的连接是 127.0.0.1 ，先修改为 mysqldb，然后在 /etc/hosts文件里面加一行指定 <br/><div class="code">127.0.0.1 mysqldb</div><br/>这样的好处是，转移数据库连接方式只是需要修改hosts文件即可一下子把所有数据库连接都修改了，无痛转移。。<br/>但以上方法要求mysql端口要一致。<br/>另外，如果没法修改为名称做连接，那可以启用mysql-proxy，做一下设置就可以了，详细可以查询相关资料<br/>也可以使用rinted做端口代理应付转移的过渡期，<a href="http://baike.baidu.com/view/1598164.html?tp=0_00" target="_blank">参考rinetd</a><br/><br/>以上三种过渡方式设定后，再修改每个连接为新的服务器连接即可。<br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/mysql/" rel="tag">mysql</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/read.php/1228.htm</link>
<title><![CDATA[Mysql高读写压力的部署构想]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Thu, 05 Mar 2009 14:39:42 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/read.php/1228.htm</guid> 
<description>
<![CDATA[ 
	上次写的《<a href="http://www.aslibra.com/blog/read.php/1226.htm" target="_blank">mysql的互为主从设置</a>》，有点问题需要解决：<br/>如何解决三台机器的主从一致性？<br/>其实就是查一下如何记录日志的参数，发现了解决方式：<br/>三台： 4308 <--- 4306 (log-slave-updates)<--> 4307<br/>（my.cnf 里面添加一行 log-slave-updates）<br/><br/>也就是流程变成：<br/>4306被修改，由于4307和4308都设置4306为master，所以都会正常发给4307和4308<br/>4307被修改，则由于4306设置4307为master，所以会收到4307的修改，但log-slave-updates的参数就有一个效果，就是记录从master发来的修改也记录在bin日志，从而发给其它serverid的slave。<br/><br/>4308 <--- 4306 (log-slave-updates)<br/>↓.............↑<br/>4307---------> <br/>(log-slave-updates)<br/><br/>也就是做成一个循环，即可三个实例互为master：<br/>4306的修改会发送到4308(slave),由于4308记录了，同时也发给它的slave(4307)<br/>4307的修改会发送到4306(slave),由于4306记录了，同时也发给它的slave(4308)<br/>4308的修改会发送到4307(slave),由于4307记录了，同时也发给它的slave(4306)<br/><br/>不知道是否有效，但是有个问题是，一个实例挂了，似乎就容易出错了。<br/><br/>4308(只读) <--- 4306(读写) (log-slave-updates)<--> 4307(读写)<br/>4309(只读) <------↓<br/>................<------↓<br/><br/>两个读写的数据库互备，防止写入冲突，最好是里面的数据库是单独使用，就不至于产生自增字段冲突之类的了<br/>...DB1 &#124;<br/>->DB2 &#124;-> 4307<br/>.................↑<br/>.................↓<br/>->DB1 &#124;-> 4306 <---->Slave1 Slave2...<br/>...DB2 &#124;&nbsp;&nbsp;&nbsp;&nbsp;(log-slave-updates)<br/><br/>这样估计容易处理数据库的压力，还有待生产环境测试。<br/><br/><strong>几个跟热备有关的mysql命令（参考）</strong><br/><br/>SET SQL_LOG_BIN=0&#124;1 <br/>#主机端运行，需要super权限，用来开停日志，随意开停，会造成主机从机数据不一致，造成错误 <br/>SET GLOBAL SQL_SLAVE_SKIP_COUNTER=n <br/># 客户端运行，用来跳过几个事件，只有当同步进程出现错误而停止的时候才可以执行。<br/> <br/>RESET MASTER <br/>#主机端运行,清除所有的日志，这条命令就是原来的FLUSH MASTER <br/>RESET SLAVE&nbsp;&nbsp; <br/>#从机运行，清除日志同步位置标志，并重新生成master.info<br/>虽然重新生成了master.info,但是并不起用，最好，将从机的mysql进程重启一下， <br/><br/>LOAD TABLE tblname FROM MASTER <br/>#从机运行，从主机端重读指定的表的数据，每次只能读取一个，受timeout时间限制，需要调整timeout时间。执行这个命令需要同步账号有 reload和super权限。以及对相应的库有select权限。如果表比较大，要增加net_read_timeout 和 net_write_timeout的值 <br/>LOAD DATA FROM MASTER <br/>#从机执行，从主机端重新读入所有的数据。执行这个命令需要同步账号有reload和super权限。以及对相应的库有select权限。如果表比较大，要增加net_read_timeout 和 net_write_timeout的值 <br/><br/>CHANGE MASTER TO master_def_list <br/>#在线改变一些主机设置，多个用逗号间隔,比如<br/>CHANGE MASTER TO<br/>MASTER_HOST='master2.mycompany.com',<br/>MASTER_USER='replication',<br/>MASTER_PASSWORD='bigs3cret' <br/>MASTER_POS_WAIT() #从机运行 <br/>SHOW MASTER STATUS #主机运行，看日志导出信息 <br/>SHOW SLAVE HOSTS #主机运行，看连入的从机的情况。 <br/>SHOW SLAVE STATUS (slave) <br/>SHOW MASTER LOGS (master) <br/>SHOW BINLOG EVENTS [ IN 'logname' ] [ FROM pos ] [ LIMIT [offset,] rows ] <br/>PURGE [MASTER] LOGS TO 'logname' ; PURGE [MASTER] LOGS BEFORE 'date' <br/><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://www.aslibra.com/blog/go.php/tags/%25E4%25B8%25BB%25E4%25BB%258E/" rel="tag">主从</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/read.php/1226.htm</link>
<title><![CDATA[mysql的互为主从设置]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Tue, 03 Mar 2009 15:14:02 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/read.php/1226.htm</guid> 
<description>
<![CDATA[ 
	mysql做主从参考：<br/><a href="http://www.aslibra.com/blog/read.php/1039.htm" target="_blank">http://www.aslibra.com/blog/read.php/1039.htm</a><br/><br/>之前做过主从的设置，但考虑到两个主服务器做主备的情况，可以考虑互为主从。<br/><br/>原先主备：4306 ----> 4307<br/>互为主从：4306 <--> 4307<br/><br/>之前的方式是这样的，假设两个mysql实例是4306和4307，4306是主，4307是从，则4306上的更改都会写入日志，从而4307的数据库可以随之更新，如果4306也设置4307为主服务器，则4307的更改也会更新到4306上。<br/><br/>有一点值得测试，更新的延时是否会有影响？<br/>4306和4307的数据库如果同时向一个自增数据表写入数据，有可能出现自增的冲突。<br/><br/>三台： 4308 <--- 4306 <--> 4307<br/><br/>另外，如果还想增加一个slave，那其实没法再完整同步了。<br/>假设4308做slave，master是4306，那其实只有4306上的操作会更新到4308，4307上的更新只能发到4306，但不会同时发到4308的数据库，所以只有更新到一部分。<br/><br/>所以，互为主从其实并不实用，除非保证一直使用其中一个，另外一个作为即时备份，可以使用LVS或者keepalived来让服务仅仅访问其中一个，另外，再次的切换时间如果比较快，有可能会出现自增字段的冲突。<br/><br/>那就是A和B同时监听某IP，LVS和keepalived来分配A和B的使用，A挂了，切换到B。一段时间后，A恢复了，然后A不适宜立刻使用，因为B上已经写入数据，对A而言，还是旧的数据，那此时访问到的是还没有通过REPLICATION取到数据，所以此时的切换就不能自动了，否则容易出错。<br/><br/>还是mysql_proxy可能比较有效，有待测试。<br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://www.aslibra.com/blog/go.php/tags/%25E4%25B8%25BB%25E4%25BB%258E/" rel="tag">主从</a> , <a href="http://www.aslibra.com/blog/go.php/tags/%25E6%2595%25B0%25E6%258D%25AE%25E5%25BA%2593/" rel="tag">数据库</a>
]]>
</description>
</item>
</channel>
</rss>