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

<channel>
	<title>Will Fitch&#039;s Blog &#187; mysql</title>
	<atom:link href="http://www.willfitch.com/tag/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://www.willfitch.com</link>
	<description></description>
	<lastBuildDate>Sun, 11 Dec 2011 23:39:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Optimizing Your MySQL Compilation</title>
		<link>http://www.willfitch.com/optimizing-your-mysql-compilation.html</link>
		<comments>http://www.willfitch.com/optimizing-your-mysql-compilation.html#comments</comments>
		<pubDate>Mon, 29 Nov 2010 07:05:54 +0000</pubDate>
		<dc:creator>Will Fitch</dc:creator>
				<category><![CDATA[LAMP]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[compile]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimization]]></category>

		<guid isPermaLink="false">http://www.fitchpad.com/?p=57</guid>
		<description><![CDATA[System administrators constantly worry about optimization with code compilation.  This is no different for MySQL.  Most systems are fine with the binaries distributed by their flavor of Linux or directly from Oracle.  But there are many who need to maximize their hardware usage by pushing their software.  I intend to show how to tweak your MySQL compilation to achieve these results.]]></description>
			<content:encoded><![CDATA[<p>
System administrators constantly worry about optimization with code compilation.  This is no different for MySQL.  Most systems are fine with the binaries distributed by their flavor of Linux or directly from Oracle.  But there are many who need to maximize their hardware usage by pushing their software.  I intend to show how to tweak your MySQL compilation to achieve these results.
</p>
<div class="attention">
<div class="icon">This article is targeted at GCC and Linux. Some of the logic applied here can carry over to Visual C++, however.</div>
</div>
<p>
I will also be showing you how I manage MySQL upgrades and versions on my database machines.  This includes keeping the previous version of software for emergency rollback.  You never know when an unexpected bug or feature will cause problems for you, so it&#8217;s good to keep at least one historical version on hand.  I highly suggest that you let the new version of MySQL burn-in for at least 48 hours before migrating the binaries and upgrading the rest of your boxes.
</p>
<div class="note">
<div class="icon">
<p>
<strong>If you&#8217;d like to follow along in your own sandbox, you will need the following software installed and tools:</strong></p>
<ul class="bullet-2">
<li>gcc &#8211; preferably the latest version for your OS</li>
<li>gcc-c++</li>
<li>libstdc and libstdc++ development files</li>
<li>kernel development files</li>
<li>libtermcap or ncurses development files</li>
<li>glibc development files</li>
<li>make</li>
<li>wget &#8211; for downloading MySQL</li>
<li>SSH or console access to your Linux machine</li>
<li>Some patience while reading and understanding this tutorial!</li>
</ul>
<p>Depending on your OS, you may need additional tools that are normally included with standard distributions.
</p>
</div>
</div>
<div class="contentheading">An Overview of Version Maintenance</div>
<p>
There have been cases where a version of MySQL that I&#8217;ve compiled has introduced problems.  The majority of the time this is related to replication or collations.  Whatever the case, I had the need to rollback to a version that was working fine.  You can typically do this for minor upgrades (e.g. 5.1.51 to 5.1.50) with a relative confidence.  That level of certainty does not apply to major and major-minor (5.0.x to 5.1.x or 4.x to 5.x).
</p>
<p>
In order to accomplish this, I keep all versions of MySQL in the same directory with at least one previous version.  My versions are installed in /opt.  The installation directory is always named mysql-[version].  For example, if I&#8217;m installing MySQL 5.1.52, the path to the installation will be /opt/mysql-5.1.52.  This let&#8217;s me keep a lot of historical versions on hand while also installing and distributing new versions without stopping MySQL.  The production version is a symbolic link to the full path of the installation.  For example, if version 5.1.51 is the production version, my symbolic link would be created like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>mysql-5.1.51 <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>mysql</pre></div></div>

<p>A listing of /opt would yield something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">drwxr-xr-x  <span style="color: #000000;">4</span> root root <span style="color: #000000;">4096</span> Sep <span style="color: #000000;">20</span> <span style="color: #000000;">20</span>:<span style="color: #000000;">52</span> .<span style="color: #000000; font-weight: bold;">/</span>
drwxr-xr-x <span style="color: #000000;">25</span> root root <span style="color: #000000;">4096</span> Sep <span style="color: #000000;">23</span> <span style="color: #000000;">23</span>:<span style="color: #000000;">42</span> ..<span style="color: #000000; font-weight: bold;">/</span>
lrwxrwxrwx  <span style="color: #000000;">1</span> root root   <span style="color: #000000;">17</span> Sep <span style="color: #000000;">20</span> <span style="color: #000000;">20</span>:<span style="color: #000000;">36</span> mysql -<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>mysql-5.1.51<span style="color: #000000; font-weight: bold;">/</span>
drwxrwxr-x  <span style="color: #000000;">9</span> root root <span style="color: #000000;">4096</span> Jul <span style="color: #000000;">23</span> <span style="color: #000000;">21</span>:<span style="color: #000000;">40</span> mysql-5.1.50<span style="color: #000000; font-weight: bold;">/</span>
drwxrwxr-x  <span style="color: #000000;">9</span> root root <span style="color: #000000;">4096</span> Sep <span style="color: #000000;">20</span> <span style="color: #000000;">20</span>:<span style="color: #000000;">34</span> mysql-5.1.51<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>Notice that the previous version, 5.1.50, still exists in the event I have to rollback.  If this happens, I simply take the following actions:</p>
<ul class="bullet-6">
<li>Stop the running MySQL instance</li>
<li>Destroy the existing symbolic link</li>
<li>Create a new symbolic link that points to the previous version</li>
<li>Start MySQL via /opt/mysql/bin/mysqld_safe</li>
<li>Verify the problem no longer exists</li>
</ul>
<p>
The same logic applies to upgrading, but rather than creating a symbolic link to the previous version, it gets pointed to the new.
</p>
<div class="contentheading">Preparing the Compilation</div>
<p>
Prior to actually configuring, compiling and installing the new version of MySQL, we need to set some flags for the C and C++ compilers.  This is where much of the optimization will come into play.  Keep in mind that this is not all-inclusive, and <a href="http://gcc.gnu.org/onlinedocs/">there&#8217;s likely more compiler optimizations you can make for your distribution and hardware</a>.
</p>
<h5>CPU-specific Flags</h5>
<p>
Depending on whether you&#8217;re using Intel or AMD processors, you will have some different flags to set.  In my case, I&#8217;m using dual Xeon 5460s.  The flag I use is SSE4.1, which is labeled for Core i7, but is generically used for X5400/5500 CPUs as well.</p>
<p>If you&#8217;re using AMD, you will have a different list to choose from.  The full list of CPU flags can be found <a href="http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html">here</a>.  The generic, x86_64 architecture flag for AMD is athlon64.
</p>
<p>
Passing these flags to the compiler is done with two Linux environmental variables: CFLAGS and CXXFLAGS.  CFLAGS is for the C compiler while CXXFLAGS is for the C++.
</p>
<p>
Now that we have the CPU-specific flags worked out, let&#8217;s discuss additional optimization flags.  One of the most important flags you&#8217;ll set is the optimization flag (-O).  There are technically five levels of optimization, but I&#8217;ll discuss only three: -O1, O2 and O3.  Each of these levels represents GCC&#8217;s attempt to optimize the code produced from the source files. I&#8217;ll briefly explain these:</p>
<ul class="bullet-7">
<li>O1 &#8211; Level one optimizes common features that don&#8217;t require speed-space tradeoffs.  The executable produced by this level is usually faster and smaller in size than with no optimization.</li>
<li>O2 &#8211; Level two includes level one optimizations and many, many others.  Generally speaking, this is the route to go with on most distributions.</li>
<li>O3 &#8211; This includes all optimization possibilities.  Be careful using this one as is produces a rather large executable. While in some cases this may produce faster code, it has had the opposite affect with me.  The only way to truly know if you should choose level two or three is trial and error.  Compile the same version of MySQL with both flags and test which is faster.</li>
</ul>
<p>The other two are O0 or no optimization and Os optimizes to produce the smallest possible executable for systems constrained by memory and disk.
</p>
<p>
For a full list of features that are optimized by level, see <a href="http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/072/7269/7269t1.jpg">this image</a>.
</p>
<p>
The next flag is &quot;pipe&quot;.  Pipe directs GCC to take piped input and use RAM whenever possible rather than disk.  In most cases, you won&#8217;t see a big performance gain from this, but we&#8217;re trying to achieve maximum results.  Next we look at C++ flags.
</p>
<p>
There are two additional flags passed to the C++ compiler in conjunction with those mentioned above: no-exceptions and no-rtti.
</p>
<p>
The flag no-exceptions removes error handling as it relates to exceptions in the produced C++ code.  MySQL actually recommends this flag in order to increase the stability of the produced executable.
</p>
<div class="alert">
<div class="icon">If you use try/catch or throw, you <strong>should not use</strong> -fno-exceptions.</div>
</div>
<p>
Finally we come to no-rtti.  The answer to this is simple: MySQL doesn&#8217;t use RTTI, so the result is a smaller and potentially faster executable.
</p>
<p>
Our CFLAGS and CXXFLAGS declaration will look like this for Intel:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">CFLAGS</span>=<span style="color: #ff0000;">&quot;-O2 -msse4 -pipe&quot;</span> <span style="color: #007800;">CXXFLAGS</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">${CFLAGS}</span> -fno-exceptions -fno-rtti&quot;</span></pre></div></div>

<p>and this for generic AMD:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">CFLAGS</span>=<span style="color: #ff0000;">&quot;-O2 --march=athlon64 -pipe&quot;</span> <span style="color: #007800;">CXXFLAGS</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">${CFLAGS}</span> -fno-exceptions -fno-rtti&quot;</span></pre></div></div>

<p>Go ahead and execute that in your shell, setting the environmental variables.  If you&#8217;d like to test that they&#8217;re valid, issue the following commands:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$CFLAGS</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$CXXFLAGS</span></pre></div></div>

</p>
<h5>Executing the Configure Script</h5>
<p>
The configure scripts works to produce a valid makefile.  The makefile contains the instructions to compile, install and clean the MySQL distribution you&#8217;re working with.  There are some important options to pass to this script that will produce a faster binary.  Not all fall under this category, and I&#8217;ll discuss each option shown in the example below:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>configure \
  <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>mysql-5.1.52 \
  <span style="color: #660033;">--enable-static</span> \
  <span style="color: #660033;">--with-charset</span>=utf8 \
  <span style="color: #660033;">--enable-thread-safe-client</span> \
  <span style="color: #660033;">--without-debug</span> \
  <span style="color: #660033;">--with-fast-mutexes</span> \
  <span style="color: #660033;">--enable-assembler</span> \
  <span style="color: #660033;">--with-plugins</span>=innobase,partition</pre></div></div>

</p>
<p>
Prefix (<span class="highlight">&#8211;prefix</span>) creates a variable that prefixes all installation directives.  In the example above, we use /opt/mysql-5.1.52.  This means that all executables, man pages, directories and scripts will be placed inside that specified directory.  </p>
<p>Enable static (<span class="highlight">&#8211;enable-static</span>) enables static linking to components. There is a trade-off with this.  While it produces a faster executable, the footprint of the file is much larger.  We will be able to dramatically reduce that later, however.</p>
<p>Setting the character set to UTF-8 (<span class="highlight">&#8211;with-charset=utf8</span>) allows us to support multiple languages and characters outside of the default Latin character set.  This is optional and by far not an optimization technique.  It could easily be argued that this has the opposite affect, but if you plan to support a global audience, I&#8217;d suggest choosing this option.</p>
<p>Enabling a thread-safe client (<span class="highlight">&#8211;enable-thread-safe-client</span>) produces the client software such as mysql, mysqladmin, mysqldump, etc. with thread-safe capabilities.</p>
<p>Disabling debugging (<span class="highlight">&#8211;without-debug</span>) is an obvious performance booster.  We most definitely don&#8217;t want MySQL to be worrying about providing that kind of information on a production system.</p>
<p>Fast mutexes (<span class="highlight">&#8211;enable-fast-mutexes</span>) is another one of those trial and error situations.  Depending on your machine, fast mutexes may or may not provide benefit.  As with optimization level three, you will have to experiment to determine whether you should use this option.</p>
<p>Using an assembler (<span class="highlight">&#8211;enable-assembler</span>) tells MySQL to use those versions of some string functions. This provides some optimization but not a lot.</p>
<p>You need to determine which plugins (<span class="highlight">&#8211;with-plugins</span>) to use with your distribution.  This is an application-level decision and the less you use the better off you are.  InnoDB is the premier transactional engine for MySQL, so I&#8217;d highly suggest enabling and using it.  The partition plugin allows you to scale your tables based on your defined criteria.
</p>
<div class="alert">
<div class="icon">Be careful with partitioning! Most use this functionality to overcome file system limitations, but you can bog down your queries if you aren&#8217;t careful to choose the best partition algorithm.
</div>
</div>
<div class="contentheading">Compiling and Installing MySQL</div>
<p>
Now that we&#8217;ve prepped our software, it&#8217;s time to compile and install! This is my favorite part.  I truly enjoy watching the makefile instruct GCC to chunk the source code and produce the fastest possible software.  This makes me a super-dork, but it is what it is.
</p>
<p>
Execute the following command in your shell:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">make</span></pre></div></div>

<p>This starts the compilation of the software. Get up, stretch your legs and grab some coffee.  This is going to take a while.
</p>
<p>
Once the compilation is complete, we&#8217;re ready to install the software.  This is an easy one:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>List your /opt directory to ensure the software is good to go:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-al</span> <span style="color: #000000; font-weight: bold;">/</span>opt</pre></div></div>

</p>
<div class="highlight1">
<h3>Strip That Code!</h3>
<p>Before testing and switching to the new version of MySQL, we need to make one last optimization.  Since we&#8217;ve compiled the code statically, we have a ton of junk symbols we can remove.  This turns a 30 MB file into a 3MB file and increases our executable&#8217;s startup speed up to 80%!
</p></div>
<p>
<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">strip</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>mysql-5.1.52<span style="color: #000000; font-weight: bold;">/</span>libexec<span style="color: #000000; font-weight: bold;">/</span>mysqld</pre></div></div>

<p>You can also execute this on any binary file within your new distribution, but mysqld is certainly the most important.
</p>
<h5>Activating the New MySQL Version</h5>
<p>
Activating the new MySQL version is easy:</p>
<ul class="bullet-6">
<li>
Stop the running MySQL instance:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mysqladmin shutdown</pre></div></div>

</li>
<li>
Destroy the existing symbolic link:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>mysql</pre></div></div>

</li>
<li>
Create a new symbolic link that points to the new version:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>mysql-5.1.52 <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>mysql</pre></div></div>

</li>
<li>
Start MySQL via /opt/mysql/bin/mysqld_safe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mysqld_safe <span style="color: #660033;">--user</span>=mysql <span style="color: #000000; font-weight: bold;">&amp;</span></pre></div></div>

</li>
</ul>
<p>There are additional optimization techniques you take use when configuring your MySQL instance (such as CPU priority), but I&#8217;ll save that for another entry.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.willfitch.com/optimizing-your-mysql-compilation.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQLi Tutorial</title>
		<link>http://www.willfitch.com/mysqli-tutorial.html</link>
		<comments>http://www.willfitch.com/mysqli-tutorial.html#comments</comments>
		<pubDate>Sun, 09 Jul 2006 22:55:32 +0000</pubDate>
		<dc:creator>Will Fitch</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysqli]]></category>

		<guid isPermaLink="false">http://2131230664</guid>
		<description><![CDATA[Moving from a procedural system to object-oriented can be a daunting task. One feature to assist you is the MySQLi class, which allows for an object-oriented approach to database manipulation. This tutorial gives insight into the structure and basic usage of the MySQLi class. If PDO isn&#8217;t an option for you, then try MySQLi! MySQLi [...]]]></description>
			<content:encoded><![CDATA[<p>Moving from a procedural system to object-oriented can be a daunting task. One feature to assist you is the MySQLi class, which allows for an object-oriented approach to database manipulation. This tutorial gives insight into the structure and basic usage of the MySQLi class. If PDO isn&#8217;t an option for you, then try MySQLi!</p>
<p><span id="more-103"></span></p>
<p><strong><a href="http://us2.php.net/mysqli" target="_blank">MySQLi</a></strong> stands for MySQL Improved, and is available from MySQL versions >= 4.1.3 and must be compiled in PHP with &#8211;with-mysqli=/path/to/mysql/bin/mysql_config.</p>
<p>There are three hierarchical classes with MySQLi:</p>
<ol>
<li>mysqli &#8211; Represents a connection between PHP and a MySQL database</li>
<li>mysqli_stmt &#8211; Represents a prepared statement</li>
<li>mysqli_result &#8211; Represents the result set obtained from a query against the database</li>
</ol>
<p>Each one of these classes represent a different situation. The mysqli class is absolutely necessary because you will be communicating only through this class. It contains the connection to the other two classes (mysqli_stmt and _result). For instance, if you were executing a SELECT statement to pull cities from the states table, you would do something like the following:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$mysqli</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mysqli<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'hostname'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'username'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'password'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'database'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//This is where we will query the database and pull using the cities/states SELECT statement</span>
<span style="color: #666666; font-style: italic;">// If the result returns true</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT city FROM state WHERE state='AL'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// So the result returned true, let's loop and print out each city.</span>
<span style="color: #666666; font-style: italic;">// The number of rows returned is assigned to the property &quot;num_rows&quot; in the mysql_result class</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'For the state of AL, there are '</span><span style="color: #339933;">.</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">num_rows</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' cities.
'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// The &quot;fetch_object()&quot; method is the equivalent of the old mysql_fetch_object() function. It allows access to the returned rows within the resouce object ($result in this case).</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch_object</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'City Name: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$row</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">city</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'
'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// Notice below that the errors are still contained within the mysqli class. This means that each result will affect a single &quot;error&quot; property. In otherwords, if your result fails, the error returned from MySQL is assigned to the property &quot;error&quot;.</span>
<span style="color: #666666; font-style: italic;">// This means the query failed</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end else</span>
<span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Before we go any further, let&#8217;s look at each one of the methods and parameters of the mysqli and mysqli_result class. This tutorial will not cover the mysql_stmt class, as this will be &#8220;Part 2&#8243;, which will cover prepared statements, and will be available within the next week.</p>
<p>Part 3 of the mysqli tutorial will cover transactions using the InnoDB engine.</p>
<p><strong>mysqli Class Methods:</strong></p>
<ul>
<li><strong>mysqli</strong> &#8211; construct a new mysqli object</li>
<li><strong>autocommit </strong>- turns on or off auto -commiting database modifications</li>
<li><strong>change_user </strong>- changes the user of the specified database connection</li>
<li><strong>character_set_name </strong>- returns the default character set for the database connection</li>
<li><strong>close </strong>- closes a previously opened connection</li>
<li><strong>commit </strong>- commits the current transaction</li>
<li><strong>connect </strong>- opens a new connection to MySQL database server</li>
<li><strong>debug </strong>- performs debugging operations</li>
<li><strong>dump_debug_info </strong>- dumps debug information</li>
<li><strong>get_client_info </strong>- returns client version</li>
<li><strong>get_host_info </strong>- returns type of connection used</li>
<li><strong>get_server_info </strong>- returns version of the MySQL server</li>
<li><strong>get_server_version </strong>- returns version of the MySQL server</li>
<li><strong>init </strong>- initializes mysqli object</li>
<li><strong>info </strong>- retrieves information about the most recently executed query</li>
<li><strong>kill </strong>- asks the server to kill a mysql thread</li>
<li><strong>multi_query </strong>- performs multiple queries</li>
<li><strong>more_results </strong>- check if more results exist from currently executed multi -query</li>
<li><strong>next_result </strong>- reads next result from currently executed multi -query</li>
<li><strong>options </strong>- set options</li>
<li><strong>ping </strong>- pings a server connection or reconnects if there is no connection</li>
<li><strong>prepare </strong>- prepares a SQL query</li>
<li><strong>query </strong>- performs a query</li>
<li><strong>real_connect </strong>- attempts to open a connection to MySQL database server</li>
<li><strong>escape_string </strong>- escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection</li>
<li><strong>rollback </strong>- rolls back the current transaction</li>
<li><strong>select_db </strong>- selects the default database</li>
<li><strong>set_charset </strong>- sets the default client character set</li>
<li><strong>ssl_set </strong>- sets ssl parameters</li>
<li><strong>stat </strong>- gets the current system status</li>
<li><strong>stmt_init</strong> &#8211; initializes a statement for use with mysqli_stmt_prepare</li>
<li><strong>store_result </strong>- transfers a resultset from last query</li>
<li><strong>thread_safe </strong>- returns whether thread safety is given or not</li>
<li><strong>use_result </strong>- transfers an unbuffered resultset from last query</li>
</ul>
<p><strong>mysqli Class properties:</strong></p>
<ul>
<li><strong>affected_rows </strong>- gets the number of affected rows in a previous MySQL operation</li>
<li><strong>client_info </strong>- returns the MySQL client version as a string</li>
<li><strong>client_version </strong>- returns the MySQL client version as an integer</li>
<li><strong>errno </strong>- returns the error code for the most recent function call</li>
<li><strong>error </strong>- returns the error string for the most recent function call</li>
<li><strong>field_count </strong>- returns the number of columns for the most recent query</li>
<li><strong>host_info </strong>- returns a string representing the type of connection used</li>
<li><strong>info </strong>- retrieves information about the most recently executed query</li>
<li><strong>insert_id </strong>- returns the auto generated id used in the last query</li>
<li><strong>protocol_version </strong>- returns the version of the MySQL protocol used</li>
<li><strong>server_info </strong>- returns a string that represents the server version number</li>
<li><strong>server_version </strong>- returns the version number of the server as an integer</li>
<li><strong>sqlstate </strong>- returns a string containing the SQLSTATE error code for the last error</li>
<li><strong>thread_id </strong>- returns the thread ID for the current connection</li>
<li><strong>warning_count </strong>- returns the number of warnings generated during execution of the previous SQL statement</li>
</ul>
<p>The best way to explain the usage of the mysqli class is to show by example. There are too many methods and properties to go over in this tutorial, so I will only give examples of some.</p>
<p>It&#8217;s important to note that some of these methods listed, aren&#8217;t methods at all. For instance, if you wanted to get the client library version of MySQL, you would use mysqli_get_client_version(), which returns the integer version. Here is an example:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Client version: <span style="color: #009933; font-weight: bold;">%d</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">mysqli_get_client_version</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>You are forced to use the functions since there is no need for the connection to the actual database.</p>
<p>You have already seen the usage of the mysql_result connection from the mysqli class, so let&#8217;s go over some more examples:</p>
<p><strong>Getting some info on the result from the mysql database:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$mysqli</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mysqli<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'db_user'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'my_password'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'mysql'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Get all the MySQL users and their hosts</span>
<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT user, host FROM user&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// If the query goes through</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// If there are some results</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">num_rows</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// Let's show some info</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'There were '</span><span style="color: #339933;">.</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">num_rows</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' rows returned.
'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'We selected '</span><span style="color: #339933;">.</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">field_count</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' fields in our query.
'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Our thread ID is '</span><span style="color: #339933;">.</span><span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">thread_id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'
'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Ok, let's show the data</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch_object</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Username: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$row</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' :: Host: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$row</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">host</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'
'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end while loop</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'There are no results to display. Odd how we connected to this database and there are no users.'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end else</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// Notice the error would be within the mysqli class, rather than mysql_result</span>
<span style="color: #990000;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;There has been an error from MySQL: <span style="color: #009933; font-weight: bold;">%s</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end else</span>
<span style="color: #666666; font-style: italic;">// Close the DB connection</span>
<span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Here we used some common methods and properties to test and display information. Next week we will go over prepared statements and how they might assist in your scripts.</p>
<p>If you have any questions regarding MySQLi, please feel free to put comments and I will answer them soon.</p>
<p>&#8211; Will</p>
]]></content:encoded>
			<wfw:commentRss>http://www.willfitch.com/mysqli-tutorial.html/feed</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Navicat MySQL: A Tool for Developers and DBAs</title>
		<link>http://www.willfitch.com/navicat-mysql-a-tool-for-developers-and-dbas.html</link>
		<comments>http://www.willfitch.com/navicat-mysql-a-tool-for-developers-and-dbas.html#comments</comments>
		<pubDate>Wed, 05 Jul 2006 18:48:18 +0000</pubDate>
		<dc:creator>Will Fitch</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Product Reviews]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[navicat]]></category>

		<guid isPermaLink="false">http://956281411</guid>
		<description><![CDATA[Navicat MySQL is a tool produced by PremiumSoft CyberTech Ltd that allows both developers and DBAs to access, design, manipulate, report and manage data and the MySQL server. Although it&#8217;s not free, it is certainly worth taking the time to play around with. Navicate MySQL is certainly the tool of choice for my DBA needs. [...]]]></description>
			<content:encoded><![CDATA[<p>Navicat MySQL is a tool produced by PremiumSoft CyberTech Ltd that allows both developers and DBAs to access, design, manipulate, report and manage data and the MySQL server. Although it&#8217;s not free, it is certainly worth taking the time to play around with.</p>
<p><strong>Navicate MySQL</strong> is certainly the tool of choice for my DBA needs. As a developer/DBA, I handle large amounts of data, and am continuously altering and adding databases, tables and fields. <strong>Navicat</strong> has certainly helped me in this aspect.</p>
<p>This is not a tutorial for Navicat, but this will be coming soon. Right now, I want to introduce some capabilities of Navicat, and show how it differs from other database tools. First, here is a list of features for Navicat:</p>
<ol>
<li>Timeout Reconnection for SQL server</li>
<li>Data and Structure Synchronization</li>
<li>New Query Builder &#8211; create query from different databases</li>
<li>Query Parameter</li>
<li>SQL Console</li>
<li>View Builder</li>
<li>Views, Stored Procedure and Triggers creation</li>
<li>Private Key for SSH Tunnel</li>
<li>Supports all MySQL versions</li>
<li>SSH Tunnel</li>
<li>HTTP Tunnel</li>
<li>Foreign Keys</li>
<li>Foreign Key Data Selection</li>
<li>Unicode and Character Set Support</li>
<li>Edit text in Blob field</li>
<li>Print Table Structure</li>
<li>Import data from ODBC</li>
<li>Import / Export data up to 18 most popular formats including MS Access, MS Excel, XML, PDF and TXT.</li>
<li>Create Schedule for Backup, Import / Export, Data Transfer, Saved Queries and Data Synchronization.</li>
<li>Create Reports with visual Report Builder</li>
<li>Report Archive &#8211; Reports can be saved as an archive file (.raf) for backup and increased portability.</li>
<li>Create Report Archive from command line</li>
</ol>
<p>The best advantage is PremiumSoft keeps up with the MySQL versions! Yes, you heard me correctly. When MySQL 5 went into production, this tool had already supported stored procedures, triggers, views, and other MySQL 5 features! Keep in mind that I have tried quite a few tools in my time to include <a title="SQLYog" href="http://www.webyog.com/" target="_blank">SQLYog</a> (decent, but just not enough features), <a title="phpMyAdmin" href="http://www.phpmyadmin.net" target="_blank">phpMyAdmin</a> (too slow, but is web based and free), <a title="MySQL Query Browser" href="http://dev.mysql.com/downloads/query-browser/1.1.html" target="_blank">MySQL Query Browser</a> (crashes all the time, but is free), <a title="MySQL Administrator" href="http://dev.mysql.com/downloads/administrator/" target="_blank">MySQL Administrator</a> (is okay, but doesn&#8217;t do a whole lot), <a title="MySQL Maestro" href="http://www.sqlmaestro.com/products/maestro/" target="_blank">MySQL Maestro</a> (just boring and useless IN MY OPINION!), as well as others.</p>
<p>If you want to download a trial version of Navicat, go to <a title="http://www.navicat.com/detail.html" href="http://www.navicat.com/detail.html" target="_blank">http://www.navicat.com/detail.html</a>. They have different licenses and it works on Windows, Linux, and Mac OS X.</p>
<p>If you do download the trial, please post comments on here for your experience.</p>
<p style="font-weight: bold; color: red">*NOTE* I am in NO WAY affiliated with PremiumSoft CyberTech Ltd, so don&#8217;t cry that I work for them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.willfitch.com/navicat-mysql-a-tool-for-developers-and-dbas.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Using the mysqldump tool</title>
		<link>http://www.willfitch.com/using-the-mysqldump-tool.html</link>
		<comments>http://www.willfitch.com/using-the-mysqldump-tool.html#comments</comments>
		<pubDate>Tue, 28 Mar 2006 19:55:38 +0000</pubDate>
		<dc:creator>Will Fitch</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysqldump]]></category>

		<guid isPermaLink="false">http://127615032</guid>
		<description><![CDATA[This tutorial will cover using the mysqldump executable for backing up databases. If you are an average user of MySQL, and are not interested in administering a MySQL server, then this tutorial might be useless to you. The mysqldump tool is a backup program that is distributed with every MySQL download. If you aren&#8217;t familiar [...]]]></description>
			<content:encoded><![CDATA[<p>This tutorial will cover using the mysqldump executable for backing up databases.  If you are an average user of MySQL, and are not interested in administering a MySQL server, then this tutorial might be useless to you.</p>
<p><span style="font-family: Verdana">The <span style="font-weight:bold; font-family: Verdana">mysqldump</span></span><span style="font-family: Verdana"> tool is a backup program that is distributed with every MySQL download. If you aren&#8217;t familiar with the bin directory within your MySQL distro, then it&#8217;s time to start playing around with the tools inside it. </span></p>
<p><span style="font-family: Verdana">According to MySQL AB, a man named Igor Romanenko was the original author of the </span><span style="font-weight:bold; font-family: Verdana">mysqldump</span><span style="font-family: Verdana"> tool. As with all software, especially open source, it has been hacked, smacked, slapped around and rewritten 17 times since then (those aren&#8217;t actual statistics). When using the </span><span style="font-weight:bold; font-family: Verdana">mysqldump</span><span style="font-family: Verdana"> tool, it produces SQL statements to create table structure, populate tables, or both. </span></p>
<p><span style="font-family: Verdana">I will assume you are using Linux command line to practice using this tool, but the same principles apply to Windows. Please do not play with production data if this is your first time using this application. You can screw things up if you aren&#8217;t careful.</span></p>
<p><span style="font-family: Verdana">The first step is to get into the MySQL bin directory. If your installation of MySQL is in /usr/local/mysql, then let&#8217;s get there by typing the following:</span></p>
<p><strong><span style="font-family: Georgia">cd /usr/local/mysql/bin</span></strong></p>
<p><span style="font-family: Verdana">Now that we are inside our bin directory, let&#8217;s list the files within and see what we&#8217;ve got.</span></p>
<p><strong><span style="font-family: Georgia">ls</span></strong></p>
<p><span style="font-family: Verdana">Now you should see the </span><span style="font-weight:bold; font-family: Verdana">mysqldump</span><span style="font-family: Verdana"> tool along with a bunch of other stuff that will eventually get covered in other tutorials. Although we are only going to cover the commonly used and mostly basic options, letâ€™s look at all that can be used with </span><span style="font-weight:bold; font-family: Verdana">mysqldump</span><span style="font-family: Verdana">. Click <a href="http://www.phpfever.com/uploads/mysqldump_options.txt" target="_blank">here</a> to view them.</span></p>
<p><span style="font-family: Verdana">The command to backup an entire database is simple:</span></p>
<p><strong><span style="font-family: Georgia">mysqldump database_name &gt; filename_to_create.sql</span></strong></p>
<p><span style="font-family: Verdana">Keep in mind that you will likely be required to use the â€“p (password) and/or â€“u (username) to backup a database. That user must have permissions to access that particular database. For instance, if we needed to backup the mysql database, and were using the root user, we would type the following:</span></p>
<p><strong><span style="font-family: Georgia">mysqldump mysql &gt; mysql_backup.sql â€“u root â€“p</span></strong></p>
<p><span style="font-family: Verdana">At this point, MySQL will prompt us to input a password for the user root. After doing so, the backup process will begin, and a new file filled with all of the SQL creations and inserts for the mysql database will be available. Pretty handy, huh? What if we need to backup <strong>ALL </strong>databases? This is actually just as simple! </span></p>
<p><span style="font-family: Verdana">With the list of options provided with the link above, one of the option was â€œ&#8211;all-databasesâ€. This will dump all databases into the file you command. Letâ€™s try it!</span></p>
<p><strong><span style="font-family: Georgia">mysqldump â€“all-databases &gt; alldbs.sql â€“u root â€“p</span></strong></p>
<p><span style="font-family: Verdana">This will dump all databases into an SQL file called alldbs.sql. Now that we have finally backed up some databases, what do we need to do to restore them? </span></p>
<p><span style="font-family: Verdana">This can actually be a little tricky at first. You wonâ€™t be using </span><span style="font-weight:bold; font-family: Verdana">mysqldump</span><span style="font-family: Verdana"> to do this, but rather mysql itself. There are two possible ways to do this. The first is to restore the data directly (using brute force). I donâ€™t like this way, and if the SQL is formatted <strong>perfectly</strong>, then you could run into some issues. At all costs, here is the format:</span></p>
<p><strong><span style="font-family: Georgia">mysql db_name &lt; file.sql</span></strong></p>
<p><span style="font-family: Verdana">Again, permissions will be a factor here. <span></span>Here is my favorite method:</span></p>
<p><strong><span style="font-family: Georgia">mysql â€“e â€œsource backup_file.sqlâ€ db_name</span></strong></p>
<p><span style="font-family: Verdana">Thatâ€™s it! That is way too easy. </span></p>
<p><span style="font-family: Verdana">Before closing this tutorial, I want to show you how to copy databases and their data from one server to another. This is extremely handy if you have a development, test, and production area serving different databases:</span></p>
<pre><strong><span style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: windowtext; font-family: Georgia" lang="EN">mysqldump â€“opt db_name | mysql â€“host=remote_host -C db_name</span></strong></pre>
<pre><span style="font-family: Verdana">The </span><span style="font-weight:bold; font-family: Verdana">mysqldump</span><span style="font-family: Verdana"> tool is just too cool!  If you have any questions, feel free to email me.</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.willfitch.com/using-the-mysqldump-tool.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

