<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>I&#039;m just a simple DBA on a complex production system</title>
	<atom:link href="http://prodlife.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://prodlife.wordpress.com</link>
	<description>Writing about all things production. Especially Oracle databases.</description>
	<lastBuildDate>Mon, 19 Sep 2011 06:44:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='prodlife.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>I&#039;m just a simple DBA on a complex production system</title>
		<link>http://prodlife.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://prodlife.wordpress.com/osd.xml" title="I&#039;m just a simple DBA on a complex production system" />
	<atom:link rel='hub' href='http://prodlife.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Environment Variables in Grid Control User Defined Metrics</title>
		<link>http://prodlife.wordpress.com/2010/08/04/environment-variables-in-grid-control-user-defined-metrics/</link>
		<comments>http://prodlife.wordpress.com/2010/08/04/environment-variables-in-grid-control-user-defined-metrics/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 16:46:14 +0000</pubDate>
		<dc:creator>prodlife</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://prodlife.wordpress.com/?p=722</guid>
		<description><![CDATA[This post originally appeared at the Pythian blog. Emerson wrote: “Foolish consistency is the hobgoblin of small minds”. I love this quote, because it allows me to announce a presentation titled “7 Sins of Concurrency” and then show up with only 5. There are places where consistency is indeed foolish, while other times I wish [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=722&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This post originally appeared at the <a href="http://www.pythian.com/news/14721/environment-variables-in-grid-control-user-defined-metrics/">Pythian </a>blog.</p>
<p>Emerson wrote: “Foolish consistency is the hobgoblin of small minds”.  I love this quote, because it allows me to announce a presentation  titled “7 Sins of Concurrency” and then show up with only 5. There are  places where consistency is indeed foolish, while other times I wish for  more consistency.</p>
<p>Here is a nice story that illustrates both types of consistency, or lack of.</p>
<p>This customer Grid Control installed in their environment. We were  asked to configure all kinds of metrics and monitors for several  databases, and we decided to use the Grid Control for this. One of the  things we decided to monitor is the success of the backup jobs.</p>
<p>Like many others, this customer runs his backup jobs from cron and the  cron job generates an RMAN logfile. I thought that a monitor that will  check the logfile for RMAN- and ORA- errors will be just the thing we  need.</p>
<p>To be consistent, I could have moved the backup jobs to run from Grid  Control scheduler instead of cron. But in my opinion, this would have  been foolish consistency – why risk breaking perfectly good backups? Why  divert my attention from the monitoring project to take on side  improvements?</p>
<p>To have Grid Control check the log files, I decided to use OS UDM:  Thats a “User Defined Metric” that is defined on “host” targets and  allows to run a script on the server. I wrote a very small shell script  that finds the latest log, greps for errors and counts them. The script  returns the error count to Grid Control. More than 0 errors is a  critical status for the monitor. I followed the <a href="http://download.oracle.com/docs/cd/E11857_01/em.111/e16790/udm.htm#EMADM9173">instructions in the documentation</a> to the letter – and indeed, everything easily worked. Hurray!</p>
<p>Wait. There’s a catch (and a reason for this blog post). I actually  had two instances that are backed up, and therefore two logs to check. I  wanted to use the same script and just change the ORACLE_SID in the  environment.</p>
<p>No worries. The UI has a field called “Environment” and the  documentation says: “Enter any environmental variable(s) required to run  the user-defined script.”</p>
<p>One could imagine, based on the field name and the documentation,  that if I type: “ORACLE_SID=mysid” in this field, and later run “echo  $ORACLE_SID” in my script, the result would be “mysid”.</p>
<p>Wrong. What does happen is that $ORACLE_SID is empty. $1, on the other hand, is “{ORACLE_SID=mysid}”.</p>
<p>To get the environment variable I wanted, I had to do: tmp=(`echo $1 | tr ‘{}’ ‘  ’`); eval $tmp</p>
<p>It took me a while to figure this out as this behavior is not documented and I found no usage examples that refer to this issue.</p>
<p>Consistency between your product, the UI and the documentation is not  foolish consistency. I expect the documentation and field descriptions  to help me do my job and I’m annoyed when it doesn’t.</p>
<p>At least now this behavior is documented somewhere so future googlers may have easier time.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/prodlife.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/prodlife.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/prodlife.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/prodlife.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/prodlife.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/prodlife.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/prodlife.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/prodlife.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/prodlife.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/prodlife.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/prodlife.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/prodlife.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/prodlife.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/prodlife.wordpress.com/722/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=722&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://prodlife.wordpress.com/2010/08/04/environment-variables-in-grid-control-user-defined-metrics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bffc8d237c3ba35c846af3714ec066c8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">prodlife</media:title>
		</media:content>
	</item>
		<item>
		<title>It’s the End of the World As We Know It (NoSQL Edition)</title>
		<link>http://prodlife.wordpress.com/2010/08/03/it%e2%80%99s-the-end-of-the-world-as-we-know-it-nosql-edition/</link>
		<comments>http://prodlife.wordpress.com/2010/08/03/it%e2%80%99s-the-end-of-the-world-as-we-know-it-nosql-edition/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 18:00:03 +0000</pubDate>
		<dc:creator>prodlife</dc:creator>
				<category><![CDATA[musing]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://prodlife.wordpress.com/?p=720</guid>
		<description><![CDATA[This post originally appeared over at Pythian. There are also some very smart comments over there that you shouldn&#8217;t miss, go take a look! Everyone knows that seminal papers need a simple title and descriptive title. “A Relational Model for Large Shared Data Banks” for example. I think Michael Stonebraker overshot the target In a 2007 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=720&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This post originally appeared over at <a href="http://www.pythian.com/news/14199/its-the-end-of-the-world-as-we-know-it-nosql-edition/">Pythian</a>. There are also some very smart comments over there that you shouldn&#8217;t miss, go take a look!</p>
<p>Everyone knows that seminal papers need a simple title and  descriptive title. “A Relational Model for Large Shared Data Banks” for  example. I think Michael Stonebraker overshot the target In a 2007 paper  titled, <a href="http://cs-www.cs.yale.edu/homes/dna/papers/vldb07hstore.pdf">“The End of an Architectural Era”</a>.</p>
<p>Why is this The End? According to Michael Stonebraker<strong> “current RDBMS code lines, while attempting to be ‘one size fits all’  solution, in face, excel at nothing. Hence, they are 25 years old legacy  code lines that should be retired in favor of a collection of ‘from  scratch’ specialized engined”.</strong></p>
<p>He makes his point by stating that traditional RDBM design is already  being replaced for a variety of specialized solutions: Data-warehouses,  streams processing, text and scientific databases. The only uses left  for RDBMS is OLTP and hybrid systems.</p>
<p>The provocatively named paper is simply a description of a system,  designed from scratch for modern OLTP requirements and the demonstration  that this system gives better performance than traditional RDBMS on  OLTP type load. The conclusion is that since RDBMS can’t even excel at  OLTP – it must be destined for the garbage pile. I’ll ignore the fact that hybrid systems are far from extinct and look at the paper itself.</p>
<p>The paper starts with a short review of the design considerations  behind traditional RDBMS, before proceeding to list the design  considerations behind the new OLTP system, HStore.:</p>
<ol>
<li><strong>The OLTP database should fit entirely in-memory.</strong> There should 	be no disk writes at all. Based on TPC-C size requirements  this 	should be possible, if not now then within few years.</li>
<li><strong>The OLTP database should be single threaded </strong>- no  concurrency 	at all. This should be possible since OLTP transactions are  all 	sub-millisecond. In an memory-only system they should be even 	 faster. This will remove the need for complex algorithms and data 	 structures and will improve performance even more. Ad-hoc queries 	will  not be allowed.</li>
<li><strong>It should be possible to add capacity to an OLTP system 	without any downtime.</strong> This means incremental expansion – it should 	be possible to grow the system by adding nodes transparently.</li>
<li><strong>The system should be highly available</strong>, with a  peer-to-peer 	configuration – the OLTP load should be distributed across  multiple 	machines and inter-machine replication should be used for 	 availability. According to the paper, in such a system redo and undo 	 logging becomes unnecessary. This paper references another paper 	that  argues that rebuilding a failed node over the network is as 	efficient  as recovering from redo log. Obviously, eliminating redo 	logs  eliminates one of the worse OLTP bottlenecks where data is 	written to  disk synchronously.</li>
<li><strong>No DBAs.</strong> Modern systems should be completely self tuning.</li>
</ol>
<p>In other sections Stonebraker describes few more properties of the system:</p>
<ol>
<li>With persistent redo logs gone, and 	locks/latches gone, the  overhead of JDBC interface is likely to be 	the next bottleneck.  Therefore the application code should be in 	form of stored procedures  inside the data store. The only command 	ran externally should be  “execute transaction X”.</li>
<li>Given that the DB will be distributed 	and replicated, and network  latencies still take milliseconds, the 	two-phase commit protocol should  be avoided</li>
<li>There will be no ad-hoc queries. The 	entire workload will be specified in advance.</li>
<li>SQL is an old legacy language with 	serious problems that were  exposed by Chris Date two decades ago. 	Modern OLTP systems should be  programmable in a modern light-weight 	language such as Ruby. Currently  the system is queried with C++.</li>
</ol>
<p>The requirements seem mostly reasonable and very modern – use  replication as a method of high availability and scalabilty, avoid disks  and their inherent latencies, avoid the complications of concurrency,  avoid ad-hoc queries, avoid SQL and avoid annoying DBAs. If Stonebraker  can deliver on his promise, if he can do all of the above without  sacraficing the throughput and durability of the system, this sounds  like a database we’ll all enjoy.<br />
In the rest of the paper, the authors describe some special properties  of OLTP work loads, and then explains how HStore utilizes the special  properties to implement a very efficient distributed OLTP system. In the  last part of the paper, the authors use HStore to run a TPC-C like  benchmark and compare the results with an RDBMS.</p>
<p><strong>Here are in very broad strokes the idea:</strong><br />
The paper explains in some detail <strong>how</strong> things are done, while I only describe <strong>what</strong> is done:</p>
<p><strong>The system is distributed, with each object partitioned over the nodes.</strong> You can have specify how many copies of each row will be distributed,  and this will provide high availability (if one node goes down you will  have all the data available on other nodes).</p>
<p><strong>Each node is single threaded.</strong> Once SQL query arrives  at a node, it will be performed to the end without interruptions. There  are no physical files. The data objects are stored as Btrees in memory,  Btree block is sized to match L2 cache line.</p>
<p><strong>The system will have a simple cost-based optimizer</strong>.  It can be simple because OLTP queries are simple.  If multi-way joins  happen they always involve identifying a single tuple and then tuples to  join to that record in a small number of 1-to-n joins. Group by and  aggregation don’t happen in OLTP systems.</p>
<p>The query plans can either run completely in one of the nodes, can be  decomposed to a set of independent transactions that can run completely  in one node each, or require results to be communicated between nodes.</p>
<p><strong>The way to make all this efficient is by using a “database designer”</strong> – Since the entire workload is known in advance, the database  designer’s job is to make sure that most queries in the workload can run  completely on a single node. It does this by smartly partitioning the  tables, placing parts that are used together frequently on the same node  and copying tables (or just specific columns) that are read-only all  over the place.</p>
<p><strong>Since there are at least two copies of each row and each table, there must be a way to consistently update them.</strong> Queries that can complete on a single node, can just be sent to all  relevant nodes and we can be confident that they will all complete them  with identical results. The only complication is that each node must  wait a few milliseconds before running the latest transaction to allow  for recieving prior transactions from other nodes. The order in which  transactions run is identified by timestamps and node ids. This allows  for identical order of execution on all nodes and is responsible for  consistent results.</p>
<p>In case of transactions that span multiple sites and involve changes  that affect other transactions (i.e. The order in which they execute in  relation to other transactions matter), one way to achieve consistency  could be locking the data sources for the duration of the transaction.  The HStore uses another method – each worker node recieves its portion  of the transaction from a coordinator. If there are no conflicting  transactions with lower timestamps, the transaction runs and the worker  sends the coordinator an “ok”, otherwise the worker aborts and notifies  the coordinator. The  transaction failed and its up to the application  to recover from this. Of course, some undo should be used to rollback  the successfull nodes.</p>
<p>The coordinator monitors the number of aborts and if there are too  many unsuccessfull transactions, it starts waiting longer between the  time a transaction arrives at a node until the node attempts to run it.  If there are still too many failures, a more advanced strategy of  aborting is used. In short, this is a very optimistic database where  failure is prefered to locking.</p>
<p>I’ll skip the part where a modified TPC-C proves that HStore is much  faster than a traditional RDBMS tuned for 3 days by an expert. <a href="http://www.perfdynamics.com/Manifesto/gcaprules.html#tth_sEc1.21">We all know that all benchmarks are institutionalized cheating.</a></p>
<p><strong>What do I think of this database?</strong></p>
<ol>
<li> It may be too optimistic in its definition of OLTP.  I’m not sure  we are all there with the 	pre-defined workload. Especially since adding  queries can require a complete rebuild of the data-store.</li>
<li> I’m wondering how he plans to get a consistent image of the data  stored there to another system to allow querying. ETL hooks are clearly  required, but it is unclear how they can be implemented.</li>
<li>Likewise, there is no clear solution on how to migrate existing datasets into this system.</li>
<li>HStore seems to depend quite heavily on the assumption that networks  never fail or slow down. Not a good assumption from my experience.</li>
<li> If Stonebraker is right and most datasets can be partitioned in a  way that allows SQL and DML to almost always run on a single node, this  can be used to optimize OLTP systems on 	RAC.</li>
<li> I like the idea of memory only 	systems. I like the idea of  replication providing recoverability and 	allowing us to throw away the  redo logs. I’m not sure we are there 	yet, but I want to be there.</li>
<li> I also like the idea of a system allowing only stored procedures to run.</li>
<li> I’m rather skeptical about systems without DBAs, I’ve yet to see  any large system work without someone responsible for it to keep  working.</li>
<li> I’m even more skeptical about systems without redo logs and how  they manage to still be atomic, durable and just plain reliable.  Unfortunately this paper doesn’t 	explain how redo-less systems can be  recovered. It references 	another paper as proof that it can be done.</li>
<li>Stonebraker deserves credit for anticipating the NoSQL boom 3 years  in advance. Especially the replication and memory-only components.</li>
</ol>
<p>I hope that in  the next few month I’ll add few more posts reviewing  futuristic systems. I enjoy keeping in touch with industry trends and  cutting-edge ideas.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/prodlife.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/prodlife.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/prodlife.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/prodlife.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/prodlife.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/prodlife.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/prodlife.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/prodlife.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/prodlife.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/prodlife.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/prodlife.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/prodlife.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/prodlife.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/prodlife.wordpress.com/720/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=720&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://prodlife.wordpress.com/2010/08/03/it%e2%80%99s-the-end-of-the-world-as-we-know-it-nosql-edition/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bffc8d237c3ba35c846af3714ec066c8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">prodlife</media:title>
		</media:content>
	</item>
		<item>
		<title>Notes on Learning MySQL (as an Oracle DBA)</title>
		<link>http://prodlife.wordpress.com/2010/08/02/notes-on-learning-mysql-as-an-oracle-dba/</link>
		<comments>http://prodlife.wordpress.com/2010/08/02/notes-on-learning-mysql-as-an-oracle-dba/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 20:01:52 +0000</pubDate>
		<dc:creator>prodlife</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://prodlife.wordpress.com/?p=716</guid>
		<description><![CDATA[This post originally appeared over at Pythian. There are also some very smart comments over there that you shouldn&#8217;t miss, go take a look! I spent some time last month getting up to speed on MySQL. One of the nice perks of working at Pythian is the ability to study during the workday. They could have [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=716&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This post originally appeared over at <a href="http://www.pythian.com/news/13369/notes-on-learning-mysql-as-an-oracle-dba/">Pythian</a>. There are also some very smart comments over there that you shouldn&#8217;t miss, go take a look!</p>
<p>I spent some time last month getting up to speed on MySQL. One of the nice perks of working at Pythian is the ability to study during the workday. They could have easily said “You are an Oracle DBA, you don’t need to know MySQL. We have enough REAL MySQL experts”, but they didn’t, and I appreciate.</p>
<p><strong>So how does an Oracle DBA goes about learning MySQL? </strong><br />
Obviously you start by reading the docs. Specifically, I looked for the MySQL equivalent of the famous Oracle “Concepts Guide”.<br />
Unfortunately, it doesn’t exist. I couldn’t find any similar overview of the architecture and the ideas behind the database. The first chapter of <a href="http://oreilly.com/catalog/9780596101718?mybuyscid=11519227335&amp;cmp=af-mybuy-9780596101718.IP">“High Performance MySQL”</a> had a high level architecture review, which was useful but being just one chapter in a book, it lacked many of the details I wanted to learn. Peter Zaitsev’s <a href="http://www.percona.com/files/presentations/UC2010-Innodb-Architecure-And-Performance-Optimization.pdf">“InnoDB Architecture”</a> presentation had the kind of information I needed – but covered just InnoDB.</p>
<p>Thats really too bad because I definitely feel the lack – which I can easily tell you what Oracle does when you connect to a database, run a select, an update, commit or rollback – I can’t say the same about MySQL. So far I managed without this knowledge, but I have a constant worry that this will come back and bite me later.</p>
<p>Lacking a concepts guide, I read the documentation I had access to: Sheeri has nice presentations available for Pythian employees (and probably customers too. I’m not sure if she ever released them to the whole world). The official documentation is not bad either – it covers syntax without obvious errors and serves as a decent “how do I do X?” guide.</p>
<p><strong>But reading docs is only half the battle. </strong>The easier half too. So I installed MySQL 5.1 on my Ubuntu from ready packages. Then I installed MySQL 5.5 from the tarball – which was not nearly as much fun, but by the time this worked I know much more about where everything is located and the various ways one can mis-configure MySQL.</p>
<p>Once the installation was successfull, I played a bit with users, schemas and databases. MySQL is weird – Schemas are called databases, users have many-to-many relation with databases. If a user logs in from a differnet IP, it is almost like a different user. If you delete all the data files and restart MySQL – it will create new empty data files instead. You can easily start a new MySQL server on the same physical box by modifying one file and creating few directories.</p>
<p>MySQL docs make a very big deal about storage engines. There are only 2 things that are important to rememeber though: MyISAM is non-transactional and is used for mysql schema (the data dictionary), it doesn’t have foreign keys or row level locks. InnoDB is transactional, has row level locks and is used everywhere else.</p>
<p>There are a confusing bunch of tools for backing up MySQL. MySQLDump is the MySQL equivalent of Export. Except that it creates a file full of the SQL commands required to recreate the database. These files can grow huge very fast, but it is very easy to restore from them, restore any parts of the schema or even modifying the data or schema before restoring.<br />
XTRABackup is a tool for consistent backups of InnoDB schema (remember that in MyISAM there are no transactions so consistent backups is rather meaningless). It is easy to use – one command to backup, two commands to restore. You can do PITR of sorts with it, and you can restore specific data files. It doesn’t try to manage the backup policies for you the way RMAN does – so cleaning old backups is your responsibility.</p>
<p>Replication is considered a basic skill, not an advanced skill like in the Oracle world. Indeed once you know how to restore from a backup, setting up replication is trivial. It took me about 2 hours to configure my first replication in MySQL. I think in Oracle Streams it took me few days, and that was on top of years of other Oracle experience.</p>
<p>Having access to experienced colleagues who are happy to spend time teaching a newbie is priceless. I already mentioned <a href="http://www.pythian.com/news/13369/author/sheeri/">Sheeri</a>’s docs. <a href="http://www.databasejournal.com/article.php/3879456/Chris-Schneider.htm">Chris Schneider</a> volunteered around 2 hours of his time to introduce me to various important configuration parameters, innoDB secrets and replication tips and tricks. <a href="http://www.pythian.com/news/13369/author/thukral/">Raj Thukral </a>helped me by providing step by step installation and replication guidance and helping debug my work. I’m so happy to work with such awesome folks.</p>
<p><strong>To my shock and horror, at that point I felt like I was done. </strong>I learned almost everything important there was to know about MySQL. It took a month. As an Oracle DBA, after two years I still felt like a complete newbie, and even today there are many areas I wish I had better expertise. I’m sure it is partially because I don’t know how much I don’t know, but MySQL really is a rather simple DB – there is less to tweak, less to configure, fewer components, less tools to learn.</p>
<p>Jonathan Lewis once said that he was lucky to learn Oracle with version 6, because back then it was still relatively simple to learn, but the concepts didn’t change much since so what he learned back then is still relevant today. Maybe in 10 years I’ll be saying the same about MySQL.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/prodlife.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/prodlife.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/prodlife.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/prodlife.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/prodlife.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/prodlife.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/prodlife.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/prodlife.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/prodlife.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/prodlife.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/prodlife.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/prodlife.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/prodlife.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/prodlife.wordpress.com/716/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=716&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://prodlife.wordpress.com/2010/08/02/notes-on-learning-mysql-as-an-oracle-dba/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bffc8d237c3ba35c846af3714ec066c8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">prodlife</media:title>
		</media:content>
	</item>
		<item>
		<title>Cloning Oracle Home from RAC to Stand-Alone</title>
		<link>http://prodlife.wordpress.com/2010/07/31/cloning-oracle-home-from-rac-to-stand-alone/</link>
		<comments>http://prodlife.wordpress.com/2010/07/31/cloning-oracle-home-from-rac-to-stand-alone/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 01:50:29 +0000</pubDate>
		<dc:creator>prodlife</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[rants]]></category>

		<guid isPermaLink="false">http://prodlife.wordpress.com/?p=713</guid>
		<description><![CDATA[This post originally appeared over at Pythian. There are also some very smart comments over there that you shouldn&#8217;t miss, go take a look! This should have been the easiest task on my todo list: Install Oracle 10.2.0.3 EE standalone on a new Linux RHEL 5 server, later to be used as a standby for [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=713&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This post originally appeared over at <a href="http://www.pythian.com/news/12875/cloning-oracle-home-from-rac-to-stand-alone/">Pythian</a>. There are also some very smart comments over there that you shouldn&#8217;t miss, go take a look!</p>
<p>This should have been the easiest task on my todo list: Install Oracle 10.2.0.3 EE standalone on a new Linux RHEL 5 server, later to be used as a standby for a production RAC system. This means 2 lines of “runinstall -silent …”, less than 5 minutes of DBA work and maybe 20 minutes of waiting. I did not expect to spend over 5 hours doing this.</p>
<p>Problems started when I discovered that I don’t have the 10.2.0.3 patchset and another patch that exists on production and should be installed on the standby. I had to wait for my Metalink credentials to be approved for this customer CSI before I could download the patches for them.</p>
<p>“Why don’t you just clone the software from production?” asked a helpful colleague.</p>
<p>Sounds like a great suggestion. I cloned Oracle software before and it is a simple process: tar $ORACLE_HOME, copy the tar file to the new server, untar, run the cloning script which will register the new home with the inventory, and you are done!</p>
<p>In theory, at least.</p>
<p><strong>Here is what actually happened:</strong></p>
<ol>
<li>Tar, copy, untar, script</li>
<li>Ran OPatch to verify that the new oracle home is in the inventory and that I see the correct version and patches.</li>
<li>OPatch is showing two nodes. Oops. I didn’t realize oracle home has information about the cluster – didn’t Oracle move the inventory elsewhere? Spend an hour looking for the cause of this.</li>
<li>Found that the two nodes are mentioned in  $ORACLE_HOME/inventory/ContentsXML/oraclehomeproperties.xml</li>
<li>Removed this file.</li>
<li>Deattached Oracle Home to clean inventory without deleting the software.</li>
<li>Ran the clone script again</li>
<li>Yay! OPatch looks good now.</li>
<li>Decided to create test database  to be extra sure everything is fine</li>
<li>NETCA failed with linking error. Spent an hour figuring out why. Cursed a bit.</li>
<li>Had to install libc-devel, 32 bit version. Too bad RDA didn’t catch this.</li>
<li>Created test database, but SQLPLUS now fails with linking error.  More cursing. Wondered what I did to deserve this.</li>
<li>libaio.so.1 was missing so I had to install the 64 bit version of libaio. Too bad RDA was silent about this as well.</li>
<li>Couldn’t start the database because the database couldn’t find the cluster. Why was it even looking for a cluster? Spent an hour figuring out why. Ah, because I copied the software from a RAC server and it was linked as RAC database.</li>
<li>Relinked everything with RAC_OFF option.</li>
<li>Finally things are working. Too bad it is 8pm already.</li>
</ol>
<p><strong>What I should have done: </strong>(I’m not sure if it is supported by Oracle, but at least it works)</p>
<ol>
<li>Double check that we have all RPMs.</li>
<li>Tar, copy, untar</li>
<li>remove $ORACLE_HOME/inventory/ContentsXML/oraclehomeproperties.xml</li>
<li>run clone.pl: <em>clone/bin/clone.pl ORACLE_HOME=/appl/oracle/product/10.2.0/db_1 ORACLE_HOME_NAME=OraDb10g_home1</em></li>
<li>Relink as non-RAC:  <em>make -f ins_rdbms.mk rac_off</em></li>
<li>Verify with OPatch.</li>
<li>Create test DB:<br />
<em>netca /silent /responsefile ~/netca.rsp<br />
dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbName TST -sid TST -SysPassword xxx -SystemPassword xxxx -emConfiguration NONE -datafileDestination /appl/oracle/oradata  -storageType FS -characterSet WE8ISO8859P1 -nationalcharacterSet AL16UTF16 -memoryPercentage 40</em></li>
<li>Go for a nice afternoon ride.</li>
</ol>
<p>I hope that I’m not the only DBA who always have to find the most difficult way to accomplish a task, and that this post will be useful to others. Perhaps the best piece of advice I can offer is to avoid this type of cloning in the first place.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/prodlife.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/prodlife.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/prodlife.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/prodlife.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/prodlife.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/prodlife.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/prodlife.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/prodlife.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/prodlife.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/prodlife.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/prodlife.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/prodlife.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/prodlife.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/prodlife.wordpress.com/713/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=713&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://prodlife.wordpress.com/2010/07/31/cloning-oracle-home-from-rac-to-stand-alone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bffc8d237c3ba35c846af3714ec066c8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">prodlife</media:title>
		</media:content>
	</item>
		<item>
		<title>BAAG, Best Practices and Multiple Choice Exams</title>
		<link>http://prodlife.wordpress.com/2010/07/29/baag-best-practices-and-multiple-choice-exams/</link>
		<comments>http://prodlife.wordpress.com/2010/07/29/baag-best-practices-and-multiple-choice-exams/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 21:19:27 +0000</pubDate>
		<dc:creator>prodlife</dc:creator>
				<category><![CDATA[musing]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://prodlife.wordpress.com/?p=710</guid>
		<description><![CDATA[(This post originally appeared at the Pythian blog) I’ve been following the discussion in various MySQL blogs regarding the sort_buffer_size parameters. As an Oracle DBA, I don’t have an opinion on the subject, but the discussion did remind me of many discussions I’ve been involved in. What’s the best size for SDU? What is the right [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=710&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>(This post originally appeared at <a href="http://www.pythian.com/news">the Pythian blog</a>)</p>
<p>I’ve been following the discussion in <a href="http://www.pythian.com/news/12441/sort_buffer_size-and-knowing-why/">various</a> <a href="http://www.pythian.com/news/12441/sort_buffer_size-and-knowing-why/">MySQL</a> <a href="http://ronaldbradford.com/blog/more-on-understanding-sort_buffer_size-2010-05-10/">blogs</a> regarding the sort_buffer_size parameters. As an Oracle DBA, I don’t have an opinion on the subject, but the discussion did remind me of many discussions I’ve been involved in. What’s the best size for SDU? What is the right value for OPEN_CURSORS? How big should the shared pool be?</p>
<p>All are good questions. Many DBAs ask them hoping for a clear cut answer – Do this, don’t do that! Some experts recognize the need for a clear cut answer, and if they are responsible experts, they will give the answer that does the least harm.</p>
<p>Often the harmless answer is “Don’t touch anything, because if you have to ask this question you don’t have the experience to make the correct decision”. As Sheeri noted, it is a rather patronizing answer and it is stands in the way of those who truly want to learn and become experts.</p>
<p>But I can appreciate that it comes from long and bitter experience. Many users read random bits of information off the web and then rush to modify the production database without fully digesting the details. They end up tuning their database in a way no database should ever be tuned. Not even MySQL.</p>
<p>I used to think that users search for those “best practices” out of laziness, or maybe a lack of time. I used to laugh at the belief that there are best practices and clear answers, because if there were – we wouldn’t have a parameter. But now I think the problem is in the way most institutions evaluate intelligence, which affects the way many people approach any problem.</p>
<p>Even though all of us DBAs come from a wide variety of cultures, I’m willing to bet that every one of us had to work his way through a multiple choice test. If you ever took an Oracle certification exam, you know what I mean:</p>
<p>How do you find the name of the database server?<br />
A) ORACLE_SID<br />
B) ORACLE_DBNAME<br />
C) DB_ID<br />
D) none of the above</p>
<p>You run into those in certification exams, job interviews and in slightly different variation when you try to get accepted to a university. You had to learn to succeed at those multiple choice tests at a very early age, or you would be labled “less intelligent”.</p>
<p>Yet those questions are absurd. In the question above, the answer could be A, but A would be wrong if my database is a RAC cluster. Besides a much better way would be to use /etc/oratab because there may be more than one DB on the machine.</p>
<p>But you can’t have a discussion with the exam author. You can’t ask for assumptions and clarifications  and you can’t even explain your assumptions in the test. What’s more, these tests also check for speed, so you don’t have much time to contemplate the options.</p>
<p>What these exams teach you is that every question has a single solution and one that is so obvious that once you see it, you recognize its rightness in less than 30 seconds. They also teach you that someone else knows the right answer (the person grading the test). So finding the right answer can be a matter of getting the “expert” to give you the one and obvious correct answer.</p>
<p>If our society teaches this point of view from a very young age, why are we surprised that DBAs keep looking for the one obvious answer?</p>
<p>I fully support the <a href="http://www.battleagainstanyguess.com/">BAAG</a> cause, and I believe that DBAs should be given a full explanation of the problem involved, the different choices that exist, their meaning, the trade-offs involved and in general give them the tools to make the right decision themselves time after time. But we should realize that undoing years of faulty teaching can take a while.</p>
<p>There is an even worse side effect to those multiple-choice-should-be-obvious tests. You may learn to never ask for clarifications. That asking for clarifications is “bad” or “wrong” in some way. In any real problem, asking for clarifications such as “why are you asking this?”, “what is the real issue you are trying to solve?” and  “How will you use this script?” is the most important part of finding a solution. It is not cheating – it is doing a professional job.</p>
<p>It is a scary thought that the very way we train and evaluate the future DBAs is something that will prevent them from doing a good job of being DBAs.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/prodlife.wordpress.com/710/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/prodlife.wordpress.com/710/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/prodlife.wordpress.com/710/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/prodlife.wordpress.com/710/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/prodlife.wordpress.com/710/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/prodlife.wordpress.com/710/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/prodlife.wordpress.com/710/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/prodlife.wordpress.com/710/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/prodlife.wordpress.com/710/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/prodlife.wordpress.com/710/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/prodlife.wordpress.com/710/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/prodlife.wordpress.com/710/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/prodlife.wordpress.com/710/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/prodlife.wordpress.com/710/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=710&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://prodlife.wordpress.com/2010/07/29/baag-best-practices-and-multiple-choice-exams/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bffc8d237c3ba35c846af3714ec066c8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">prodlife</media:title>
		</media:content>
	</item>
		<item>
		<title>On the difficulties of Migrations &#8211; Especially to new Blogs</title>
		<link>http://prodlife.wordpress.com/2010/07/29/on-the-difficulties-of-migrations-especially-to-new-blogs/</link>
		<comments>http://prodlife.wordpress.com/2010/07/29/on-the-difficulties-of-migrations-especially-to-new-blogs/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 17:46:32 +0000</pubDate>
		<dc:creator>prodlife</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://prodlife.wordpress.com/?p=707</guid>
		<description><![CDATA[I haven&#8217;t posted here in a log while. That&#8217;s because I&#8217;ve been posting all my stories and ideas over at the Pythian blog. I knew that migrations are one of the most difficult tasks in IT operations, but I did not realize this also applies to blogs. Yesterday, Alex helped me look at the blog statistics over [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=707&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I haven&#8217;t posted here in a log while. That&#8217;s because I&#8217;ve been posting all my stories and ideas over at the <a href="http://www.pythian.com/news/author/shapira/">Pythian blog</a>.</p>
<p>I knew that migrations are one of the most difficult tasks in IT operations, but I did not realize this also applies to blogs. Yesterday, Alex helped me look at the blog statistics over at the Pythian blog and it turns out that over there I have about 10% of the readers that I had over here. While I&#8217;m just as brilliant in the Pythian blog as I was here, I guess that with all the old links, google ranks and people not changing their RSS subscriptions &#8211; blog locations have a lot more momentum than I suspected.</p>
<p>Anyway, to the 90% of my readers who apparently only read me at this address, in the next few days I&#8217;ll copy over the blog posts that I neglected to post here. I&#8217;ll try to post new articles here in the future, but they will always appear in the Pythian blog first, so you really should add my new address to whatever it is you use to follow blogs.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/prodlife.wordpress.com/707/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/prodlife.wordpress.com/707/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/prodlife.wordpress.com/707/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/prodlife.wordpress.com/707/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/prodlife.wordpress.com/707/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/prodlife.wordpress.com/707/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/prodlife.wordpress.com/707/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/prodlife.wordpress.com/707/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/prodlife.wordpress.com/707/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/prodlife.wordpress.com/707/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/prodlife.wordpress.com/707/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/prodlife.wordpress.com/707/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/prodlife.wordpress.com/707/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/prodlife.wordpress.com/707/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=707&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://prodlife.wordpress.com/2010/07/29/on-the-difficulties-of-migrations-especially-to-new-blogs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bffc8d237c3ba35c846af3714ec066c8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">prodlife</media:title>
		</media:content>
	</item>
		<item>
		<title>On the Difficulty of Data Migrations (Especially to NoSQL Databases)</title>
		<link>http://prodlife.wordpress.com/2010/04/27/on-the-difficulty-of-data-migrations-especially-to-nosql-databases/</link>
		<comments>http://prodlife.wordpress.com/2010/04/27/on-the-difficulty-of-data-migrations-especially-to-nosql-databases/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 03:08:43 +0000</pubDate>
		<dc:creator>prodlife</dc:creator>
				<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://prodlife.wordpress.com/?p=703</guid>
		<description><![CDATA[(Originally posted at Pythian Blog) I’ve been reading a lot of NoSQL blogs recently, and one thing that bothers me is that many of the leading NoSQL bloggers seem to have very different experience in operations that I’ve had. Here’s an example: Over at the O’Reilly community blogs, Andy Oram interviewed two MongoDB experts about [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=703&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>(Originally posted at <a href="http://www.pythian.com/news/11645/on-the-difficulty-of-data-migrations-especially-to-nosql-databases/">Pythian Blog</a>)</p>
<p>I’ve been reading a lot of NoSQL blogs recently, and one thing that  bothers me is that many of the leading NoSQL bloggers seem to have very  different experience in operations that I’ve had.</p>
<p>Here’s an example:<br />
Over at the O’Reilly community blogs, <a href="http://broadcast.oreilly.com/2010/04/mongodb-experts-model-the-move.html">Andy  Oram interviewed two MongoDB experts about migrating from a relational  databases to MongoDB</a>.</p>
<p>Here’s what the experts said:</p>
<blockquote><p>”  1. Get to know MongoDB. Download it, read the  tutorials, try some toy projects.<br />
2. Think about how to represent your model in its document store.<br />
3. Migrate the data from the database to MongoDB, probably simply by  writing a bunch of SELECT * FROM statements against the database and  then loading the data into your MongoDB model using the language of your  choice.<br />
4. Rewrite your application code to query MongoDB through statements  such as insert() or find().</p>
<p>OK, so which step do you think takes the longest? And the answer  is…step 2. Design is critical, and there are trade-offs that provide no  simple answers but require a careful understanding of your application.  Migrating the data and rewriting the application are straightforward by  comparison. “</p></blockquote>
<p>I’ve never migrated anything to MongoDB, but I was involved in the  migration of a large application from SQLServer to Oracle. Both are  relational databases so there was almost no need to rethink the data  model. The rewrite and the migration took over two years, with  significant bugs discovered and fixed up to the last week. The majority  of the time spent on migration. None of it was done by  “simply by  writing a bunch of SELECT * FROM statements against the  database”.</p>
<p>We did not lack expertise – we had plenty SQLServer and Oracle  developers and DBAs with 10+ years of experience. Note that no one has  10 years of MongoDB experience.</p>
<p>I don’t doubt that modeling is critical and the trade-offs are always  difficult, but I’ve yet to see a modeling phase that took more than  rewrite + migration of large applications with big data. Note that large  applications and big data are the target customers of NoSQL databases,  so I’m not inventing irrelevant issues here.</p>
<p>I’ve experienced two major difficulties with migrations:<br />
The first one is that you normally have large number of users, and you  may be reluctant to migrate everyone to a new system at once. No matter  how good your load testing skills are, you will still not be 100%  certain your new system will have perfect performance under peak load.  So you do phased migration. Start by moving 5% of the users, then  another 15%, then another 30%, and then if everything goes well, you may  migrate the rest.</p>
<p>Why is this a difficulty? First, the users may share data with users  that have not yet migrated. There could be dependencies. You’ll need to  figure these out and write temporary code to solve those that will be  used only during the migration phase. But before that, you need to find a  way to migrate specific parts of your data. This requires figuring out  how to tear things apart carefully within and across tables. A mini  modeling project in its own right. This complicates the “bunch of SELECT  * FROM statements” quite a bit.</p>
<p>Oh, and the migration may fail. Spectacularly. At 3am. You now need  to migrate all the users back. With the new data they inserted into the  new DB. I hope you prepared a script in advance to do that.</p>
<p>And that is just the first difficulty. The second major problem is  that you may have large amounts of data arriving at high rates. You  could declare 3 days downtime to move all the data, but I can see some  reasons not to do that.</p>
<p>The alternative is to move the data in increments. First select and  copy all the data inserted until today at 8am. Once this is done, select  and copy all the data inserted between 8am and now. Then all the data  between the previous now and the now-now. All in ever shrinking deltas  of data that will eventually converge to a point where you can switch  the users over. This requires that all large tables will have  timestamps, preferably indexed, hopefully partitioned. Even with  timestamps it is not a trivial application to write, and it has to take  care of dependencies – you can’t migrate comments on a document without  migrating the document itself.</p>
<p>During the incremental migration and the data streaming phase, you  have to support two systems with the same one operational group. The  same operational group that now have to learn to support a new database  and a lot of new code rewritten for it. Not impossible, but far from  “straightforward”.</p>
<p>I always thought that the biggest misconception developers have about  operations is the “just add a bunch of servers to solve the performance  issue” myth. I can add “migration to a new system is straighforward” as  another dangerous myth.</p>
<p>I’m not blaming them, they are architects and developers. Solving  difficult operational problems is not their job. The “migration is  straightforward” attitude is a problem only when you ask your developers  to support your operations. Something that seems depressingly common  when NoSQL databases arrive to operations. Operations have no NoSQL  experience and management asks the developers to help out until the ops  teams learn to support the new beast. Problem is that NoSQL developers  without operations experience are likely to cause just as much damage as  operations without NoSQL experience.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/prodlife.wordpress.com/703/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/prodlife.wordpress.com/703/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/prodlife.wordpress.com/703/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/prodlife.wordpress.com/703/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/prodlife.wordpress.com/703/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/prodlife.wordpress.com/703/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/prodlife.wordpress.com/703/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/prodlife.wordpress.com/703/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/prodlife.wordpress.com/703/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/prodlife.wordpress.com/703/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/prodlife.wordpress.com/703/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/prodlife.wordpress.com/703/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/prodlife.wordpress.com/703/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/prodlife.wordpress.com/703/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=703&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://prodlife.wordpress.com/2010/04/27/on-the-difficulty-of-data-migrations-especially-to-nosql-databases/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bffc8d237c3ba35c846af3714ec066c8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">prodlife</media:title>
		</media:content>
	</item>
		<item>
		<title>Daylight Saving Time Causes Performance Issues!</title>
		<link>http://prodlife.wordpress.com/2010/04/02/daylight-saving-time-causes-performance-issues/</link>
		<comments>http://prodlife.wordpress.com/2010/04/02/daylight-saving-time-causes-performance-issues/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 01:13:26 +0000</pubDate>
		<dc:creator>prodlife</dc:creator>
				<category><![CDATA[Analysis]]></category>
		<category><![CDATA[optimizer]]></category>
		<category><![CDATA[statistics]]></category>

		<guid isPermaLink="false">http://prodlife.wordpress.com/?p=701</guid>
		<description><![CDATA[Since I&#8217;m starting employment with Pythian on Monday, this is the last technical post that is exclusive to this blog. Future technical tips, discoveries and stories will appear on the Pythian blog, and either copied here or linked to from here. BTW. I already made my first post in the Pythian blog today, as the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=701&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Since I&#8217;m starting employment with <a href="http://www.pythian.com/">Pythian</a> on Monday, this is the last technical post that is exclusive to this blog. Future technical tips, discoveries and stories will appear on the Pythian blog, and either copied here or linked to from here. BTW. I already made my first post in the <a href="http://www.pythian.com/news/">Pythian blog</a> today, as the editor of the<a href="http://www.pythian.com/news/10519/log-buffer-184-a-carnival-of-the-vanities-for-dbas"> Log Buffer</a> &#8211; and I&#8217;m not even an employee yet <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>So, lets end this with a bang. Real life story on how Daylight Saving Time caused one query to take twice as long as before! And its not even an April Fools joke <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Three days ago the customer called me and said: Listen, since daylight saving time started, this process that should take two hours is now taking five. My manager gets his morning report late and he is unhappy.</p>
<p>I told him that I&#8217;ll be glad to help with his performance issue, but this can&#8217;t possibly related  to day light saving time. Besides, since the process runs every night but some nights the performance is fine, the problem is probably in the nature of the data that changes from day to day.</p>
<p>In any case, we started working on the problem with our usual methods: Instrumented the PL/SQL of the process so we can know exactly what part is slowing down the process, ran trace, analyzed the results of traces, looks at AWR reports, look at query plans, etc.</p>
<p>Eventually, we found a query, buried within a view, whose explain plan looked completely unreasonable &#8211; First of all, it included a bunch of &#8220;nested loops&#8221; and even &#8220;cartesian merge join&#8221; between tables that I knew were quite large. Second, those large tables had estimated number of rows of 1.</p>
<p>I checked DBA_TABLES and saw that num_rows was indeed 0, and last analyzed was yesterday at 10pm. This didn&#8217;t make any sense &#8211; I personally collected statistics for this table yesterday, it had around 1M rows and it was at 3pm.</p>
<p>Why does it show 0 rows at 10pm?</p>
<p>A quick check with the customer confirmed that the  process truncates this table and copies data into it before our slow query runs. I assumed that &#8220;truncate table&#8221; resets the statistics and asked the customer to modify the process to analyze the table after all the data is copied in, but before the slow query runs.</p>
<p>But two questions still bothered me: Does truncate really resets statistics? And why did this problem start occurring after day light saving time?</p>
<p>The answer to the first question is &#8220;no&#8221;, truncate does not reset statistics:</p>
<pre>SQL&gt;  analyze table  sitescope.test1 compute statistics;
Table analyzed.

SQL&gt; select table_name,num_rows from dba_tables where owner='SITESCOPE' and table_name='TEST1';
TABLE_NAME                       NUM_ROWS
------------------------------ ----------
TEST1                                   4

SQL&gt; truncate table sitescope.test1;
Table truncated.
SQL&gt; select table_name,num_rows from dba_tables where owner='SITESCOPE' and table_name='TEST1';
TABLE_NAME                       NUM_ROWS
------------------------------ ----------
TEST1                                   4</pre>
<p>The answer to the second question was found using DBA_TAB_STATS_HISTORY.</p>
<p>Turns out that there is an automated process that collects statistics on this schema every night. Until DST, it ran every night at 9pm, before the process started running &#8211; so the table had data and the collected statistics were accurate. After DST, the process started running at 10pm (obviously the system running the process doesn&#8217;t know about DST). At 10pm the table was already truncated, but was not loaded yet, so the process collected statistics for a table that was temporarily empty.</p>
<p>Tada! Daylight saving time caused a severe performance problem!</p>
<p>P.S. No indexes were rebuilt while attempting to resolve the issue <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/prodlife.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/prodlife.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/prodlife.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/prodlife.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/prodlife.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/prodlife.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/prodlife.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/prodlife.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/prodlife.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/prodlife.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/prodlife.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/prodlife.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/prodlife.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/prodlife.wordpress.com/701/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=701&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://prodlife.wordpress.com/2010/04/02/daylight-saving-time-causes-performance-issues/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bffc8d237c3ba35c846af3714ec066c8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">prodlife</media:title>
		</media:content>
	</item>
		<item>
		<title>Fetch as Much as You Can</title>
		<link>http://prodlife.wordpress.com/2010/03/24/fetch-as-much-as-you-can/</link>
		<comments>http://prodlife.wordpress.com/2010/03/24/fetch-as-much-as-you-can/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 02:18:36 +0000</pubDate>
		<dc:creator>prodlife</dc:creator>
				<category><![CDATA[network]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://prodlife.wordpress.com/?p=699</guid>
		<description><![CDATA[In my &#8220;Everything DBAs Need to Know About TCP/IP&#8221; presentation, I discussed the issue of fetch size &#8211; tuning the number of rows your application will get from Oracle in a single &#8220;fetch&#8221; call. The problem is interesting when you want to get a large number of rows from the DB to the application. Cary [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=699&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://www.slideshare.net/gwenshap/tcpip-networks-for-dbas">&#8220;Everything DBAs Need to Know About TCP/IP&#8221;</a> presentation, I discussed the issue of fetch size &#8211; tuning the number of rows your application will get from Oracle in a single &#8220;fetch&#8221; call.</p>
<p>The problem is interesting when you want to get a large number of rows from the DB to the application. Cary Millsap would say that no one should want to do that, but Cary obviously never had to work with statistical analysis application. These things demand large amounts of <span style="text-decoration:line-through;">blood</span> raw data to do their thing.</p>
<p>If this is too slow for your users, you should look at statistics like &#8220;round trips&#8221;. If the number of round-trips looks completely off the wall, like 200,000 round trips for 2M rows, someone might have left JDBC&#8217;s default fetch size of 10.</p>
<p>In my presentation, I mentioned that there is really no problem with setting a very high fetch size. I recommended setting it as high as possible while taking into account the amount of memory each row will consume.</p>
<p>Charles Hooper blogged last week with a <a href="http://hoopercharles.wordpress.com/2010/03/16/consistently-inconsistent-consistent-gets/">new reason to use large fetch sizes</a>: Turns out that it allows Oracle to pin the block for the length of the fetch. He references an <a href="http://forums.oracle.com/forums/thread.jspa?threadID=973560&amp;start=0&amp;tstart=0">OTN discussion</a> where Jonathan Lewis says:</p>
<p>&#8220;&#8230;what it the array fetch size ? If the array fetch size is large enough  the number of block visits would be similar to the number of physical  block reads. If the arraysize is one then the number of block visits  could be close to the number of rows fetched as a block has to be  released at the end of each fetch and the reacquired for the next fetch.&#8221;</p>
<p>So a higher fetch size ends up with fewer consistent gets. Even if you are not tuning any specific issue that requires lowering the number of consistent gets, I hope you&#8217;ll agree that getting the same results with less work is a good thing.</p>
<p>One more reason to set fetch size to as many rows as your memory allows.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/prodlife.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/prodlife.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/prodlife.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/prodlife.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/prodlife.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/prodlife.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/prodlife.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/prodlife.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/prodlife.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/prodlife.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/prodlife.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/prodlife.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/prodlife.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/prodlife.wordpress.com/699/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=699&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://prodlife.wordpress.com/2010/03/24/fetch-as-much-as-you-can/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bffc8d237c3ba35c846af3714ec066c8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">prodlife</media:title>
		</media:content>
	</item>
		<item>
		<title>What a Difference a Month Makes</title>
		<link>http://prodlife.wordpress.com/2010/03/23/what-a-difference-a-month-makes/</link>
		<comments>http://prodlife.wordpress.com/2010/03/23/what-a-difference-a-month-makes/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 03:55:50 +0000</pubDate>
		<dc:creator>prodlife</dc:creator>
				<category><![CDATA[musing]]></category>

		<guid isPermaLink="false">http://prodlife.wordpress.com/?p=696</guid>
		<description><![CDATA[Its March 22. Exactly one month ago, I came back from few days spent in Colorado. I gave presentations, met amazing people, enjoyed skiing and drank a lot of beer, wine and whiskey. I also barely made it back, but that&#8217;s a different story. Obviously I drank too much, or maybe I gave too many [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=696&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Its March 22. Exactly one month ago, I came back from few days spent in Colorado. I gave presentations, met amazing people, enjoyed skiing and drank a lot of beer, wine and whiskey. I also barely made it back, but that&#8217;s a different story.</p>
<p>Obviously I drank too much, or maybe I gave too many presentations. I don&#8217;t remember.</p>
<p>What I do know is that in the month since that eventful weekend, my life has taken a sharp turn.</p>
<p>I&#8217;m about to start working for <a href="http://www.pythian.com/">Pythian</a>. There will be a separate post about that, where I explain how amazing Pythian is and how to continue to follow my blog once it is merged with the <a href="http://www.pythian.com/news/">official Pythian blog</a>. Same hypothetical blog post will also include comments about how much I love my current colleagues and how sorry I am to leave them.</p>
<p>But more important &#8211; I&#8217;m now an <a href="http://www.oaktable.net/main.jsp">Oakie</a>. Seriously. <a href="http://www.oaktable.net/pageServer.jsp;jsessionid=B55550BF669870656066C5DC51A88F6B?body=members.jsp">Check it out</a> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Can you tell I&#8217;m <a href="http://www.urbandictionary.com/define.php?term=stoked">stoked</a>?</p>
<p>This is not really a blog post, more of a <a href="http://twitter.com/gwenshap">tweet</a> really. But I had to share the news.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/prodlife.wordpress.com/696/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/prodlife.wordpress.com/696/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/prodlife.wordpress.com/696/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/prodlife.wordpress.com/696/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/prodlife.wordpress.com/696/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/prodlife.wordpress.com/696/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/prodlife.wordpress.com/696/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/prodlife.wordpress.com/696/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/prodlife.wordpress.com/696/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/prodlife.wordpress.com/696/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/prodlife.wordpress.com/696/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/prodlife.wordpress.com/696/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/prodlife.wordpress.com/696/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/prodlife.wordpress.com/696/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=prodlife.wordpress.com&amp;blog=1244228&amp;post=696&amp;subd=prodlife&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://prodlife.wordpress.com/2010/03/23/what-a-difference-a-month-makes/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bffc8d237c3ba35c846af3714ec066c8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">prodlife</media:title>
		</media:content>
	</item>
	</channel>
</rss>
