<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-24359421</id><updated>2012-01-17T22:27:35.671+01:00</updated><category term='connector'/><category term='xtstat'/><category term='xa'/><category term='froscon'/><category term='ourdelta'/><category term='jdbc'/><category term='cache'/><category term='debugging'/><category term='doag'/><category term='mariadb'/><category term='community'/><category term='scaling'/><category term='new release'/><category term='mybs'/><category term='contension'/><category term='jeremy zawodny'/><category term='mysqlfoundation'/><category term='presentation'/><category term='blob'/><category term='durabilty'/><category term='gpl'/><category term='xampp'/><category term='acid'/><category term='level 2'/><category term='transactions'/><category term='sun'/><category term='performance'/><category term='user conference'/><category term='launchpad'/><category term='jonathan schwartz'/><category term='pbms'/><category term='c++'/><category term='acquisition'/><category term='embedded'/><category term='ga'/><category term='2-phase commit'/><category term='mysql'/><category term='cloud computing'/><category term='java'/><category term='ace director'/><category term='ronald bradford'/><category term='sourceforge'/><category term='rc'/><category term='streaming'/><category term='high availability'/><category term='storage engine'/><category term='concurrency'/><category term='test suite'/><category term='oracle'/><category term='c'/><category term='beta'/><category term='uc2010'/><category term='durable'/><category term='drizzle'/><category term='rich green'/><category term='welcome'/><category term='ha'/><category term='online backup'/><category term='dual license'/><category term='primebase'/><category term='innodb'/><category term='epbxt'/><category term='optimization'/><category term='linux magazine'/><category term='mysqlconf'/><category term='statistics'/><category term='testing'/><category term='pbxt'/><category term='opensql camp'/><category term='dbt2'/><category term='replication'/><title type='text'>PrimeBase XT</title><subtitle type='html'>PrimeBase XT (PBXT) is a transactional storage engine for MySQL which can be loaded dynamically by the pluggable storage engine API of MySQL 5.1. It has been designed for modern, web-based, high concurrency environments. Full MVCC (multi-version concurrency control) support and a unique "write-once" strategy make PBXT particularly effective under heavy update loads.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>79</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-24359421.post-1476684540827768319</id><published>2011-09-30T14:53:00.003+02:00</published><updated>2011-09-30T19:16:27.323+02:00</updated><title type='text'>What's happened to the MySQL Storage Engine Vendor Advisory Board?</title><content type='html'>As most of you know, the Engine Vendor Advisory Board was setup by Oracle under terms that Oracle specified for themselves when acquiring MySQL. I am referring to point number 8, on the &lt;a href="http://www.dbms2.com/2009/12/14/oracle-mysql-storage-engine/"&gt;10 point list&lt;/a&gt; that played a major role in quieting nervous Bureaucrats in Europe.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://primebase.org/"&gt;PrimeBase Technologies&lt;/a&gt; is a member of the Board and so far we have heard nothing of a meeting this year.&lt;br /&gt;&lt;br /&gt;Has the Board been quietly disbanded?&lt;br /&gt;&lt;br /&gt;If so, what does this mean for the other promises on Oracles list...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;UPDATE: We are in contact with Oracle concerning this. I will keep you all posted. Hopefully it was just a communications error.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-1476684540827768319?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/1476684540827768319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=1476684540827768319' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1476684540827768319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1476684540827768319'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2011/09/whats-happened-to-mysql-storage-engine.html' title='What&apos;s happened to the MySQL Storage Engine Vendor Advisory Board?'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-2771868851851361943</id><published>2011-04-12T17:58:00.000+02:00</published><updated>2011-04-12T20:58:08.855+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysqlconf'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><title type='text'>PBXT "Secrets" at the MySQL Conference</title><content type='html'>In my presentation tomorrow at the MySQL Conference I plan to talk about some aspects of PBXT that I have never spoken about before. Here are the details of the presentation:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Update on the PBXT Storage Engine&lt;/span&gt;&lt;br /&gt;10:50am Wednesday, 04/13/2011&lt;br /&gt;Location: Ballroom D&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Of course nothing about the engine is really a secret, if you are prepared to read the code. But who does that right? I am pretty sure that not even developers of other engines have spent much time (if any) on that.&lt;br /&gt;&lt;br /&gt;But really, there are some gems stuck away in those X 1000 lines of code, and I plan to pick out a few tomorrow and show them to you. So don't miss it! :)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-2771868851851361943?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/2771868851851361943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=2771868851851361943' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/2771868851851361943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/2771868851851361943'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2011/04/pbxt-secrets-at-mysql-conference.html' title='PBXT &quot;Secrets&quot; at the MySQL Conference'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-5206703203380614898</id><published>2010-12-17T22:02:00.000+01:00</published><updated>2010-12-17T10:03:18.860+01:00</updated><title type='text'>HandlerSocket: Why did our version not take off?</title><content type='html'>There is quite a buzz about &lt;a href="http://www.mysqlperformanceblog.com/2010/12/14/percona-server-now-both-sql-and-nosql/"&gt;HandlerSocket&lt;/a&gt; built into the latest Percona Server. I agree with Henrik that this is a brilliant idea that is going to &lt;a href="http://openlife.cc/blogs/2010/december/handlersocket-nosql-innodb-added-percona-server-ps-mysql-55-ga-out"&gt;go very far&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;But I did the same thing 2.5 years ago with the BLOB Streaming Engine. In &lt;a href="http://pbxt.blogspot.com/2007/06/first-release-of-blob-streaming-engine.html"&gt;this blog&lt;/a&gt; I explain how you can retrieve data out of the database using the BLOB Streaming Engine and a simple URL of the form:&lt;tt&gt; http://mysql-host-name:8080/database/table/blob-column/condition&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Where &lt;tt&gt;condition&lt;/tt&gt; has the form: &lt;tt&gt;column1=value1&amp;amp;column2=value2&amp;amp;...&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Now I have to ask myself the question: &lt;span style="font-weight: bold;"&gt;why did we not manage to generate more enthusiasm for the idea?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Many agree that we can learn more from failure than success, so here is my list of top reasons for this particular failure:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Every idea has its time. &lt;/span&gt;In the last 2 years the awareness of NoSQL solutions has grown a lot, making RESTful and non-transactional storage and retrieval much better known and generally acceptable.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;We had no platform on which to launch the idea&lt;/span&gt;. Without a server distribution a plug-in does not have a chance of real exposure (this was not obvious back when we started making plug-ins). Percona Server and MariaDB now present such a platform. This is great for the whole community, so support them! :)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Our software had not been proven in production&lt;/span&gt;. And this is one reason why building software based on an idea, instead of an actual project requirement is quite likely to fail.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;We did it with PBXT and not a the main stream storage engine&lt;/span&gt; which everyone is already using. The really exciting thing about HandlerSocket is that you can use it to grab data in your existing database. This will allow it to spread like wild fire in a dry forest.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is obvious to me that &lt;span style="font-weight: bold;"&gt;we at PrimeBase have a marketing problem&lt;/span&gt;! We have no clue how to get a message across to the public. It is really quite sad, and great technology like PBXT engine-level replication and BLOB streaming may die because of this. The following points also show lack of marketing skills - so next time you see him, hug your marketing guy! ;)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;By using the name BLOB Streaming Engine, &lt;span style="font-weight: bold;"&gt;we did not make it clear that this works for all kinds data&lt;/span&gt;, not just BLOBs. (OK, and MyBS no was a terrible name - PBMS not much better - but "HandlerSocket" will prove that it has nothing to do with the name!)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;We did not show benchmarks&lt;/span&gt;. For me it was obvious that retrieval would be significantly faster if it did not have to go through the SQL interface. Besides, as a developer I know you can easily manipulate benchmark results, so I reluctant to present them (although I do) for my own software.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;For me, as a developer, it is very important that my software gets used. This is why I can understand why there is open source, and why we give away software for free.&lt;br /&gt;&lt;br /&gt;But to developers it is not always obvious that giving it away for free does not automatically mean it will get used. So to my hacking compatriots: I hope this list will help you to do things better!&lt;br /&gt;&lt;br /&gt;P.S. Congratulations Oracle on release of 5.5!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-5206703203380614898?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/5206703203380614898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=5206703203380614898' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5206703203380614898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5206703203380614898'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/12/handlersocket-why-did-out-version-did.html' title='HandlerSocket: Why did our version not take off?'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-5945222126167350956</id><published>2010-11-18T10:25:00.002+01:00</published><updated>2010-11-18T10:42:20.431+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='doag'/><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>My Presentation at the DOAG 2010</title><content type='html'>Yesterday I presented &lt;span style="font-style: italic;"&gt;PBXT: A Transactional Storage Engine for MySQL&lt;/span&gt; at the German Oracle User Group Conference (DOAG) in Nuremberg. A number of people asked for the slides, so here is the &lt;a href="http://primebase.org/download/doag-pbxt-2010.pdf"&gt;link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The talk was scheduled to be in English, but since I had a German-only audience I presented in German. There was quite a bit of interest, particularly in the Engine Level replication built into PBXT 2.0.&lt;br /&gt;&lt;br /&gt;As Ronny observed, this feature can be used effectively for many tasks, including for online backup and maintaining a hot-standby. This all with the addition of a "small" feature:&lt;br /&gt;&lt;br /&gt;The Master could initially stream the entire database over to the Slave before actual replication begins. This would also make it extremely easy to setup replication.&lt;br /&gt;&lt;br /&gt;A brilliant idea, but a good 3 months work...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-5945222126167350956?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/5945222126167350956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=5945222126167350956' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5945222126167350956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5945222126167350956'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/11/my-presentation-at-doag-2010.html' title='My Presentation at the DOAG 2010'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-8688531799586718</id><published>2010-07-16T15:48:00.000+02:00</published><updated>2010-07-16T15:48:50.395+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='level 2'/><category scheme='http://www.blogger.com/atom/ns#' term='new release'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><title type='text'>PBXT 1.5.02 Beta adds 2nd Level Cache</title><content type='html'>As many probably already know, PBXT is the first MySQL Storage Engine to use a log-based architecture. Log-based means that data that would normally first be written to the transaction log, and then to the database tables, is just written to the log, and the log becomes part of the database.&lt;br /&gt;&lt;br /&gt;This result is that data is only written once, and is always written sequentially. The advantage when writing is obvious, but there is a down side (as always). The data is written to the disk in write order, which is seldom the order in which the data is retrieved. So this results in a lot of random reads to the disk when accessing the data later.&lt;br /&gt;&lt;br /&gt;Placing the data logs on a Solid State Drive would solve this problem, because SSDs have no seek time. But the problem with this solution is that SSDs are still way to expense to base all your storage needs on such hardware.&lt;br /&gt;&lt;br /&gt;The solution: &lt;span&gt;an &lt;span style="font-style: italic;"&gt;SSD-based 2nd Level Cache&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Using an SSD-based 2nd Level Cache you can store the most commonly accessed parts of your database on SSD for a reasonable price. For example, if you have a Terabyte database, you can cache about 15% (160 GB) of it on SSD for around $400. This can significantly affect the performance of your system.&lt;br /&gt;&lt;br /&gt;With this thought in mind, I have just released PBXT 1.5.02 Beta, which implements a 2nd level cache for the data logs. How this works is illustrated below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.primebase.org/images/2nd-level-cache.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 521px; height: 351px;" src="http://www.primebase.org/images/2nd-level-cache.jpg" alt="" border="0" /&gt;&lt;/a&gt;Data written to the data log is also written to the, main memory based, Data Log Cache. Once the Data Log Cache is full, pages need to be freed up when new data arrives. Pages that are freed from the Data Log Cache are written to the 2nd Level Cache.&lt;br /&gt;&lt;br /&gt;Now, when the Data Log records are read, PBXT will read the corresponding page from the Data Log Cache. If the page is not already in the cache, it will first check to see if the page is in the 2nd Level Cache, before reading from the Data Log itself.&lt;br /&gt;&lt;br /&gt;PBXT 1.5 is available for download from &lt;a href="http://primebase.org/"&gt;primebase.org&lt;/a&gt;, or you can check out &lt;tt&gt;lp:pbxt/1.5&lt;/tt&gt; from &lt;a href="https://launchpad.net/pbxt"&gt;Launchpad&lt;/a&gt; using &lt;a href="http://bazaar.canonical.com/"&gt;bazaar&lt;/a&gt;. The &lt;a href="http://primebase.org/documentation"&gt;documentation&lt;/a&gt; has also been updated for 1.5.&lt;br /&gt;&lt;br /&gt;Using the 2nd level cache is easy. It is controlled by 3 system variables:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;tt style="font-weight: bold;"&gt;pbxt_dlog_lev2_cache_file&lt;/tt&gt; - the name and path of the file in which the data is stored.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;tt style="font-weight: bold;"&gt;pbxt_dlog_lev2_cache_size&lt;/tt&gt; - the size of the 2nd level cache.&lt;/li&gt;&lt;li&gt;&lt;tt style="font-weight: bold;"&gt;pbxt_dlog_lev2_cache_enabled&lt;/tt&gt; - set to 1 to enable the 2nd level cache.&lt;/li&gt;&lt;/ul&gt;It also makes sense to set a higher value for the Data Log Cache, using the &lt;tt style="font-weight: bold;"&gt;pbxt_data_log_cache_size&lt;/tt&gt; variable, which has a default value of 16MB.&lt;br /&gt;&lt;br /&gt;Of course it will be interesting to do some benchmarks on this implementation. But that will have to wait until after my holiday! I will be away until late August, but if you decide to test the new version, be sure to let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-8688531799586718?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/8688531799586718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=8688531799586718' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/8688531799586718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/8688531799586718'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/07/pbxt-1502-beta-adds-2nd-level-cache.html' title='PBXT 1.5.02 Beta adds 2nd Level Cache'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-7244099849973853756</id><published>2010-07-02T11:45:00.004+02:00</published><updated>2010-07-02T11:52:05.992+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='user conference'/><category scheme='http://www.blogger.com/atom/ns#' term='doag'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>MySQL Track at the DOAG 2010 Conference</title><content type='html'>The &lt;a href="http://www.doag.org/en/konferenz/doag/2010/i_text"&gt;DOAG 2010 Conference + Exhibition&lt;/a&gt; is to be held from the 16th to 18th November in Nuremberg this year. DOAG stands for "Deutsche ORACLE-Anwendergruppe", in English: the German Oracle User's Group.&lt;br /&gt;&lt;br /&gt;We will be adding a MySQL track to the conference this year, much like Ronald and Sheeri did for the &lt;a href="http://www.odtugkaleidoscope.com/"&gt;ODTUG Kaleidoscope 2010&lt;/a&gt;. Volker Oboda (of &lt;a href="http://primebase.org/"&gt;PrimeBase Technologies&lt;/a&gt;) is organizing the track and I will be helping to review the submissions. More information is available in German on &lt;a href="http://oboda.com/"&gt;Volker's MySQL Blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, if you are planning to be in the area, please consider &lt;a href="https://mydoag.doag.org/termine/cfp_nachmeldung.php"&gt;submitting a talk&lt;/a&gt;. The deadline for submissions was the 30 June, but has been extended until 10 July for the MySQL track. Talks in English are welcome!&lt;br /&gt;&lt;br /&gt;We are looking forward to playing an active part in the German speaking Oracle community. Just the size is something to wonder about. The DOAG Conference draws over 2500 participants, which is larger than the MySQL Conference (but maybe not for long!).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-7244099849973853756?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/7244099849973853756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=7244099849973853756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7244099849973853756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7244099849973853756'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/07/mysql-track-at-doag-2010-conference.html' title='MySQL Track at the DOAG 2010 Conference'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-1749952969959804174</id><published>2010-06-11T11:04:00.001+02:00</published><updated>2010-06-11T11:05:07.852+02:00</updated><title type='text'>An Overview of PBXT Versions</title><content type='html'>If you follow PBXT development you may have noticed a number of different versions of the engine have been mentioned in various talks and blogs.&lt;br /&gt;&lt;br /&gt;There is actually a consistent strategy behind all this, which I would like to explain here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;PBXT 1.0 - Current: 1.0.11-3 Pre-GA&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Launchpad: &lt;a href="https://launchpad.net/pbxt/trunk"&gt;lp:pbxt&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is the current PBXT production release. It is stable in all tests and environments in which it is currently in use.&lt;br /&gt;&lt;br /&gt;The 1.0.11 version of the engine is available in &lt;a href="http://askmonty.org/wiki/MariaDB:Download"&gt;MariaDB 5.1.47&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;PBXT 1.1 - Stability&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;: RC&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Launchpad: &lt;a href="https://launchpad.net/pbxt/1.1"&gt;lp:pbxt/1.1&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PBXT 1.1 implements &lt;span style="font-weight: bold;"&gt;memory resident (MR) tables&lt;/span&gt;. These tables can be used for fast, concurrent access to non-persistent data.&lt;br /&gt;&lt;br /&gt;1.1 also adds &lt;span style="font-weight: bold;"&gt;parallel checkpointing&lt;/span&gt;. To do this, PBXT starts multiple threads to flush several tables at once during a checkpoint.&lt;br /&gt;&lt;br /&gt;This version is feature complete. Unless someone is interested in using MR tables in production, my plan is to leave 1.1 at the RC level and concentrate development on PBXT 1.5 and 2.0.&lt;br /&gt;&lt;br /&gt;PBXT 1.1 is part of &lt;a href="https://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;PBXT 1.5 - &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Current: 1.5.01 &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Beta&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Launchpad: &lt;a href="https://launchpad.net/pbxt/1.5"&gt;lp:pbxt/1.5&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PBXT 1.5 changes how the data logs are written, which makes the engine much faster, depending on the database schema.&lt;br /&gt;&lt;br /&gt;Previously each user thread wrote its own data log. In version 1.5 the data logs are written the same way the transaction log is written. This means that &lt;span style="font-weight: bold;"&gt;group commit is implemented for the data logs&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I have also added a &lt;span style="font-weight: bold;"&gt;data log cache&lt;/span&gt; which can be help significantly if your data has hot spots.&lt;br /&gt;&lt;br /&gt;The log-based architecture of PBXT makes it possible to write Terabytes of data without degrading performance. But, as the amount of data increases, garbage collection and random read speed can become a problem. I am currently focusing on solving these problems in 1.5.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;PBXT 2.0 - Stability&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;: Alpha&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Launchpad: &lt;a href="https://launchpad.net/pbxt/2.0"&gt;lp:pbxt/2.0&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The major feature in PBXT 2.0 is &lt;span style="font-weight: bold;"&gt;engine level replication (ELR)&lt;/span&gt;. This is an extremely efficient form of replication, while being fully transactional and reliable.&lt;br /&gt;&lt;br /&gt;ELR works by transferring changes directly from the the PBXT transaction and data logs to the PBXT engine on the slave. This means the binary log does not need to be written or flushed, which can greatly increase the speed of the master server (up to 10x in some tests).&lt;br /&gt;&lt;br /&gt;Currently the replication does not handle database schema changes, but it works and is ready for testing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Setting Priorities&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PBXT is a free, open source project which is largely funded by a &lt;span style="font-style: italic;"&gt;big name&lt;/span&gt; database company.&lt;br /&gt;&lt;br /&gt;Nevertheless, I am not bound as to how I set priorities, which means I usually focus on what is important to those using and testing the engine.&lt;br /&gt;&lt;br /&gt;Now that you have an overview of what's happening in the PBXT world, let me know if you have a problem that PBXT might fix. I'd be happy to hear from you... :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-1749952969959804174?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/1749952969959804174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=1749952969959804174' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1749952969959804174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1749952969959804174'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/06/pbxt-versions.html' title='An Overview of PBXT Versions'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-7029462279249409299</id><published>2010-05-12T17:00:00.000+02:00</published><updated>2010-05-12T17:00:21.874+02:00</updated><title type='text'>PBXT 1.0.11 Pre-GA Released!</title><content type='html'>I have just released PBXT 1.0.11, which I have titled "Pre-GA". Going by our internal tests, and all instances of PBXT in production and testing by the community this is a GA version!&lt;br /&gt;&lt;br /&gt;However, although PBXT has 1000's of instances in production, it is not used in very diverse applications. So I am waiting for wider testing and usage before removing the "Pre" prefix.&lt;br /&gt;&lt;br /&gt;You can download the source code from &lt;a href="http://primebase.org/download"&gt;primebase.org&lt;/a&gt;, or pull it straight from &lt;a href="https://launchpad.net/pbxt"&gt;Launchpad&lt;/a&gt;. Here are instructions &lt;a href="http://primebase.org/download/#qg_source"&gt;how to compile and build the engine&lt;/a&gt; with MySQL. PBXT builds with &lt;a href="http://primebase.org/download/mysql-5.1.46.tar.gz"&gt;MySQL 5.1.46&lt;/a&gt; GA, and earlier 5.1 versions.&lt;br /&gt;&lt;br /&gt;If you don't want to compile it yourself, PBXT 1.0.11 will soon be available in the &lt;a href="http://askmonty.org/wiki/MariaDB:Download"&gt;5.1.46 release of MariaDB&lt;/a&gt;. And, for the more adventurous, PBXT 1.1 is included in &lt;a href="https://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A complete list of all the changes in this version are in the &lt;a href="http://primebase.org/download/ChangeLog"&gt;release notes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you are testing PBXT and have any questions send me an e-mail. I will be glad to help.&lt;br /&gt;&lt;br /&gt;And, oh yes. If you are looking for development or production support for MySQL/MariaDB and PBXT then please write to: support-at-primebase-dot-org.&lt;br /&gt;&lt;br /&gt;We are working together with &lt;a href="http://www.percona.com/"&gt;Percona&lt;/a&gt; and &lt;a href="http://askmonty.org/wiki/Main_Page"&gt;Monty Program Ab&lt;/a&gt; to provide the service level you require.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-7029462279249409299?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/7029462279249409299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=7029462279249409299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7029462279249409299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7029462279249409299'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/05/pbxt-1011-pre-ga-released.html' title='PBXT 1.0.11 Pre-GA Released!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-5470881358465868344</id><published>2010-04-19T12:59:00.000+02:00</published><updated>2010-04-19T22:00:00.985+02:00</updated><title type='text'>Stuck in the US of A</title><content type='html'>As far as I know, nobody who was at the &lt;a href="http://en.oreilly.com/mysql2010"&gt;MySQL User Conference&lt;/a&gt; and lives in Europe has made it back home yet!&lt;br /&gt;&lt;br /&gt;Please leave a comment on this blog as soon as you get home. I am interested to know...&lt;br /&gt;&lt;br /&gt;My flight was yesterday, so I have the worst prospects. I am booked on a flight for next week Wednesday (10 days delay)! No joke! :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-5470881358465868344?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/5470881358465868344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=5470881358465868344' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5470881358465868344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5470881358465868344'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/04/stuck-in-us-of.html' title='Stuck in the US of A'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-5027593242004618007</id><published>2010-04-16T14:04:00.000+02:00</published><updated>2010-04-16T23:05:31.581+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ace director'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>The other Oracle ACE Director</title><content type='html'>While the choice of &lt;a href="http://ronaldbradford.com/blog/my-acceptance-with-oracle-as-ace-director-2010-04-15"&gt;Ronald Bradford&lt;/a&gt; and &lt;a href="http://www.pythian.com/news/10643/meet-the-first-oracle-ace-director-in-mysql-sheeri-cabral"&gt;Sheeri Cabral&lt;/a&gt; were natural for Oracle ACE Director my own nomination was perhaps a bit of a surprise. Well, it was to me anyway.&lt;br /&gt;&lt;br /&gt;Those of you at the conference may have noticed that I had no (super-cool) ACE Director jacket when I was called up on the stage...&lt;br /&gt;&lt;br /&gt;Well that was because the jacket was too big, and I had already returned it to Lenz for it to be exchanged.&lt;br /&gt;&lt;br /&gt;Unfortunately I can't return the shoes because they are too big for me as well...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-5027593242004618007?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/5027593242004618007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=5027593242004618007' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5027593242004618007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5027593242004618007'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/04/other-oracle-ace-director.html' title='The other Oracle ACE Director'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-5670586914038092081</id><published>2010-04-14T14:27:00.002+02:00</published><updated>2010-04-19T21:09:04.359+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysqlconf'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>Slides of the PBXT Presentation</title><content type='html'>Here are the &lt;a href="http://www.primebase.org/download/pbxt-uc-2010.pdf"&gt;slides&lt;/a&gt; to &lt;a href="http://en.oreilly.com/mysql2010/public/schedule/detail/13314"&gt;my talk&lt;/a&gt; yesterday: &lt;a href="http://www.primebase.org/download/pbxt-uc-2010.pdf"&gt;A Practical Guide to the PBXT Storage Engine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For anyone who missed my talk, I think it is worth going through the slides, because the are fairly self explanatory.&lt;br /&gt;&lt;br /&gt;If there are any questions, please post them as a comment to the blog. I will be glad to answer :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-5670586914038092081?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/5670586914038092081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=5670586914038092081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5670586914038092081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5670586914038092081'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/04/slides-of-pbxt-presentation.html' title='Slides of the PBXT Presentation'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-688047173209429728</id><published>2010-04-09T11:54:00.000+02:00</published><updated>2010-04-09T11:54:20.196+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysqlconf'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='uc2010'/><title type='text'>PBXT at the MySQL User Conference 2010</title><content type='html'>At this year's User Conference I have some interesting results to present. But more than anything else, my talk will explain how you can really get the most out of the engine. The design of PBXT makes it flexible, but this provides a lot of options. What tools are available to help you make the right decisions? I will explain.&lt;br /&gt;&lt;br /&gt;Every design has trade-offs. How does this work out in practice for PBXT? And how can you take advantage of the strengths of the storage engine? I will explain in:&lt;br /&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;A Practical Guide to the PBXT Storage Engine&lt;/span&gt;&lt;br /&gt;Paul McCullagh&lt;br /&gt;&lt;a href="http://en.oreilly.com/mysql2010/public/schedule/detail/13314"&gt;2:00pm - 3:00pm Tuesday, 04/13/2010&lt;/a&gt;&lt;br /&gt;Ballroom E&lt;/p&gt;&lt;p style="text-align: left;"&gt;Don't miss it! :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-688047173209429728?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/688047173209429728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=688047173209429728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/688047173209429728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/688047173209429728'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/04/pbxt-at-mysql-user-conference-2010.html' title='PBXT at the MySQL User Conference 2010'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-3068156668604108835</id><published>2010-03-17T17:02:00.000+01:00</published><updated>2010-03-17T17:03:05.252+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ha'/><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><title type='text'>PBXT Engine Level replication, works!</title><content type='html'>I have been talking about this for a while, now at last I have found the time to get started! Below is a picture from my 2008 MySQL User Conference presentation. It illustrates how engine level replication works, and also shows how this can be ramped up to provide a multi-master HA setup.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://primebase.org/images/engine-replication-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 369px; height: 239px;" src="http://primebase.org/images/engine-replication-2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;What I now have running is the first phase: asynchronous replication, in a master/slave configuration. The way it works is simple. For every slave in the configuration the master PBXT engine starts a thread which reads the transaction log, and transfers modifications to a thread which applies the changes to PBXT tables on the slave.&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold;"&gt;Where to get it&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have pushed the changes that do this trick to PBXT 2.0 on &lt;a href="https://launchpad.net/pbxt"&gt;Launchpad&lt;/a&gt;. The branch to try out is &lt;a href="https://code.launchpad.net/%7Epbxt-core/pbxt/2.0"&gt;lp:pbxt/2.0&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold;"&gt;Getting started&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Setup of the replication is dead easy. Assuming you already have a PBXT database, what you need to do is the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Copy the Master data: &lt;/span&gt;Shutdown the MySQL server and make a complete copy of the data directory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Setup a Slave server: &lt;/span&gt;&lt;span&gt;Setup&lt;/span&gt; a second MySQL server using the copy of the data directory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Declare the Slave: &lt;/span&gt;Create a text file called &lt;tt&gt;slaves&lt;/tt&gt;, in the &lt;tt&gt;data/pbxt&lt;/tt&gt; directory of the master server, with the following entry:&lt;br /&gt;&lt;pre&gt;[slave]&lt;br /&gt;name=slave-thread-name&lt;br /&gt;host=host-name-of-slave&lt;br /&gt;port=37656&lt;br /&gt;&lt;/pre&gt;&lt;tt&gt;slave-process-name&lt;/tt&gt; is any name you like, and is used to identify the replication thread running on the master. &lt;tt&gt;host-name-of-slave&lt;/tt&gt; is the host name or IP address of the slave MySQL server. &lt;tt&gt;37656&lt;/tt&gt; is the default port used by the PBXT slave engine to receive replication changes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Enable replication: &lt;/span&gt;On the master server set &lt;tt&gt;pbxt_enable_replication=1&lt;/tt&gt;, and on the slave server set &lt;tt&gt;pbxt_enable_replication=2&lt;/tt&gt;. Also make sure that both servers have different server IDs (system parameter: &lt;tt&gt;server_id&lt;/tt&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Start both servers: &lt;/span&gt;Replication will begin immediately if the slave server is started before master server, otherwise replication will begin after a minute (see below).&lt;br /&gt;&lt;span style=";font-family:arial;font-size:130%;"  &gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How it works&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PBXT engine level replication, unlike MySQL replication, pushes changes to the slave. For every entry in the &lt;tt&gt;data/pbxt/slaves&lt;/tt&gt; file, PBXT starts a thread (the &lt;span style="font-style: italic;"&gt;supplier&lt;/span&gt; thread). The thread connects to the slave on the given address, and pushes the changes to an &lt;span style="font-style: italic;"&gt;applier&lt;/span&gt; thread run by the PBXT engine on the slave side. If any error occurs, the supplier thread on the master will pause, and then try again in a minute.&lt;br /&gt;&lt;br /&gt;On connect the supplier thread requests the global transaction ID (GID) of the last transaction committed on the slave. The applier determines the GID of the last transaction by searching backwards through its own transaction logs.&lt;br /&gt;&lt;br /&gt;Replication is row-based, and fairly low level. Changes refer to the PBXT internal row and table IDs. The row data is transferred in the same format used to store the information on disk. This makes the replication extremely efficient. The supplier thread does not even have to read the log from disk if it is fairly up-to-date, because PBXT already caches the last changes to the transaction log for use by the writer and the sweeper threads.&lt;br /&gt;&lt;br /&gt;Probably the most important thing about this type of replication is that it  (theoretically) has almost no affect on the "foreground" activity on the master machine. I am interested to find out if this really is the case.&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold;"&gt;What's next?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Replication of DDL changes are not implemented yet. So if you do &lt;tt&gt;ALTER TABLE&lt;/tt&gt; or any other such operation, replication will stop, and have to be restarted by copying over the data directory to the slave again.&lt;br /&gt;&lt;br /&gt;After DDL changes the next step is to add synchronous replication, as illustrated above. This requires waiting for a commit from the slave before continuing. Latency in this case can be kept to a minimum by sending transactions to the slave before they have been committed on the master.&lt;br /&gt;&lt;br /&gt;I believe this would then provide the basis for an extremely simple (and efficient) HA solution based on MySQL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-3068156668604108835?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/3068156668604108835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=3068156668604108835' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3068156668604108835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3068156668604108835'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/03/pbxt-engine-level-replication-works.html' title='PBXT Engine Level replication, works!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-6808888912841972994</id><published>2010-02-26T16:49:00.000+01:00</published><updated>2010-02-26T16:49:27.681+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='epbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='embedded'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><title type='text'>Embedded PBXT is Cool</title><content type='html'>Martin Scholl (&lt;a href="http://twitter.com/zeit_geist"&gt;@zeit_geist&lt;/a&gt;) has started a new project based on the PBXT storage engine: EPBXT - Embedded PBXT! In his first blog he describes how you can easily build the latest version: &lt;a href="http://blog.erlang.de/building-embedded-pbxt-from-bzr?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+StillDontUnderstandAllThatIsTheCase+%28Still+don%27t+understand+all+that+is+the+case.%29"&gt;Building Embedded PBXT from bzr&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The interesting thing about this project is that it exposes the "raw" power of the engine. Some basic performance tests show this really is the case.&lt;br /&gt;&lt;br /&gt;At the lowest level, PBXT does not impose any format on the data stored in tables and indexes. When running as a MySQL storage engine it uses the MySQL native row and index formats. Theoretically it would be possible to expose this in an embedded API. The work Martin is doing goes in at this level. The wrapper around the engine determines the data types, data sizes, row and index format. Comparison operations for the data types are also supplied by the embedded code or user program.&lt;br /&gt;&lt;br /&gt;This flexibility will make it possible for an application to store its own data very efficiently. As Martin suggested, it would also be possible to use &lt;a href="http://code.google.com/p/protobuf"&gt;Google's protobuf's&lt;/a&gt; for the row format. This would eliminate the need to use an ALTER TABLE for many types of changes to a table's definition!&lt;br /&gt;&lt;br /&gt;Of course, EPBXT is still a way from realizing this vision, and Martin has some very specific problems he wants to solve with the development. However, judging by his command of the code within such a short time, this is going to be a project to watch in the future!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-6808888912841972994?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/6808888912841972994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=6808888912841972994' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6808888912841972994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6808888912841972994'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/02/embedded-pbxt-is-cool.html' title='Embedded PBXT is Cool'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-7491922018832034299</id><published>2010-02-08T12:34:00.000+01:00</published><updated>2010-02-08T12:34:44.068+01:00</updated><title type='text'>Ken we will miss you!</title><content type='html'>What does it take for someone, fiercely loyal to a company to suddenly leave? Ken Jakobs, Oracle employee number 18, a man that sincerely loves the company, &lt;a href="http://news.cnet.com/8301-13505_3-10448783-16.html"&gt;has resigned&lt;/a&gt;! The only reason I can think of is an extreme snub!&lt;br /&gt;&lt;br /&gt;I must say, I am very disappointed. The prospect of Ken running MySQL was a light at the end of the tunnel for the community. Why? Because Ken is a MySQL insider! He knows the project, he knows the community.&lt;br /&gt;&lt;br /&gt;As an engine developer I have come to know Ken well over the last 4 years. He lead the InnoDB team and is largely responsible for the improvements made to the engine since the Oracle acquisition. At the yearly Engine Summit he was always professional and constructive in his suggestions, with a deep technical knowledge of the subject. His track record shows that he has always kept his word with regard to Oracle's intensions with InnoDB, and I would trust him to do the same with MySQL.&lt;br /&gt;&lt;br /&gt;Goodbye Ken. This is great loss for both the MySQL community and Oracle!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-7491922018832034299?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/7491922018832034299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=7491922018832034299' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7491922018832034299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7491922018832034299'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2010/02/ken-we-will-miss-you.html' title='Ken we will miss you!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-1827026909992209953</id><published>2009-12-31T17:41:00.000+01:00</published><updated>2009-12-31T17:41:19.395+01:00</updated><title type='text'>PBXT 1.0.10, New Year Release!</title><content type='html'>I have just released PBXT 1.0.10 RC4. The sources can be downloaded from &lt;a href="http://primebase.org/download"&gt;primebase.org&lt;/a&gt;, or from &lt;a href="https://launchpad.net/pbxt"&gt;Launchpad&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The major feature in this release is the implementation of the &lt;tt style="font-weight: bold;"&gt;pbxt_flush_log_at_trx_commit&lt;/tt&gt; system variable. Similar to the InnoDB equivalent, this variable allows you to determine the level of durability of transactions.&lt;br /&gt;&lt;br /&gt;This is a trade-off: by decreasing durability, the speed of database update operations can be increased.&lt;br /&gt;&lt;br /&gt;The default &lt;span style="font-weight: bold;"&gt;setting is 1, which means full durability&lt;/span&gt;: the transaction log is flushed on every transaction commit.&lt;br /&gt;&lt;br /&gt;Setting the &lt;span style="font-weight: bold;"&gt;variable to 2 reduces durability&lt;/span&gt;, by just writing the log on transaction commit (no flush is done). In this case, transactions can only be lost if the entire server machine goes down (for example a power failure).&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight: bold;"&gt;lowest level of durability is 0&lt;/span&gt;. In this case the transaction log is not written on transaction commit. Transactions can be lost if the server crashes.&lt;br /&gt;&lt;br /&gt;In the case of 2 and 0, the engine flushes the transaction log at least once per second. So only transactions executed within the last second can be lost.&lt;br /&gt;&lt;br /&gt;Ironically, PBXT  started life as a "partially durable" storage engine (level 2 according to the description above). Almost exactly 2 years ago I started the implementation of full durability. It has taken a while to build in the original "feature" :)&lt;br /&gt;&lt;br /&gt;The main reason for doing this has been the Mac version, and our work with &lt;a href="http://teamdrive.net/"&gt;TeamDrive&lt;/a&gt;. On the Mac the &lt;tt&gt;fsync()&lt;/tt&gt; operations is a &lt;span style="font-style: italic;"&gt;fake&lt;/span&gt;. To do a true flush to disk you have to call &lt;tt&gt;fcntl(of-&gt;of_filedes, F_FULLFSYNC, 0)&lt;/tt&gt;. Problem is, the real flush is incredibly slow (about 20 times slower than &lt;tt&gt;fsync&lt;/tt&gt;), but necessary to avoid any corruption.&lt;br /&gt;&lt;br /&gt;The advantage of a lot of applications like TeamDrive is that they can tolerate a lower level of durability. So we can look forward to an even speedier TeamDrive in the future :)&lt;br /&gt;&lt;br /&gt;I would love to hear from anyone testing the new version. Bugs can be &lt;a href="https://bugs.launchpad.net/pbxt"&gt;reported on Launchpad&lt;/a&gt;, as usual.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Happy New Year to you all!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-1827026909992209953?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/1827026909992209953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=1827026909992209953' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1827026909992209953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1827026909992209953'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/12/pbxt-1010-new-year-release.html' title='PBXT 1.0.10, New Year Release!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-3046647758114553530</id><published>2009-12-14T14:58:00.001+01:00</published><updated>2009-12-14T14:58:52.564+01:00</updated><title type='text'>Monty's appeal is selfless!</title><content type='html'>What many people don't get is that Monty's appeal to the MySQL community to &lt;a href="http://monty-says.blogspot.com/2009/12/help-saving-mysql.html"&gt;help save MySQL&lt;/a&gt; is really quite selfless.&lt;br /&gt;&lt;br /&gt;The fact is, Monty's own company, &lt;a href="http://askmonty.org"&gt;Monty Program Ab&lt;/a&gt;, stands to benefit the most from &lt;span style="font-weight: bold;"&gt;bad stewardship of MySQL by Oracle&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;If Oracle slows and closes up development, rejects community contributions and creates a commercial version of MySQL, then Monty Program's &lt;a href="http://askmonty.org/wiki/index.php/MariaDB"&gt;MariaDB&lt;/a&gt; fork will become very popular, very quickly.&lt;br /&gt;&lt;br /&gt;Which would translate into income for Monty Program Ab as customers come to his company for additions, features and bug fixes that they need to secure there own production.&lt;br /&gt;&lt;br /&gt;What Monty is concerned about is the commercial vendors of MySQL (one of which Monty Program is not).&lt;br /&gt;&lt;br /&gt;These vendors either:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;OEM MySQL and integrate it into a commercial software or hardware product, or&lt;/li&gt;&lt;li&gt;they produce a closed source (or dual-license) storage engine, which is sold with a commercial version of MySQL.&lt;/li&gt;&lt;/ul&gt;Oracle could kill both businesses, and this is Monty's main concern. As Monty explained in a phone call this morning: he sees the existence of commercial/dual-license vendors of MySQL as very important to the long-term survival of "his baby".&lt;br /&gt;&lt;br /&gt;Of course Oracle cannot prevent 3rd parties from continuing to offer consulting, support and training for MySQL. But close sourcing and vigorous enforcement of trademarks can make things very difficult for such companies.&lt;br /&gt;&lt;br /&gt;Unfortunately Oracles &lt;a href="http://money.cnn.com/news/newsfeeds/articles/marketwire/0568514.htm"&gt;latest concessions&lt;/a&gt; may not be enough to satisfy investors in MySQL based technology either, because there is no guarantee of what happens after 5 years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-3046647758114553530?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/3046647758114553530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=3046647758114553530' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3046647758114553530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3046647758114553530'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/12/montys-appeal-is-selfless.html' title='Monty&apos;s appeal is selfless!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-1447274098331932380</id><published>2009-11-11T13:10:00.000+01:00</published><updated>2009-11-11T13:10:41.058+01:00</updated><title type='text'>The EU's real problem: MySQL and Oracle do not compete!</title><content type='html'>I think that most people are missing the point, Oracle included. The main objection of the EU is &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; that Oracle is swallowing up a major competitor.&lt;br /&gt;&lt;br /&gt;To understand this you have to read between the lines of the EU decision:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"The regulators see a major conflict of interest in the world's largest commercial database company owning its largest open-source competitor"&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This should actually read: "&lt;span style="font-style: italic;"&gt;the world's largest commercial database company owning the largest open-source &lt;/span&gt;&lt;span style="font-style: italic;"&gt;database&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;The database market is divided into 2 parts: &lt;span style="font-weight: bold;"&gt;the back-office&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;the online &lt;/span&gt;world.&lt;br /&gt;&lt;br /&gt;And now you know what I am going to say ... &lt;span style="font-weight: bold;"&gt;Oracle has an near monopoly in back-office&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;MySQL has a monopoly in online&lt;/span&gt; applications.&lt;br /&gt;&lt;br /&gt;So let's do a little maths:&lt;br /&gt;&lt;br /&gt;If we assume that back-office and online applications divide the database market into 2 equal parts, and that &lt;span style="font-weight: bold;"&gt;Oracle owns 60% of the back-office&lt;/span&gt;, and &lt;span style="font-weight: bold;"&gt;MySQL 90% of the online &lt;/span&gt;world.&lt;br /&gt;&lt;br /&gt;This means that &lt;span style="font-weight: bold;"&gt;Oracle controls 30%&lt;/span&gt; (60% of 50%) &lt;span style="font-weight: bold;"&gt;of the entire database market today&lt;/span&gt;, but &lt;span style="font-weight: bold;"&gt;after the acquisition this number will be 75%&lt;/span&gt; (30% + 90% of 50%).&lt;br /&gt;&lt;br /&gt;Something to think about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-1447274098331932380?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/1447274098331932380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=1447274098331932380' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1447274098331932380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1447274098331932380'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/11/eus-real-problem-mysql-and-oracle-do.html' title='The EU&apos;s real problem: MySQL and Oracle do not compete!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-1055475882246814375</id><published>2009-09-18T12:16:00.001+02:00</published><updated>2009-09-21T09:57:34.554+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='storage engine'/><category scheme='http://www.blogger.com/atom/ns#' term='test suite'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>The mysterious Storage Engine Independent Test Suite</title><content type='html'>Recently &lt;a href="http://www.facebook.com/note.php?note_id=140021445932"&gt;Mark observed&lt;/a&gt; that we now all need a storage engine independent test suite, &lt;span style="font-weight: bold;"&gt;Sun included&lt;/span&gt;! Well, as far as I know, there is such a thing at Sun, sort of. Apparently it has been used to test PBXT and other engines, but I've heard it is not in good enough shape to be released.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;But my question is, why not release it anyway?&lt;/span&gt; We could turn it into an engine community project. I believe there are enough engine developers out there to get this moving forward.&lt;br /&gt;&lt;br /&gt;The secret is to start small, and just get a few tests to run with all engines. Then additional tests can be added step by step. Engines need a way to specify that they want to skip a test entirely (e.g. transactional tests), and it should be easy to customize results for various engines.&lt;br /&gt;&lt;br /&gt;An example of a simple and elegant solution can be found in Drizzle. As &lt;a href="http://www.facebook.com/mordred"&gt;Monty Taylor&lt;/a&gt; mentioned in a comment to &lt;a href="http://www.facebook.com/note.php?note_id=140021445932"&gt;Marks blog&lt;/a&gt;: "We have some patches to test-run in Drizzle to allow running the whole test suite with a specified storage engine".&lt;br /&gt;&lt;br /&gt;I think it has been long enough. This could be a good opportunity to start a Sun/Community project, something like Drizzle. In other words, get something out there, even if it is incomplete, and let the community also take a large part of the responsibility.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-1055475882246814375?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/1055475882246814375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=1055475882246814375' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1055475882246814375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1055475882246814375'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/09/mysterious-storage-engine-independent.html' title='The mysterious Storage Engine Independent Test Suite'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-5366437937267277105</id><published>2009-09-11T15:16:00.000+02:00</published><updated>2009-09-11T15:16:40.058+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new release'/><category scheme='http://www.blogger.com/atom/ns#' term='rc'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='2-phase commit'/><category scheme='http://www.blogger.com/atom/ns#' term='xa'/><category scheme='http://www.blogger.com/atom/ns#' term='online backup'/><title type='text'>PBXT 1.0.09 RC3 implements XA and online backup</title><content type='html'>I have just released PBXT 1.0.09 RC3. Besides bug fixes (details in the &lt;a href="http://primebase.org/download/ChangeLog"&gt;release notes&lt;/a&gt;), this version includes 2 Beta features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    XA/2-Phase Commit support&lt;/li&gt;&lt;li&gt;    Native online backup Driver&lt;/li&gt;&lt;/ul&gt;XA support has been around MySQL for quite a while, and we all know of it usefulness, for example when sharding. So I was surprised to find a bug in the XA recovery: &lt;a href="http://bugs.mysql.com/bug.php?id=47134"&gt;Bug #47134&lt;/a&gt;. Contrary to what is reported, the crash can also occur when using XA with just the default engines installed, so watch out for that one (the good news: the bug fix is simple).&lt;br /&gt;&lt;br /&gt;Online backup is really cool! I have heard that it may soon be released in a coming version of 5.4, so lets hope that this is true.&lt;br /&gt;&lt;br /&gt;In a little test, I did a backup of a 10GB database in 49.26 seconds! Admitedly this was on a system with 4 15K drives in a RAID 0 configuration. But that is still a fantastic, considering the tables are not even locked during this time!&lt;br /&gt;&lt;br /&gt;The database itself took 19 min. 56 sec. to generate. A complete restore took only 14 min. 29 sec.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;But, it gets even better....&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have been working on PBXT 1.1, where I have done a number of things to improve the I/O performance of the engine.&lt;br /&gt;&lt;br /&gt;In the same test as above, run with PBXT 1.1, the time to generate the database was 9 min. 35 sec., and the time to restore was 6 min 18 sec!  (Time to generate the backup was identical.)&lt;br /&gt;&lt;br /&gt;PBXT 1.1 is available directly from Launchpad here: &lt;a href="https://code.launchpad.net/%7Epbxt-core/pbxt/staging"&gt;lp:~pbxt-core/pbxt/staging&lt;/a&gt;, if you are interested in trying it out. 1.1 also has full support for memory based tables.&lt;br /&gt;&lt;br /&gt;The new release candidate (PBXT 1.0.09) can be downloaded from &lt;a href="http://primebase.org/download"&gt;primebase.org/download&lt;/a&gt;. It is also available from Lauchpad as the rc3 series: &lt;a href="https://code.launchpad.net/pbxt/rc3"&gt;lp:pbxt/rc3&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Please report bugs &lt;a href="https://bugs.launchpad.net/pbxt"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Any feedback is welcome! You can use Launchpad &lt;a href="https://answers.launchpad.net/pbxt"&gt;questions&lt;/a&gt; or the PBXT &lt;a href="https://launchpad.net/%7Epbxt-discuss"&gt;mailing list&lt;/a&gt; for this purpose.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-5366437937267277105?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/5366437937267277105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=5366437937267277105' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5366437937267277105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5366437937267277105'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/09/pbxt-1009-rc3-implements-xa-and-online.html' title='PBXT 1.0.09 RC3 implements XA and online backup'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-6003096117269653543</id><published>2009-08-21T13:44:00.000+02:00</published><updated>2009-08-21T13:44:58.830+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensql camp'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='froscon'/><title type='text'>PBXT at the OpenSQL Camp hosted by the FrOSCon 2009</title><content type='html'>Vladimir will be giving a presentation on PBXT at the FrOSCon 2009 in St. Augustin, near Bonn in Germany tomorrow:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; font-style: italic;"&gt;PBXT: Technology trends that affect your Database&lt;br /&gt;Room: C120/OpenSQLCamp&lt;br /&gt;Time: 22 Aug 2009, 18:15 - 18:45&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The talks is packed with interesting information about how the design of PBXT handles the major technological challenges of the future, including multiple cores, lots of RAM and solid state drives.&lt;br /&gt;&lt;br /&gt;If you are in the area, check it out! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-6003096117269653543?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/6003096117269653543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=6003096117269653543' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6003096117269653543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6003096117269653543'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/08/pbxt-at-opensql-camp-hosted-at-froscon.html' title='PBXT at the OpenSQL Camp hosted by the FrOSCon 2009'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-5098861676187991933</id><published>2009-08-20T09:51:00.000+02:00</published><updated>2009-08-20T09:51:43.339+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='gpl'/><category scheme='http://www.blogger.com/atom/ns#' term='dual license'/><title type='text'>What if MySQL dropped the Dual License?</title><content type='html'>In his blog &lt;a href="http://redmonk.com/sogrady/2009/08/17/does-the-gpl-matter/"&gt;Does the GPL Matter? In a Word, Yes&lt;/a&gt;, Stephen O'Grady makes the significant point that the dual-licensing model has a major drawback:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Sun/MySQL can only include patches and contributions if they fully own the copyright to those changes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This gives forks like Drizzle, OurDelta, Percona and MariaDB a major advantage over the Sun version: they can include the best patches from all over. And it is clear that the momentum is building.&lt;br /&gt;&lt;br /&gt;In a follow-up blog, &lt;a href="http://redmonk.com/sogrady/2009/08/19/does-copyright-matter-or-is-the-end-of-dual-licensing-near/"&gt;Stephen asks&lt;/a&gt;: "what would the implications be if MySQL, of all projects, were forced to abandon the dual-licensing model it had long championed?"&lt;br /&gt;&lt;br /&gt;Thinking about this, there is something that really bothers me:&lt;br /&gt;&lt;br /&gt;Let's assume MySQL took on patches without ownership of the copyright, and thereby lost the ability to provide a commercial license to OEM customers.&lt;br /&gt;&lt;br /&gt;According to the GPL this would mean that nobody could ever ship a commercial product with MySQL built-in!&lt;br /&gt;&lt;br /&gt;To avoid this possibility from being lost to the world forever,  &lt;span style="font-weight: bold;"&gt;surely MySQL &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;would have to abandon the GPL&lt;/span&gt;, and maybe change to LGPL or BSD!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-5098861676187991933?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/5098861676187991933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=5098861676187991933' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5098861676187991933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5098861676187991933'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/08/what-if-mysql-dropped-dual-license.html' title='What if MySQL dropped the Dual License?'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-645915387065253694</id><published>2009-08-11T21:28:00.000+02:00</published><updated>2009-08-11T21:29:16.190+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jeremy zawodny'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='linux magazine'/><title type='text'>Jeremy's article on PBXT in Linux Magazine</title><content type='html'>&lt;a href="http://jeremy.zawodny.com/blog"&gt;Jeremy Zawodny&lt;/a&gt; of Craigslist wrote a great article on PBXT for Linux Magazine:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linux-mag.com/cache/7462/1.html"&gt;PBXT: Your Next MySQL Storage Engine?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Check it out...&lt;br /&gt;&lt;br /&gt;Thanks Jeremy :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-645915387065253694?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/645915387065253694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=645915387065253694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/645915387065253694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/645915387065253694'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/08/jeremys-article-on-pbxt-in-linux.html' title='Jeremy&apos;s article on PBXT in Linux Magazine'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-6497317213255821553</id><published>2009-06-30T19:56:00.001+02:00</published><updated>2009-06-30T21:30:50.122+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new release'/><category scheme='http://www.blogger.com/atom/ns#' term='rc'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><title type='text'>PBXT 1.0.08 RC2 Released!</title><content type='html'>The second Release Candidate of PBXT, version 1.0.08, has just been released.&lt;br /&gt;&lt;br /&gt;As I have mentioned in my previous blogs (&lt;a href="http://pbxt.blogspot.com/2009/03/improving-pbxt-dbt2-performance.html"&gt;here&lt;/a&gt; and &lt;a href="http://pbxt.blogspot.com/2009/03/solving-pbxt-dbt2-scaling-problem.html"&gt;here&lt;/a&gt;), I did a lot to improve performance for this version.&lt;br /&gt;&lt;br /&gt;At the same time I am confident that this release is stable as we now have a large number of tests, including functionality, concurrency and crash recovery. But even more important, the number of users of PBXT has increased significantly since the last RC release, and that is the best test for an engine.&lt;br /&gt;&lt;br /&gt;So there has never been a better time to try out PBXT! :)&lt;br /&gt;&lt;br /&gt;You can download the source code, and selected binaries from here: &lt;a href="http://primebase.org/download"&gt;primebase.org/download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Vladimir and I have made a lot of changes, for details checkout the &lt;a href="http://primebase.org/download/ChangeLog"&gt;release notes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bugs can be reported on Launchpad, &lt;a href="https://bugs.launchpad.net/pbxt"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There is also a new PBXT &lt;a href="https://launchpad.net/%7Epbxt-discuss"&gt;mailing lis&lt;/a&gt;&lt;a href="https://launchpad.net/%7Epbxt-discuss"&gt;t&lt;/a&gt;, so if you have any questions this is the best place for them.&lt;br /&gt;&lt;br /&gt;PBXT is a high-performance, MVCC-based, transactional storage engine for MySQL. The project is open source (GPL) and hosted on &lt;a href="https://launchpad.net/pbxt"&gt;Launchpad&lt;/a&gt;. PBXT supports referential integrity, row-level locking and is fully ACID compliant.&lt;br /&gt;&lt;br /&gt;For more information please go to the PBXT home at: &lt;a href="http://primebase.org/"&gt;primebase.org&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-6497317213255821553?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/6497317213255821553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=6497317213255821553' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6497317213255821553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6497317213255821553'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/06/pbxt-1008-rc2-released.html' title='PBXT 1.0.08 RC2 Released!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-2494459165053424771</id><published>2009-05-13T18:52:00.000+02:00</published><updated>2009-05-13T18:52:24.884+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysqlfoundation'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='xampp'/><category scheme='http://www.blogger.com/atom/ns#' term='mariadb'/><category scheme='http://www.blogger.com/atom/ns#' term='ourdelta'/><title type='text'>At last we have a MySQL Foundation, its called The Open Database Alliance</title><content type='html'>Just over a year ago we registered the domain name &lt;a href="http://www.whois.net/whois/mysqlfoundation.org"&gt;mysqlfoundation.org&lt;/a&gt; in the hopes that Sun/MySQL will actually create such an entity.&lt;br /&gt;&lt;br /&gt;My idea was to move the development of the MySQL Community server to the Foundation and make the development fully community orientated. The Foundation would have its own development goals and release schedule. Sun could then pull patches from the Foundation's Community server into the Enterprise server once they had stabilized.&lt;br /&gt;&lt;br /&gt;I pitched the idea to several people at Sun back then and over the last year, however, for some reason, the foundation concept just proved impossible to push through.&lt;br /&gt;&lt;br /&gt;I believe this would have been a great opportunity for Sun to take the leadership in the community, as the foundation idea dates back to before things really started &lt;a href="http://developers.slashdot.org/article.pl?sid=09/03/30/228214"&gt;splitting up&lt;/a&gt;. But Sun's loss is now that of Oracle, who perhaps doesn't care anyway.&lt;br /&gt;&lt;br /&gt;What is really most important is that we in the community now have an entity that is going to tie our side of things together: &lt;a href="http://www.prweb.com/releases/2009/05/prweb2417854.htm"&gt;The Open Database Alliance&lt;/a&gt;. For the community it is critical that things do not split up any further and that instead our efforts are bundled. I believe the Alliance can do this for us.&lt;br /&gt;&lt;br /&gt;So where does that leave Oracle?&lt;br /&gt;&lt;br /&gt;Well, as I see it, we now have a new, more relevant, community/enterprise split: the Oracle MySQL Enterprise server and the MariaDB Community server.&lt;br /&gt;&lt;br /&gt;And, I guess I have to stand up and say, for us (&lt;a href="http://primebase.org/"&gt;primebase.org&lt;/a&gt;) this difference is real and significant.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://launchpad.net/pbxt"&gt;PBXT&lt;/a&gt; is already part of most community builds including  &lt;a href="https://launchpad.net/maria"&gt;MariaDB&lt;/a&gt;, &lt;a href="http://ourdelta.org/patches"&gt;OurDelta&lt;/a&gt; and &lt;a href="http://www.apachefriends.org/en/news.html"&gt;XAMPP&lt;/a&gt;. But is is not part of the official &lt;a href="http://dev.mysql.com/downloads/mysql/5.1.html"&gt;MySQL 5.1 Community Server&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Please note, this has nothing to do with my &lt;span style="font-weight: bold;"&gt;many great friends&lt;/span&gt; at MySQL! They help us in lots of other ways and I am very thankful for this :)&lt;br /&gt;&lt;br /&gt;But even with the "community" label, any download offered by Sun (now Oracle of course - no change there) is about business! That is very difficult to change, and I accept that.&lt;br /&gt;&lt;br /&gt;But the community does not need to change anything. It is, what it is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-2494459165053424771?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/2494459165053424771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=2494459165053424771' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/2494459165053424771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/2494459165053424771'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/05/at-last-we-have-mysql-foundation-its.html' title='At last we have a MySQL Foundation, its called The Open Database Alliance'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-2516923897174010537</id><published>2009-04-17T14:37:00.000+02:00</published><updated>2009-04-17T14:37:45.269+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='user conference'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='pbms'/><title type='text'>PrimeBase Engines at the MySQL Conference 2009</title><content type='html'>Barry, Vladimir and I (the entire PrimeBase dev team!) will be presenting next week at the &lt;a href="http://www.mysqlconf.com/mysql2009"&gt;MySQL User Conference and Expo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We've got lots of cool stuff going on. Barry will tell you how &lt;a href="http://blobstreaming.org/"&gt;PBMS&lt;/a&gt; can store your BLOBs in the clouds, Vladimir will be explaining what makes &lt;a href="http://www.primebase.org/"&gt;PBXT&lt;/a&gt; so fast, and I will be talking about the past, the present and the future...&lt;br /&gt;&lt;br /&gt;Even if that all doesn't interest you, be sure to just drop by to say hi. We're friendly, really! :)&lt;br /&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;The PBXT Storage Engine: Meeting Future Challenges&lt;/span&gt;&lt;br /&gt;Paul McCullagh&lt;br /&gt;&lt;a href="http://www.mysqlconf.com/mysql2009/public/schedule/detail/6676"&gt;3:05pm - 3:50pm Tuesday, 04/21/2009&lt;/a&gt;&lt;br /&gt;Ballroom B&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;BLOB Streaming: Efficient Reliable BLOB Handling&lt;br /&gt;for all Storage Engines&lt;/span&gt;&lt;br /&gt;Barry Leslie&lt;br /&gt;&lt;a href="http://www.mysqlconf.com/mysql2009/public/schedule/detail/6727"&gt;2:50pm - 3:35pm Thursday, 04/23/2009&lt;/a&gt;&lt;br /&gt;Ballroom B&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;Making PBXT Faster&lt;/span&gt;&lt;br /&gt;Vladimir Kolesnikov&lt;br /&gt;&lt;a href="http://conferences.percona.com/percona-performance-conference-2009/schedule.html"&gt;11:15am - 11:55am Thursday, 04/23/2009&lt;/a&gt;&lt;br /&gt;Percona Performance Conference - Rooms 203 &amp;amp; 204&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-2516923897174010537?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/2516923897174010537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=2516923897174010537' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/2516923897174010537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/2516923897174010537'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/04/primebase-engines-at-mysql-conference.html' title='PrimeBase Engines at the MySQL Conference 2009'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-8826918805977596603</id><published>2009-03-25T19:21:00.001+01:00</published><updated>2009-03-26T12:33:56.742+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scaling'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='innodb'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><title type='text'>Solving the PBXT DBT2 Scaling Problem</title><content type='html'>One little bit of wisdom I would like to pass on:&lt;br /&gt;&lt;br /&gt;If a program runs fast with 20 threads, that does not mean it will run fast with 50. And if it runs fast with 50, it does not mean that it will run fast with 100, and if it runs fast with 100 ... don't bet on it running fast with 200 :)&lt;br /&gt;&lt;br /&gt;In my &lt;a href="http://pbxt.blogspot.com/2009/03/improving-pbxt-dbt2-performance.html"&gt;last blog&lt;/a&gt; I discussed some improvement to the performance of PBXT running the DBT2 benchmark. Despite the overall significant increase in performance I noted a drop off at 32 threads that indicated a scaling problem. For the last couple of weeks I have been working on this problem and I have managed to fix it:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.primebase.org/download/pbxt-vs-inno2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 391px; height: 236px;" src="http://www.primebase.org/download/pbxt-vs-inno2.jpg" alt="" border="0" /&gt;&lt;/a&gt;As before, this test was done using MySQL 5.1.30 on an 8 core, 64-bit, Linux machine with an SSD drive and a 5 warehouse DBT2 database. The test is memory bound and does not test the affects of checkpointing.&lt;br /&gt;&lt;br /&gt;PBXT Baseline is the code revision indicated as PBXT 1.0.08 in my &lt;a href="http://pbxt.blogspot.com/2009/03/improving-pbxt-dbt2-performance.html"&gt;last blog&lt;/a&gt;. PBXT 1.0.07 is the current PBXT GA release version. PBXT 1.0.08 is the latest revision of the PBXT &lt;a href="https://launchpad.net/pbxt/trunk"&gt;trunk&lt;/a&gt;. The baseline graph shows the extent of the scaling problem of the last version.&lt;br /&gt;&lt;br /&gt;The latest version is over 20 times faster than PBXT 1.0.07 and 140% faster than the previous version. But most important is the fact that performance remains almost constant as the number of threads increases.&lt;br /&gt;&lt;br /&gt;My thanks also to InnoDB which, looking at it positively, offers an excellent measure of how well you are doing! :) It looks like PBXT now actually scales better than InnoDB for this type of test.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So what has changed?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Basically I have made 2 changes, one major and one smaller but significant change. The first change, which got PBXT running faster with 50 threads has to do with conflict handling.&lt;br /&gt;&lt;br /&gt;As I mentioned &lt;a href="http://pbxt.blogspot.com/2009/03/improving-pbxt-dbt2-performance.html"&gt;before&lt;/a&gt; DBT2 causes a lot of row level conflicts. This is especially the case as the number threads increase. In fact, at any given time during the test with 100 threads (performance results above), 80 of the threads are waiting for row locks. (Of the remaining 20, 4 are waiting for network I/O, and the rest are doing the actual work!)&lt;br /&gt;&lt;br /&gt;The result is, if the handling of these conflicts is not optimal the engine looses a lot of time. Which you can clearly see from both the baseline and 1.0.07 results reported above.&lt;br /&gt;&lt;br /&gt;To fix this I completely re-wrote the row-level conflict handling. Code paths are now much shorter for row-lock/update detection and handling and threads are now notified directly when they can continue.&lt;br /&gt;&lt;br /&gt;The other change I made involved the opening and closing of tables when the MySQL open table cache is too small. This is something that really killed performance starting at about 100 threads. PBXT was doing quite a bit of unnecessary stuff on open and close table, which was fairly easy to move out.&lt;br /&gt;&lt;br /&gt;So now that the scaling is good up to 200 threads, should I assume that performance will also be good for 400 threads? Of course it is! Well, at least until I test it... :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-8826918805977596603?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/8826918805977596603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=8826918805977596603' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/8826918805977596603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/8826918805977596603'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/03/solving-pbxt-dbt2-scaling-problem.html' title='Solving the PBXT DBT2 Scaling Problem'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-3535215797015936276</id><published>2009-03-06T14:50:00.000+01:00</published><updated>2009-03-06T14:51:25.904+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='innodb'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='dbt2'/><title type='text'>Improving PBXT DBT2 Performance</title><content type='html'>DBT2, with over 40% conflicts, is an very challenging benchmark, especially for an MVCC based engine. And, as a result, it is not a test that an engine is automatically good at. InnoDB has been extensively optimized for DBT2, and it shows.&lt;br /&gt;&lt;br /&gt;For the last few weeks I have had the opportunity to focus on PBXT DBT2 performance for the first time. I started with a memory bound DBT2 test and the current state of this work is illustrated below.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.primebase.org/download/pbxt-vs-inno.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 391px; height: 236px;" src="http://www.primebase.org/download/pbxt-vs-inno.jpg" alt="" border="0" /&gt;&lt;/a&gt;These results were achieved using MySQL 5.1.30 on an 8 core, 64-bit, Linux machine with an SSD drive and a 5 warehouse DBT2 database.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The dip off at 32 threads is left as an exercise for the reader :) Patches will be excepted!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So what were the major changes that lead to this improvement?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Don't Wait Too Long!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When I began the optimizations, PBXT was only using 120% CPU (i.e. just over 1 core), while InnoDB uses 440% (i.e. about 4.5 cores). I noticed that the pauses I was using in some situations were way too long (even at 1/1000 of a second). For example, shortly before commit, PBXT waits if some other transaction may soon commit in order to improve group commit efficiency.&lt;br /&gt;&lt;br /&gt;If the pause is too long the program waits around even after the condition to continue has been fulfilled. So I changed these pauses to a yield. However, I have noticed that even a yield causes some threads to wait too long, so I am considering putting in a small amount of spinning.&lt;br /&gt;&lt;br /&gt;Anyway, after that change, PBXT performance was still only 50% of InnoDB.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Too Many &lt;span style="font-family:courier new;"&gt;memcpy&lt;/span&gt;'s&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The next problem was the number of &lt;span style="font-family:courier new;"&gt;memcpy&lt;/span&gt;'s in the standard index operations: &lt;span style="font-style: italic;"&gt;search&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;insert&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;delete&lt;/span&gt;. PBXT was using the index cache like a disk with a read and write call interface. Such functions involve a buffer and a memcpy on every access. On average 8K was transferred per call, which is significant.&lt;br /&gt;&lt;br /&gt;To get rid of the &lt;span style="font-family:courier new;"&gt;memcpy&lt;/span&gt;'s I had to change the way the indexing system and the index cache work together. This was a major change. Instead of an index operation using a buffer and a copy it now "pins" the index cache page, and accesses the index cache page directly.&lt;br /&gt;&lt;br /&gt;Unfortunately I didn't see the improvement that I expected after this change because I ran straight into the next problem...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Updating an Index&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; in &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Parallel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Threads were now waiting on an exclusive lock required to perform modification to an index. I was using an exclusive lock because it is simply the easiest way keep indices consistent during update.&lt;br /&gt;&lt;br /&gt;To fix this I found a way to do modify an index in parallel with other readers and writers in over 90% of index update cases. This was one of the most complex changes. Although, the idea behind the solution is relatively straight forward.&lt;br /&gt;&lt;br /&gt;But, I have decided I'm not going to say how I did it here ... for that you will have to attend my (plug) &lt;a href="http://en.oreilly.com/mysql2009/public/schedule/speaker/517"&gt;talk at the User's Conference&lt;/a&gt;! He he :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Cost of Index Scans&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;At this stage PBXT was running 3 of the 5 procedures used by DBT2 (slightly) faster than InnoDB. The remaining problem involved the index scan, something that InnoDB is pretty good at.&lt;br /&gt;&lt;br /&gt;In order to scan an index, PBXT was making a copy of each index page, and then stepping through the items. A copy of the page was required because after each step the engine returns a row to MySQL. So, all-in-all, the time taken to scan a page is too long to pin the index cache page.&lt;br /&gt;&lt;br /&gt;To avoid making a copy of each page scanned I implemented index cache page "handles". An index scanner now gets a handle to the index page it is scanning. The handles are "copy-on-write", so changes to the index page are transparent to the scanner.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Work in Progress&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So DBT2 performance of PBXT is now more or less on par with InnoDB for memory bound tests. There are some scaling issues which I will look at next, and I have not yet investigated the affects of a disk bound load and checkpointing.&lt;br /&gt;&lt;br /&gt;I also had a quick look at the &lt;span style="font-family:courier new;"&gt;mysqlslap&lt;/span&gt; performance following the optimizations. Some of it is great and some of it is "interesting". But I think I'll leave that for another blog...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-3535215797015936276?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/3535215797015936276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=3535215797015936276' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3535215797015936276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3535215797015936276'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2009/03/improving-pbxt-dbt2-performance.html' title='Improving PBXT DBT2 Performance'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-739246780706015208</id><published>2008-12-18T15:01:00.000+01:00</published><updated>2008-12-18T15:01:29.511+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new release'/><category scheme='http://www.blogger.com/atom/ns#' term='rc'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><title type='text'>PBXT goes RC!</title><content type='html'>With all the booha about MySQL not being ready for GA, it makes me almost afraid to announce, ahem, ... and &lt;a href="http://www.primebase.org"&gt;PBXT&lt;/a&gt; &lt;b&gt;is&lt;/b&gt;, ehr, &lt;b&gt;RC&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;It has been just over a year now since I started developing the fully durable version of PBXT. Before that, PBXT was Beta. After that, it was Alpha again.&lt;br /&gt;&lt;br /&gt;Now we have 2 solid Beta versions behind us, Vladimir and I have fixed all known bugs for this version, including quite a number of foreign key bugs. We have all 259 mysql-test-run tests that were adapted for PBXT (and a bunch of our own) running through without any errors on 4 platforms: Mac OS X, Linux 32-bit and 64-bit, and Windows. Our buildbot is giving us a green light, at last!&lt;br /&gt;&lt;br /&gt;Besides this we have done crash tests, load tests and crash and load tests (I mean recovery)! And maybe most important, we have it ticking away in a very demanding OEM product called &lt;a href="http://www.teamdrive.net"&gt;TeamDrive&lt;/a&gt;. And it is doing it 20% to 30% faster than the "most commonly used" transactional storage engine.&lt;br /&gt;&lt;br /&gt;Then we also have PBXT 1.0.07 RC compiling and running with MySQL 5.1.30, MySQL 6.0.8 and Drizzle! And it compiles on Linux, Windows, Mac OS X, FreeBSD, netbsd, OpenSolaris and Solaris (last patch pending on this one), whew!&lt;br /&gt;&lt;br /&gt;So what's next?&lt;br /&gt;&lt;br /&gt;Well next stop is GA, and I would like to have it done before the MySQL conference. Heard that one before? Nah ;)&lt;br /&gt;&lt;br /&gt;Seriously though, we are not planning to add anymore features to this version so there is only one way to stop us: by testing and reporting bugs! Right here: &lt;a href="https://bugs.launchpad.net/pbxt"&gt;https://bugs.launchpad.net/pbxt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Would be much appreciated! :)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;BTW, the version is available, as usual, from &lt;a href="http://www.primebase.org/download"&gt;http://www.primebase.org/download&lt;/a&gt;, or get it straight from &lt;a href="https://launchpad.net/pbxt"&gt;Launchpad.net&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;bzr branch lp:pbxt/1.0.07-rc&lt;br /&gt;&lt;br /&gt;&lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-739246780706015208?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/739246780706015208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=739246780706015208' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/739246780706015208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/739246780706015208'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/12/pbxt-goes-rc.html' title='PBXT goes RC!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-8076109492785626628</id><published>2008-12-15T15:13:00.000+01:00</published><updated>2008-12-15T15:13:10.773+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='xtstat'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><title type='text'>xtstat: Tells you exactly what PBXT is doing!</title><content type='html'>I have created a new tool, called &lt;tt&gt;xtstat&lt;/tt&gt;, for analyzing the performance of the PBXT storage engine.&lt;br /&gt;&lt;br /&gt;The way it works is simple. PBXT now counts all kinds of things: transactions committed and rolled back, statements executed, records read and written, tables and indexes scanned, bytes read, written and flushed to various types of files: record, index, data logs, transaction logs, and so on.&lt;br /&gt;&lt;br /&gt;A &lt;tt&gt;SELECT&lt;/tt&gt; on the system table &lt;tt&gt;PBXT.STATISTICS&lt;/tt&gt; (or &lt;tt&gt;INFORMATION_SCHEMA.PBXT_STATISTICS&lt;/tt&gt; if PBXT was built inside the MySQL tree) returns the current totals of all these counters. &lt;tt&gt;xtstat&lt;/tt&gt; does a &lt;tt&gt;SELECT&lt;/tt&gt; every second on this table and prints the difference. In this way, you can see how much work PBXT is doing in each area.&lt;br /&gt;&lt;br /&gt;There are currently 48 different statistics:&lt;br /&gt;&lt;img src="http://www.primebase.org/blog/xtstat1.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;To ensure all this counting does not itself cost any performance, each thread counts for itself, so no locking is required. The &lt;tt&gt;SELECT&lt;/tt&gt; on &lt;tt&gt;STATISTICS&lt;/tt&gt; then sums over all running threads.&lt;br /&gt;&lt;br /&gt;The default output of &lt;tt&gt;xtstat&lt;/tt&gt; is 201 characters wide (281 characters are required to display all statistics), but using the &lt;tt&gt;--display&lt;/tt&gt; option you can specify exactly which statistics you would like to look at.&lt;br /&gt;&lt;br /&gt;Here is an example, of the default output with some of the middle columns removed:&lt;br /&gt;&lt;img style="width: 410px; height: 153px;" src="http://www.primebase.org/blog/xtstat2.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;To display large byte values, such as data read from the data log files (&lt;tt&gt;data-in&lt;/tt&gt; column), &lt;tt&gt;xtstat&lt;/tt&gt; uses &lt;tt&gt;K&lt;/tt&gt; (Kilobytes), &lt;tt&gt;M&lt;/tt&gt; (Megabytes) and &lt;tt&gt;G&lt;/tt&gt; (Gigabytes) to ensure the values don't overflow the column space. Counts like the number of rows inserted (&lt;tt&gt;row-ins&lt;/tt&gt; column) use, &lt;tt&gt;t&lt;/tt&gt; (thousands), &lt;tt&gt;m&lt;/tt&gt; (millions) and &lt;tt&gt;b&lt;/tt&gt; (billions) to keep things lined up.&lt;br /&gt;&lt;br /&gt;Using &lt;tt&gt;xtstat&lt;/tt&gt; it is possible to ask questions like:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How efficiently is group commit working?&lt;/b&gt;&lt;br /&gt;&lt;img style="width: 410px; height: 154px;" src="http://www.primebase.org/blog/xtstat3.jpg" border="0" /&gt;&lt;br /&gt;Notice here that the number of transaction commits in this example (&lt;tt&gt;xact-commt&lt;/tt&gt; column), is larger than the number transaction log flushes (&lt;tt&gt;xlog-syncs&lt;/tt&gt;).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Is their enough index cache?&lt;/b&gt;&lt;br /&gt;&lt;img src="http://www.primebase.org/blog/xtstat4.jpg" border="0" /&gt;&lt;br /&gt;Displaying the index stats shows that index cache misses (&lt;tt&gt;ind-miss&lt;/tt&gt; column) are at about 30%, and that the server is reading 8MB per second from the index file. So increasing the index cache would result in better performance.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How much time is being spent flushing files?&lt;/b&gt;&lt;br /&gt;&lt;img style="width: 410px; height: 153px;" src="http://www.primebase.org/blog/xtstat5.jpg" border="0" /&gt;&lt;br /&gt;In the example above you can see that &lt;tt&gt;xtstat&lt;/tt&gt; displays the number of flushes (&lt;tt&gt;syncs&lt;/tt&gt;) and the time spent in flushing in milliseconds (&lt;tt&gt;ms&lt;/tt&gt; and &lt;tt&gt;msec&lt;/tt&gt; columns).&lt;br /&gt;&lt;br /&gt;When you build PBXT with &lt;tt&gt;make install&lt;/tt&gt;, &lt;tt&gt;xtstat&lt;/tt&gt; will be installed in the same directory as other MySQL tools such as &lt;tt&gt;mysqladmin&lt;/tt&gt;, &lt;tt&gt;mysqldump&lt;/tt&gt;, etc.&lt;br /&gt;&lt;br /&gt;For more information on &lt;tt&gt;xtstat&lt;/tt&gt;, just enter:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$ bin/xtstat --help&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;All in all, I think &lt;tt&gt;xtstat&lt;/tt&gt; will be very useful in analyzing and tuning the performance of the engine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-8076109492785626628?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/8076109492785626628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=8076109492785626628' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/8076109492785626628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/8076109492785626628'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/12/xtstat-tells-you-exactly-what-pbxt-is.html' title='xtstat: Tells you exactly what PBXT is doing!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-5150655198492648694</id><published>2008-11-10T14:42:00.000+01:00</published><updated>2008-11-10T14:42:20.556+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drizzle'/><category scheme='http://www.blogger.com/atom/ns#' term='new release'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='beta'/><title type='text'>PBXT 1.0.06 Beta Released</title><content type='html'>On friday we released the second Beta version of PBXT. PBXT is a transactional storage engine for MySQL 5.1 and 6.0. You can find out more about the engine at &lt;a href="http://www.primebase.org/"&gt;www.primebase.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;PBXT is pluggable, so it can be built separately from the MySQL tree, and loaded dynamically at runtime using the &lt;tt&gt;LOAD PLUGIN&lt;/tt&gt; statement.&lt;br /&gt;&lt;br /&gt;You can download PBXT from &lt;a href="http://www.primebase.org/download"&gt;here&lt;/a&gt;. A "quick guide" to building and installing the plugin is provided. I have also updated the documentation for this version.&lt;br /&gt;&lt;br /&gt;There are no major new features in this release because we are working towards the RC version in December. But we wrote some &lt;a href="http://www.primebase.org/download/ChangeLog"&gt;release notes&lt;/a&gt; to prove we have been busy :)&lt;br /&gt;&lt;br /&gt;There is now also a version of PBXT available for &lt;a href="http://drizzleproject.org/"&gt;Drizzle&lt;/a&gt;. You will find the source code here: &lt;a href="https://code.launchpad.net/%7Edrizzle-pbxt/drizzle/pbxt"&gt;https://code.launchpad.net/~drizzle-pbxt/drizzle/pbxt&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;By the way, did any of you see this report: &lt;a href="http://www.zdnetasia.com/news/software/0,39044164,62048072,00.htm"&gt;Sun releases MySQL 5.1&lt;/a&gt;?! It's dated 7 Nov, but no sign of the new release on the MySQL website ... to bad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-5150655198492648694?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/5150655198492648694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=5150655198492648694' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5150655198492648694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5150655198492648694'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/11/pbxt-1006-beta-released.html' title='PBXT 1.0.06 Beta Released'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-6713352257938948809</id><published>2008-09-30T10:36:00.002+02:00</published><updated>2008-09-30T10:37:11.449+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='launchpad'/><category scheme='http://www.blogger.com/atom/ns#' term='drizzle'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='sourceforge'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><title type='text'>PBXT moves to Launchpad</title><content type='html'>It's been a week or 2 and some of you may already have heard that &lt;a href="http://www.primebase.org/"&gt;PBXT&lt;/a&gt; has moved from &lt;a href="http://sourceforge.net/projects/pbxt"&gt;Sourceforge&lt;/a&gt; to Lauchpad.net: &lt;a href="https://launchpad.net/pbxt"&gt;https://launchpad.net/pbxt&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are several very good reasons for the move, not the least of which is that MySQL has already moved to &lt;a href="https://launchpad.net/mysql"&gt;Launchpad&lt;/a&gt;, and &lt;a href="https://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt; is there too. It simply makes sense for a storage engine like PBXT to be on the same platform.&lt;br /&gt;&lt;br /&gt;And check this out, &lt;a href="http://www.flamingspork.com/blog/"&gt;Stewart Smith&lt;/a&gt; has already ported PBXT to Drizzle. You will find the tree here: &lt;a href="https://code.launchpad.net/%7Estewart-flamingspork/drizzle/pbxt" title="PBXT in Drizzle"&gt;PBXT in Drizzle&lt;/a&gt;. I will be pulling Stewart's changes back into the PBXT tree. Creating new branches, merging branches and generally contributing to projects is easy on Launchpad.&lt;br /&gt;&lt;br /&gt;Besides this, Launchpad has great tools for &lt;a href="https://bugs.launchpad.net/pbxt"&gt;bug reporting&lt;/a&gt;, &lt;a href="https://blueprints.launchpad.net/pbxt"&gt;planning&lt;/a&gt;, &lt;a href="https://answers.launchpad.net/pbxt"&gt;Q&amp;amp;A&lt;/a&gt; and managing &lt;a href="https://launchpad.net/pbxt/1.0.05-beta"&gt;releases&lt;/a&gt; which we plan to use. In general, I find these tools are much better integrated than those on Sourceforge. For example it is easy to attach a branch which fixes a bug to the bug report.&lt;br /&gt;&lt;br /&gt;Jay Pipes has written some excellent articles on getting started with Launchpad:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jpipes.com/index.php?/archives/249-A-Contributors-Guide-to-Launchpad.net-Part-1-Getting-Started.html"&gt;A Contributor's Guide to Launchpad.net - Part 1 - Getting Started&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jpipes.com/index.php?/archives/250-A-Contributors-Guide-to-Launchpad.net-Part-2-Code-Management.html"&gt;A Contributor's Guide to Launchpad.net - Part 2 - Code Management&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As Jay explains, making a contribution is done in a few easy steps: create a branch, make your changes, push the branch back to Launchpad and request a merge into the project. That's it!&lt;br /&gt;&lt;br /&gt;Give it a try, &lt;a href="http://ritmark.com/"&gt;Vladimir&lt;/a&gt; and I will certainly be glad to have your help. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-6713352257938948809?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/6713352257938948809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=6713352257938948809' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6713352257938948809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6713352257938948809'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/09/pbxt-moves-to-launchpad.html' title='PBXT moves to Launchpad'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-528893665567033219</id><published>2008-09-01T00:34:00.002+02:00</published><updated>2008-09-01T16:04:33.559+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drizzle'/><category scheme='http://www.blogger.com/atom/ns#' term='rc'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='beta'/><title type='text'>PBXT Beta Version Released!</title><content type='html'>I am pleased to announce that the Beta version of &lt;a href="http://www.primebase.org/"&gt;PBXT&lt;/a&gt; has just been released. You can download the source code of the storage engine from &lt;a href="http://www.primebase.org/download"&gt;www.primebase.org/download&lt;/a&gt;. I have also updated the &lt;a href="http://www.primebase.org/download"&gt;documentation&lt;/a&gt; for this version.&lt;br /&gt;&lt;br /&gt;Configuring and building the engine is easier than ever now. To configure PBXT all you have to do is specify the path to the MySQL source code tree (after building MySQL), for example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;./configure --with-mysql=/home/foo/mysql/mysql-5.1.26-rc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The PBXT configure command will retrieve all required options from the MySQL build. For example whether to do a debug or optimized build and where to install the plugin are determined automatically, depending on how you configured MySQL.&lt;br /&gt;&lt;br /&gt;This was a source of some mistakes when building the plugin, so I think it is really cool!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So what's next?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My goal is a  RC (release candidate) version before the end of the year.   Considering the stability of the new Beta, I think this is realistic.&lt;br /&gt;&lt;br /&gt;The main work is testing, performance tuning, and fixing all those bugs you are about to find as you give PBXT a spin, right? :)&lt;br /&gt;&lt;br /&gt;Besides, the size of the PBXT programming team will soon double! But more about that later...&lt;br /&gt;&lt;br /&gt;Another thing I would love to do soon is a &lt;a href="http://www.drizzleproject.org/"&gt;Drizzle&lt;/a&gt; version of PBXT. This has one significant advantage. If I discover a bottleneck in Drizzle, while performance tuning the engine, a patch for the problem in the server will probably be accepted fairly quickly.&lt;br /&gt;&lt;br /&gt;But first I need to move PBXT to &lt;a href="https://launchpad.net/"&gt;launchpad&lt;/a&gt; where all the music is playing these days!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-528893665567033219?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/528893665567033219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=528893665567033219' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/528893665567033219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/528893665567033219'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/09/pbxt-beta-version-released.html' title='PBXT Beta Version Released!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-3454095642657438208</id><published>2008-08-02T21:52:00.001+02:00</published><updated>2008-08-02T21:55:49.971+02:00</updated><title type='text'>New PBXT Release 1.0.04 Improves Performance</title><content type='html'>Lets face it, when it comes to storage engines, performance is everything. But then again, so is stability and data integrity!&lt;br /&gt;&lt;br /&gt;So as a developer of an engine, which should you concentrate on first: performance, stability or data integrity?&lt;br /&gt;&lt;br /&gt;I know there are not many that have to deal with this stuff, but here is my advice anyway: &lt;i&gt;go for performance first&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;The reason is simple, significant performance tuning can have a serious affect on both stability and data integrity. And this means you need to repeat a lot of the debugging and testing you did before.&lt;br /&gt;&lt;br /&gt;For example one of the optimizations I made for 1.0.04 required a number of changes to the index cache. One thing was to make the LRU (least recently used) list global, it was segment based before. During the change I copy-pasted a "lru" pointer instead of a "mru" pointer :(&lt;br /&gt;&lt;br /&gt;The result was not a crash, but the engine lost cache pages! So I only noticed the problem when a test just ran to slowly. When I got it up in the debugger, I noticed that the engine was flushing the index constantly, and this was because it was running on only 4 cache pages! All-in-all that typo cost me a half a day of debugging.&lt;br /&gt;&lt;br /&gt;Anyway, there is still more to be done in way of optimization, but so far I am happy with the results. Here is a comparison between 1.0.04 and the previous version of PBXT:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.primebase.org/download/pbxt_03_vs_04.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 406px; height: 238px;" src="http://www.primebase.org/download/pbxt_03_vs_04.jpg" alt="" border="0" /&gt;&lt;/a&gt;This test was done on a 2-core machine using sysbench-0.4.7 running various selects on a table with 1M rows.&lt;br /&gt;&lt;br /&gt;As you can see performance of the 1.0.03 version breaks completely at 4 threads. However, although 1.0.04 performance is significantly better (10 times faster at 4 threads), it also degrades substantially.&lt;br /&gt;&lt;br /&gt;So why is this?&lt;br /&gt;&lt;br /&gt;Well that is the thing that prompted me to have a look at the performance of MySQL itself, which I reported here: &lt;a href="http://pbxt.blogspot.com/2008/07/mutex-contention-and-other-bottlenecks.html"&gt;Mutex contention and other bottlenecks in MySQL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Suffice to say that at 16 threads, MySQL is hanging 43% of the time in a mutex in open_table(), and 45% of the time in a mutex in lock_table(). And the solution is ... on its way down ... &lt;a href="https://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;As usual you can download the latest version from &lt;a href="http://www.primebase.org/download"&gt;www.primebase.org/download&lt;/a&gt; or checkout using &lt;tt&gt;svn&lt;/tt&gt; directly from &lt;a href="http://sourceforge.net/projects/pbxt"&gt;SourceForge.net&lt;/a&gt;. Give it a spin...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-3454095642657438208?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/3454095642657438208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=3454095642657438208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3454095642657438208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3454095642657438208'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/08/new-pbxt-release-1004-improves.html' title='New PBXT Release 1.0.04 Improves Performance'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-7139201818787063984</id><published>2008-07-23T09:30:00.000+02:00</published><updated>2008-07-23T09:30:00.477+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drizzle'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>Drizzle goes back to the Roots</title><content type='html'>Will &lt;a href="https://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt; (&lt;a href="http://krow.livejournal.com/602409.html"&gt;Brian&lt;/a&gt;, &lt;a href="http://monty-says.blogspot.com/2008/07/what-if.html"&gt;Monty&lt;/a&gt;, &lt;a href="http://fallenpegasus.livejournal.com/730102.html"&gt;Mark&lt;/a&gt;, &lt;a href="http://mysql-ha.com/2008/07/22/building-drizzle-cleanly-with-all-the-warnings/"&gt;MontyT&lt;/a&gt;, and others ...) become a &lt;i&gt;cloudburst&lt;/i&gt;? I think so, and here is why...&lt;br /&gt;&lt;br /&gt;&lt;i&gt;First a simple question:&lt;/i&gt; what made diverse systems such as PHP, the HTTP protocol and memcached so popular?&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Answer:&lt;/i&gt; &lt;b&gt;ease of use, simplicity, speed and scalability&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;And what made the original version of MySQL so popular? Well, &lt;i&gt;exactly the same things&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Drizzle goes back to the roots, concentrating on what made the use of MySQL so widespread in the first place.&lt;br /&gt;&lt;br /&gt;You could say, with 5.0, MySQL lost its way while introducing many complex features: stored procedures, triggers, views, query cache, etc.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;So why did MySQL add these features?&lt;/i&gt; I see two reasons:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Popular opinion:&lt;/b&gt; It is a simple fact that analysts, journalists and, in particular, investors, refused to take MySQL seriously unless it "grew up", and gained all the features that a mature database should have. As a venture capital financed company heading for IPO its hard to ignore popular opinion.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To compete with Oracle:&lt;/b&gt; MySQL management believed (understandably) that MySQL would not make it unless it competed head-to-head with the industry leader. Characteristic of this was the effort to run SAP on MySQL.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;And what came of all this?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Two years ago already MySQL gave up trying to compete directly with Oracle. Back then Martin Mickos stated MySQL's mission as follows: &lt;i&gt;"to become the best online database in the world"&lt;/i&gt;. And all efforts to run SAP, including MaxDB, have also been dropped since then.&lt;br /&gt;&lt;br /&gt;But at least the critics have been silenced! And let's face it, Sun would never have paid $1B for a "toy" database. And still today, these heavy duty features are important for Sun's effort to sell MySQL into the corporate IT space.&lt;br /&gt;&lt;br /&gt;However, this leaves a void to be filled by Drizzle: a lightweight database that scales for demanding Web 2.0 applications and Cloud computing. By concentrating on core functionality I believe Drizzle can really make progress in this space. Just one example: developers don't have to worry whether the query cache breaks scalability on each release.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;So what can I learn from this?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;So far I have resisted adding features such as savepoints and 2-phase commit to &lt;a href="http://www.primebase.org"&gt;PBXT&lt;/a&gt;, but I was thinking I would have to do this stuff at some stage. Well, I am not so sure anymore... :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-7139201818787063984?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/7139201818787063984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=7139201818787063984' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7139201818787063984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7139201818787063984'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/07/drizzle-goes-back-to-roots.html' title='Drizzle goes back to the Roots'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-6163960458340564554</id><published>2008-07-14T15:34:00.001+02:00</published><updated>2008-07-14T15:32:29.903+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scaling'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='contension'/><category scheme='http://www.blogger.com/atom/ns#' term='optimization'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Mutex contention and other bottlenecks in MySQL</title><content type='html'>Over the last few weeks I have been doing some work on improving the concurrency performance of &lt;a href="http://www.primebase.org"&gt;PBXT&lt;/a&gt;. The last Alpha version (1.0.03) has quite a few problems in this area.&lt;br /&gt;&lt;br /&gt;Most of the problems have been with r/w lock and mutex contention but, I soon discovered that MySQL has some serious problems of it's own. In fact, I had to remove some of the bottlenecks in MySQL in order to continue the optimization of PBXT.&lt;br /&gt;&lt;br /&gt;The result for simple SELECT performance is shown in the graph below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.primebase.org/images/std_vs_opt.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 360px;" src="http://www.primebase.org/images/std_vs_opt.jpg" alt="" border="0" /&gt;&lt;/a&gt;Here you can see that the gain is over 60% for 32 or more concurrent threads. Both results show the performance with the newly optimized version of PBXT. The test is running on a 2.16 MHz dual core processor, so I expect an even greater improvement on 4 or 8 cores. The query I ran for this test is of the form &lt;tt&gt;SELECT * FROM table WHERE ID = ?&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;So what did it do to achieve this? Well first of all, as you will see below, I cheated in some cases. I commented out or avoided some locks that were a bit too complicated to solve properly right now. But in other cases, I used solutions that can actually be taken over, as-is, by MySQL. In particular, the use of spinlocks.&lt;br /&gt;&lt;br /&gt;All-in-all though, my intension here is just &lt;b&gt;to demonstration the potential for concurrency optimization&lt;/b&gt; in MySQL.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimization 1: LOCK_plugin in plugin_foreach_with_mask()&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The &lt;tt&gt;LOCK_plugin&lt;/tt&gt; mutex in &lt;tt&gt;plugin_foreach_with_mask()&lt;/tt&gt; is the first bottleneck you hit in just about any query. In my tests with 32 threads it takes over 60% of the overall execution time.&lt;br /&gt;&lt;br /&gt;In order to get further with my own optimizations, I &lt;b&gt;commented out&lt;/b&gt; the &lt;tt&gt;pthread_mutex_lock()&lt;/tt&gt; and &lt;tt&gt;pthread_mutex_lock()&lt;/tt&gt; calls in this function, knowing that the lock is only really needed if plug-ins are installed or uninstalled. However, later I needed to find a better solution (see below).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimization 2: LOCK_grant in check_grant()&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After removing the above bottleneck I hit a wall in &lt;tt&gt;check_grant()&lt;/tt&gt;. &lt;tt&gt;pthread_rwlock_rdlock()&lt;/tt&gt; was taking 50%, and &lt;tt&gt;pthread_rwlock_unlock()&lt;/tt&gt; was taking 45.6% CPU time! Once again I commented out the calls &lt;tt&gt;rw_rdlock(&amp;amp;LOCK_grant)&lt;/tt&gt; and &lt;tt&gt;rw_unlock(&amp;amp;LOCK_grant)&lt;/tt&gt; in &lt;tt&gt;check_grant()&lt;/tt&gt; to get around the problem.&lt;br /&gt;&lt;br /&gt;In order to really eliminate this lock, MySQL needs to switch to a different type of read/write lock. 99.9% of the time only a read lock is required because a write lock is only required when loading and changing privileges.&lt;br /&gt;&lt;br /&gt;For similar purposes, in PBXT, I have invented a special type of read/write lock that requires almost zero time to gain a read lock ... hmmmm ;)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimization 3: Mutex in LOCK and UNLOCK tables&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I then discovered that 51.7% of the time was taken in &lt;tt&gt;pthread_mutex_lock()&lt;/tt&gt; called from &lt;tt&gt;thr_lock()&lt;/tt&gt; called from &lt;tt&gt;open_and_lock_tables()&lt;/tt&gt;.&lt;br /&gt;And, 44.5% of the time was taken in &lt;tt&gt;thread_mutex_lock()&lt;/tt&gt; called from &lt;tt&gt;thr_unlock()&lt;/tt&gt; called from &lt;tt&gt;mysql_unlock_tables()&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;Now this is a tough nut. The locks used here are used all over the place, but I think they can be replaced with a spinlock to good effect (see below). I did not try this though. Instead I used LOCK TABLES in my test code, to avoid the calls to LOCK and UNLOCK tables for every query.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimization 4: LOCK_plugin in plugin_unlock_list()&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Once again the &lt;tt&gt;LOCK_plugin&lt;/tt&gt; is the bottleneck, this time taking 94.7% of the CPU time in &lt;tt&gt;plugin_unlock_list()&lt;/tt&gt;. This time I did a bit of work. Instead of commenting it out, I replaced &lt;tt&gt;LOCK_plugin&lt;/tt&gt; with a spinlock (I copied and adapted the PBXT engine implementation for the server).&lt;br /&gt;&lt;br /&gt;This worked to remove the bottleneck because &lt;tt&gt;LOCK_plugin&lt;/tt&gt; is normally only held for a very short time. However, when a plugin is installed or unstalled this lock will be a killer and some more work probably needs to be done here.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimization 5: pthread_setschedparam()&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I was a bit shocked to find &lt;tt&gt;pthread_setschedparam()&lt;/tt&gt; was now taking 17% of the CPU time required to execute the &lt;tt&gt;SELECT&lt;/tt&gt;. This call can be easily avoided by first checking to see if the schedule parameter needs to be changed at all. For the moment, I commented the call out.&lt;br /&gt;&lt;br /&gt;Of course, the more optimized the code is, the worse such a call becomes. After all other optimizations &lt;tt&gt;pthread_setschedparam()&lt;/tt&gt; CPU time increases to 52.6%!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimization 6: LOCK_thread_count in dispatch_command()&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The &lt;tt&gt;LOCK_thread_count&lt;/tt&gt; mutex in dispatch_command() is next in line with 96.1% of the execution time.&lt;br /&gt;&lt;br /&gt;Changing this to a spinlock completely removes the bottleneck.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimization 7: LOCK_alarm in thr_end_alarm() and thr_alarm()&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;my_net_read()&lt;/tt&gt; calls &lt;tt&gt;my_real_read()&lt;/tt&gt; which calls the functions &lt;tt&gt;thr_end_alarm()&lt;/tt&gt; and &lt;tt&gt;thr_alarm()&lt;/tt&gt;. At this point in the optimization these 2 calls required 99.5% of the CPU time between them. Replacing &lt;tt&gt;LOCK_alarm&lt;/tt&gt; with a spinlock fixed this problem.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Without too much effort it is possible to make a huge improvement to the threading performance of MySQL. The fact that such bottlenecks have not yet been investigated may be due the fact that MySQL currently has no performance analysis team.&lt;br /&gt;&lt;br /&gt;Following the last optimization, execution time was divided as follows:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;25.8%&lt;/b&gt; of the time in &lt;tt&gt;net_end_statement()&lt;/tt&gt;, which hangs in &lt;tt&gt;net_flush()&lt;/tt&gt;&lt;br /&gt;&lt;b&gt;32.8%&lt;/b&gt; of the time in &lt;tt&gt;my_net_read()&lt;/tt&gt;&lt;br /&gt;&lt;b&gt;7.6%&lt;/b&gt; in &lt;tt&gt;ha_pbxt::index_read()&lt;/tt&gt;, this is the time spent in the engine&lt;br /&gt;&lt;b&gt;32.2%&lt;/b&gt; in &lt;tt&gt;init_sql_alloc()&lt;/tt&gt; which waits on the spinlock in &lt;tt&gt;malloc()&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;From this you can see that the optimization is almost optimal because the program is spending almost 60% of its time waiting on the network.&lt;br /&gt;&lt;br /&gt;However, it is also clear where the next optimization would come from. Remove the call to &lt;tt&gt;malloc()&lt;/tt&gt; in &lt;tt&gt;init_sql_alloc()&lt;/tt&gt; which is called by &lt;tt&gt;open_tables()&lt;/tt&gt;. This could be done by reusing the block of memory required by the thread, from call to call.&lt;br /&gt;&lt;br /&gt;Ultimately, the goal of optimizing for scale like this is to bring the code to the point that it is either network, CPU, or disk bound. Only then will the end-user really see an improvement in performance as the hardware is upgraded.&lt;br /&gt;&lt;br /&gt;I think I have shown that it is worth putting some effort into such optimizations. Even more so as multi-core systems become more and more commonplace.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-6163960458340564554?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/6163960458340564554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=6163960458340564554' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6163960458340564554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6163960458340564554'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/07/mutex-contention-and-other-bottlenecks.html' title='Mutex contention and other bottlenecks in MySQL'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-1367618507403971878</id><published>2008-06-13T15:10:00.000+02:00</published><updated>2008-06-13T15:10:05.805+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='ga'/><title type='text'>PBXT compiles without change under MySQL 5.1.25!</title><content type='html'>OK, now I know that the &lt;i&gt;GA version of 5.1&lt;/i&gt; is rapidly approaching. PBXT compiles with the latest release of MySQL &lt;b&gt;without any changes&lt;/b&gt;!&lt;br /&gt;&lt;br /&gt;This has &lt;i&gt;never been the case before&lt;/i&gt;. Just search the PBXT code for &lt;tt&gt;MYSQL_VERSION_ID&lt;/tt&gt;, and you will find things like:&lt;br /&gt;&lt;pre&gt;#if MYSQL_VERSION_ID &lt; 50114&lt;br /&gt;    XT_RETURN_VOID;&lt;br /&gt;#else&lt;br /&gt;    XT_RETURN(0);&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;and, even worse:&lt;br /&gt;&lt;pre&gt;#if MYSQL_VERSION_ID &lt; 60000&lt;br /&gt;#if MYSQL_VERSION_ID &gt;= 50124&lt;br /&gt;#define USE_CONST_SAVE&lt;br /&gt;#endif&lt;br /&gt;#else&lt;br /&gt;#if MYSQL_VERSION_ID &gt;= 60005&lt;br /&gt;#define USE_CONST_SAVE&lt;br /&gt;#endif&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;The lack of changes that affect pluggable storage engines can only mean that the bug fixes required are diminishing in scope.&lt;br /&gt;&lt;br /&gt;And I believe this is a far better gauge of whether GA is close than any other &lt;a href="http://www.sun.com/aboutsun/pr/2008-04/sunflash.20080415.1.xml"&gt;marketing orientated statements&lt;/a&gt;! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-1367618507403971878?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/1367618507403971878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=1367618507403971878' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1367618507403971878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1367618507403971878'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/06/pbxt-compiles-without-change-under.html' title='PBXT compiles without change under MySQL 5.1.25!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-3763657505433823415</id><published>2008-06-04T09:57:00.000+02:00</published><updated>2008-06-04T09:57:18.297+02:00</updated><title type='text'>PBXT 1.0.03 Alpha has been released!</title><content type='html'>I have released PBXT 1.0.03 Alpha and it is available for download from &lt;a href="http://www.primebase.org/download"&gt;http://www.primebase.org/download&lt;/a&gt;. I have also posted binary plugins for a few platforms.&lt;br /&gt;&lt;br /&gt;If you are building from source I have added a &lt;a href="http://www.primebase.org/download/index.php#qg_source"&gt;Quick Guide: Building and Installing PBXT from Source&lt;/a&gt;, which I hope makes the task really simple. If not, I would appreciate any feedback!&lt;br /&gt;&lt;br /&gt;With this version I have completed the implementation of full-durability, and other features that are scheduled for RC and ultimately for the first GA release.&lt;br /&gt;&lt;br /&gt;Still to be done is the Windows port which I plan to do before the first Beta release.&lt;br /&gt;&lt;br /&gt;Please send any comments, questions, bug reports, etc. directly to me: paul dot mccullagh at primebase dot org.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-3763657505433823415?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/3763657505433823415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=3763657505433823415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3763657505433823415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3763657505433823415'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/06/pbxt-1003-alpha-has-been-released.html' title='PBXT 1.0.03 Alpha has been released!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-65548790691053101</id><published>2008-05-01T12:55:00.006+02:00</published><updated>2008-05-01T13:08:53.027+02:00</updated><title type='text'>PBXT &amp; BLOB Streaming Conference Presentations &amp; Videos</title><content type='html'>The slides of my presentations at the MySQL Conference &amp;amp; Expo 2008 are now available for download. Videos of the presentations have been uploaded to &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt;:&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Inside the PrimeBase XT Storage Engine&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Presentation: &lt;a href="http://www.primebase.org/download/pbxt-uc-2008.pdf"&gt;pbxt-uc-2008.pdf&lt;/a&gt;&lt;br /&gt;Videos: &lt;a href="http://www.youtube.com/watch?v=TyXk7rQ5hFo"&gt;Part 1/7&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=A1XjcA4MpHY"&gt;Part 2/7&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=CAiFE28Z22E"&gt;Part 3/7&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=EVQKsGCfJTU"&gt;Part 4/7&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=HHTPvd1U1R4"&gt;Part 5/7&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=gsLEdZuR3nk"&gt;Part 6/7&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=3XlDozTxA9E"&gt;Part 7/7&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Introduction to the BLOB Streaming Project&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Presentation: &lt;a href="http://www.blobstreaming.com/download/mybs-uc-2008.pdf"&gt;mybs-uc-2008.pdf&lt;/a&gt;&lt;br /&gt;Videos: &lt;a href="http://www.youtube.com/watch?v=pgx3XJlmAeo"&gt;Part 1/5&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=KFRs_8liVBg"&gt;Part 2/5&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=BBiLMaY-GEk"&gt;Part 3/5&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=gT8Jrycrj80"&gt;Part 4/5&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=nXnBGxf8vuk"&gt;Part 5/5&lt;/a&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;With &lt;a href="http://www.youtube.com/results?search_query=BLOB+PBXT&amp;amp;search_type="&gt;this link&lt;/a&gt; you will find all the videos at once. If you watch the movies, then it may help to look at the PDF presentation slides at the same time, because the video quality is "not ideal" :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-65548790691053101?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/65548790691053101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=65548790691053101' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/65548790691053101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/65548790691053101'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/05/pbxt-blob-streaming-conference.html' title='PBXT &amp; BLOB Streaming Conference Presentations &amp; Videos'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-1654784163946813327</id><published>2008-04-22T11:06:00.000+02:00</published><updated>2008-04-22T11:06:11.409+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rich green'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='community'/><category scheme='http://www.blogger.com/atom/ns#' term='jonathan schwartz'/><title type='text'>Sun is serious about Open Source and the MySQL Community</title><content type='html'>In probably the best move by Sun during the whole MySQL Conference and Expo, &lt;a href="http://www.forbes.com/finance/mktguideapps/personinfo/FromPersonIdPersonTearsheet.jhtml?passedPersonId=1099090"&gt;Rich Green&lt;/a&gt; and &lt;a href="http://blogs.sun.com/jonathan"&gt;Jonathan Schwartz&lt;/a&gt; turned up at the Community Dinner on the Sunday night before the conference.&lt;br /&gt;&lt;br /&gt;As we walked into the restaurant I saw a face that I thought was familiar. Jonathan and Rich were standing outside the restaurant talking. However, only when we got inside did I hear &lt;a href="http://jpipes.com/index.php"&gt;Jay&lt;/a&gt; saying that that was Jonathan Schwartz.&lt;br /&gt;&lt;br /&gt;So just before we all took our places, and while we were trying to work out how we were going to organize payment for the dinner, Rich and Jonathan turned up and quickly ended the discussion. Rich said his credit card would be good for the tab. So thanks to Sun for that!&lt;br /&gt;&lt;br /&gt;But besides good food and plenty to drink, it was a great opportunity to talk and ask some questions that have been on my mind since the acquisition of MySQL by Sun. I have expressed these concerns on this blog, and they can be summarized as follows:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How important is open source, and in particular the MySQL community to Sun?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Both Rich and Jonathan were able to give me an adequate answer to this question. I will summarize this in my own words.&lt;br /&gt;&lt;br /&gt;Sun bought MySQL to expand its business and influence in the open source world. So the MySQL community is the key to this. &lt;br /&gt;&lt;br /&gt;I believe this means that Sun is not interested in commercializing any parts of the MySQL server, and here I am referring to the massive discussion that has resulted from the announcement &lt;a href="http://jcole.us/blog/archives/2008/04/14/just-announced-mysql-to-launch-new-features-only-in-mysql-enterprise/"&gt;&lt;i&gt;MySQL to launch new features only in MySQL Enterprise&lt;/i&gt;&lt;/a&gt; on &lt;a href="http://jcole.us/blog/"&gt;Jeremy Cole's blog&lt;/a&gt;. After all, it is clear that MySQL's bottom line (although profitable) makes no difference to Sun. They are interested in access to the over 10 million users of MySQL to sell services and hardware, those things that Sun already does well.&lt;br /&gt;&lt;br /&gt;It is the MySQL's task to expand the user base, &lt;b&gt;not endanger it&lt;/b&gt;. So I think we will see a change of strategy in the coming weeks and months.&lt;br /&gt;&lt;br /&gt;And I can add the following: from what I have seen of it, MySQL's enterprise offering is really a great package without having to add a proprietary version of the server. It has everything a serious user of MySQL wants: 24 hour support, monitoring tools, design tools, service packs and priority bug fixing. And with Sun's backing, nobody doubts anymore that they can deliver this service.&lt;br /&gt;&lt;br /&gt;Jonathan and Rich clearly demonstrated their support for the MySQL community by coming to the dinner. Besides clearing up some important questions, it was a great photo op.:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.prmebase.org/download/paul_and_jonathan.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://www.primebase.org/download/paul_and_jonathan.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You may have seen this photo already on &lt;a href="http://blog.arabx.com.au/"&gt;Ronald's blog&lt;/a&gt;. The picture is of Jonathan and I with the &lt;a href="http://www.primebase.org"&gt;PrimBase Technologies&lt;/a&gt; conference T-shirt. If you look closely you will see another little detail. I have a dolphin in my pocket! I wonder if that has any symbolic meaning...&lt;br /&gt;&lt;br /&gt;Jonathan tells a great story on his &lt;a href="http://blogs.sun.com/jonathan/entry/freedom_s_choice"&gt;blog&lt;/a&gt;. But what is significant is the picture of &lt;a href="http://monty-says.blogspot.com"&gt;Monty&lt;/a&gt; he posted, who is wearing a shirt that says "my free software runs your company". We have every reason to believe Jonathan fully supports this sentiment. So note that the T-shirt does not say "my partially free software ..."!&lt;br /&gt;&lt;br /&gt;Oh, and in the &lt;a href="http://farm3.static.flickr.com/2416/2414423398_2711e9df3f.jpg?v=0"&gt;picture of Monty&lt;/a&gt;, do you recognize the shirt of the person standing next to him? Since I generally only wear a shirt once, we know that this picture was also taking at the Community Dinner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-1654784163946813327?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/1654784163946813327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=1654784163946813327' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1654784163946813327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/1654784163946813327'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/04/sun-is-serious-about-open-source-and.html' title='Sun is serious about Open Source and the MySQL Community'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-8094846512267585706</id><published>2008-04-11T11:59:00.000+02:00</published><updated>2008-04-11T11:58:21.103+02:00</updated><title type='text'>BLOB Streaming presentation at the MySQL Conference</title><content type='html'>My &lt;a href="http://en.oreilly.com/mysql2008/public/schedule/detail/362"&gt;presentation&lt;/a&gt; on BLOB Streaming at the MySQL Conference next week will be very practical.&lt;br /&gt;&lt;br /&gt;I have made quite a few graphics to show how it works, and plan to demonstrate the current version of the &lt;a href="http://www.blobstreaming.org/"&gt;BLOB Streaming engine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;"To BLOB or not to BLOB?" is a common question in the database world. There are advantages and disadvantages to both sides. I'll be explaining why I believe that the "BLOB Repository" (a central component of the BLOB Streaming Architecture) combines the advantages of both approaches.&lt;br /&gt;&lt;br /&gt;Check it out:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;An Introduction to BLOB Streaming for MySQL Project&lt;/span&gt;&lt;br /&gt;3:05pm - 3:50pm Wednesday, 04/16/2008&lt;br /&gt;Ballroom A&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-8094846512267585706?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/8094846512267585706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=8094846512267585706' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/8094846512267585706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/8094846512267585706'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/04/blob-streaming-presentation-at-mysql.html' title='BLOB Streaming presentation at the MySQL Conference'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-4419467141677394346</id><published>2008-04-08T13:56:00.001+02:00</published><updated>2008-04-11T11:54:11.874+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ha'/><category scheme='http://www.blogger.com/atom/ns#' term='high availability'/><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><title type='text'>Replication is dead, long live Replication!</title><content type='html'>Brian Aker has found general agreement with his post: "&lt;a href="http://krow.livejournal.com/590912.html"&gt;The Death of Read Replication&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Arjen Lentz says "&lt;a href="http://arjen-lentz.livejournal.com/105951.html"&gt;I think Brian is right...&lt;/a&gt;", and Frank Mash confirmed: "&lt;a href="http://mysqldatabaseadministration.blogspot.com/2008/04/is-read-replication-really-dying-in.html"&gt;what Brian says about replication, caching and memcached is very true&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Just like &lt;b&gt;&lt;i&gt;Video killed the Radio Star&lt;/i&gt;&lt;/b&gt; it looks like maybe &lt;b&gt;&lt;i&gt;Memcached killed the Replication Hierarchy&lt;/i&gt;&lt;/b&gt;!&lt;br /&gt;&lt;br /&gt;But of course, Brian and others are talking about &lt;b&gt;replication for scaling reads&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;In my &lt;a href="http://en.oreilly.com/mysql2008/public/schedule/detail/361"&gt;session on PBXT&lt;/a&gt; next week at the conference I will be talking about how we plan to use &lt;b&gt;synchronous replication&lt;/b&gt; to produce an &lt;a href="http://en.wikipedia.org/wiki/High_availability"&gt;HA&lt;/a&gt; solution for MySQL at the engine level.&lt;br /&gt;&lt;br /&gt;I will also discuss how some flexibility in the PBXT architecture makes it possible to actually scale writes efficiently as mentioned by Arjen &lt;a href="http://arjen-lentz.livejournal.com/105951.html"&gt;in his blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So don't miss it:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Inside the PBXT Storage Engine&lt;/span&gt;&lt;br /&gt;10:50am - 11:50am Thursday, 04/17/2008&lt;br /&gt;Ballroom G&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-4419467141677394346?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/4419467141677394346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=4419467141677394346' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/4419467141677394346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/4419467141677394346'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/04/replication-is-dead-long-live.html' title='Replication is dead, long live Replication!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-7192655365737083899</id><published>2008-04-02T11:41:00.008+02:00</published><updated>2008-04-02T16:38:45.481+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ronald bradford'/><category scheme='http://www.blogger.com/atom/ns#' term='primebase'/><category scheme='http://www.blogger.com/atom/ns#' term='welcome'/><title type='text'>Welcome Ronald! Great to have you on board!</title><content type='html'>If you've been following his &lt;a href="http://blog.arabx.com.au/?p=975"&gt;blog&lt;/a&gt;, then you will already know that Ronald Bradford has joined &lt;a href="http://www.primebase.org"&gt;PrimeBase Technologies&lt;/a&gt;. We are very pleased to have him on board! As many know, Ronald has always been very active in the MySQL community as far as his job has made this possible.&lt;br /&gt;&lt;br /&gt;Ironically during his time at MySQL he was less present in the community than before. When we discussed our plans for PrimeBase with him, Ronald was interested because it was an opportunity to return to a more active role in the community. I am very glad that this motivation was understood by almost everyone at MySQL and we are all looking forward to seeing and hearing more from Ronald.&lt;br /&gt;&lt;br /&gt;But, of course, Ronald is not "just a pretty face" ;) He will be helping us to design and specify our open source products (including &lt;a href="http://www.blobstreaming.org"&gt;Blob Streaming&lt;/a&gt;). Ronald's extensive experience with both MySQL and end-users will contribute significantly to what we produce.&lt;br /&gt;&lt;br /&gt;Ronald will also be helping us to refine our business model. We want all PrimeBase software to be open and free, so we've been thinking hard about how we can make this possible. All this makes it a very exciting time for us, and we will be talking more about of our plans in the days and weeks to come.&lt;br /&gt;&lt;br /&gt;Of course, &lt;a href="http://en.oreilly.com/mysql2008/public/schedule/speaker/148"&gt;Ronald&lt;/a&gt; and &lt;a href="http://en.oreilly.com/mysql2008/public/schedule/speaker/517"&gt;I will&lt;/a&gt; be at the MySQL conference, so be sure to look us up!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-7192655365737083899?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/7192655365737083899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=7192655365737083899' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7192655365737083899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7192655365737083899'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/04/welcome-ronald-great-to-have-you-on.html' title='Welcome Ronald! Great to have you on board!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-4595540756760931454</id><published>2008-03-14T00:40:00.000+01:00</published><updated>2008-03-14T12:39:23.271+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='durabilty'/><category scheme='http://www.blogger.com/atom/ns#' term='new release'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><title type='text'>New version and a new home for PBXT!</title><content type='html'>I have just released the first fully durable version of PBXT. Because of the amount of new code I have reverted PBXT to Alpha status. This version, 1.0-alpha, can be downloaded from: &lt;a href="http://www.primebase.org/download"&gt;http://www.primebase.org/download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Oh, which reminds me: PBXT now has a &lt;span style="font-weight: bold;"&gt;new home&lt;/span&gt; at &lt;a style="font-weight: bold;" href="http://www.primebase.org/"&gt;http://www.primebase.org&lt;/a&gt;, so take a look around! I have actually found a bit of time to write some &lt;a href="http://www.primebase.org/documentation"&gt;documentation&lt;/a&gt;. Right now the documentation describes building, installation, and the PBXT system parameters. Future additions will include information on performance tuning and a road map for PBXT development.&lt;br /&gt;&lt;br /&gt;But there is more to the new home than just a new web-site. The PBXT project is now owned and funded by PrimeBase Technologies, an open source software development company. So altogether this is a important step forward on the road to my goal which is to make PBXT a significant contribution to the MySQL community and business/eco-system.&lt;br /&gt;&lt;br /&gt;Besides full durability, the latest release includes the following improvements:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Calculation of &lt;span style="font-weight: bold;"&gt;index statistics&lt;/span&gt; as required by the optimizer (execute &lt;span style="font-family:courier new;"&gt;FLUSH TABLES&lt;/span&gt; to refresh the statistics).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;New system variables&lt;/span&gt;: &lt;span style="font-family:courier new;"&gt;pbxt_log_cache_size&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;pbxt_log_file_threshold&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;pbxt_transaction_buffer_size&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;pbxt_checkpoint_frequency&lt;/span&gt; (details &lt;a href="http://www.primebase.org/documentation#sysvar"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Implementation of &lt;span style="font-weight: bold;font-family:courier new;" &gt;SELECT FOR UPDATE&lt;/span&gt;, which performs row-level locking to prevent concurrent updates.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Group commit&lt;/span&gt;: increases update throughput by committing multiple transactions concurrently.&lt;/li&gt;&lt;li&gt;Support for &lt;span style="font-weight: bold;font-family:courier new;" &gt;SHOW ENGINE PBXT STATUS&lt;/span&gt;, which displays information about memory usage.&lt;/li&gt;&lt;/ul&gt;What this release does not have is an option to relax durability. The transaction log is always flushed on commit. I plan to add a system parameter shortly that will allow you, in the spirit of the original version, to trade performance for durability if this suites your application.&lt;br /&gt;&lt;br /&gt;Even better would be to be able to specify this per table. Now if only MySQL would allow engines to specify custom table attributes...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-4595540756760931454?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/4595540756760931454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=4595540756760931454' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/4595540756760931454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/4595540756760931454'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/03/new-version-and-new-home-for-pbxt.html' title='New version and a new home for PBXT!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-2228966991475641356</id><published>2008-02-08T15:24:00.001+01:00</published><updated>2008-06-13T14:41:48.222+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='dbt2'/><title type='text'>PBXT &amp; DBT2: Dubugging C/C++ 101</title><content type='html'>Yesterday I starting testing PBXT using the DBT2 benchmark. Following the implementation of durability and SELECT FOR UPDATE for the engine I was more interested in the benchmark as a test for stability and concurrency than performance. I was not disappointed...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Which bug first?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well I immediately ran into 3 bugs. Isn't it funny how bugs often come in batches, which leaves you thinking: "Oh sh.. where do I start?". Here's my advice: start with the bug that is most likely to disappear if you fix the others!&lt;br /&gt;&lt;br /&gt;A simple example, you have 2 bugs: an unexpected exception is occurring, and you're loosing memory. First look for the memory loss, because it may disappear when you fix the exception (because you may be loosing memory in the error handler).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Take things one problem at time:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another thing: once you have decided for one of the bugs, stick with it (no matter how hard it gets) to the bitter end! Thrashing around will build frustration!&lt;br /&gt;&lt;br /&gt;So what happened with the DBT2 test? I started the test and immediately noticed that the engine was throwing "duplicate key" errors (it was too much to hope that this behavior was intended). Next I hit an assertion that claimed that a semaphore was not initialized (but I knew the semaphore &lt;span style="font-weight: bold;"&gt;was&lt;/span&gt; initialized). Finally, on restart after the assertion failed the engine crashed on recovery, in the clib memory manager (not a good sign!).&lt;br /&gt;&lt;br /&gt;So were to start? Taking my own advice I quickly secured the state of the database before the restart, and confirmed that I could repeat the restart crash. So that one could wait for later.&lt;br /&gt;&lt;br /&gt;The duplicate key error seemed be a fairly stable repeat, so I took a closer look at the semaphore problem. Here I noticed that the assertion was failing because the check bytes that indicate that the semaphore was initialized had been overwritten, not a happy situation!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Make the bug quick and easy to repeat:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This bug was also difficult to repeat, I had to restore a fresh environment to get it to repeat consistently. So this is where I started.&lt;br /&gt;&lt;br /&gt;But before we go on: make sure, in such a situation, that you can repeat the bug as quickly and easily as possible. Eliminate as many manual steps as you can, it will save time in the long run. For example, in this case I wrote a line of shell commands to delete and copy in the database to provide the correct starting point for repeating the bug.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Check your last bug fix first!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately this bug turned out to be the result of a short laps of concentration during my last bug fix. But I did not notice the error during my testing of the big fix and so I moved on to DBT2. When the error occurred during the DBT2 test, I did not relate the problem to my last bug fix.&lt;br /&gt;&lt;br /&gt;If I had, I would have found the problem quick enough by a simple code read of the bug fix again. This has happened to me before, so my advice is: check your last bug fix, even when the new error does not seem to be related!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Debugging C/C++ 101, 3 lessons:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Conveniently for my little refresher course, each of the 3 bugs proved to touch on a different aspect of C/C++ debugging:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bug 1. Using an uninitialized pointer.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For goodness sake, if you suspect this, then compile you program with optimization on, and the warning for "uninitialized variables" enabled. I didn't do this, and I may have saved myself a lot of time. Anyway, this does not always work (for example if you used '&amp;amp;'). Unfortunately, if the compiler does not help, there is no easy way to find these bugs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Debugging method: Probing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I call the method I used to find this error "probing". The idea is to write a special piece of check code which tests for the memory overwrite. The semaphore that was being overwritten was not global, but I added some code when it was initialized to set a global pointer to the semaphore. Then I wrote a little check (or probe) function which tested to see if the check bytes were still OK.&lt;br /&gt;&lt;br /&gt;Next I spread calls to the check function around my program, trying to close in on the point were things go wrong. When doing this you have 2 difficulties to deal with:&lt;br /&gt;&lt;br /&gt;Finding the right thread - If you are probing the wrong thread, then you get very miss-leading results. For example, I started by adding the probes to the engine API functions. When the probe was failing on the entry point it took me a while to realize that the problem must be in the PBXT background threads. So, using the probe try to first isolate the thread(s) that are causing the corruption.&lt;br /&gt;&lt;br /&gt;This meant removing all probes from the engine API functions and placing them in the background threads, starting with the main loops. Then by elimination I managed to narrow the problem down to one particular thread.&lt;br /&gt;&lt;br /&gt;Dealing with disappearing repeatability - The problem with this kind of bug is that it is really shy! As soon as you start to probe it, it disappears. I mean the changes made to the program change the executions so that the bug does not repeat.&lt;br /&gt;&lt;br /&gt;At this stage it is very tempting to leave the debug statements in the code and declare the bug as fixed! But, alas, the bug is still there, it has just moved on to overwrite some other part of memory in some quite little corner.&lt;br /&gt;&lt;br /&gt;Here I can give the following advice: When the bug disappears always return to the last repeat point and try taking smaller steps this time.&lt;br /&gt;&lt;br /&gt;Another thing: approach the corruption point from the bottom. By this I mean, close the probe in from a point after the corruption has occurred. This is because if the corruption is due an uninitialized stack value, then as you move the probe towards the corruption point from the top, the probe disturbs the state of the stack.&lt;br /&gt;&lt;br /&gt;As I mentioned above, when I found this bug it turned out to be a result of the last bug fix, bummer :(&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bug 2. Overwriting memory.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next I decided to look at the crash on startup. This bug caused a crash in the memory manager. This is most often due to a memory overwrite which has wiped out some of the management data stored per block by the memory manager.&lt;br /&gt;&lt;br /&gt;Fortunately I have to right tools to deal with this problem.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Debugging method: Scanning Memory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Its like "don't leave home without it": don't start C/C++ program without a debug memory manager that does at least the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Adds and checks headers and footers on every block of memory allocated.&lt;/li&gt;&lt;li&gt;Wipes out blocks that are freed (for example set all bytes to 0xFE).&lt;/li&gt;&lt;li&gt;Always moves a block of memory that is reallocated.&lt;/li&gt;&lt;li&gt;Records every block allocated, and notes the line number and file where allocated.&lt;/li&gt;&lt;li&gt;Checks on shutdown that all memory has been freed, and reports blocks not freed.&lt;/li&gt;&lt;/ul&gt;This can also be done for objects allocated in C++ by overriding the delete and new operators.&lt;br /&gt;&lt;br /&gt;Now using the fact that I have a list of all allocated pointers I have implemented a function which scans all allocated pointers and checks the headers and footers to tell me if anything is corrupted.&lt;br /&gt;&lt;br /&gt;So to find the recovery crash I added the scan call to some of the loops that do recovery and soon managed to narrow things down and find the point were the corruption was occurring.&lt;br /&gt;&lt;br /&gt;Note that with this method it may not even be necessary to do such a search. One call to the scan routine tells me which block has been corrupted. If it was a simple overwrite of the end of the block, then my debug memory manager will tells me which block it was, and were it was allocated. This may be enough to find the problem.&lt;br /&gt;&lt;br /&gt;In my case it turned out that I had taken a pointer to a block and then some sub-function reallocated the block. But this is why it is so important that the debug memory manager always moves blocks on realloc(). If it had not done this, I probably never would have noticed the bug until it happened in some production situation (ugh!).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bug 3. Concurrency problems.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I was worried about the 3rd bug which was causing an unexpected "duplicate key" error, because I was afraid it might be a conceptual problems. This fear stems from the fact that there are indeed serious conceptual problems involving MVCC and SELECT FOR UPDATE (which requires locking), but fortunately, my fear was unfounded, and it turned out to be just a normal bug, whew!&lt;br /&gt;&lt;br /&gt;I new this bug must be related to concurrency because I had tested all aspects of the row level locking in a simple controlled environment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Debugging method: Trace it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The way to find concurrency problems is to trace them. The better your trace, the easier it is to find the bug. I think it is almost impossible to find a concurrency bug just using the debugger (unless you have a deadlock, for example). This is because in the debugger you only have a snapshot of the situation, and you don't see the interaction between the threads.&lt;br /&gt;&lt;br /&gt;In my case the duplicate key error turned out to be the result of a SELECT FOR UPDATE that failed earlier.&lt;br /&gt;&lt;br /&gt;There is, of course a big problem with tracing and concurrency. Sometimes the error is robust, and sticks around while you bombard it with printf() statements. Mine was more of the shy type where the timing was really critical, and it disappeared when I added print statements.&lt;br /&gt;&lt;br /&gt;In this case, I also have the right tool for the job. It is a trace function which records the information only in RAM, in one huge block of memory which rolls over if necessary. It is worth also taking the bit of extra time to make the trace function handle printf() type syntax, so that it is as easy to using as printf() itself.&lt;br /&gt;&lt;br /&gt;What I did was I set a breakpoint at the spot in my code where the duplicate key error is generated. At this point in the code, I built in a call to my "trace dump" function. This function dumps the trace information which I have collected so far to a file.&lt;br /&gt;&lt;br /&gt;Then I can examine the trace to find out how I got to this point, and I can also use the debugger to examine the threads and find other information I need.&lt;br /&gt;&lt;br /&gt;Now some advice on trace code:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Firstly, never build in trace code that you think you might need! This is a waste of time if it is never used, and it clutters the code unnecessarily.&lt;/li&gt;&lt;li&gt;Secondly, when faced with a problem that needs to be traced, do not waste to much time or thought trying to guess what information you will need. Initially, just get something out there. Examining the trace is the best way to decide what information is missing.&lt;/li&gt;&lt;li&gt;Finally, when you are done, and you have found your bug, you will probably feel quite attached to you new trace code and not want to part with it. Don't worry, I understand, and I am not going now tell you that you have to remove it :) Well, not all of it, anyway.&lt;/li&gt;&lt;/ul&gt;Really, you have to be very critical and decide what parts of the trace are good in general, and what parts helped you just find this bug. That stuff must go. And the other stuff: take a bit of time to clean it up, and make sure it can only be enabled in debug mode! Ever have to recall a version because you forgot a trace in it? Hmmm...&lt;br /&gt;&lt;br /&gt;Well in the end I was very happy with my trace code. It allowed me to pinpoint the bug in SELECT FOR UPDATE, and I added a GOTCHA to my code which you can search for as soon as I get this version released (soon I hope).&lt;br /&gt;&lt;br /&gt;OK, so this has been quite a long post, thanks for sticking with me :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-2228966991475641356?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/2228966991475641356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=2228966991475641356' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/2228966991475641356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/2228966991475641356'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/02/pbxt-dbt2-dubugging-cc-101.html' title='PBXT &amp; DBT2: Dubugging C/C++ 101'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-6266221431609349358</id><published>2008-01-17T11:25:00.000+01:00</published><updated>2008-01-17T11:30:51.530+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sun'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='acquisition'/><title type='text'>Good move, congratulations MySQL and Sun!</title><content type='html'>Its already a day old, but the news is as hot as ever. Sun will acquire MySQL before the end of the year.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Congratulation to MySQL and Sun!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And well done to all who were involved in making this deal, in particular, those I know personally: Marten, Monty, David, Zack and Kaj!&lt;br /&gt;&lt;br /&gt;As I mentioned to Kaj, I am sure that MySQL has a very bright future under the wings of Sun. A deal for $1 billion made in 5 weeks can only mean both sides are &lt;span style="font-weight: bold;"&gt;extremely&lt;/span&gt; motivated to make it work.&lt;br /&gt;&lt;br /&gt;I have just 3 concerns:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I hope that the MySQL web-site will not disappear into the Sun web-site like the proverbial needle in a haystack! Sun's download page alone is as big as the MySQL web-site ;) I would like to see a mysql.sun.com, where we can find our way around easily.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;And the second is similar to the first but relates to the people. There is a massive difference between dealing with a company that has 400 employees, and one with 34000! I hope that this deal will not affect the access we have to the decision makers, the community support team and the developers.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Thirdly, Sun wants to sell MySQL to enterprise customers, but I want to be involved in a database that is there for everyone. I am concerned that the non-paying customers, which is a large part of the community, may become neglected.&lt;/li&gt;&lt;/ul&gt;I know that Kaj and many others at MySQL will be working hard to alleviate these concerns, so thanks in advance. Time will tell how successful they are. But they can be sure, &lt;span style="font-weight: bold;"&gt;in this quest they have my full support&lt;/span&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-6266221431609349358?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/6266221431609349358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=6266221431609349358' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6266221431609349358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/6266221431609349358'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2008/01/good-move-congratulations-mysql-and-sun.html' title='Good move, congratulations MySQL and Sun!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-8566295175611633226</id><published>2007-12-20T09:54:00.000+01:00</published><updated>2007-12-20T09:53:51.779+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='transactions'/><category scheme='http://www.blogger.com/atom/ns#' term='acid'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='durable'/><title type='text'>Making PBXT Fully Durable</title><content type='html'>Until now PBXT has been ACId (with a lower-case d). This is soon to change as I have had some weeks to work on a fully durable version of the transactional engine (&lt;a href="http://www.primebase.com/xt"&gt;http://www.primebase.com/xt&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;My first concern in making PBXT fully durable was to what extent I would have to abandon the original "write-once" design. While there are a number of ways to implement durability, the only method used by databases (as far as I know) is the write-ahead log.&lt;br /&gt;&lt;br /&gt;The obvious advantage of this method is that all changes can be flushed at once. However, this requires that all data be written twice: once to the log and after that, to the database itself.&lt;br /&gt;&lt;br /&gt;My solution to this problem is a compromise, but I think it is a good one. In a nutshell: short records are written twice, and long records are written once. When it comes to durability, this compromise, I believe, is a good one.&lt;br /&gt;&lt;br /&gt;If a transaction writes only short records, then one flush will suffice to commit it. Because the records are short, contention on the write-ahead log is at a minimum. If a transaction writes any long records, most of the data will be written once to a data log (as opposed to a transaction log). Contention for writing on the data log is zero (because each writer has its own data log), but two flushes are required to commit the transaction.&lt;br /&gt;&lt;br /&gt;By doing this I have saved other transactions having to wait while a certain transaction copies a large amount of data to the transaction log. Although the transaction log uses a double buffering system, this will still cause a hold up.&lt;br /&gt;&lt;br /&gt;In summary: if you have a transaction which writes large records, then it will basically just hold up itself, and not everybody else.&lt;br /&gt;&lt;br /&gt;Another innovation I have introduced to reduce contention on the transaction log is an "operation sequence number".&lt;br /&gt;&lt;br /&gt;Normally operations must be synchronized on the transaction log to ensure consistency. For example, the allocation of a block must be written to the log before usage. But this means all threads need to lock the transaction log when performing an operation.&lt;br /&gt;&lt;br /&gt;Instead of doing this, I issue a unique sequence number for each operation done on a table. The operations are then written to the log in batches without concern about the order.&lt;br /&gt;&lt;br /&gt;The process that then applies the changes in the log to the database sorts the operations by sequence number before they are applied. This is also done on restart, during recovery.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-8566295175611633226?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/8566295175611633226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=8566295175611633226' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/8566295175611633226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/8566295175611633226'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/12/making-pbxt-fully-durable.html' title='Making PBXT Fully Durable'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-3314011739044593745</id><published>2007-11-08T11:04:00.000+01:00</published><updated>2007-11-08T11:04:43.647+01:00</updated><title type='text'>BLOB Streaming presentation at the Hamburg MySQL User Group</title><content type='html'>I have just posted the presentation that I gave at the Hamburg MySQL User Group last Tuesday. You can download the presentation &lt;a href="http://www.blobstreaming.org/download/mysql_ug_nov_2007.pdf"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have added a few slides on advanced topics: backup, replication and the distributed repository, which did not actually make it into my talk. However, these topics came up in the discussion over a few drinks afterwards.&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://lenz.homelinux.org/"&gt;Lenz&lt;/a&gt; for the opportunity to present the &lt;a href="http://www.blobstreaming.org/"&gt;BLOB Streaming Project&lt;/a&gt; and to those that were there for the good feedback.&lt;br /&gt;&lt;br /&gt;As Lenz said, it was a "pretty technical crowd". For example, it did not go unnoticed that a denial of service attack could be launched by a malicious client, that establishes many upload connections that fill up the server's file system. Although unreferenced BLOBs of this type are deleted from the repository after 5 minutes, this is still a serious threat for anyone that exposes the MyBS HTTP port to the internet.&lt;br /&gt;&lt;br /&gt;To prevent this it may be necessary to limit upload to clients with specific IP addresses (which could be specified by a system variable). Lenz suggested using HTTP-based authentication such as &lt;a href="http://en.wikipedia.org/wiki/Digest_access_authentication"&gt;digest access authentification&lt;/a&gt;. Any other ideas would be welcome.&lt;br /&gt;&lt;br /&gt;Another question was whether a BLOB could be deleted while it is being downloaded from the repository. Although BLOBs are not locked while they are downloaded, I have just realized that this is not a problem. The BLOB remains in the repository after deletion until the compactor thread removes it by deleting a repository file that contains the BLOB. And this is only done once all readers have release the repository file.&lt;br /&gt;&lt;br /&gt;I have submitted this talk under the heading &lt;span style="font-style: italic;"&gt;An Introduction to BLOB Streaming for MySQL Project&lt;/span&gt; as a proposal for the &lt;a href="http://en.oreilly.com/mysql2008/public/content/home"&gt;MySQL Conference &amp;amp; Expo 2008&lt;/a&gt;. And, if it is approved I will also be presenting &lt;span style="font-style: italic;"&gt;Inside the PBXT Storage Engine&lt;/span&gt; at the conference. &lt;a href="http://blog.arabx.com.au/?p=870"&gt;Ronald&lt;/a&gt; mentioned that there have been nearly 300 submissions so I will be quite lucky to get both talks approved! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-3314011739044593745?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/3314011739044593745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=3314011739044593745' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3314011739044593745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3314011739044593745'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/11/blob-streaming-presentation-at-hamburg.html' title='BLOB Streaming presentation at the Hamburg MySQL User Group'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-7944699569032241805</id><published>2007-10-19T10:20:00.000+02:00</published><updated>2007-10-19T10:21:27.202+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='streaming'/><category scheme='http://www.blogger.com/atom/ns#' term='mybs'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='connector'/><category scheme='http://www.blogger.com/atom/ns#' term='jdbc'/><category scheme='http://www.blogger.com/atom/ns#' term='blob'/><title type='text'>New PBXT/MyBS release enables JDBC-based BLOB streaming!</title><content type='html'>This is quite a milestone for me! At last it possible to actually do some practical work with the BLOB streaming engine (MyBS)!&lt;br /&gt;&lt;br /&gt;For this release I have completed changes to the MySQL Connector/J 5.0.7, to allow BLOB data to be transparently stored and retrieved from the MyBS BLOB repository. The new version of the driver is called MySQL Connector/J SE (streaming enabled).&lt;br /&gt;&lt;br /&gt;Uploading a BLOB is as simple as using &lt;span style="font-family:courier new;"&gt;setBinaryStream()&lt;/span&gt; or &lt;span style="font-family:courier new;"&gt;setBlob()&lt;/span&gt; on &lt;span style="font-family:courier new;"&gt;INSERT&lt;/span&gt; or &lt;span style="font-family:courier new;"&gt;UPDATE&lt;/span&gt;. By using &lt;span style="font-family:courier new;"&gt;getBinaryStream()&lt;/span&gt; or &lt;span style="font-family:courier new;"&gt;getBlob()&lt;/span&gt; after a &lt;span style="font-family:courier new;"&gt;SELECT&lt;/span&gt; you get direct access to the data stream coming from the repository. More information and some examples are provided in the documentation at: &lt;a href="http://www.blobstreaming.org/documentation"&gt;http://www.blobstreaming.org/documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To try this out you need to install the latest versions of PBXT and MyBS. Both are available from: &lt;a href="http://www.blobstreaming.org/download"&gt;http://www.blobstreaming.org/download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Binary versions of the storage engines are also available for MySQL 5.1.22 running on 32-bit Linux and x86 Mac OS X. The modified version of the JDBC source code is included in the MyBS source code distribution, but the driver can also be downloaded &lt;a href="http://www.blobstreaming.org/download/mysql-connector-java-5.0.7se-bin.jar"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have included a small test program, TestJDBC.java, as part of the JDBC driver. So once you have installed the engines, you can test BLOB streaming as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;java -cp mysql-connector-java-5.0.7se-bin.jar TestJDBC&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;TestJDBC connects to a local MySQL server, creates a PBXT table and tests &lt;span style="font-family:courier new;"&gt;INSERT&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;SELECT&lt;/span&gt; of rows containing BLOBs. The program also serves as an example of how to do BLOB streaming with JDBC, but this is all pretty much standard stuff.&lt;br /&gt;&lt;br /&gt;To get started quickly, the most important things to note are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Set &lt;span style="font-family:courier new;"&gt;EnableBlobStreaming=true&lt;/span&gt; in your JDBC connection URL.&lt;/li&gt;&lt;li&gt;Streamable BLOBs can only be stored in &lt;span style="font-family:courier new;"&gt;LONGBLOB&lt;/span&gt; columns in PBXT tables.&lt;/li&gt;&lt;li&gt;Use &lt;span style="font-family:courier new;"&gt;setBinaryStream()&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;setAsciiStream()&lt;/span&gt; or &lt;span style="font-family:courier new;"&gt;setBlob()&lt;/span&gt; and specify the length to upload a BLOB.&lt;/li&gt;&lt;/ul&gt;A streamable BLOB is a BLOB where the data is stored in the MyBS BLOB repository and a reference is inserted into the row. If you use &lt;span style="font-family:courier new;"&gt;setBinaryStream()&lt;/span&gt; on &lt;span style="font-family:courier new;"&gt;INSERT&lt;/span&gt;, for example, but specify a length of &lt;span style="font-family:courier new;"&gt;-1&lt;/span&gt;, then the JDBC driver reverts to the default (non-streaming enabled) behavior which is to store the data directly in the table. The data will be returned correctly on &lt;span style="font-family:courier new;"&gt;SELECT&lt;/span&gt;, but is not streamable.&lt;br /&gt;&lt;br /&gt;As usual, any comments, questions or bug reports can be sent directly to me: paul-dot-mccullagh-at-primebase-dot-com. Make sure you put the word PBXT or MyBS in the e-mail title to make it through my spam filter! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-7944699569032241805?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/7944699569032241805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=7944699569032241805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7944699569032241805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7944699569032241805'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/10/new-pbxtmybs-release-enables-jdbc-based.html' title='New PBXT/MyBS release enables JDBC-based BLOB streaming!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-302666024662455010</id><published>2007-09-25T11:16:00.000+02:00</published><updated>2007-09-25T11:26:07.035+02:00</updated><title type='text'>PBXT &amp; MyBS at the MySQL Developer Meeting in Heidelberg</title><content type='html'>I was glad to have the opportunity to join the MySQL developers in &lt;a href="http://www.planetmysql.org/kaj/?p=87"&gt;Heidelberg&lt;/a&gt; for a few days, so thanks to MySQL for the invitation. In between great food, quite a few beers and a number of boat trips we managed to get a significant amount of work done!&lt;br /&gt;&lt;br /&gt;In what could be considered a follow-up to the engine summit at Google following the MySQL User's conference, I joined Calvin Sun, &lt;a href="http://krow.livejournal.com"&gt;Brian Aker&lt;/a&gt;, Jeffrey Pugh, &lt;a href="http://www.mysql.com/company/management.html"&gt;Monty&lt;/a&gt; and others from MySQL and the engine developing community to discuss things concerning storage engines.&lt;br /&gt;&lt;br /&gt;One of the main topics of the meeting was features and other changes to the MySQL front-end as required by the engines. Some of the requirements (such as an interface to the MySQL optimizer) would really require huge changes, but most agree that freely defined attributes on tables, columns and indexes would be very useful (and relatively easy to implement). Monty would like error handling on the commit call to be added ASAP, but Jeffrey said that's a feature, not a bug fix, and so for MySQL 5.1 it's a no-go. It will be interesting to see who wins that one! I would also like to have engine defined, custom data types. My most pressing problem: how can I indicate that a BLOB column is streamable?&lt;br /&gt;&lt;br /&gt;I presented the ideas behind the BLOB Streaming engine to the connector developers and we discussed how the PHP and JDBC connectors could be extended to support BLOB Streaming. Mark Matthews, responsible for JDBC, showed me the spot in the code where the ResultSet would handle a MyBS data stream. Mark also pointed out that JDBC will need to upload a BLOB without specifying which table it would be going into or the JDBC driver will have to parse the SQL statement. Hmm, ... I should have realized this before!?&lt;br /&gt;&lt;br /&gt;I am also looking forward to discussing things further with &lt;a href="http://www.hristov.com/andrey/"&gt;Andrey Hristov&lt;/a&gt;, developer of the mysqlnd PHP Connector, after he has tried out the new engine. Making the BLOB streaming functionality easily available to PHP developers will be a great step forward.&lt;br /&gt;&lt;br /&gt;I was also glad to be able to meet with &lt;a href="http://mysqlmusings.blogspot.com/"&gt;Mats Kindahl&lt;/a&gt; whose experience on the MySQL replication team is very useful to the BLOB streaming project. His main concern is to maintain the flexibility of the system as he points out in his &lt;a href="http://mysqlmusings.blogspot.com/2007/06/blob-locators-blob-streaming.html"&gt;blog&lt;/a&gt;. He suggested a more loosely coupled system, for example to use database triggers instead of the MyBS server-side API calls. While flexibility is important, I want to avoid too many moving parts, and make sure that the basic setup is simple. We both agreed that an embedded scripting language (ala MySQL proxy) may be a good compromise.&lt;br /&gt;&lt;br /&gt;In a bit of time between sessions &lt;a href="http://www.flamingspork.com/blog/"&gt;Stewart Smith&lt;/a&gt; and I took a look at adding the BLOB streaming functionality into the NDB cluster engine. We didn't get all that far with our quick hack, but we both saw that it could be done relatively easily. The potential for the combination of MySQL cluster and BLOB streaming is huge.&lt;br /&gt;&lt;br /&gt;Altogether it is very helpful to any developer in the community to have such concentrated access to the MySQL developers as is possible at the internal developer's conference. This is a great offer on the part of MySQL, and I can only imagine that they will have to continue to limit the number of external developers that can be accommodated at these meetings.&lt;br /&gt;&lt;br /&gt;So my recommendation: try to book a ticket as early as possible for next year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-302666024662455010?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/302666024662455010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=302666024662455010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/302666024662455010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/302666024662455010'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/09/pbxt-mybs-at-mysql-developer-meeting-in.html' title='PBXT &amp; MyBS at the MySQL Developer Meeting in Heidelberg'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-3355859379030468305</id><published>2007-08-28T12:06:00.000+02:00</published><updated>2007-08-28T12:06:36.410+02:00</updated><title type='text'>MySQL Camp: a Secret Tip?</title><content type='html'>Where can you get access to some of the most informed people from MySQL and the community, for free?&lt;br /&gt;&lt;br /&gt;The answer: at &lt;a href="http://mysqlcamp.org/"&gt;MySQL Camp&lt;/a&gt;. And then throw in lunch and breakfast for free, being able to influence the session topics and you have quite a package deal.&lt;br /&gt;&lt;br /&gt;So it is strange why so few people took up the offer in New York this year!?&lt;br /&gt;&lt;br /&gt;My talk was about the BLOB Streaming engine, MyBS, and I have posted the slides: &lt;a href="http://www.blobstreaming.org/download/mybs-camp2007.pdf"&gt;Presentation - MySQL Camp 2007: The BLOB Streaming Project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;OK, so I got pretty much ragged about the name, MyBS. Why, I was asked, did I name it that? Jay, even suggested a session to find a new name for the engine! Thanks, Jay, very considerate of you... :)&lt;br /&gt;&lt;br /&gt;But it was quite unnecessary, because I really can't see what the problem is. I think the name is cool. Uhm, totally ... cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-3355859379030468305?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/3355859379030468305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=3355859379030468305' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3355859379030468305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3355859379030468305'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/08/mysql-camp-secret-tip.html' title='MySQL Camp: a Secret Tip?'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-802513609320476769</id><published>2007-07-27T11:40:00.000+02:00</published><updated>2007-07-27T11:40:08.186+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='streaming'/><category scheme='http://www.blogger.com/atom/ns#' term='mybs'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='pbxt'/><category scheme='http://www.blogger.com/atom/ns#' term='blob'/><title type='text'>BLOB streaming engine (MyBS), version 0.5 Alpha released!</title><content type='html'>With some effort just before my holiday, I have managed to complete the release of the next version of MyBS, the BLOB streaming engine for MySQL.&lt;br /&gt;&lt;br /&gt;This version includes all the basic functionality required to stream BLOB data in and out of MySQL tables.&lt;br /&gt;&lt;br /&gt;The main features are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Uploading&lt;/i&gt; of BLOB data directly into the database using HTTP &lt;span style="font-weight: bold;"&gt;PUT&lt;/span&gt; or &lt;span style="font-weight: bold;"&gt;GET&lt;/span&gt; methods.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Downloaded of BLOB data directly from the database using HTTP &lt;span style="font-weight: bold;"&gt;GET&lt;/span&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;BLOB size may exceed 4GB - theoretical BLOB size limit of &lt;span style="font-style: italic;"&gt;256 Terabytes&lt;/span&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;BLOBs are stored in a &lt;span style="font-style: italic;"&gt;repository&lt;/span&gt; which manages references from other storage engine tables.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;BLOBs are referenced by a &lt;span style="font-weight: bold;"&gt;URL&lt;/span&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;URLs referencing BLOBs in the repository have a unique &lt;span style="font-style: italic;"&gt;access code&lt;/span&gt;, for security.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The theoretical maximum repository size is &lt;span style="font-style: italic;"&gt;4 Zettabytes&lt;/span&gt; (2^72 bytes) per database.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The &lt;span style="font-style: italic;"&gt;server-side streaming API&lt;/span&gt; allows any storage engine to store BLOB data in the repository.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;MyBS &lt;span style="font-style: italic;"&gt;system tables&lt;/span&gt; provide a view of the BLOBs and associated references in the repository.&lt;/li&gt;&lt;/ul&gt;MyBS works together with the PBXT transactional storage engine, version 0.9.88, which supports the MyBS streaming API. Both engines can be downloaded from: &lt;a href="http://www.blobstreaming.org/download"&gt;http://www.blobstreaming.org/download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Documentation for MyBS is also available. It includes details about all features so far, and some examples of use: &lt;a href="http://www.blobstreaming.org/documentation"&gt;http://www.blobstreaming.org/documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you try out the new engine, I'd like to hear from you. Any comments, questions and bug reports can be sent directly to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-802513609320476769?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/802513609320476769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=802513609320476769' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/802513609320476769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/802513609320476769'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/07/blob-streaming-engine-mybs-version-05.html' title='BLOB streaming engine (MyBS), version 0.5 Alpha released!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-5432746373032382291</id><published>2007-07-17T10:46:00.000+02:00</published><updated>2007-07-17T10:46:14.285+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='streaming'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='blob'/><title type='text'>The MyBS Engine and the BLOB Repository</title><content type='html'>After some consideration I have decided  to move the BLOB repository from PBXT to MyBS &lt;span style="font-style: italic;"&gt;(§)&lt;/span&gt;. This has the advantage that any engine that does not have its own BLOB repository (or is otherwise not suitable for storing large amounts of BLOB data) can reference BLOBs in the MyBS BLOB repository.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(§) MyBS stands for "BLOB Streaming for MySQL". The BLOB Streaming engine is a new storage engine for MySQL which allows you to stream media data directly in and out of the database. More info at &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.blobstreaming.org/"&gt;www.blobstreaming.org&lt;/a&gt;&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lets look at an example of this. Assume my standard example table:&lt;br /&gt;&lt;pre&gt;CREATE TABLE notes_tab (&lt;br /&gt;  n_id    int PRIMARY KEY,&lt;br /&gt;  n_text  longblob&lt;br /&gt;) ENGINE=PBXT;&lt;/pre&gt;And assume we have a file called &lt;tt&gt;blob_eg.txt&lt;/tt&gt; with the contents "This is a BLOB Streaming upload test".&lt;br /&gt;&lt;br /&gt;Firstly, I can upload a BLOB to the MyBS BLOB Repository using the HTTP PUT method:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;% curl -T blob_eg.txt http://localhost:8080/test/notes_tab&lt;br /&gt;test/1-326-4891cdae-0&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Here I uploaded a BLOB to the repository and specified the database, &lt;tt&gt;test&lt;/tt&gt;, and the table, &lt;tt&gt;notes_tab&lt;/tt&gt;. The URL returned, &lt;tt&gt;test/1-326-4891cdae-0&lt;/tt&gt;, is the reference to the BLOB in the BLOB repository, returned by MyBS. Note that the BLOB is not yet in the table (to store the BLOB directly in the table, I would have to specify a column and a condition which identifies a particular row in the table).&lt;br /&gt;&lt;br /&gt;However, the BLOB is already stored in the database, and I can download as follows:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;% curl http://localhost:8080/test/1-326-4891cdae-0&lt;br /&gt;This is a BLOB Streaming upload test&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Since the BLOB is not yet referenced by a table, the MyBS BLOB repository sets a timer. If the BLOB is not &lt;span style="font-style: italic;"&gt;retained&lt;/span&gt; (reference count incremented) within a certain amount of time it is removed from the BLOB repository.&lt;br /&gt;&lt;br /&gt;To actually insert the BLOB into the table you just insert the BLOB reference, for example:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;mysql&gt; insert notes_tab values (1, "test/1-326-4891cdae-0");&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;On the MySQL server the &lt;tt&gt;notes_tab&lt;/tt&gt; table engine will call the MyBS engine (using the server-side BLOB Streaming API) and retain the &lt;tt&gt;test/1-326-4891cdae-0&lt;/tt&gt; BLOB reference. So I can now download the BLOB by referencing the table, column and row as follows:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;% curl http://localhost:8080/test/notes_tab/n_text/n_id=1&lt;br /&gt;This is a BLOB Streaming upload test&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Note: this example will only work with MyBS 0.5 (&lt;a href="http://www.blobstreaming.org/download"&gt;www.blobstreaming.org/download&lt;/a&gt;) or later. Coming soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-5432746373032382291?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/5432746373032382291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=5432746373032382291' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5432746373032382291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5432746373032382291'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/07/mybs-engine-and-blob-repository.html' title='The MyBS Engine and the BLOB Repository'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-3596074483430996827</id><published>2007-06-28T10:03:00.000+02:00</published><updated>2007-06-28T10:28:22.029+02:00</updated><title type='text'>PBXT: Top 5 wishes of a Storage Engine</title><content type='html'>In response to Ronald's challenge in &lt;a href="http://blog.arabx.com.au/?p=739"&gt;Top 5 wishes for MySQL&lt;/a&gt;, here is my top 5 wish list. However, it make sense for me to put a slightly different spin on the top 5 series, and write from a storage engine developers perspective.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. A generic engine test suite&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A set of &lt;tt&gt;mysql-test-run&lt;/tt&gt; test scripts and results that are intended to be run by all engines. The tests will verify basic functionality and compatibility, and form the basis for an engine certification process.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Internal APIs&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;PBXT already has to call into MySQL to open &lt;tt&gt;.frm&lt;/tt&gt; files, and transform path and file names. The &lt;a href="http://www.blobstreaming.org"&gt;BLOB Streaming&lt;/a&gt; engine will need to access user privilege information. Other engines use the cross-platform functionality provided by &lt;tt&gt;mysys&lt;/tt&gt;. What we need is a number of official, well-defined APIs to various MySQL internal functionality.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Customizable table and column attributes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Specialized engines require specialized information. Right now, this information is being packed into table and column comments (hack, hack, ...).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Push-down restrict and join conditions&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is a big one for engines in general. Many engines are being created that can do certain searches better than the MySQL query processor. However, for the optimizer to know whether to push down a condition or not will probably require a better performance metric.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. Custom data types&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;SQL-92 has the concept of a domain, which is basically a named data type. This could be used as the basis for custom data types provided by a storage engine, made available in the form of a new domain.&lt;br /&gt;&lt;br /&gt;And without numbering them, let me slip in a few more wishes. How about MySQL community project development hosted on &lt;a href="http://forge.mysql.com/"&gt;MySQLForge&lt;/a&gt;, complete with integration into the MySQL bug tracking system?! And I have heard that this may also be possible: PBXT and other GPL community engines on the MySQL Community distribution :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-3596074483430996827?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/3596074483430996827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=3596074483430996827' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3596074483430996827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3596074483430996827'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/06/pbxt-top-5-wishes-for-mysql-of-storage.html' title='PBXT: Top 5 wishes of a Storage Engine'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-7058863326827784108</id><published>2007-06-26T13:14:00.000+02:00</published><updated>2007-06-26T13:15:28.159+02:00</updated><title type='text'>First release of the BLOB Streaming engine for MySQL</title><content type='html'>I have just released the first version of the BLOB Streaming engine for MySQL (MyBS). You can download the source code of the engine from &lt;a href="http://www.blobstreaming.org/download"&gt;http://www.blobstreaming.org/download&lt;/a&gt;. Pluggable binaries for MySQL 5.1.19 (32-bit Linux and Mac OS X) are also available.&lt;br /&gt;&lt;br /&gt;To install the plug-in copy &lt;tt&gt;libmybs.so&lt;/tt&gt; to the /usr/local/mysql/lib/mysql directory, connect to your server using mysql, and enter:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;mysql&gt; install plugin MyBS soname "libmybs.so";&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;This version allows you to download BLOBs that are already stored in the database using HTTP. The URL is specified as follows:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;http://mysql-host-name:8080/database/table/blob-column/condition&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Where &lt;tt&gt;condition&lt;/tt&gt; has the form: &lt;tt&gt;column1=value1&amp;column2=value2&amp;...&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;I gave an example of this in my previous blog: &lt;a href="http://pbxt.blogspot.com/2007/06/geting-blob-out-of-database-with-blob.html"&gt;"GET"ing a BLOB from the database with the BLOB Streaming Engine&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;8080&lt;/tt&gt; is the default port, which can be set using the &lt;tt&gt;mybs_port&lt;/tt&gt; system variable on the mysqld command line. For example: &lt;tt&gt;mysqld --mybs_port=8880&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;In order for BLOB streaming to work you also need PBXT version 0.9.87 which is &lt;i&gt;streaming enabled&lt;/i&gt;. Streaming enabled simply means the engine supports the MyBS server-side streaming API.&lt;br /&gt;&lt;br /&gt;This version of PBXT is also available from &lt;a href="http://www.blobstreaming.org/download"&gt;www.blobstreaming.org&lt;/a&gt;, or from &lt;a href="http://sourceforge.net/projects/pbxt"&gt;Sourceforge.net&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Note that this version is currently only for use behind the firewall because the HTTP access is unrestricted.&lt;br /&gt;&lt;br /&gt;The next step will be to enable the uploading of BLOBs using the HTTP PUT method, and the implementation of basic security.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-7058863326827784108?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/7058863326827784108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=7058863326827784108' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7058863326827784108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7058863326827784108'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/06/first-release-of-blob-streaming-engine.html' title='First release of the BLOB Streaming engine for MySQL'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-934659854207705324</id><published>2007-06-05T13:04:00.000+02:00</published><updated>2007-06-05T13:07:07.520+02:00</updated><title type='text'>"GET"ing a BLOB from the database with the BLOB Streaming Engine</title><content type='html'>Current plans call for the use of the HTTP protocol to upload and retrieve BLOBs to and from the database. The BLOB Streaming Engine makes this possible by integrating a lightweight HTTP server directly into the MySQL server.&lt;br /&gt;&lt;br /&gt;I am currently working on an alpha implementation of this, and would like to give a short demonstration of what is possible using this system.&lt;br /&gt;&lt;br /&gt;We start by creating a table using any streaming enabled storage engine (a streaming enable storage engine, is an engine that supports the server-side streaming API):&lt;br /&gt;&lt;pre&gt;use test;&lt;br /&gt;CREATE TABLE notes_tab (&lt;br /&gt;  n_id        INTEGER PRIMARY KEY,&lt;br /&gt;  n_text      BLOB&lt;br /&gt;) ENGINE=pbxt;&lt;br /&gt;INSERT notes_tab VALUES (1, "This is a BLOB streaming test!");&lt;/pre&gt;&lt;br /&gt;Now assuming the MySQL server is on the localhost, and the BLOB streaming engine has been set to port 8080, you can open your browser, and enter this URL:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;http://localhost:8080/test/notes_tab/n_text/n_id=1&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;With the following result:&lt;br /&gt;&lt;br /&gt;&lt;img height=103 width=410 src="http://www.primebase.com/xt/download/streamed-blob.jpg"&gt;&lt;br /&gt;&lt;br /&gt;So without even doing a &lt;code&gt;SELECT&lt;/code&gt;, you can &lt;b&gt;GET&lt;/b&gt; a BLOB directly out of the database!&lt;br /&gt;&lt;br /&gt;Note that there is no need for the BLOB in the database to be explicitly "streamable" for this to work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-934659854207705324?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/934659854207705324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=934659854207705324' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/934659854207705324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/934659854207705324'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/06/geting-blob-out-of-database-with-blob.html' title='&quot;GET&quot;ing a BLOB from the database with the BLOB Streaming Engine'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-3691773299772450849</id><published>2007-05-18T14:18:00.000+02:00</published><updated>2007-05-18T14:18:02.390+02:00</updated><title type='text'>The Scalable BLOB Streaming discussion so far</title><content type='html'>Having discussed BLOB streaming for MySQL with a number of people I have gathered quite a bit of input on the subject.&lt;br /&gt;&lt;br /&gt;So here are some details of the issues raised so far:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Server-side API&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;One of the first things that Brian Aker pointed out to me was that the server-side API must make it possible to use the sendfile() system call. The call does direct disk to network transfer and can speed up delivery of a BLOB stream significantly.&lt;br /&gt;&lt;br /&gt;The server-side API must also include a mechanism to inform the stream enabled engine that an upload is complete. Assuming the streaming protocol used is HTTP, there are 2 ways of determining the end of a download: either the connection is closed when download is complete, or the length of the BLOB data is specified in a HTTP header. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;ODBC Issues&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Monty was concerned about compatibility with the MySQL ODBC driver. The ODBC function SQLPutData() is used to send BLOB data, and SQLGetData() is used to retrieve BLOB data. Both functions transfer data in chunks. The implementation of these functions would have to be made aware of streamable BLOB values.&lt;br /&gt;&lt;br /&gt;This can probably be done in a way that is transparent to the user. It may be necessary to designate certain database types as streaming BLOBs. One suggestion is to add 2 new types to MySQL. LONGBIN and LONGCHAR. These keywords are not yet used by MySQL.&lt;br /&gt;&lt;br /&gt;However, from the OBDC side the data types LONGVARBINARY and LONGVARCHAR are already mapped to the MySQL types BLOB and TEXT respectively. But this simply means that it would be transparent to an ODBC application whether a BLOB is being streamed, or retrieved using the standard client/server connection.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Upload Before or After INSERT&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There is some debate about how exactly a BLOB should be inserted. The 2 main possibilities are:&lt;br /&gt;&lt;br /&gt;1) Upload the BLOB. The upload returns a handle (or key). Perform the INSERT setting the BLOB column to the key value.&lt;br /&gt;&lt;br /&gt;2) Perform an INSERT, but specify in a CREATE_BLOB(&lt;size&gt;) function the size of the BLOB that is to be inserted into the column. The caller then SELECTs back the inserted data. In the BLOB column the caller finds a handle. The handle can then be used to upload the data.&lt;br /&gt;&lt;br /&gt;For method (1) it was also suggested that the client application specify a name, instead of using a handle returned by the server. The name could then be used as input to a "create_blob" function which is specified in the INSERT statement. The advantage of this is that the text of the insert statement is readable.&lt;br /&gt;&lt;br /&gt;One advantage of method (1), as pointed out by Monty, is that the client does not have to wait for the upload to complete before doing the INSERT. The server could wait for the upload to complete. This would require a client side generated identifier for each BLOB uploaded.&lt;br /&gt;&lt;br /&gt;Note that method (2) requires use of a transaction to prevent the row with the BLOB from being selected before the BLOB data has been uploaded.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Storage of BLOBs&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Stewart Smith suggested that the BLOBs be stored by the streaming engine itself. This is something to be considered, and probably will be necessary in most scale-out scenarios. Otherwise the current plan is that each engine that is streaming BLOB enabled (i.e. that supports the server-side streaming API) will store the BLOBs themselves.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scaling Writes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Also mentioned in regard to scaling is the fact that read scale-out is usually more important than write. However, there are web-sites that have a heavy write load. To be investigated would be how NBD could used in combination with the streaming engine to scale-out uploading of BLOBs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mysqldump &amp; mysql&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As pointed out by Monty, the output of mysqldump is a readable stream. So any changes to mysqldump in order to support streamable BLOBs should ensure that this continues to be the case. This is related to the question of how to upload BLOBs using the mysql client. One idea would be to provide a command in mysql to upload a file or a block of binary data or text.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Security&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In some cases it may be necessary to check whether a client is authorized to download or upload a BLOB. The most straight forward method would be for the server to issue authorization tokens which are submitted with an upload or download. These tokens expire after a certain amount of time, or when the associated server connection is closed. However, if the streaming protocol is to be HTTP then we need to investigate the possibility of using standard HTTP authentication when retrieving and sending BLOBs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;In-place Updates&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In-place updates of BLOBs is allowed by some SQL servers (for example by using functions UPDATETEXT and WRITETEXT supported by MS SQL Server). In this case the streaming enabled engine would be responsible for locking or using some other method to ensure that concurrent reads of the BLOB remain consistent.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PHP Upload&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Georg Richter, who is responsible for the PHP Native Driver at MySQL, noted that using BLOB streaming, data could be uploaded from the Web directly into the database. The PHP extension to the standard MySQL client software should include a function to make this possible.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ALTER TABLE&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Georg also pointed out that it should be possible to convert BLOBs currently stored in MySQL tables into streamable BLOBs using ALTER TABLE. This would enable developers to quickly try out streaming BLOBs and test the performance characteristics, in combination with their applications.&lt;br /&gt;&lt;br /&gt;These are the main issues raised so far. Any further ideas, comments and questions are welcome! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-3691773299772450849?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/3691773299772450849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=3691773299772450849' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3691773299772450849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/3691773299772450849'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/05/scalable-blob-streaming-discussion-so.html' title='The Scalable BLOB Streaming discussion so far'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-5871697933699296973</id><published>2007-05-01T13:30:00.000+02:00</published><updated>2007-05-02T12:52:24.683+02:00</updated><title type='text'>PBXT and the MySQL Conference &amp; Expo 2007</title><content type='html'>The conference is over, and it was a great week but pretty exhausting! From what I saw, and from what I have heard the sessions were of a very high standard this year. I have come back with a number of new ideas and quite a few things I would like to implement in PBXT. One of these is new &lt;a href="http://forge.mysql.com/wiki/OnlineBackup"&gt;online backup API&lt;/a&gt; for MySQL which will enable you to make a snapshot backup of data stored by all engines, and do &lt;i&gt;point in time&lt;/i&gt; recovery.&lt;br /&gt;&lt;br /&gt;For me the week started off with the BoF on &lt;a href="http://www.blobstreaming.org"&gt;scalable BLOB streaming&lt;/a&gt; on Tuesday evening. The BoF was well attended and there was significant interest in the topic. I will be reporting on some of the issues discussed soon.&lt;br /&gt;&lt;br /&gt;On Wednesday morning I presented: &lt;i&gt;PrimeBase XT - Design and Implementation of a Transactional Storage Engine&lt;/i&gt;. I was pleased with the number of questions, interest and feedback I received.&lt;br /&gt;&lt;br /&gt;When I mentioned to Mårten Mickos that someone had said it was the best session they had heard so far at the conference, Mårten told me that they pay guys to say this to the speakers so that they feel good! So I must thank MySQL for this very thoughtful gesture - joke, of course ;)&lt;br /&gt;&lt;br /&gt;Thanks also to &lt;a href="http://www.sheeri.com"&gt;Sheeri Kritzer&lt;/a&gt; for video recording the talk so I hope to get a link to that soon. In the meantime I have posted my slides to the PBXT home page:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.primebase.com/xt/download/pbxt_mysql_uc_2007.pdf"&gt;http://www.primebase.com/xt/download/pbxt_mysql_uc_2007.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After that I also took part in 2 lightning rounds sessions: &lt;i&gt;Top MySQL Community Contributors&lt;/i&gt; and &lt;i&gt;State of the Partner Engines&lt;/i&gt;. Both sessions were interesting in their diversity. One of the top contributors, Ask Bjørn Hansen, described how meeting his goal of filing a bug a week was a lot easier in the early days of MySQL. However, more recently he has been helped by the current state of the GUI tools!&lt;br /&gt;&lt;br /&gt;During the &lt;i&gt;Partner Engines&lt;/i&gt; session, it came as a surprise to some people in the audience that not all engines are for free. Actually there is a wide spectrum from GPL over partially free to highly priced. In fact, one of the developers of a data-warehousing engine found the question as to whether it may be free quite amusing. Solid has not decided to what extent it high-availability offering will be commercial, and the Amazon S3 engine is free, but the service behind it not. So that's something to watch out for in general.&lt;br /&gt;&lt;br /&gt;I took the opportunity during the &lt;i&gt;Partner Engines&lt;/i&gt; session to mention our plans for the future of PBXT which involve building a &lt;i&gt;scalable BLOB streaming infrastructure&lt;/i&gt; for MySQL. This is relevant to a number engine developers as we will be providing an open system which will enable all engines to stream BLOBs directly in and out of the server. So please check out &lt;a href="http://www.blobstreaming.org"&gt;blobstreaming.org&lt;/a&gt; for more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-5871697933699296973?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/5871697933699296973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=5871697933699296973' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5871697933699296973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/5871697933699296973'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/05/pbxt-and-mysql-conference-expo-2007.html' title='PBXT and the MySQL Conference &amp; Expo 2007'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-7271316357439129208</id><published>2007-04-19T14:01:00.000+02:00</published><updated>2007-04-19T14:03:30.625+02:00</updated><title type='text'>What makes the design of PBXT similar to MyISAM?</title><content type='html'>PBXT is a transactional storage engine, but what does the design have in common with MyISAM?&lt;br /&gt;&lt;br /&gt;I'll be answering this and other questions during my session at the MySQL Users Conference next week:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;a href="http://www.mysqlconf.com/cs/mysqluc2007/view/e_sess/10410"&gt;PrimeBase XT: Design and Implementation of a Transactional Storage Engine&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Date:&lt;/b&gt; Wednesday, April 25&lt;br /&gt;&lt;b&gt;Time:&lt;/b&gt; 10:45am - 11:45am &lt;br /&gt;&lt;b&gt;Location:&lt;/b&gt; Ballroom F&lt;br /&gt;&lt;/center &gt;&lt;br /&gt;&lt;br /&gt;So be sure to check it out! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-7271316357439129208?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/7271316357439129208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=7271316357439129208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7271316357439129208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7271316357439129208'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/04/what-makes-design-of-pbxt-similar-to.html' title='What makes the design of PBXT similar to MyISAM?'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-9100060033487834616</id><published>2007-04-09T16:03:00.001+02:00</published><updated>2007-04-09T16:04:42.647+02:00</updated><title type='text'>PBXT 0.9.86 the MySQL Conference 2007 release!</title><content type='html'>I have just released PrimeBase XT 0.9.86 which will be my last release before the MySQL User Conference this year. The most significant change in this version is the reduction of the number of data logs used per table. This, and a number of other modifications, makes PBXT fit to handle databases with 1000's of tables.&lt;br /&gt;&lt;br /&gt;If you would like to learn more about the development and design of PBXT then join me for my session at the MySQL User Conference in Santa Clara, on Wed, April 25, 10:45am - 11:45am, Ballroom F:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mysqlconf.com/cs/mysqluc2007/view/e_sess/10410"&gt;PrimeBase XT: Design and Implementation of a Transactional Storage Engine&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looking ahead, I would also like to invite all who are interested to the &lt;a href="http://www.mysqlconf.com/cs/mysqluc2007/view/e_sess/14125"&gt;"Scalable BLOB Streaming Infrastructure" BoF&lt;/a&gt;, which is scheduled for Tuesday, April 24, 8:30pm - 9:30pm.&lt;br /&gt;&lt;br /&gt;This will be an informal discussion of our plans for the implementation of scalable BLOB streaming in MySQL, and how this all fits together with PBXT and other engines.&lt;br /&gt;&lt;br /&gt;We would like as much input as possible at this early stage, so I hope you can make it!&lt;br /&gt;&lt;br /&gt;I will also be taking part in a number of lightning rounds so check out &lt;a href="http://www.mysqlconf.com/cs/mysqluc2007/view/e_spkr/3104"&gt;this page&lt;/a&gt; for a complete list of my sessions:&lt;br /&gt;&lt;br /&gt;I'm looking forward to seeing you all there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-9100060033487834616?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/9100060033487834616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=9100060033487834616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/9100060033487834616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/9100060033487834616'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/04/pbxt-0986-mysql-conference-2007-release.html' title='PBXT 0.9.86 the MySQL Conference 2007 release!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-7672734965833386620</id><published>2007-03-23T14:49:00.000+01:00</published><updated>2007-03-23T17:53:57.154+01:00</updated><title type='text'>PBXT and a scalable BLOB streaming infrastructure</title><content type='html'>As Kaj Arnö already mentioned in his &lt;a href="http://www.planetmysql.org/kaj/?p=95"&gt;blog&lt;/a&gt;, we have a vision for MySQL and it is called a &lt;i&gt;&lt;b&gt;scalable BLOB streaming infrastructure&lt;/b&gt;&lt;/i&gt;. Our plan is to build this into and around the MySQL architecture with the help of MySQL and the community.&lt;br /&gt;&lt;br /&gt;It is a "big picture" idea and in this way a response to Robin Schumacher's question: &lt;a href="http://www.planetmysql.org/robin/?p=37"&gt;The MySQL Vision - What do you see?&lt;/a&gt;. But at the same time it is very relevant and practical in the context of the Web 2.0 world.&lt;br /&gt;&lt;br /&gt;The design of the system includes a client-side library which extends the existing MySQL client API, a stream based communications protocol and a scalable back-end which is (at least partially) linked into the MySQL server. In short, we want to make it possible to put BLOBs of any size in the database.&lt;br /&gt;&lt;br /&gt;The system will be open, and available to all engines running under MySQL. Of course, I believe PBXT has the ideal design and performance characteristics to support this new infrastructure.&lt;br /&gt;&lt;br /&gt;Many say that their programs run fine with the BLOBs stored in the filing system. And this is true, but what about transactional consistency, backup and replication? And what about scale-out for the storage and delivery of this data? Simply put, we know these are significant issues from our customers in the print and web publishing business that need this functionality.&lt;br /&gt;&lt;br /&gt;And, when you think about it, media streaming has a very promising future. I believe it's becoming more important for an increasing number of developers. So this is more about opening up new opportunities and extending the reach of MySQL into new areas.&lt;br /&gt;&lt;br /&gt;We have a pretty good idea of the basic design of the system, but this is just the starting point. The design must reflect the requirements of the users and developers, so our first step is to get as many as possible in the MySQL community together who have an interest in this technology.&lt;br /&gt;&lt;br /&gt;We want to know what features and characteristics of such a system are important to you. What are your requirements of such a system?&lt;br /&gt;&lt;br /&gt;To this end I am arranging a &lt;a href="http://conferences.oreillynet.com/pub/w/54/bof.html"&gt;BoF&lt;/a&gt; on scalable BLOB streaming at the &lt;a href="http://www.mysqlconf.com/cs/mysqluc2007/view/e_spkr/3104"&gt;MySQL user conference&lt;/a&gt; next month. This will be a great opportunity to get together and discuss the subject with all who are interested, so I hope you will join me.&lt;br /&gt;&lt;br /&gt;Of course you are welcome to contact me any time in this regard by e-mail at paul-dot-mccullagh-at-primebase-dot-com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-7672734965833386620?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/7672734965833386620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=7672734965833386620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7672734965833386620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7672734965833386620'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/03/pbxt-and-scalable-blob-streaming.html' title='PBXT and a scalable BLOB streaming infrastructure'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-4741849037981206159</id><published>2007-03-19T13:28:00.000+01:00</published><updated>2007-03-19T13:39:35.834+01:00</updated><title type='text'>PBXT does Windows!</title><content type='html'>On Friday I posted PBXT version 0.9.85 which concludes my initial work on porting the engine to Windows NT/XP.&lt;br /&gt;&lt;br /&gt;I have built a MySQL 5.1 executable (&lt;tt&gt;mysqld-nt.exe&lt;/tt&gt;) to make it easy to try it out. The binary package can be downloaded from &lt;a href="http://www.primebase.com/xt"&gt;http://www.primebase.com/xt&lt;/a&gt;. Instructions on how to install are given in the &lt;tt&gt;README&lt;/tt&gt; file.&lt;br /&gt;&lt;br /&gt;If you would like to build it yourself, then download the source code from &lt;a href="http://sourceforge.net/projects/pbxt"&gt;SourceForge.net&lt;/a&gt;, and follow the instruction in the &lt;tt&gt;windows-readme.txt&lt;/tt&gt; file.&lt;br /&gt;&lt;br /&gt;Unfortunately MySQL 5.1 does not support runtime loading of storage engines, as done on Linux and Mac OS X. Last I heard, this feature will also be a bit slow in coming, and is scheduled for 5.2. So if there is anybody else out there who would like to see this feature sooner, let your voices be heard!&lt;br /&gt;&lt;br /&gt;On the whole the port to Windows was fairly straightforward. I miss atomic "seek-and-read/write" functions like &lt;i&gt;pread&lt;/i&gt; and &lt;i&gt;pwrite&lt;/i&gt; under Windows. But the only real source of problems was the pthread stuff. PBXT uses a bit more of the pthread library than the MySQL server, so I had to add implementations for several functions.&lt;br /&gt;&lt;br /&gt;I would like to just link one of the available pthread libraries for Windows (such as &lt;a href="http://sources.redhat.com/pthreads-win32/"&gt;pthreads-win32&lt;/a&gt;) but MySQL already implements some of the functions, which could cause link errors. In general, I think, MySQL should consider using a LGPL library such as pthreads-win32.&lt;br /&gt;&lt;br /&gt;But this is a minor point, PBXT for Windows is running anyway...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-4741849037981206159?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/4741849037981206159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=4741849037981206159' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/4741849037981206159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/4741849037981206159'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/03/pbxt-does-windows.html' title='PBXT does Windows!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-7251034231853769902</id><published>2007-02-08T14:55:00.000+01:00</published><updated>2007-02-08T15:26:25.321+01:00</updated><title type='text'>The first binary distribution of PBXT!</title><content type='html'>It's quite an effort to compile and test 3 versions of MySQL on 4 different machines, but that is what I have done for the first binary distribution of the PrimeBase XT pluggable storage engine.&lt;br /&gt;&lt;br /&gt;Of course, its worth the effort because this is the "holy grail" of the pluggable storage engine strategy. Namely, binary plug-ins that work with the binary distributions prepared by MySQL and others in the community.&lt;br /&gt;&lt;br /&gt;And by creating an installer script I have made it easier than ever to install the plug-in. So after you have downloaded the binary package from &lt;a href="http://www.primebase.com/xt/#binary_plugin"&gt;http://www.primebase.com/xt&lt;/a&gt;, all you have to do is:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Start your MySQL server.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Enter: &lt;tt&gt;sudo ./install&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;The installer will automatically determine the version of the server running and install the corresponding plug-in.&lt;br /&gt;&lt;br /&gt;The package includes plug-ins for MySQL 5.1.14, 5.1.15 and 5.2.0 on Linux (32/64-bit) and Mac OS X (x86/PowerPC). Nevertheless you may wonder why the download is 22MB in size.&lt;br /&gt;&lt;br /&gt;The reason is I have had to include patched versions of &lt;tt&gt;mysqld&lt;/tt&gt; with the plug-ins for MySQL 5.1.14 and 5.2.0. The patch fixes a &lt;a href="http://bugs.mysql.com/bug.php?id=22694"&gt;bug&lt;/a&gt; that causes MySQL to crash when restarted after a plug-in has been installed. The installer generates an &lt;tt&gt;uninstall&lt;/tt&gt; script which restores the unpatched &lt;tt&gt;mysqld&lt;/tt&gt; and removes the plug-in.&lt;br /&gt;&lt;br /&gt;The bug is fixed in MySQL 5.1.15, so in the future the package should be much smaller, even when it includes more platforms.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-7251034231853769902?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/7251034231853769902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=7251034231853769902' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7251034231853769902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/7251034231853769902'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/02/first-binary-distribution-of-pbxt.html' title='The first binary distribution of PBXT!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-117023554400688658</id><published>2007-01-31T14:01:00.000+01:00</published><updated>2007-02-06T09:23:23.623+01:00</updated><title type='text'>PBXT 0.9.8 Beta with Referential Integrity released!</title><content type='html'>I have just released version 0.9.8 of the &lt;a href="http://www.primebase.com/xt"&gt;PrimeBase XT&lt;/a&gt; storage engine for MySQL 5.1. The major feature of this new version is foreign key support. As far as I know, this makes PBXT the first 3rd party storage engine to fully implement referential integrity, and the second after InnoDB.&lt;br /&gt;&lt;br /&gt;With this version PBXT is practically feature complete. Only &lt;tt&gt;CHECK TABLE&lt;/tt&gt; remains to be implemented for the first GA release (see &lt;a href="http://www.primebase.com/xt/download/pbxt-to-do.txt"&gt;pbxt-to-do.txt&lt;/a&gt; for details). So my plan to complete the PBXT GA release on time for MySQL 5.1 GA looks quite doable (especially now that I have heard MySQL 5.1 GA has been pushed to 3rd quarter 2007).&lt;br /&gt;&lt;br /&gt;The latest package can be downloaded from &lt;a href="http://www.primebase.com/xt"&gt;www.primebase.com/xt&lt;/a&gt; or &lt;a href="http://sourceforge.net/projects/pbxt"&gt;sourceforge.net/projects/pbxt&lt;/a&gt;. I have updated the instructions on how to build and install PBXT as a pluggable storage engine: &lt;a href="http://www.primebase.com/xt/download/how-to-build.txt"&gt;how-to-build.txt&lt;/a&gt;. This text also explains how to download and build MySQL 5.1.14.&lt;br /&gt;&lt;br /&gt;Although building everything from source code is relatively straight forward I plan to make binary versions of the plug-in available for MySQL 5.1.14 shortly. So a quick test drive of PBXT is about to become easier than ever...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-117023554400688658?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/117023554400688658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=117023554400688658' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/117023554400688658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/117023554400688658'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/01/pbxt-098-beta-with-referential.html' title='PBXT 0.9.8 Beta with Referential Integrity released!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-116954087018742443</id><published>2007-01-23T09:25:00.000+01:00</published><updated>2007-01-23T09:31:28.506+01:00</updated><title type='text'>PBXT Session at the 2007 MySQL Conference &amp; Expo</title><content type='html'>Thanks to MySQL, and in particular Jay, for giving me the opportunity to talk about PBXT at the up-coming MySQL Conference in April. I will be presenting a session with the title: &lt;i&gt;PrimeBase XT: Design and implementation of a transactional storage engine&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Topics include the design of XT and how it differs from conventional implementations, experience with implementing storage engines, surprises and gotchas, and performance. So I think this talk will be of interest to both end-users and other developers of storage engines.&lt;br /&gt;&lt;br /&gt;See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-116954087018742443?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/116954087018742443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=116954087018742443' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116954087018742443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116954087018742443'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2007/01/pbxt-session-at-2007-mysql-conference.html' title='PBXT Session at the 2007 MySQL Conference &amp; Expo'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-116610949618581862</id><published>2006-12-15T10:43:00.000+01:00</published><updated>2006-12-15T10:44:22.413+01:00</updated><title type='text'>Implementation of Foreign Keys for the PBXT storage engine</title><content type='html'>I have just committed the initial implementation of foreign keys for the PrimeBase XT storage engine, whew! The implementation is similar to that of InnoDB and supports the &lt;tt&gt;RESTRICT&lt;/tt&gt;, &lt;tt&gt;CASCADE&lt;/tt&gt; and &lt;tt&gt;SET NULL&lt;/tt&gt; options.&lt;br /&gt;&lt;br /&gt;Currently the PBXT implementation requires that the data types of the referenced columns are identical. InnoDB allows references between &lt;tt&gt;CHAR&lt;/tt&gt; and &lt;tt&gt;VARCHAR&lt;/tt&gt; and strings of different length. PBXT also requires that the index used by foreign keys have the exact number of components. InnoDB can use indexes that have more components than the number of columns specified in the foreign key declaration.&lt;br /&gt;&lt;br /&gt;On the other hand, PBXT supports all SQL syntax that can be used to create foreign keys. This includes the following syntax which is not supported by InnoDB:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;CREATE TABLE t2 (&lt;/tt&gt;&lt;br /&gt;&lt;tt&gt;  id INT PRIMARY KEY,&lt;/tt&gt;&lt;br /&gt;&lt;tt&gt;   fk int REFERENCES t1(id)&lt;/tt&gt;&lt;br /&gt;&lt;tt&gt;) ENGINE=pbxt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Maybe you are wondering why one engine supports a certain syntax, and another does not. Well, this was one thing that surprised me as well: MySQL parses but ignores the foreign key definitions. In fact, when you execute &lt;tt&gt;SHOW CREATE TABLE&lt;/tt&gt;, MySQL calls the storage engine for the text of the foreign key definitions. So one of the biggest jobs has been to parse the SQL statements and extract the foreign key information.&lt;br /&gt;&lt;br /&gt;Unfortunately, its not just done with &lt;tt&gt;CREATE TABLE&lt;/tt&gt;. The engine also has to support &lt;tt&gt;ALTER TABLE&lt;/tt&gt;, and all other statements that modify a table (e.g. &lt;tt&gt;CREATE/DROP INDEX&lt;/tt&gt;) have to be parsed to determine which table is being altered. The reason for this is, when MySQL alters a table it creates a new table and copies the data from the old to the new table. So when the new table is created the engine has to identify the source table and copy over the foreign key definitions or they will be lost!&lt;br /&gt;&lt;br /&gt;One thing to watch out for when parsing the SQL statements is that column and table names have to be converted to UTF-8. The conversion depends on the charset of the text which in turn depends on the current charset of the database connection. Table names have to be further converted into file names which use a special encoding schema to avoid non-US ASCII characters. All this requires calling certain character conversion routines in MySQL. &lt;br /&gt;&lt;br /&gt;The other major problem that needed to be solve involved the MySQL &lt;i&gt;st_table&lt;/i&gt; structure. This structure contains all the information about a table, including: column definitions, data types, character sets and index descriptions. This is actually the data from the &lt;tt&gt;.frm&lt;/tt&gt; file of the table. Since the engine has access to this structure when a table is opened by MySQL, there is normally no need for the engine to store this information itself.&lt;br /&gt;&lt;br /&gt;However, foreign keys force the engine to access tables that are not necessarily open by MySQL. For example if MySQL does an &lt;tt&gt;INSERT&lt;/tt&gt; on table &lt;tt&gt;t2&lt;/tt&gt; (see definition above), then MySQL will open &lt;tt&gt;t2&lt;/tt&gt; before it performs the operation. But the engine is required by the foreign key definition to check column &lt;tt&gt;id&lt;/tt&gt; on table &lt;tt&gt;t1&lt;/tt&gt;. This table may not be open by MySQL (depending on the table cache). And without the &lt;i&gt;st_table&lt;/i&gt; structure accessing the table is not possible, unless the engine stores all the information itself.&lt;br /&gt;&lt;br /&gt;It took a little while to figure out, but my solution was to open the MySQL table myself. This means that PBXT calls routines in MySQL that load the information from the &lt;tt&gt;.frm&lt;/tt&gt; file as needed.&lt;br /&gt;&lt;br /&gt;Of course the engine will have a bit of a problem if the definition of any of the functions change. Since the engine is linked dynamically to MySQL this could occur without notice. So I think there is a general need to make these routines part of an official engine callback API.&lt;br /&gt;&lt;br /&gt;Next on my list is &lt;tt&gt;CHECK&lt;/tt&gt; and &lt;tt&gt;REPAIR&lt;/tt&gt; table but before I get on to that, I will be on holiday in South Africa until the 12th of January! :)&lt;br /&gt;&lt;br /&gt;If you would like to test PBXT foreign keys, checkout the trunk of the subversion tree directly as follows: &lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$ svn co https://pbxt.svn.sourceforge.net/svnroot/pbxt/trunk/pbxt pbxt&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Then, assuming you have your MySQL tree in the directory &lt;tt&gt;/home/build/mysql-5.1.12&lt;/tt&gt; you can build PBXT as follows:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$ cd pbxt&lt;br /&gt;$ ./configure --with-mysql=/home/build/mysql-5.1.12 --libdir=/home/build/mysql-5.1.12/mysql-test/lib/mysql&lt;br /&gt;$ make install&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;This will install the PBXT plug-in (&lt;tt&gt;libpbxt.so&lt;/tt&gt;) in the directory required by &lt;tt&gt;mysql-test-run&lt;/tt&gt;. If you built MySQL as a debug version then remember to include &lt;tt&gt;--with-debug=full&lt;/tt&gt; when configuring PBXT.&lt;br /&gt;&lt;br /&gt;Instructions about how to test PBXT with &lt;tt&gt;mysql-test-run&lt;/tt&gt; are given in the README file in the &lt;tt&gt;mysql-test-update&lt;/tt&gt; directory. I have modified the InnoDB test scripts that test foreign keys to work with PBXT.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-116610949618581862?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/116610949618581862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=116610949618581862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116610949618581862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116610949618581862'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/12/implementation-of-foreign-keys-for.html' title='Implementation of Foreign Keys for the PBXT storage engine'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-116464397669838595</id><published>2006-11-28T11:12:00.000+01:00</published><updated>2006-11-30T16:54:04.156+01:00</updated><title type='text'>PBXT: Experience with testing Storage Engines</title><content type='html'>Many users may be unaware of the fact that there is a great tool for automatically testing MySQL called &lt;i&gt;mysql-test-run&lt;/i&gt;. The most recent version of this program is written in perl and resides in the &lt;tt&gt;mysql-test&lt;/tt&gt; directory of the MySQL source code tree.&lt;br /&gt;&lt;br /&gt;Tests are written as scripts (&lt;tt&gt;.test&lt;/tt&gt; files) which contains SQL statements and a number of meta-commands. Each &lt;tt&gt;.test&lt;/tt&gt; file has a corresponding &lt;tt&gt;.result&lt;/tt&gt; file which is used to verify the test output. A text-based "diff" is used to confirm that the output generated by the test is identical to the expected result.&lt;br /&gt;&lt;br /&gt;To run a test mysql-test-run automatically sets up a clean environment and starts the MySQL server. It then executes the test scripts specified (by default all tests are executed) and verifies the output. &lt;br /&gt;&lt;br /&gt;Most of the tests shipped with MySQL are intended to run with the MyISAM storage engine. There are also tests specifically created for other MySQL engines like NDB and InnoDB.&lt;br /&gt;&lt;br /&gt;But what about testing 3rd party engines like PBXT? Firstly, its easy enough to start the test, just execute the following: &lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$ ./mysql-test-run --mysqld=--default-storage-engine=pbxt&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;This tells mysql-test-run to start mysqld with the option that sets PBXT to the default engine. So all CREATE TABLE statements that do not explicitly specify an engine now use PBXT. After this the real work starts:&lt;br /&gt;&lt;br /&gt;There are over 630 tests in MySQL 5.1.12 and currently PBXT requires 223 individual changes to the test scripts for them to run. Of the 630 test results, 187 need to be changed. This is a lot of work given that verifying a difference is not a bug can be quite time consuming.&lt;br /&gt;&lt;br /&gt;Meanwhile many differences are trivial, so ideally they would not appear at all. Lets have a look at some of the most common test differences:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SHOW CREATE TABLE:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The &lt;tt&gt;SHOW CREATE TABLE&lt;/tt&gt; statement output depends on the default engine. So &lt;tt&gt;CREATE TABLE (...) ENGINE=MyISAM&lt;/tt&gt; must be changed to &lt;tt&gt;CREATE TABLE (...) ENGINE=PBXT&lt;/tt&gt; in over 360 instances.&lt;br /&gt;&lt;br /&gt;The correct way to solve this problem would be to use the mysql-test-run command &lt;tt&gt;--replace-regex&lt;/tt&gt; to transform the output to something like &lt;tt&gt;ENGINE=?&lt;/tt&gt;. But, of course, this change would need to be checked into the MySQL source code tree to be of long term help.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MERGE, FULLTEXT or GEOMETRY:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;All these features are only supported by MyISAM tables. When using these features the test should explicitly specify &lt;tt&gt;ENGINE=MyISAM&lt;/tt&gt;. An even better solution would be if MySQL could automatically pick an engine that supported the features used in the &lt;tt&gt;CREATE TABLE&lt;/tt&gt;. In this case the default engine will take preference.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ENGINE=InnoDB:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In order to use the InnoDB tests to test some other transactional engine, all the &lt;tt&gt;CREATE TABLE (...) ENGINE=InnoDB&lt;/tt&gt; statements must be changed. Ideally MySQL would support syntax of the form: &lt;tt&gt;ENGINE=TRANSACTIONAL&lt;/tt&gt;, which would automatically pick a transactional engine from those available. If the default engine is transactional then that would obviously be used.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ORDER BY Required:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;By far the biggest problem when testing PBXT is that the "natural" SELECT order often differs from that of MyISAM. This means that a SELECT without an ORDER BY returns the correct rows, but in a different order to MyISAM. This is due to the way PBXT manages free space.&lt;br /&gt;&lt;br /&gt;Making this problem even worse is the fact that the order can differ from one run to the next because PBXT manages the free space asynchronously. The only thing that helps is to add an ORDER BY clause to the SELECT, but I am wondering if the problem cannot be solved in general by mysql-test-run. For example this could be done by a more intelligent diff function. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;EXPLAIN Differences:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Each engine has its own way of calculating the heuristics used by the optimizer. This causes many differences in the result files due to slightly different EXPLAIN output. On the other hand there is a need to verify that queries are being optimized correctly. I'm clueless on this one at the moment, so suggestions are welcome.&lt;br /&gt;&lt;br /&gt;I think other engine developers will agree, its a major task so any help in testing will be greatly appreciated!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-116464397669838595?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/116464397669838595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=116464397669838595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116464397669838595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116464397669838595'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/11/pbxt-experience-with-testing-storage.html' title='PBXT: Experience with testing Storage Engines'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-116280450614269889</id><published>2006-11-06T11:53:00.000+01:00</published><updated>2006-11-25T01:20:46.906+01:00</updated><title type='text'>The PBXT pluggable storage engine and the MySQL 5.1.12 Beta release</title><content type='html'>OK, it took a while, but it has been worth the wait. At last I can now guarantee that when you download the PBXT source code, it will compile! But seriously, with the released of MySQL 5.1.12 Beta we now have an excellent platform for testing the pluggable storage engine API.&lt;br /&gt;&lt;br /&gt;These are interesting times because we are seeing the future of storage engines in MySQL. The PBXT 0.9.73 release demonstrates the ease with which externally built storage engines can be combined with MySQL in the future. And, as I have mentioned before, PrimeBase XT is the first engine to take full advantage of this new feature in MySQL.&lt;br /&gt;&lt;br /&gt;And while I am singing my praises let me remind you of 2 other reasons why you should try out PBXT: the engine achieves high concurrency using a pure MVCC implementation (MVCC stands for multi-generational concurrency control, if you want to know why, ask Jim! ;) and great performance with a &lt;i&gt;write-once&lt;/i&gt; update strategy.&lt;br /&gt;&lt;br /&gt;Download and further details can be found at &lt;a href="http://www.primebase.com/xt"&gt;http://www.primebase.com/xt&lt;/a&gt; as usual. The PBXT project is now hosted by SourceForge.net so for SVN access, bug reports and tracking, please go to: &lt;a href="http://sourceforge.net/projects/pbxt"&gt;http://sourceforge.net/projects/pbxt&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To help you get started I have included &lt;b&gt;6 steps&lt;/b&gt; to build and test PBXT with MySQL 5.1.12 below. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Building and testing PBXT for MySQL 5.1.12&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This description assumes the following:&lt;ul&gt;&lt;li&gt;The user's name is &lt;i&gt;myname&lt;/i&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The home directory of &lt;i&gt;myname&lt;/i&gt; is: &lt;tt&gt;/home/myname&lt;/tt&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i&gt;myname&lt;/i&gt; is using a working directory called: &lt;tt&gt;/home/myname/mysql-dev&lt;/tt&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;b&gt;1.&lt;/b&gt; Download the &lt;a href="http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.12-beta.tar.gz/from/pick"&gt;MySQL 5.1.12 source code&lt;/a&gt; tree, and unpack it in the &lt;tt&gt;/home/myname/mysql-dev&lt;/tt&gt; directory.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Build MySQL as follows:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$ cd /home/myname/mysql-dev/mysql-5.1.12-beta&lt;br /&gt;$ ./configure --prefix=/home/myname/mysql-dev/test --with-debug=full --with-mysqld-user=myname --with-extra-charsets=complex --with-plugins=max-no-ndb --with-embedded-server --enable-thread-safe-client --with-big-tables&lt;br /&gt;$ make&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; Download the source code of &lt;a href="http://www.primebase.com/xt"&gt;PBXT 0.9.73 (or later)&lt;/a&gt;, and unpack it in the &lt;tt&gt;/home/myname/mysql-dev directory&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; Build and install PBXT as follows:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$ cd /home/myname/mysql-dev/pbxt-0.9.73-beta&lt;br /&gt;$ ./configure --with-mysql=/home/myname/mysql-dev/mysql-5.1.12-beta  --libdir=/home/myname/mysql-dev/mysql-5.1.12-beta/mysql-test/lib/mysql --with-debug=full&lt;br /&gt;$ make install&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&lt;/b&gt; Install the PBXT version of the &lt;tt&gt;mysql-test-run&lt;/tt&gt; scripts:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$ cd mysql-test-update&lt;br /&gt;$ ./update_mysql_test.sh /home/myname/mysql-dev/mysql-5.1.12-beta&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6.&lt;/b&gt; Run the MySQL test scripts:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$ cd /home/myname/mysql-dev/mysql-5.1.12-beta/mysql-test&lt;br /&gt;$ ./mysql-test-run --mysqld=--default-storage-engine=pbxt --force&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTES:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Almost all the tests should run through without error (I am still working on 2 or 3 tests that fail).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Step &lt;b&gt;4&lt;/b&gt; installs the PBXT shared library, &lt;tt&gt;libpbxt.so&lt;/tt&gt;, in the &lt;tt&gt;mysql-test/lib/mysql&lt;/tt&gt; directory where it is required by &lt;tt&gt;mysqld&lt;/tt&gt;, which it is started by &lt;tt&gt;mysql-test-run&lt;/tt&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Step &lt;b&gt;5&lt;/b&gt; modifies the file &lt;tt&gt;mysql-test/lib/init_db.sql&lt;/tt&gt;, adding the statement: &lt;tt&gt;INSERT INTO plugin VALUES ('pbxt', 'libpbxt.so');&lt;/tt&gt;, which will cause &lt;tt&gt;mysqld&lt;/tt&gt; to load the plug-in when started.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Both MYSQL and PBXT must be compiled with the same value for the &lt;tt&gt;--with-debug&lt;/tt&gt; switch (&lt;tt&gt;on/off/full&lt;/tt&gt;). If not, the plug-in will not load.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;Normally you would install a plug-in using the command: &lt;tt&gt;INSTALL PLUGIN pbxt SONAME 'libpbxt.so';&lt;/tt&gt;. However, unless you add this statement to every test script, this will not work when using &lt;tt&gt;mysql-test-run&lt;/tt&gt; because the server environment is re-installed every time &lt;tt&gt;mysql-test-run&lt;/tt&gt; starts.&lt;br /&gt;&lt;br /&gt;By the way, the new perl based &lt;tt&gt;mysql-test-run&lt;/tt&gt; is much faster on startup than the old UNIX shell based program. Makes testing much more fun ... thanks MySQL :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-116280450614269889?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/116280450614269889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=116280450614269889' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116280450614269889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116280450614269889'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/11/pbxt-pluggable-storage-engine-and.html' title='The PBXT pluggable storage engine and the MySQL 5.1.12 Beta release'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-116177747454082406</id><published>2006-10-25T13:44:00.000+02:00</published><updated>2006-10-25T14:19:58.143+02:00</updated><title type='text'>PBXT now hosted by SourceForge.net!</title><content type='html'>I would have liked to have done this on &lt;a href="http://forge.mysql.com/"&gt;MySQLForge&lt;/a&gt; but, as you know, this is not yet possible. However, if MySQL were to provide even part of their, obviously, excellent development management system for external projects I would be one of the first on board.&lt;br /&gt;&lt;br /&gt;In the meantime, PrimeBase XT source code and development will be managed on SourceForge.net: &lt;a href="http://sourceforge.net/projects/pbxt"&gt;http://sourceforge.net/projects/pbxt&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For new projects it really makes sense to use Subversion instead of CVS, so to get the latest version of the source code you enter the following:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;svn checkout https://svn.sourceforge.net/svnroot/pbxt/trunk/pbxt pbxt&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;If you are a Mac OS X user, or your UNIX distribution does not include the Subversion client, you can download it from &lt;a href="http://subversion.tigris.org/project_packages.html"&gt;Tigris.org&lt;/a&gt;. I recommend Mac OS X users install the version from a &lt;tt&gt;.dmg&lt;/tt&gt; since the Fink  version is not yet available in binary form (with SSL support).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;[ By the way, this may be of interest to developers using Mac OS X: the only way I have managed to compile the latest MySQL 5.1 sources is by using &lt;a href="http://fink.sourceforge.net/"&gt;Fink&lt;/a&gt; to download and install the latest versions of automake, autoconf, make, bison and libtool! ]&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Following the Subversion convention, the current Beta release is available as a snapshot in the 'tags' directory:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://svn.sourceforge.net/svnroot/pbxt/tags/pbxt-0.9.72-beta"&gt;https://svn.sourceforge.net/svnroot/pbxt/tags/pbxt-0.9.72-beta&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And, of course, bug reporting and tracking will also be handled by SF.net, so from now on please report all bugs at &lt;a href="http://sourceforge.net/tracker/?func=add&amp;group_id=180250&amp;atid=892419"&gt;Projects » PrimeBase XT » Tracker » Bugs&lt;/a&gt;, and feature requests at &lt;a href="http://sourceforge.net/tracker/?func=add&amp;group_id=180250&amp;atid=892422"&gt;Projects  » PrimeBase XT » Tracker » Feature Requests&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-116177747454082406?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/116177747454082406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=116177747454082406' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116177747454082406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116177747454082406'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/10/pbxt-now-hosted-by-sourceforgenet.html' title='PBXT now hosted by SourceForge.net!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-116168734739599533</id><published>2006-10-24T12:38:00.000+02:00</published><updated>2006-10-24T13:29:55.033+02:00</updated><title type='text'>PBXT mentioned on SlashDot by CEO Mårten Mickos</title><content type='html'>Following up on what &lt;a href="http://www.flamingspork.com/blog/2006/10/21/slashdot-mysql-ceo-marten-mickos-answers-your-questions/"&gt;Stewart&lt;/a&gt; and &lt;a href="http://www.bytebot.net/blog/archives/2006/10/21/slashdot-mysql-ceo-mrten-mickos-answers-your-questions"&gt;Colin&lt;/a&gt; reported: this definitely is the first time PBXT has been mentioned on SlashDot: &lt;a href="http://interviews.slashdot.org/article.pl?sid=06/10/20/1325244"&gt;MySQL CEO Mårten Mickos Answers Your Questions&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mårten, speaking of the the innovative power of MySQL AB, says: "But more massive is the innovation that happens in the MySQL ecosystem", and lists PBXT amongst a lot of other great work.&lt;br /&gt;&lt;br /&gt;So I am very proud that PBXT was mentioned in this context!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-116168734739599533?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/116168734739599533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=116168734739599533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116168734739599533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/116168734739599533'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/10/pbxt-mentioned-on-slashdot-by-ceo.html' title='PBXT mentioned on SlashDot by CEO Mårten Mickos'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-115954084317625097</id><published>2006-09-29T16:31:00.000+02:00</published><updated>2006-10-17T22:44:13.263+02:00</updated><title type='text'>New PBXT Beta release includes a pluggable storage engine for MySQL 5.1</title><content type='html'>I have just released the first Beta version of PrimeBase XT. Besides MySQL 4.1.21 support it is also available as a pluggable storage engine for MySQL 5.1. As far as I know, PBXT is the first full featured engine to be released in this form.&lt;br /&gt;&lt;br /&gt;The engine can be downloaded (at &lt;a href="http://www.primebase.com/xt"&gt;http://www.primebase.com/xt&lt;/a&gt;) and built separately from MySQL. Currently, a reference to a MySQL 5.1 source tree is required to build the plug-in. However, in the future things will be even easier. Lenz Grimmer has told me that the plan is to include the required headers in the mysql-devel package. Then it will only be necessary to install the mysql-devel package in order to build the engine.&lt;br /&gt;&lt;br /&gt;Still further in the future, once 5.1 is released, I will be able to make the PBXT engine available as a binary download for a number of platforms.&lt;br /&gt;&lt;br /&gt;Once you have built the PBXT engine, you can install it by copying the binary, &lt;tt&gt;libpbxt.so&lt;/tt&gt;, to the MySQL plug-in directory. Then enter the following command:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;mysql&gt; INSTALL PLUGIN pbxt SONAME 'libpbxt.so';&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;After this, you can create tables that use the PBXT engine by setting ENGINE=PBXT in the table declaration as usual. It's that easy!&lt;br /&gt;&lt;br /&gt;I think this makes PrimeBase XT a great demo of the ease and power of the new pluggable storage engine API for MySQL 5.1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-115954084317625097?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/115954084317625097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=115954084317625097' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/115954084317625097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/115954084317625097'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/09/new-pbxt-beta-release-includes.html' title='New PBXT Beta release includes a pluggable storage engine for MySQL 5.1'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-115744627368467759</id><published>2006-09-06T10:44:00.000+02:00</published><updated>2006-09-06T13:54:26.096+02:00</updated><title type='text'>PBXT Presentation at the Hamburg MySQL September Meetup</title><content type='html'>My thanks to &lt;a href="http://lenz.homelinux.org/about.html"&gt;Lenz Grimmer&lt;/a&gt; for the opportunity to present PrimeBase XT at the Hamburg MySQL September Meetup last Monday night. The meeting took place in a well equipped conference room belonging to the Chinese restaurant "Ni Hao" in Wandsbek. With over 20 attendees the venue was filled to capacity.&lt;br /&gt;&lt;br /&gt;I must admit, I was a bit surprised (although I probably should not have been) by the highly technical nature of the questions and comments during the presentation and afterwards. As a result we had great time and spent quite a while discussing the various algorithms and implementation strategies used by XT.&lt;br /&gt;&lt;br /&gt;I have posted the &lt;a href="http://www.primebase.com/xt/download/pbxt_ug_sept_2006.pdf"&gt;presentation&lt;/a&gt; as PDF on the PrimeBase XT home page. Among the topics of the presentation were: our motivation, a brief history of XT, future plans, design aspects and the results of some preliminary performance testing.&lt;br /&gt;&lt;br /&gt;Of particular interest to many was the garbage collection mechanism. There was some concern as to just how much load the garbage collector would place on the server. When I presented a graphic showing the data throughput rate vs the record size written, someone asked why there was no dropoff in the performance when the garbage collector kicks in.&lt;br /&gt;&lt;br /&gt;Indeed, performance is not affected adversely by the garbage collector. This is mainly due to the fact that the garbage collector is a low-priority thread, so it is immediately descheduled when it would affect foreground activity. This is not a problem as long as the system has enough disk space to be able to delay garbage collection until the peak access times are over. This can be contrasted with a conventional RAM garbage collector which is forced to run due to the fact that it manages a relatively scarce resource.&lt;br /&gt; &lt;br /&gt;But besides this, the XT garbage collector generally does not require much CPU time. For example, it does not need to search for garbage, this is marked as such by the "sweeper" thread (see my &lt;a href="http://www.primebase.com/xt/download/pbxt_white_paper.pdf"&gt;white paper&lt;/a&gt;). I plan to discuss this topic in more details in a future blog, so stay tuned...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-115744627368467759?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/115744627368467759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=115744627368467759' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/115744627368467759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/115744627368467759'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/09/pbxt-presentation-at-hamburg-mysql.html' title='PBXT Presentation at the Hamburg MySQL September Meetup'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-115495753979115743</id><published>2006-08-07T15:24:00.000+02:00</published><updated>2006-08-08T15:12:08.753+02:00</updated><title type='text'>PBXT on schedule for Beta in September</title><content type='html'>Its a dirty job, but somebody's got to do it! I am talking about testing and debugging, of course, which is what I have been doing for the last month. But at least I have the satisfaction of knowing that XT is a &lt;b&gt;lot&lt;/b&gt; more stable.&lt;br /&gt;&lt;br /&gt;Over 95% of the "mysql-test-run" scripts now run through correctly with PBXT as the default engine. I have documented the changes made to the test scripts here: &lt;a href="http://www.primebase.com/xt/download/pbxt-test-run-changes.txt"&gt;pbxt-test-run-changes.txt&lt;/a&gt;. This file also explains the major differences between MyISAM and PBXT, and lists all features are not yet implemented.&lt;br /&gt;&lt;br /&gt;If you have compiled XT and would like to run the tests, then enter the following commands:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;cd mysql-test&lt;br /&gt;./mysql-test-run --force --mysqld=--default-storage-engine=pbxt&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;I have also compiled and tested XT on a multi-processor, 64-bit machine. I used &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=102348"&gt;sysbench 0.4.7&lt;/a&gt; for multi-threaded, stability and performance testing. If you have downloaded and build sysbench, then you can measure the speed of XT using the following commands:&lt;br /&gt;&lt;br /&gt;To create a test table containing 1000000 rows:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;sysbench --test=oltp --oltp-table-size=1000000 --mysql-table-engine=pbxt --mysql-engine-trx=yes --mysql-user=root --mysql-socket=/tmp/mysql.sock prepare&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Then, to perform a test with READ-ONLY queries:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;sysbench --test=oltp --oltp-table-size=1000000 --init-rng=on --mysql-engine-trx=yes --oltp-table-name=sbtest --oltp-test-mode=complex --oltp-point-selects=1 --oltp-simple-ranges=0 --oltp-sum-ranges=0 --oltp-order-ranges=0 --oltp-distinct-ranges=0 --oltp-skip-trx=on --oltp-read-only=on --max-requests=0 --num-threads=4 --oltp-dist-type=special --init-rng=on --mysql-db=sbtest --max-time=60 --mysql-user=root --mysql-socket=/tmp/mysql.sock run&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;But more interesting is a test with update transactions, as follows:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;sysbench --test=oltp --oltp-table-size=1000000 --oltp-read-only=off --oltp-test-mode=complex --num-threads=2 --mysql-engine-trx=yes --init-rng=on --oltp-point-selects=0 --oltp-simple-ranges=0 --oltp-sum-ranges=0 --oltp-order-ranges=0 --oltp-distinct-ranges=0 --mysql-user=root --mysql-socket=/tmp/mysql.sock --oltp-table-name=sbtest --oltp-dist-type=special --max-requests=50000 run&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;In this test, each transaction performs 3 UPDATEs, a DELETE and an INSERT. According to my tests, SELECT speed is similar to InnoDB, but the update queries are significantly faster. It would be great if someone could confirm these results. &lt;br /&gt;&lt;br /&gt;Judging by the stability of the &lt;a href="http://www.primebase.com/xt"&gt;current version&lt;/a&gt;, it looks like I will be able to achieve my goal of a Beta release next month. As I mentioned before, the only feature still to be completed for the Beta version is a pluggable storage engine for MySQL 5.1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-115495753979115743?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/115495753979115743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=115495753979115743' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/115495753979115743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/115495753979115743'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/08/pbxt-on-schedule-for-beta-in-september.html' title='PBXT on schedule for Beta in September'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-115201983425812058</id><published>2006-07-04T15:26:00.000+02:00</published><updated>2006-07-07T21:02:03.493+02:00</updated><title type='text'>New PBXT Release 0.9.5: Smaller, Faster, Better...</title><content type='html'>The new release of &lt;a href="http://www.primebase.com/xt"&gt;PBXT&lt;/a&gt; is, in fact, smaller than the previous version. This is due to a major re-structuring of the code. The result is a more compact and direct implementation. With less code to execute and some major changes this version is also a lot faster.&lt;br /&gt;&lt;br /&gt;The most significant change is that all files (except the transaction logs) are now associated with a particular table. All table related files begin with the name of the table, and can be easily identified. If a database is not being accessed you can copy a table by copying the associated files, or drop a table by deleting the files. However, the main reason for this change was to improve the speed of sequentially reading and writing.&lt;br /&gt;&lt;br /&gt;Records are now divided into a fixed and a variable length component. The fixed length component is stored together with the handle in the record data file. The variable component is referenced by the handle and is stored in one of a number of data log files associated with the table.&lt;br /&gt;&lt;br /&gt;This new format reduces the number of disk accesses needed to read, create and update a row significantly. Furthers details of changes in this version can be found in the &lt;a href="http://www.primebase.com/xt/download/pbxt-release.txt"&gt;release notes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In this release I have also resolved almost all of the issues on my &lt;a href="http://www.primebase.com/xt/download/pbxt-to-do.txt"&gt;to-do list&lt;/a&gt;. This includes the items regarding auto-increment, caching, unique key checking and all the bugs reported so far.&lt;br /&gt;&lt;br /&gt;The only feature still due for the Beta release in September is the 5.1 implementation which I will be working on next.&lt;br /&gt;&lt;br /&gt;I would much appreciate any feedback, bug reports and performance test results!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-115201983425812058?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/115201983425812058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=115201983425812058' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/115201983425812058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/115201983425812058'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/07/new-pbxt-release-095-smaller-faster.html' title='New PBXT Release 0.9.5: Smaller, Faster, Better...'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-114980126360590989</id><published>2006-06-08T22:22:00.000+02:00</published><updated>2006-06-09T10:48:10.186+02:00</updated><title type='text'>PBXT featured on the MySQL home page</title><content type='html'>Last week I spoke to Lenz Grimmer, MySQL Community Relations Manager for Europe, ME and Africa, about the Users Conference, PBXT and the Community.&lt;br /&gt;&lt;br /&gt;The interview has been featured under Articles on the &lt;a href="http://www.mysql.com"&gt;MySQL home page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For those of you that missed it, here is the link to the interview again:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/tech-resources/interviews/paul-mccullagh-pbxt.html"&gt;Interview with Paul McCullagh, developer of the PrimeBase XT Storage Engine&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-114980126360590989?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/114980126360590989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=114980126360590989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/114980126360590989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/114980126360590989'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/06/pbxt-featured-on-mysql-home-page.html' title='PBXT featured on the MySQL home page'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-114609200071543547</id><published>2006-04-27T00:51:00.000+02:00</published><updated>2006-06-28T19:59:10.020+02:00</updated><title type='text'>PBXT mentioned by CEO Mårten Mickos at the MySQL Users Conference Keynote</title><content type='html'>Ok, so here is a story:&lt;br /&gt;&lt;br /&gt;I was standing with Giuseppe Maxia waiting to go into this mornings keynote when a smartly dressed man approached Giuseppe to congratulate him. The reason was that Giuseppe had won an award the day before for service to the MySQL community. So Giuseppe introduced the guy as Marten (the rest of the name I don't get, and he was not wearing a name tag). &lt;br /&gt;&lt;br /&gt;Marten seemed to recognize my name and asked if I was a frequent visitor to the conferences. I said, "no, I am the PBXT guy". Thats when he realized why he had heard my name.&lt;br /&gt;&lt;br /&gt;So then we chatted a bit, and he asked me how difficult it had been to write the engine, how long it had taken me and what my engine can do well. I said I was more concerned about what it could not do so well then what it could do well, but then I told him what was good in my performance tests, etc.&lt;br /&gt;&lt;br /&gt;A little later Giuseppe and I moved into the hall for the keynote. The CEO was introduced and I started thinking, hey, isn't this the guy I just spoke to.&lt;br /&gt;&lt;br /&gt;Well, I soon realized it was Mårten Mickos the CEO of MySQL whom I had just spoken to because he included a few details of our conversation in his keynote!&lt;br /&gt;&lt;br /&gt;When discussing innovation in the MySQL community, this is what he said (at the risk of being immodest):&lt;br /&gt;&lt;br /&gt;"I just spoke to the guy that programmed the PBXT engine: He developed the engine in the 6 months. I thought we had hired all the best database guys. Well there are still a lot of very clever people out there in the community."&lt;br /&gt;&lt;br /&gt;(The last sentence is very true, of course).&lt;br /&gt;&lt;br /&gt;And later he mentioned that PBXT is particularly good at handling variable length records.&lt;br /&gt;&lt;br /&gt;Then on the slide which listed the storage engines: Falcon (by MySQL themselves), Solid (new partner) and InnoDB (new partner Oracle), he mentioned PBXT again, even though it was not on the slide.&lt;br /&gt;&lt;br /&gt;So this is very encouraging because, with Falcon, Solid and InnoDB around, in any other conventional company PBXT would be sidelined. I know this from experience. This is because Falcon, Solid and InnoDB are built on existing code developed by well established companies.&lt;br /&gt;&lt;br /&gt;So why are things different with MySQL. Because &lt;b&gt;the community is extremely important to MySQL&lt;/b&gt;! I mean, just think about it: MySQL was build by the community!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-114609200071543547?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/114609200071543547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=114609200071543547' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/114609200071543547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/114609200071543547'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/04/pbxt-mentioned-by-ceo-mrten-mickos-at.html' title='PBXT mentioned by CEO Mårten Mickos at the MySQL Users Conference Keynote'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-114415406575082914</id><published>2006-04-04T14:31:00.000+02:00</published><updated>2006-04-04T14:34:25.763+02:00</updated><title type='text'>PBXT and the Community</title><content type='html'>I would just like to thank all those who have downloaded and tested PBXT for their help and suggestions. I have updated my to-do list to include all the issues raised so far.&lt;br /&gt;&lt;br /&gt;Although my own performance tests indicate that PBXT has great potential, the more general MySQL performance tests show that the implementation is still in its early days.&lt;br /&gt;&lt;br /&gt;Of course, there is still a lot to be done. Everybody knows there is a big difference between a running program and a production system. It is the most challenging part of writing a program. But also the most rewarding because it will eventually see the program being put to useful work.&lt;br /&gt;&lt;br /&gt;Some people at MySQL have expressed surprise that an effort to develop a new engine has come out of the community. Personally I think I was more surprised that I am already part of the community!&lt;br /&gt;&lt;br /&gt;I guess I am used to the turf wars that pervade most other large companies, so I really was not expecting the warm welcome I have received from &lt;i&gt;everybody&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;Thanks for making PBXT part of the community!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-114415406575082914?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/114415406575082914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=114415406575082914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/114415406575082914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/114415406575082914'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/04/pbxt-and-community.html' title='PBXT and the Community'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-114332764926774143</id><published>2006-03-29T09:55:00.000+02:00</published><updated>2006-04-28T01:51:09.990+02:00</updated><title type='text'>PBXT: May the source be with you!</title><content type='html'>Now that I have PBXT running under both Mac OS X (Power PC) and Linux, I have posted the source code. Here is the download URL:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.primebase.com/xt/download/mysql-4.1.16-pbxt-0.9.1.tar.gz"&gt;http://www.primebase.com/xt/download/mysql-4.1.16-pbxt-0.9.1.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As the name suggests, the engine has been integrated into MySQL 4.1.16 (the nightly build of November 4, 2005). I have labeled this version Alpha since it is almost feature complete, but please check my to-do list before you build and run it:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.primebase.com/xt/download/pbxt-to-do.txt"&gt;http://www.primebase.com/xt/download/pbxt-to-do.txt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are some brief instructions for building MySQL with PBXT:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.primebase.com/xt/download/how-to-build.txt"&gt;http://www.primebase.com/xt/download/how-to-build.txt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can send any questions, suggestions or bug reports to me directly: paul.mccullagh(a)primebase.com.&lt;br /&gt;&lt;br /&gt;My initial tests show that the performance of PBXT under Linux/Intel is very promising, to put it modestly. More about this later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-114332764926774143?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/114332764926774143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=114332764926774143' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/114332764926774143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/114332764926774143'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/03/pbxt-may-source-be-with-you.html' title='PBXT: May the source be with you!'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24359421.post-114280127040980147</id><published>2006-03-21T10:32:00.000+01:00</published><updated>2006-07-30T21:53:01.516+02:00</updated><title type='text'>Concerning: PBXT, MySQL and Mountains</title><content type='html'>Is PrimeBase XT (PBXT) just another transactional engine for MySQL? I think (hope) not! But, even if it was, it would still be justified considering the current lack of an independent (i.e. not owned by a monopolist) transactional engine. But I started developing PBXT at the beginning of last year for a much more basic reason, after all I had no idea what Oracle was about to do.&lt;br /&gt;&lt;br /&gt;I started programming PBXT simply &lt;i&gt;because it was there&lt;/i&gt;!&lt;br /&gt;&lt;br /&gt;But wait, you say, "we climb mountains &lt;i&gt;because they are there&lt;/i&gt;, we don't program software &lt;i&gt;because it is there&lt;/i&gt;", because it isn't (before we start). Well I think many programmers can relate to that statement anyway. Programming is much like climbing a mountain. You start out with great enthusiasm, wanting to do things better and quicker than before. But as you get higher, the air gets thinner. You struggle on and as you approach the top it gets tougher and tougher (we all know how long it takes to finish that last 10%)!&lt;br /&gt;&lt;br /&gt;But when you reach the peak, the summit, there is nothing like it! You have conquered the beast of chaos and doubt, the air is fresh and you can see for miles. Inspiring, isn't it? Well I think so.&lt;br /&gt;&lt;br /&gt;OK, so programming is like climbing a mountain, but how can you climb a mountain that isn't there? Well, it is there, actually, isn't it? &lt;i&gt;Right there, in your head&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;And so it was with PBXT. After quite a few years of programming databases I had some ideas (questions actually), for example: what would it be like if the database wrote only sequentially? Must a database always write twice? Can we eliminate read locks? Is it possible to commit or rollback without doing any work? Is it possible to startup without recovery?&lt;br /&gt;&lt;br /&gt;Using some known techniques and combining them with a few new ideas, I have found some answers to these questions. You can read about it in my White Paper at &lt;a href="http://www.primebase.com/xt"&gt;http://www.primebase.com/xt&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So have I reached the top? Of course not, nobody ever reaches the top! Seriously though, I have a few things on my to-do list, but mostly PBXT is untested. So I am thankful that testing is the first area in which I have been offered help (thanks Ronald) and also from MySQL themselves (thanks Brian). Any more help would be welcome and we'll turn this into an expedition.&lt;br /&gt;&lt;br /&gt;I plan to keep the address above posted with the latest information, versions, etc. and we'll just take it from there, one step at a time...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24359421-114280127040980147?l=pbxt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbxt.blogspot.com/feeds/114280127040980147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24359421&amp;postID=114280127040980147' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/114280127040980147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24359421/posts/default/114280127040980147'/><link rel='alternate' type='text/html' href='http://pbxt.blogspot.com/2006/03/concerning-pbxt-mysql-and-mountains.html' title='Concerning: PBXT, MySQL and Mountains'/><author><name>Paul McCullagh</name><uri>http://www.blogger.com/profile/10476275147692948727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_deH-jeyN6ns/Sehinfam0nI/AAAAAAAAAA4/7YrGb9ycFXw/s1600-R/pmc.jpg'/></author><thr:total>2</thr:total></entry></feed>
