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

<channel>
	<title>PlanetMysql.ru - информация о СУБД MySQL &#187; Новости</title>
	<atom:link href="http://planetmysql.ru/category/%d0%bd%d0%be%d0%b2%d0%be%d1%81%d1%82%d0%b8/feed/" rel="self" type="application/rss+xml" />
	<link>http://planetmysql.ru</link>
	<description>Блог о самой популярной СУБД MySQL</description>
	<lastBuildDate>Sat, 11 Feb 2012 12:38:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Shinguz&#8217;s Blog (en): MySQL logon and logoff trigger for auditing</title>
		<link>http://www.fromdual.com/mysql-logon-and-logoff-trigger-for-auditing?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=shinguzs-blog-en-mysql-logon-and-logoff-trigger-for-auditing</link>
		<comments>http://www.fromdual.com/mysql-logon-and-logoff-trigger-for-auditing#comments</comments>
		<pubDate>Fri, 10 Dec 2010 22:23:51 +0000</pubDate>
		<dc:creator>Planet MySQL</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://www.fromdual.com/mysql-logon-and-logoff-trigger-for-auditing</guid>
		<description><![CDATA[I while ago I did some research about MySQL audit functionality and logon a and logoff triggers. MySQL and MariaDB provide a logon trigger in the form of the init_connect variable but no logoff trigger where most of the work for auditing would be done. When we would have a logoff trigger we could track the login and possibility some activity of a user and implement auditing functionality.
Yesterday when I was looking into the code for an answer to the question of one of my customers this research came into my mind again. Today I was a bit more curious and I tried to find a way to patch the MySQL code to get a logoff trigger. Luckily I was successful right away and I created the exit_connect variable which acts as the logoff trigger.
The patches for the logoff trigger you can find here.
What you can do with these patches you will see in the following example. First we create an audit schema with an audit table:
CREATE SCHEMA audit;
USE audit;

-- thread_id is no good PK, because of restart!
CREATE TABLE audit_connect (
  id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
, thread_id       INT UNSIGNED NOT NULL DEFAULT 0
, user            VARCHAR(64) NOT NULL DEFAULT 'unknown'
, login_ts        TIMESTAMP NULL DEFAULT NULL
, logout_ts       TIMESTAMP NULL DEFAULT NULL
, com_select      INT UNSIGNED NOT NULL DEFAULT 0
, bytes_received  BIGINT UNSIGNED NOT NULL DEFAULT 0
, bytes_sent      BIGINT UNSIGNED NOT NULL DEFAULT 0
, KEY (thread_id)
);
Then we create a stored procedure:
DROP PROCEDURE IF EXISTS audit.login_trigger;
DROP PROCEDURE IF EXISTS audit.logoff_trigger;

DELIMITER //

CREATE PROCEDURE audit.login_trigger()
SQL SECURITY DEFINER
BEGIN
  INSERT INTO audit.audit_connect (thread_id, user, login_ts)
  VALUES (CONNECTION_ID(), USER(), NOW());
END;

CREATE PROCEDURE audit.logoff_trigger()
SQL SECURITY DEFINER
BEGIN

  DECLARE com_select INT DEFAULT 0;
  DECLARE bytes_received INT DEFAULT 0;
  DECLARE bytes_sent INT DEFAULT 0;

  SELECT variable_value
    INTO com_select
    FROM INFORMATION_SCHEMA.session_status
   WHERE variable_name = 'COM_SELECT';

  SELECT variable_value
    INTO bytes_received
    FROM INFORMATION_SCHEMA.session_status
   WHERE variable_name = 'BYTES_RECEIVED';

  SELECT variable_value
    INTO bytes_sent
    FROM INFORMATION_SCHEMA.session_status
   WHERE variable_name = 'BYTES_SENT';

  UPDATE audit.audit_connect
     SET logout_ts = NOW(), com_select = com_select
       , bytes_received = bytes_received, bytes_sent = bytes_sent
   WHERE thread_id = CONNECTION_ID();
END;

//
DELIMITER ;
Then we grant the EXECUTE privilege to ALL users which have to connect to this database:
GRANT EXECUTE ON PROCEDURE audit.login_trigger TO 'testuser'@'%';
GRANT EXECUTE ON PROCEDURE audit.logoff_trigger TO 'testuser'@'%';
And last we have to hook our login and logoff triggers into MySQL:
mysql&#62; SET GLOBAL init_connect="CALL audit.login_trigger()";
mysql&#62; SET GLOBAL exit_connect="CALL audit.logoff_trigger()";
This you should also make permanent in the the my.cnf.
Then you can start and connecting and running some statements against you database and some reports against you audit table:
Which user connected most
SELECT user, COUNT(user) AS count
  FROM audit_connect
 GROUP BY user
 ORDER BY count DESC;

+-----------+-------+
&#124; user      &#124; count &#124;
+-----------+-------+
&#124; u3@master &#124;   169 &#124;
&#124; u2@master &#124;     2 &#124;
&#124; u1@master &#124;     1 &#124;
+-----------+-------+Total, average, max and min connect time per user
SELECT user, MAX(logout_ts-login_ts) AS max, MIN(logout_ts-login_ts) AS min
     , AVG(ROUND(logout_ts-login_ts, 0)) AS avg, SUM(logout_ts-login_ts) AS total
  FROM audit_connect
 GROUP BY user;

+-----------+------+------+----------+-------+
&#124; user      &#124; max  &#124; min  &#124; avg      &#124; total &#124;
+-----------+------+------+----------+-------+
&#124; u1@master &#124;  220 &#124;  220 &#124; 220.0000 &#124;   220 &#124;
&#124; u2@master &#124;   17 &#124;    0 &#124;   8.5000 &#124;    17 &#124;
&#124; u3@master &#124;    2 &#124;    0 &#124;   0.0414 &#124;     7 &#124;
+-----------+------+------+----------+-------+Which user did the most SELECT queries
SELECT user, SUM(com_select) AS cnt
  FROM audit_connect
 GROUP BY user
 ORDER BY cnt DESC;

+-----------+------+
&#124; user      &#124; cnt  &#124;
+-----------+------+
&#124; u3@master &#124;  503 &#124;
&#124; u2@master &#124;   29 &#124;
&#124; u1@master &#124;    6 &#124;
+-----------+------+Which user sent the most traffic over the network
SELECT user, SUM(bytes_received) AS rcvd, SUM(bytes_sent) AS sent
  FROM audit_connect
 GROUP BY user;

+-----------+-------+-----------+
&#124; user      &#124; rcvd  &#124; sent      &#124;
+-----------+-------+-----------+
&#124; u1@master &#124;   242 &#124; 358488916 &#124;
&#124; u2@master &#124;  1046 &#124;     16753 &#124;
&#124; u3@master &#124; 23259 &#124;     70808 &#124;
+-----------+-------+-----------+Which user was doing what in a certain time range
SELECT user, COUNT(*) AS cnt, SUM(com_select) AS sel
     , SUM(bytes_received) AS rcvd, SUM(bytes_sent) AS sent
  FROM audit_connect
 WHERE login_ts &#60;= '2010-12-10 22:54:59' and logout_ts &#62;= '2010-12-10 22:54:00'
 GROUP BY user
;

+-----------+-----+------+------+-----------+
&#124; user      &#124; cnt &#124; sel  &#124; rcvd &#124; sent      &#124;
+-----------+-----+------+------+-----------+
&#124; u1@master &#124;   1 &#124;    6 &#124;  242 &#124; 358488916 &#124;
&#124; u3@master &#124;  13 &#124;   37 &#124; 1721 &#124;      5119 &#124;
+-----------+-----+------+------+-----------+]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fromdual.ch/aggregator/categories/mysql-logon-trigger">I while ago</a> I did some research about MySQL audit functionality and logon a and logoff triggers. MySQL and MariaDB provide a logon trigger in the form of the init_connect variable but no logoff trigger where most of the work for auditing would be done. When we would have a logoff trigger we could track the login and possibility some activity of a user and implement auditing functionality.</p>
<p>Yesterday when I was looking into the code for an answer to the question of one of my customers this research came into my mind again. Today I was a bit more curious and I tried to find a way to patch the MySQL code to get a logoff trigger. Luckily I was successful right away and I created the exit_connect variable which acts as the logoff trigger.</p>
<p>The patches for the logoff trigger you can find <a href="http://www.fromdual.ch/sites/default/files/mysql_logon_trigger_patch.tgz">here</a>.</p>
<p>What you can do with these patches you will see in the following example. First we create an audit schema with an audit table:</p>
<pre>CREATE SCHEMA audit;
USE audit;

-- thread_id is no good PK, because of restart!
CREATE TABLE audit_connect (
  id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
, thread_id       INT UNSIGNED NOT NULL DEFAULT 0
, user            VARCHAR(64) NOT NULL DEFAULT 'unknown'
, login_ts        TIMESTAMP NULL DEFAULT NULL
, logout_ts       TIMESTAMP NULL DEFAULT NULL
, com_select      INT UNSIGNED NOT NULL DEFAULT 0
, bytes_received  BIGINT UNSIGNED NOT NULL DEFAULT 0
, bytes_sent      BIGINT UNSIGNED NOT NULL DEFAULT 0
, KEY (thread_id)
);</pre><p>
Then we create a stored procedure:</p>
<pre>DROP PROCEDURE IF EXISTS audit.login_trigger;
DROP PROCEDURE IF EXISTS audit.logoff_trigger;

DELIMITER //

CREATE PROCEDURE audit.login_trigger()
SQL SECURITY DEFINER
BEGIN
  INSERT INTO audit.audit_connect (thread_id, user, login_ts)
  VALUES (CONNECTION_ID(), USER(), NOW());
END;

CREATE PROCEDURE audit.logoff_trigger()
SQL SECURITY DEFINER
BEGIN

  DECLARE com_select INT DEFAULT 0;
  DECLARE bytes_received INT DEFAULT 0;
  DECLARE bytes_sent INT DEFAULT 0;

  SELECT variable_value
    INTO com_select
    FROM INFORMATION_SCHEMA.session_status
   WHERE variable_name = 'COM_SELECT';

  SELECT variable_value
    INTO bytes_received
    FROM INFORMATION_SCHEMA.session_status
   WHERE variable_name = 'BYTES_RECEIVED';

  SELECT variable_value
    INTO bytes_sent
    FROM INFORMATION_SCHEMA.session_status
   WHERE variable_name = 'BYTES_SENT';

  UPDATE audit.audit_connect
     SET logout_ts = NOW(), com_select = com_select
       , bytes_received = bytes_received, bytes_sent = bytes_sent
   WHERE thread_id = CONNECTION_ID();
END;

//
DELIMITER ;</pre><p>
Then we grant the <span>EXECUTE</span> privilege to ALL users which have to connect to this database:</p>
<pre>GRANT EXECUTE ON PROCEDURE audit.login_trigger TO 'testuser'@'%';
GRANT EXECUTE ON PROCEDURE audit.logoff_trigger TO 'testuser'@'%';</pre><p>
And last we have to hook our login and logoff triggers into MySQL:</p>
<pre>mysql> SET GLOBAL init_connect="CALL audit.login_trigger()";
mysql> SET GLOBAL exit_connect="CALL audit.logoff_trigger()";</pre><p>
This you should also make permanent in the the <span>my.cnf</span>.</p>
<p>Then you can start and connecting and running some statements against you database and some reports against you audit table:</p>
<h3>Which user connected most</h3>
<pre>SELECT user, COUNT(user) AS count
  FROM audit_connect
 GROUP BY user
 ORDER BY count DESC;

+-----------+-------+
| user      | count |
+-----------+-------+
| u3@master |   169 |
| u2@master |     2 |
| u1@master |     1 |
+-----------+-------+</pre><h3>Total, average, max and min connect time per user</h3>
<pre>SELECT user, MAX(logout_ts-login_ts) AS max, MIN(logout_ts-login_ts) AS min
     , AVG(ROUND(logout_ts-login_ts, 0)) AS avg, SUM(logout_ts-login_ts) AS total
  FROM audit_connect
 GROUP BY user;

+-----------+------+------+----------+-------+
| user      | max  | min  | avg      | total |
+-----------+------+------+----------+-------+
| u1@master |  220 |  220 | 220.0000 |   220 |
| u2@master |   17 |    0 |   8.5000 |    17 |
| u3@master |    2 |    0 |   0.0414 |     7 |
+-----------+------+------+----------+-------+</pre><h3>Which user did the most <span>SELECT</span> queries</h3>
<pre>SELECT user, SUM(com_select) AS cnt
  FROM audit_connect
 GROUP BY user
 ORDER BY cnt DESC;

+-----------+------+
| user      | cnt  |
+-----------+------+
| u3@master |  503 |
| u2@master |   29 |
| u1@master |    6 |
+-----------+------+</pre><h3>Which user sent the most traffic over the network</h3>
<pre>SELECT user, SUM(bytes_received) AS rcvd, SUM(bytes_sent) AS sent
  FROM audit_connect
 GROUP BY user;

+-----------+-------+-----------+
| user      | rcvd  | sent      |
+-----------+-------+-----------+
| u1@master |   242 | 358488916 |
| u2@master |  1046 |     16753 |
| u3@master | 23259 |     70808 |
+-----------+-------+-----------+</pre><h3>Which user was doing what in a certain time range</h3>
<pre>SELECT user, COUNT(*) AS cnt, SUM(com_select) AS sel
     , SUM(bytes_received) AS rcvd, SUM(bytes_sent) AS sent
  FROM audit_connect
 WHERE login_ts &lt;= '2010-12-10 22:54:59' and logout_ts >= '2010-12-10 22:54:00'
 GROUP BY user
;

+-----------+-----+------+------+-----------+
| user      | cnt | sel  | rcvd | sent      |
+-----------+-----+------+------+-----------+
| u1@master |   1 |    6 |  242 | 358488916 |
| u3@master |  13 |   37 | 1721 |      5119 |
+-----------+-----+------+------+-----------+</pre><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26710&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26710&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/12/11/shinguzs-blog-en-mysql-logon-and-logoff-trigger-for-auditing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speaking at O&#8217;Reilly MySQL Conference!</title>
		<link>http://kostja-osipov.livejournal.com/31825.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=speaking-at-oreilly-mysql-conference</link>
		<comments>http://kostja-osipov.livejournal.com/31825.html#comments</comments>
		<pubDate>Thu, 09 Dec 2010 09:21:50 +0000</pubDate>
		<dc:creator>Konstantin Osipov</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://kostja-osipov.livejournal.com/31825.html</guid>
		<description><![CDATA[Yay! My talk on new metadata locking in 5.5 was accepted to the O'Reilly MySQL ConferenceI'm happy to be given a chance to come and visit this place again (7th time!), especially since I know that it reinvents itself every year. This year it's going to be different: as far as I can see, there is close to no participation in the conference on the Oracle side, and the content is being provided almost fully by the rest of the community. Nothing to worry about if one looks for best talks -- last year's most popular sessions were delivered by Percona and Monty Program speakers anyway -- but very likely this year's participation will be, as in good old days, fewer suites and more engineers.]]></description>
			<content:encoded><![CDATA[Yay! My talk on new metadata locking in 5.5 was accepted to the <br /><a href="http://en.oreilly.com/mysql2011">O'Reilly MySQL Conference</a><br /><br />I'm happy to be given a chance to come and visit this place again (7th time!), especially since I know that it reinvents itself every year. <br /><br />This year it's going to be different: as far as I can see, there is close to no participation in the conference on the Oracle side, and the content is being provided almost fully by the rest of the community. <br />Nothing to worry about if one looks for best talks -- last year's most popular sessions were delivered by Percona and Monty Program speakers anyway -- but very likely this year's participation will be, as in good old days, fewer suites and more engineers.<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26684&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26684&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/12/09/speaking-at-oreilly-mysql-conference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEO / SEM SWOT</title>
		<link>http://mysqldatabaseadministration.blogspot.com/2010/12/seo-sem-swot.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=seo-sem-swot</link>
		<comments>http://mysqldatabaseadministration.blogspot.com/2010/12/seo-sem-swot.html#comments</comments>
		<pubDate>Wed, 08 Dec 2010 11:04:00 +0000</pubDate>
		<dc:creator>Frank Mash</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Since most of my friends here have asked me questions on SEO. I thought i'd share this presentation that I posted on SlideShare. This was a pre-engagement presentation. It contains over a 100 slides and covers many dimensions of SEO. Enjoy!SEO / SEM SWOT Presentation View more presentations from frankmashraqi.]]></description>
			<content:encoded><![CDATA[Since most of my friends here have asked me questions on SEO. I thought i'd share this presentation that I posted on SlideShare. This was a pre-engagement presentation. It contains over a 100 slides and covers many dimensions of SEO. Enjoy!<div><strong><a href="http://www.slideshare.net/frankmashraqi/opportunities4fynanzv3" title="SEO / SEM SWOT Presentation ">SEO / SEM SWOT Presentation </a></strong><div>View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/frankmashraqi">frankmashraqi</a>.</div></div><div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/18337119-8355984853903271469?l=mysqldatabaseadministration.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26673&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26673&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/12/08/seo-sem-swot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drizzle, now with more dump</title>
		<link>http://www.moocowproductions.org/blog/details.php?postid=635&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=drizzle-now-with-more-dump</link>
		<comments>http://www.moocowproductions.org/blog/details.php?postid=635#comments</comments>
		<pubDate>Wed, 08 Dec 2010 02:21:40 +0000</pubDate>
		<dc:creator>Tim Soderstrom</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://www.moocowproductions.org/blog/details.php?postid=635</guid>
		<description><![CDATA[Too far? Well it's a bit true really :) Over the past several weeks, Andrew and the Drizzle team have been working on squashing quite a few bugs with drizzzledump, Drizzle's own advanced version of mysqldump. Patrick was kind enough to give me a shoutout for all the bug filing I had been doing - thanks for that! Though I am glad to see drizzledump, and Drizzle as a whole, approach a period of real usefulness - that's the part I, and I am sure quite a few folks, are excited about. It's on my todo list to convert my blog over to Drizzle as well, now that drizzledump seems to be working against my schema. The reason it has not been done yet is really due to the job change and the season among other things; though it is still very much on my list.

I think Drizzle is a a step in the right direction and am glad to see the march toward stability and extensibility. That last bit makes me excited since my favorite engine is still PBXT and I am excited to give it a spin in Drizzle. If you have not checked out Drizzle in a while, head over to drizzle.org to find out more. I see they revamped the website since I visited it myself!]]></description>
			<content:encoded><![CDATA[Too far? Well it's a bit true really :) Over the past several weeks, Andrew and the Drizzle team have been working on squashing quite a few bugs with drizzzledump, Drizzle's own advanced version of mysqldump. Patrick was kind enough to give me a <a href="http://www.wc220.com/?p=93">shoutout</a> for all the bug filing I had been doing - thanks for that! Though I am glad to see drizzledump, and Drizzle as a whole, approach a period of real usefulness - that's the part I, and I am sure quite a few folks, are excited about. It's on my todo list to convert my blog over to Drizzle as well, now that drizzledump seems to be working against my schema. The reason it has not been done yet is really due to the job change and the season among other things; though it is still very much on my list.<br />
<br />
I think Drizzle is a a step in the right direction and am glad to see the march toward stability and extensibility. That last bit makes me excited since my favorite engine is still PBXT and I am excited to give it a spin in Drizzle. If you have not checked out Drizzle in a while, head over to <a href="http://drizzle.org/">drizzle.org</a> to find out more. I see they revamped the website since I visited it myself!<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26670&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26670&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/12/08/drizzle-now-with-more-dump/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LOB storage in MySQL and Postgres</title>
		<link>http://www.facebook.com/note.php?note_id=466714895932&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lob-storage-in-mysql-and-postgres</link>
		<comments>http://www.facebook.com/note.php?note_id=466714895932#comments</comments>
		<pubDate>Mon, 06 Dec 2010 16:10:01 +0000</pubDate>
		<dc:creator>Planet MySQL</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://www.facebook.com/note.php?note_id=466714895932</guid>
		<description><![CDATA[How do InnoDB and Postgres store large columns? Both use overflow pages for rows with large columns and support compression. Postgres is more likely to store large columns in overflow pages and InnoDB is likely to use more space in overflow pages. Tables can be queried in Postgres to determine the per-table space used by overflow pages. MySQL does not have tables for that but the data can be extracted with a lot more work and time. InnoDB Peter wrote an excellent post for InnoDB. There are two file formats, Antelope and Barracuda, and the general approach is the same. A row can use about 1/2 of a page which is ~8k for 16k pages. When the row is too big and has large columns, the largest of them are moved to overflow pages until the row fits. If the row is not small enough after all have been moved then an error is raised. When a column is moved for the Antelope format the first 768 bytes are stored inline. If 10 large columns are moved they can still consume 7680 bytes inline, excluding the metadata bytes. Thus you can't have a row with 11 BLOB columns each with length 10,000 as that would not fit. The difference with Barracuda is that when a large column is moved to an overflow page, only a 20-byte pointer is stored inline rather than a 768-byte prefix. Large columns do not share overflow pages. When five columns each from two rows are moved to overflow pages, then at least ten overflow pages will be allocated. This can use much more space than expected and it is difficult to monitor. You can get the data on space used but it is not fun and it can take a long time (see xtrabackup --stats, upcoming patch to innochecksum in Facebook MySQL patch, InnoDB tablespace monitor). The Barracuda format also supports compression for the overflow pages and with key_block_size=16 compression is only done for overflow pages (not for the inline columns). Documentation can be tricky:This accurately describes  Antelope behavior but does not state that this is Antelope behavior as the official docs describe the built-in behavior and the Antelope/Barracuda distinction occurs with the plug-in.This page confuses me and incorrectly describes the 768-byte prefix approach.This is a good but brief description of the changes with Barracuda.This is the best description and covers both the strategy for moving columns and the amount of space used by external pages.Postgres Disclaimer - I do not use Postgres, but I read the manuals, mailing lists and blog posts. What I have written below is a summary. There are many more details in the docs that I cite. They are worth reading. Postgres uses TOAST (The Oversized Attribute Storage Technique) for large columns, has an 8k page size by default and rows cannot span pages. Large columns are compressed and then split into pieces (usually 2k each) where each piece is stored as a separate row in the per-table TOAST table. Queries can be done to determine the space used for each TOAST table. Differences Postgres is more likely than InnoDB to use overflow pages (the TOAST table) because large columns are stored in the TOAST table when a row is wider than TOAST_TUPLE_TARGET (2k by default). InnoDB does not use overflow pages until rows are wider than ~8k. But InnoDB is likely to use more space in the overflow pages because each column that uses overflow pages requires its own pages. If 5 columns each from rows A and B use overflow pages then at least 10 pages are allocated by InnoDB. This can waste a lot of space. Postgres splits each large column into compressed pieces and treats each piece as a row in a TOAST table.]]></description>
			<content:encoded><![CDATA[<div><p>How do InnoDB and Postgres store large columns? Both use overflow pages for rows with large columns and support compression. Postgres is more likely to store large columns in overflow pages and InnoDB is likely to use more space in overflow pages. Tables can be queried in Postgres to determine the per-table space used by overflow pages. MySQL does not have tables for that but the data can be extracted with a lot more work and time.</p><p> </p><p><strong>InnoDB</strong></p><p> </p><p>Peter wrote <a href="http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb"  title="http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb" onmousedown="UntrustedLink.bootstrap($(this), "1f255", event);" rel="nofollow">an excellent post</a> for InnoDB. There are two file formats, Antelope and Barracuda, and the general approach is the same. A row can use about 1/2 of a page which is ~8k for 16k pages. When the row is too big and has large columns, the largest of them are moved to overflow pages until the row fits. If the row is not small enough after all have been moved then an error is raised.</p><p> </p><p>When a column is moved for the Antelope format the first 768 bytes are stored inline. If 10 large columns are moved they can still consume 7680 bytes inline, excluding the metadata bytes. Thus you can't have a row with 11 BLOB columns each with length 10,000 as that would not fit.</p><p> </p><p>The difference with Barracuda is that when a large column is moved to an overflow page, only a 20-byte pointer is stored inline rather than a 768-byte prefix.</p><p> </p><p>Large columns do not share overflow pages. When five columns each from two rows are moved to overflow pages, then at least ten overflow pages will be allocated. This can use much more space than expected and it is difficult to monitor. You can get the data on space used but it is not fun and it can take a long time (see xtrabackup --stats, upcoming patch to innochecksum in Facebook MySQL patch, InnoDB tablespace monitor).</p><p> </p><p>The Barracuda format also supports compression for the overflow pages and with key_block_size=16 compression is only done for overflow pages (not for the inline columns).</p><p> </p><p>Documentation can be tricky:</p><ul><li><a href="http://dev.mysql.com/doc/refman/5.1/en/innodb-file-space.html"  title="http://dev.mysql.com/doc/refman/5.1/en/innodb-file-space.html" onmousedown="UntrustedLink.bootstrap($(this), "1f255", event);" rel="nofollow">This accurately describes</a>  Antelope behavior but does not state that this is Antelope behavior as the official docs describe the built-in behavior and the Antelope/Barracuda distinction occurs with the plug-in.</li><li><a href="http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-row-format-antelope.html"  title="http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-row-format-antelope.html" onmousedown="UntrustedLink.bootstrap($(this), "1f255", event);" rel="nofollow">This page confuses me</a> and incorrectly describes the 768-byte prefix approach.</li><li><a href="http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-row-format-dynamic.html"  title="http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-row-format-dynamic.html" onmousedown="UntrustedLink.bootstrap($(this), "1f255", event);" rel="nofollow">This is a good</a> but brief description of the changes with Barracuda.</li><li><a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-compression-internals.html"  title="http://dev.mysql.com/doc/refman/5.5/en/innodb-compression-internals.html" onmousedown="UntrustedLink.bootstrap($(this), "1f255", event);" rel="nofollow">This is the best description</a> and covers both the strategy for moving columns and the amount of space used by external pages.</li></ul><p><strong>Postgres</strong></p><p> </p><p>Disclaimer - I do not use Postgres, but I read the manuals, mailing lists and blog posts. What I have written below is a summary. There are many more details in the docs that I cite. They are worth reading.</p><p> </p><p>Postgres uses <a href="http://www.postgresql.org/docs/9.0/interactive/storage-toast.html"  title="http://www.postgresql.org/docs/9.0/interactive/storage-toast.html" onmousedown="UntrustedLink.bootstrap($(this), "1f255", event);" rel="nofollow">TOAST (The Oversized Attribute Storage Technique)</a> for large columns, has an 8k page size by default and rows cannot span pages. Large columns are compressed and then split into pieces (usually 2k each) where each piece is stored as a separate row in the per-table TOAST table. <a href="http://www.postgresql.org/docs/9.0/interactive/disk-usage.html"  title="http://www.postgresql.org/docs/9.0/interactive/disk-usage.html" onmousedown="UntrustedLink.bootstrap($(this), "1f255", event);" rel="nofollow">Queries can be done</a> to determine the space used for each TOAST table.</p><p> </p><p><strong>Differences</strong></p><p> </p><p>Postgres is more likely than InnoDB to use overflow pages (the TOAST table) because large columns are stored in the TOAST table when a row is wider than TOAST_TUPLE_TARGET (2k by default). InnoDB does not use overflow pages until rows are wider than ~8k.</p><p> </p><p>But InnoDB is likely to use more space in the overflow pages because each column that uses overflow pages requires its own pages. If 5 columns each from rows A and B use overflow pages then at least 10 pages are allocated by InnoDB. This can waste a lot of space. Postgres splits each large column into compressed pieces and treats each piece as a row in a TOAST table.</p><br /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26659&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26659&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/12/06/lob-storage-in-mysql-and-postgres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Group commit in PostgreSQL</title>
		<link>http://www.facebook.com/note.php?note_id=465781235932&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=group-commit-in-postgresql</link>
		<comments>http://www.facebook.com/note.php?note_id=465781235932#comments</comments>
		<pubDate>Sat, 04 Dec 2010 17:48:07 +0000</pubDate>
		<dc:creator>Planet MySQL</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://www.facebook.com/note.php?note_id=465781235932</guid>
		<description><![CDATA[There are three active projects to add support for group commit to MySQL/InnoDB. Monty Program and MySQL appear to have work in progress. The Facebook version is done but we will gladly undo it when official versions are ready. PostgreSQL has group commit today. It is enabled by the commit_delay configuration parameter and the feature is described in the manual. The commit_delay options provides a constraint on when group commit is done that has yet to be considered in the MySQL implementations. When commit_siblings is set to a non-zero value then a transaction attempting to commit will only wait at least that many transactions are active. This is a great option because for workloads with limited or intermittent concurrency there is no reason to wait when it is unlikely that another commit will be attempted before the commit_delay time expires. It is harder to implement group commit for MySQL/InnoDB because two resource managers must be kept in sync: InnoDB and the binlog. This looks a lot like XA. But that is required until someone implements storage-engine replication (which is another hard problem). In PostgreSQL there is but one log to worry about, the WAL. That simplifies group commit, replication and incremental backup. But those are topics for another post or another author.]]></description>
			<content:encoded><![CDATA[<div><p>There are three active projects to add support for group commit to MySQL/InnoDB. <a href="http://kristiannielsen.livejournal.com/12254.html"  title="http://kristiannielsen.livejournal.com/12254.html" onmousedown="UntrustedLink.bootstrap($(this), "62706", event);" rel="nofollow">Monty Program</a> and <a href="http://mysqlmusings.blogspot.com/2010/04/binary-log-group-commit-implementation.html"  title="http://mysqlmusings.blogspot.com/2010/04/binary-log-group-commit-implementation.html" onmousedown="UntrustedLink.bootstrap($(this), "62706", event);" rel="nofollow">MySQL</a> appear to have work in progress. The Facebook version is done but we will gladly undo it when official versions are ready.</p><p> </p><p>PostgreSQL has group commit today. It is enabled by the <a href="http://www.postgresql.org/docs/current/static/runtime-config-wal.html#GUC-COMMIT-DELAY"  title="http://www.postgresql.org/docs/current/static/runtime-config-wal.html#GUC-COMMIT-DELAY" onmousedown="UntrustedLink.bootstrap($(this), "62706", event);" rel="nofollow">commit_delay</a> configuration parameter and the feature is <a href="http://www.postgresql.org/docs/current/static/wal-configuration.html"  title="http://www.postgresql.org/docs/current/static/wal-configuration.html" onmousedown="UntrustedLink.bootstrap($(this), "62706", event);" rel="nofollow">described in the manual</a>.</p><p> </p><p>The <strong>commit_delay</strong> options provides a constraint on when group commit is done that has yet to be considered in the MySQL implementations. When <strong>commit_siblings</strong> is set to a non-zero value then a transaction attempting to commit will only wait at least that many transactions are active. This is a great option because for workloads with limited or intermittent concurrency there is no reason to wait when it is unlikely that another commit will be attempted before the commit_delay time expires.</p><p> </p><p>It is harder to implement group commit for MySQL/InnoDB because two resource managers must be kept in sync: InnoDB and the binlog. This looks a lot like XA. But that is required until someone implements storage-engine replication (which is another hard problem).</p><p> </p><p>In PostgreSQL there is but one log to worry about, the WAL. That simplifies group commit, replication and incremental backup. But those are topics for another post or another author.</p><br /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26651&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26651&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/12/04/group-commit-in-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Working with MySQL on Windows &#8212; Part 1</title>
		<link>http://karlssonondatabases.blogspot.com/2010/12/working-with-mysql-on-windows-part-1.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=working-with-mysql-on-windows-part-1</link>
		<comments>http://karlssonondatabases.blogspot.com/2010/12/working-with-mysql-on-windows-part-1.html#comments</comments>
		<pubDate>Thu, 02 Dec 2010 18:08:00 +0000</pubDate>
		<dc:creator>Anders Karlsson</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[This is the first post in an attempt to write about how to get along with MySQL on Windows. Before I start, I want to stress that the focus here is seasoned Windows users getting started with MySQL.  As for MySQL, I am prett much Operating System agnostic, having used Linux / Unix for some 25 - 30 years ( started using Unix as of Version 6. That's OLD). But I have also been a Windows user and developer since Windows 3.0 days.Also, when I say I'm a Windows developer, let me tell you where I come from. I come from learning Win16 in C. Hardcoded message loops and message handlers and that kind of stuff. And that is how I still develop on Windows, but these days with Win32 / Win64 and exposing more Windows APIs. So I am no C# or .NET expert by any means.So, you are ready to get started with MySQL on Windows? OK, first you should download it, possibly from here: http://dev.mysql.com/downloads/mysql/. And no, you don't have to pay anything, MySQL is free for us developers. And no, you will not need to compile anything from source or something, quite the opposite, MySQL comes with a very nice installer. Just download the MSI installer package for your platform (32 or 64 bit that is), and get started.Usually when Installing MySQL, you can choose most of the defaults. After the installation, a configuration application starts, and you can usually choose most of the defaults for a starter here also. One things that your might want to look at is the character set selection. Latin1 is one option that is usually OK and that is similar  odl and tried Windows CP1252. It's good enough as a start. If you plan to develop Web applications, then you might want to choose UTF8.OK, assuming all went well, where do a get started with really using MySQL? Well, there isn't much in terms of a Windows GUI for MySQL installed as part of MySQL. And not only that, if you are a Visual Studio user, possibly developing in C#, there is very little in Visual Studio that shows that there is a new database server installed? Well, this we will fix, all this stuff sure is available from MySQL, you just have to know where to look.First, as for a MySQL GUI for Windows, you have a few choices. If you want a complete MySQL design and SQL tool, then look no further than MySQL Workbench from MySQL themselves. This is a database design tool for MySQL that is loaded with cool features. Again, you can download it and use it at no cost, it is available here: http://dev.mysql.com/downloads/workbench/5.2.htmlThere are alternatives to MySQL Workbench, and many of them are also free and Open Source. HeidiSQL is one such option, and I have a tool myself called MyQuery. Both of these are a little less ambitious than MySQL Workbench, but also has features of their own. HeidiSQL is very much DBA focused and has loads of DBA style functions. My own MyQuery is focused on working with MySQL Scripts and shines when it comes to extensibility among other things. MyQuery can be downloaded here: http://sourceforge.net/projects/myquery/But what about your applications? How is a database connection to MySQL achieved? Well, there are several ways to connect to MySQL. When you download the MySQL Server, it comes with a C API. If you are an old man like me, that might well be the way to go. The C API is OK and is well documented here: http://dev.mysql.com/doc/refman/5.5/en/c.html. The C API comes in static and dynamic shape. If you don't know the the difference or don't really care, then use the dynamic build. Using the static library is more demanding. MySQL itself, including the C API, is built with Visual Studio, so if that is what you use for your application (and I guess you are), that is OK. And you can do with the Express editions of Visual Studio.Now, chances are you are not an old C hacker like myself, but a more modern person, using C#, Visual Basic or Java. If that is the case, MySQL provides help even here. If you are using Visual Studio with any of these languages, you want to download and install MySQL Connector/Net. A Connector is what MySQL calls their database drivers. And yes, even if you are on Java you want the .Net connector. The reason is that the .Net connector also includes the Visual Studio integration, although here it doesn't seem that the Express editions are enough. Connector/.Net can be downloaded here: http://dev.mysql.com/downloads/connector/net/.And then for Java, you need Connector/J, available here: http://dev.mysql.com/downloads/connector/j/Now, one word of caution before I leave you for this time: Both Connector/Net and Connector/J does some cool things for you. If you look at how MySQL works, or have a look at the MySQL C API, you realize that MySQL has some very particular ways of dealing with some things, like array inserts, prepared statements and things like that. To make life as a MySQL developer easier, both of these connectors do some very cool things to isolate you from that. Also, these connectors to an extent address some things beyond MySQL itself, such as high availability. And thirdly, tuning the Connectors is often just as important as tuning the server! What I am saying here is, in short, something as unknown and arcane as read the documentation. In particular this is true for Connector/J, which has many parameters, is very advanced, but also very fast and can help you speed up your application if you know how to work it.Bye for now, I'll be back in a jiffy with some more Windows specific MySQL notes/Karlsson]]></description>
			<content:encoded><![CDATA[<span>This</span> is <span>the</span> <span>first</span> post in an <span>attempt</span> <span>to</span> <span>write</span> <span>about</span> <span>how</span> <span>to</span> get <span>along</span> <span>with</span> MySQL <span>on</span> <span>Windows.</span> <span>Before</span> I start, I <span>want</span> <span>to</span> stress <span>that</span> <span>the</span> <span>focus</span> <span>here</span> is <span>seasoned</span> <span>Windows</span> <span>users</span> getting <span>started</span> <span>with</span> MySQL.  As for MySQL, I <span>am</span> <span>prett</span> <span>much</span> Operating System <span>agnostic</span>, <span>having</span> <span>used</span> Linux / Unix for <span>some</span> 25 - 30 <span>years</span> ( <span>started</span> <span>using</span> Unix as <span>of</span> Version 6. <span>That's</span> <span>OLD</span>). <span>But</span> I <span>have</span> <span>also</span> <span>been</span> a <span>Windows</span> <span>user</span> and <span>developer</span> <span>since</span> <span>Windows</span> 3.0 <span>days.</span><br /><br /><span>Also</span>, <span>when</span> I <span>say</span> <span>I'm</span> a <span>Windows</span> <span>developer</span>, <span>let</span> <span>me</span> <span>tell</span> <span>you</span> <span>where</span> I <span>come</span> from. I <span>come</span> from <span>learning</span> <span>Win</span>16 in <span>C.</span> <span>Hardcoded</span> <span>message</span> <span>loops</span> and <span>message</span> <span>handlers</span> and <span>that</span> kind <span>of</span> <span>stuff.</span> And <span>that</span> is <span>how</span> I still <span>develop</span> <span>on</span> <span>Windows</span>, <span>but</span> <span>these</span> <span>days</span> <span>with</span> <span>Win</span>32 / <span>Win</span>64 and <span>exposing</span> <span>more</span> <span>Windows</span> <span>APIs.</span> So I am no C# or .NET expert by any means.<br /><br />So, <span>you</span> <span>are</span> <span>ready</span> <span>to</span> get <span>started</span> <span>with</span> MySQL <span>on</span> <span>Windows</span>? OK, <span>first</span> <span>you</span> <span>should</span> <span>download</span> <span>it</span>, <span>possibly</span> from <span>here</span>: <a href="http://dev.mysql.com/downloads/mysql/">http://dev.mysql.com/downloads/mysql/</a>. And <span>no</span>, <span>you</span> <span>don't</span> <span>have</span> <span>to</span> <span>pay</span> <span>anything</span>, MySQL is <span>free</span> for <span>us</span> <span>developers.</span> And <span>no</span>, <span>you</span> <span>will</span> not <span>need</span> <span>to</span> <span>compile</span> <span>anything</span> from <span>source</span> <span>or</span> <span>something</span>, <span>quite</span> <span>the</span> <span>opposite</span>, MySQL <span>comes</span> <span>with</span> a <span>very</span> <span>nice</span> <span>installer.</span> Just <span>download</span> <span>the</span> <span>MSI</span> <span>installer</span> <span>package</span> for <span>your</span> <span>platform</span> (32 <span>or</span> 64 bit <span>that</span> is), and get started.<br /><br /><span>Usually</span> <span>when</span> <span>Installing</span> MySQL, <span>you</span> <span>can</span> <span>choose</span> <span>most</span> <span>of</span> <span>the</span> <span>defaults.</span> <span>After</span> <span>the</span> <span>installation</span>, a <span>configuration</span> <span>application</span> <span>starts</span>, and <span>you</span> <span>can</span> <span>usually</span> <span>choose</span> <span>most</span> <span>of</span> <span>the</span> <span>defaults</span> for a starter <span>here</span> <span>also.</span> <span>One</span> <span>things</span> <span>that</span> <span>your</span> <span>might</span> <span>want</span> <span>to</span> <span>look</span> <span>at</span> is <span>the </span><span>character</span> set <span>selection.</span> Latin1 is <span>one</span> option <span>that</span> is <span>usually</span> OK and <span>that</span> is <span>similar</span>  <span>odl and tried</span> <span>Windows</span> <span>CP</span>1252. <span>It's</span> <span>good</span> <span>enough</span> as a start. <span>If</span> <span>you</span> plan <span>to</span> <span>develop</span> <span>Web</span> <span>applications</span>, <span>then</span> <span>you</span> <span>might</span> <span>want</span> <span>to</span> <span>choose</span> <span>UTF</span>8.<br /><br />OK, <span>assuming</span> all <span>went</span> <span>well</span>, <span>where</span> <span>do</span> a get <span>started</span> <span>with</span> <span>really</span> <span>using</span> MySQL? <span>Well</span>, <span>there</span> <span>isn't</span> <span>much</span> in terms <span>of</span> a <span>Windows</span> <span>GUI</span> for MySQL <span>installed</span> as part <span>of</span> MySQL. And not <span>only</span> <span>that</span>, <span>if</span> <span>you</span> <span>are</span> a <span>Visual</span> Studio <span>user</span>, <span>possibly</span> <span>developing</span> in C#, <span>there</span> is <span>very</span> <span>little</span> in <span>Visual</span> Studio <span>that</span> <span>shows</span> <span>that</span> <span>there</span> is a <span>new</span> <span>database</span> <span>server</span> <span>installed</span>? <span>Well</span>, <span>this</span> <span>we</span> <span>will</span> fix, <span>all this</span> <span>stuff</span> <span>sure</span> is <span>available</span> from MySQL, <span>you</span> just <span>have</span> <span>to</span> <span>know</span> <span>where</span> <span>to</span> <span>look.</span><br /><br /><span>First</span>, as for a MySQL <span>GUI</span> for <span>Windows</span>, <span>you</span> <span>have</span> a <span>few</span> <span>choices.</span> <span>If</span> <span>you</span> <span>want</span> a <span>complete</span> MySQL design and <span>SQL</span> <span>tool</span>, <span>then</span> <span>look</span> <span>no</span> <span>further</span> <span>than</span> MySQL <span>Workbench</span> from MySQL <span>themselves.</span> <span>This</span> is a <span>database</span> design <span>tool</span> for MySQL <span>that</span> is <span>loaded</span> <span>with</span> <span>cool</span> <span>features.</span> <span>Again</span>, <span>you</span> <span>can</span> <span>download</span> <span>it</span> and <span>use</span> <span>it</span> <span>at</span> <span>no</span> <span>cost</span>, <span>it</span> is <span>available</span> <span>here</span>: <a href="http://dev.mysql.com/downloads/workbench/5.2.html">http://dev.mysql.com/downloads/workbench/5.2.html</a><br /><br /><span>There</span> <span>are</span> <span>alternatives</span> <span>to</span> MySQL <span>Workbench</span>, and <span>many</span> <span>of</span> <span>them</span> <span>are</span> <span>also</span> <span>free</span> and <span>Open</span> <span>Source.</span> <span>HeidiSQL</span> is <span>one</span> <span>such</span> option, and I <span>have</span> a <span>tool</span> <span>myself</span> <span>called</span> <span>MyQuery.</span> <span>Both</span> <span>of</span> <span>these</span> <span>are</span> a <span>little</span> less <span>ambitious</span> <span>than</span> MySQL <span>Workbench</span>, <span>but</span> <span>also</span> <span>has</span> <span>features</span> <span>of</span> <span>their</span> <span>own.</span> <span>HeidiSQL</span> is <span>very</span> <span>much</span> <span>DBA</span> <span>focused</span> and <span>has</span> <span>loads</span> <span>of</span> <span>DBA</span> <span>style</span> <span>functions.</span> <span>My</span> <span>own</span> <span>MyQuery</span> is <span>focused</span> <span>on</span> <span>working</span> <span>with</span> MySQL <span>Scripts</span> and <span>shines</span> <span>when</span> <span>it</span> <span>comes</span> <span>to</span> <span>extensibility</span> <span>among</span> <span>other</span> <span>things.</span> <span>MyQuery</span> <span>can</span> be <span>downloaded</span> <span>here</span>: <a href="http://sourceforge.net/projects/myquery/">http://sourceforge.net/projects/myquery/</a><br /><br /><span>But</span> <span>what</span> <span>about</span> <span>your</span> <span>applications</span>? <span>How</span> is a <span>database</span> <span>connection</span> <span>to</span> MySQL <span>achieved</span>? <span>Well</span>, <span>there</span> <span>are</span> <span>several</span> <span>ways</span> <span>to</span> <span>connect</span> <span>to</span> MySQL. <span>When</span> <span>you</span> <span>download</span> <span>the</span> MySQL <span>Server</span>, <span>it</span> <span>comes</span> <span>with</span> a C <span>API.</span> <span>If</span> <span>you</span> <span>are</span> an <span>old</span> man like <span>me</span>, <span>that</span> <span>might</span> <span>well</span> be <span>the</span> <span>way</span> <span>to</span> <span>go.</span> <span>The</span> C <span>API</span> is OK and is <span>well</span> <span>documented</span> <span>here</span>: <a href="http://dev.mysql.com/doc/refman/5.5/en/c.html">http://dev.mysql.com/doc/refman/5.5/en/c.html</a>. <span>The</span> C <span>API</span> <span>comes</span> in <span>static</span> and <span>dynamic</span> <span>shape.</span> <span>If</span> <span>you</span> <span>don't</span> <span>know</span> <span>the</span> <span>the</span> <span>difference</span> <span>or</span> <span>don't</span> <span>really</span> <span>care</span>, <span>then</span> <span>use</span> <span>the</span> <span>dynamic</span> <span>build.</span> <span>Using</span> <span>the</span> <span>static</span> <span>library</span> is <span>more</span> <span>demanding.</span> MySQL <span>itself</span>, <span>including</span> <span>the</span> C <span>API</span>, is <span>built</span> <span>with</span> <span>Visual</span> Studio, so <span>if</span> <span>that</span> is <span>what</span> <span>you</span> <span>use</span> for <span>your</span> <span>application</span> (and I <span>guess</span> <span>you</span> <span>are</span>), <span>that</span> is OK. And <span>you</span> <span>can</span> <span>do</span> <span>with</span> <span>the</span> Express editions <span>of</span> <span>Visual</span> Studio.<br /><br /><span>Now</span>, <span>chances</span> <span>are</span> <span>you</span> <span>are</span> not an <span>old</span> C <span>hacker</span> like <span>myself</span>, <span>but</span> a <span>more</span> modern person, <span>using</span> C#, <span>Visual</span> <span>Basic</span> <span>or</span> <span>Java.</span> <span>If</span> <span>that</span> is <span>the</span> <span>case</span>, MySQL <span>provides</span> <span>help</span> <span>even</span> <span>here.</span> <span>If</span> <span>you</span> <span>are</span> <span>using</span> <span>Visual</span> Studio <span>with</span> <span>any</span> <span>of</span> <span>these</span> <span>languages</span>, <span>you</span> <span>want</span> <span>to</span> <span>download</span> and <span>install</span> MySQL <span>Connector</span>/<span>Net.</span> A <span>Connector</span> is <span>what</span> MySQL <span>calls</span> <span>their</span> <span>database</span> drivers. And <span>yes</span>, <span>even</span> <span>if</span> <span>you</span> <span>are</span> <span>on</span> <span>Java</span> <span>you</span> <span>want</span> <span>the</span> .<span>Net</span> <span>connector.</span> <span>The</span> reason is <span>that</span> <span>the</span> .<span>Net</span> <span>connector</span> <span>also</span> <span>includes</span> <span>the</span> <span>Visual</span> Studio integration, <span>although</span> <span>here</span> <span>it</span> <span>doesn't</span> <span>seem</span> <span>that</span> <span>the</span> Express editions <span>are</span> <span>enough.</span> <span>Connector</span>/.<span>Net</span> <span>can</span> be <span>downloaded</span> <span>here</span>: <a href="http://dev.mysql.com/downloads/connector/net/">http://dev.mysql.com/downloads/connector/net/</a>.<br /><br />And <span>then</span> for <span>Java</span>, <span>you</span> <span>need</span> <span>Connector</span>/J, <span>available</span> <span>here</span>: <a href="http://dev.mysql.com/downloads/connector/j/">http://dev.mysql.com/downloads/connector/j/</a><br /><br /><span>Now</span>, <span>one</span> <span>word</span> <span>of</span> <span>caution</span> <span>before</span> I <span>leave</span> <span>you</span> for <span>this</span> <span>time</span>: <span>Both</span> <span><span>Connector</span>/<span>Net</span></span> and <span><span>Connector</span>/J</span> <span>does</span> <span>some</span> <span>cool</span> <span>things</span> for <span>you.</span> <span>If</span> <span>you</span> <span>look</span> <span>at</span> <span>how</span> MySQL <span>works</span>, <span>or</span> <span>have</span> a <span>look</span> <span>at</span> <span>the</span> MySQL C <span>API</span>, <span>you</span> <span>realize</span> <span>that</span> MySQL <span>has</span> <span>some</span> <span>very</span> <span>particular</span> <span>ways</span> <span>of</span> <span>dealing</span> <span>with</span> <span>some</span> <span>things</span>, <span>like</span> <span>array</span> <span>inserts</span>, <span>prepared</span> <span>statements</span> and <span>things</span> like <span>that.</span> <span>To</span> make <span>life</span> as a MySQL <span>developer</span> <span>easier</span>, <span>both</span> <span>of</span> <span>these</span> <span>connectors</span> <span>do</span> <span>some</span> <span>very</span> <span>cool</span> <span>things</span> <span>to</span> <span>isolate</span> <span>you</span> from <span>that.</span> <span>Also</span>, <span>these</span> <span>connectors</span> <span>to</span> an <span>extent</span> <span>address</span> <span>some</span> <span>things</span> <span>beyond</span> MySQL <span>itself</span>, <span>such</span> as <span>high</span> <span>availability.</span> And <span>thirdly</span>, <span>tuning</span> <span>the</span> <span>Connectors</span> is <span>often</span> just as <span>important</span> as <span>tuning</span> <span>the</span> <span>server</span>! <span>What</span> I <span>am</span> <span>saying</span> <span>here</span> is, in <span>short</span>, <span>something</span> as <span>unknown</span> and <span>arcane</span> as <span><span>read</span> <span>the</span> <span>documentation</span></span>. In <span>particular</span> <span>this</span> is <span>true</span> for <span>Connector</span>/J, <span>which</span> <span>has</span> <span>many</span> parameters, is <span>very</span> <span>advanced</span>, <span>but</span> <span>also</span> <span>very</span> fast and <span>can</span> <span>help</span> <span>you</span> <span>speed</span> <span>up</span> <span>your</span> <span>application</span> <span>if</span> <span>you</span> <span>know</span> <span>how</span> <span>to</span> <span>work</span> <span>it.</span><br /><br /><span>Bye</span> for <span>now</span>, <span>I'll</span> be back in a <span>jiffy</span> <span>with</span> <span>some</span> <span>more</span> <span>Windows</span> <span>specific</span> MySQL <span>notes</span><br />/Karlsson<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/9144505959002328789-7519583806586730050?l=karlssonondatabases.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26636&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26636&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/12/02/working-with-mysql-on-windows-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More on the sqlstats SQL Statement monitor plugin</title>
		<link>http://karlssonondatabases.blogspot.com/2010/11/more-on-sqlstats-sql-statement-monitor.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=more-on-the-sqlstats-sql-statement-monitor-plugin</link>
		<comments>http://karlssonondatabases.blogspot.com/2010/11/more-on-sqlstats-sql-statement-monitor.html#comments</comments>
		<pubDate>Tue, 30 Nov 2010 15:03:00 +0000</pubDate>
		<dc:creator>Anders Karlsson</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[There was some questions on how sqlstats really works, so I'll provide some more details here. Before I begin though, if you want to play with it, it can be downloaded from Sourcefore here: http://sourceforge.net/projects/sqlstats/OK. So lets start then. SQLStats is a plugin for MySQL 5.5 and up, it will not work at all with previous versions. What it does is reasonable simple, the reason it hasn't been done before is that MySQL just wasn't instrumented to support it, but the effect is really usuful anyway. The 4 things it does, in short, are:Pick up all SQL Statements executing in MySQL. This is done using the MySQL Audit plugin interface.The SQL Statement is then normalized, which in this case means that all literals in the statements are taken away, so that SELECT * FROM orders WHERE orderid = 57 becomes SELECT * FROM orders WHERE orderid = ?. Then we place this statement in a list of most recently executed statements, if the normalized version is already in the list, the execute counter is incremented and the statement is popped to the top (as it is most recently executed), else it is inserted into the list (and popped to the top), in which case, if the list of full, the least recently executed statement leaves the list.Then we check a second list, the toplist of most executed statements. If the execute count of the normalized statement will make it appear on this list, it is added there in the same way.As a sidenote, both the recently executed list as well as the top executed list are simple in-memory datastructures. They are not stored on disk or anything, they are just lists of C-structs allocated dynamically.The last thing the Plugin do is to expose two INFORMATION_SCHEMA plugins, so that the recently executed list and the toplist can be examined as normal MySQL tables.All three plugins (the Audit plugin that will pick up and process the statements, and the two INFORMATION_SCHEMA tables) are in the same plugin library, so that they can share the same data: the lists of SQL statements. The lists are protected by an internal mutex, so that multiple threads can use the plugin simultaneously without breaking anything.One magic aspect here is the Audit plugin API? What is that you ask? It is actually pretty well documented these days (see http://dev.mysql.com/doc/refman/5.5/en/audit-plugins.html). Basically how I use it in this instance is to pick up the statements every time they are written to, or would be written to, the general log. Note that the general log does NOT have to be enabled anywhere for the plugin to work! That's a releif, right?So, once the plugin is installed, if you follow the documentation, you can see the most recently executed statements in the SQLSTATS_LASTSQL tables in the INFORMATION_SCHEMA schema, like this for example:SELECT * FROM INFORMATION_SCHEMA.SQLSTATS_LASTSQL;The columns are described in the documentation, but the most important ones are:STATEMENT - The normalized statement.SAMPLE_STATEMENT - The first real statement that was turned into the normalized statement in the STATEMENT column.NUM_EXECUTES - The number of times the statement has been executed.NUM_ROWS_TOTAL - The total number of rows retrieved by all NUM_EXECUTES executions of the statement.The SQLSTATS_TOPSQL table looks the same, but has different rows in it of course.You can turn collection of statements on and off by setting the sqlstats_enable global variable:SET GLOBAL sqlstats_enable=1; -- Turn SQLSTATS onThe installation script will turn it on. You may also adjust the size of the lists using the global variables sqlstats_lru_stmts and sqlstats_top_stmts global variables. The way these work now, they will not really be adjusted down below the current size of the list.To install the plugin, just follow the documentation. As you have to link with the MySQL sourcecode, the build process is slightly iffy, but once built, the plugin can be installed and deinstalled and recinfigured, without shuting down the server or anything.I think that the Audit API is good enough reason to go with MySQL 5.5, if you ask me. My testing, and some semi-production testing here at RF, has shown that the overhead of the plugin is hardly noticable./Karlsson]]></description>
			<content:encoded><![CDATA[There was some questions on how <span>sqlstats</span> really works, so I'll provide some more details here. Before I begin though, if you want to play with it, it can be downloaded from Sourcefore here: <a href="http://sourceforge.net/projects/sqlstats/">http://sourceforge.net/projects/sqlstats/</a><br /><br />OK. So lets start then. SQLStats is a plugin for MySQL 5.5 and up, it will not work at all with previous versions. What it does is reasonable simple, the reason it hasn't been done before is that MySQL just wasn't instrumented to support it, but the effect is really usuful anyway. The 4 things it does, in short, are:<br /><ul><li>Pick up all SQL Statements executing in MySQL. This is done using the MySQL Audit plugin interface.</li><li>The SQL Statement is then normalized, which in this case means that all literals in the statements are taken away, so that <span><span>SELECT * FROM orders WHERE orderid = 57</span> </span>becomes <span>SELECT * FROM orders WHERE orderid = ?</span>. Then we place this statement in a list of most recently executed statements, if the normalized version is already in the list, the execute counter is incremented and the statement is popped to the top (as it is most recently executed), else it is inserted into the list (and popped to the top), in which case, if the list of full, the least recently executed statement leaves the list.</li><li>Then we check a second list, the toplist of most executed statements. If the execute count of the normalized statement will make it appear on this list, it is added there in the same way.<br />As a sidenote, both the recently executed list as well as the top executed list are simple in-memory datastructures. They are not stored on disk or anything, they are just lists of C-structs allocated dynamically.</li><li>The last thing the Plugin do is to expose two INFORMATION_SCHEMA plugins, so that the recently executed list and the toplist can be examined as normal MySQL tables.</li></ul>All three plugins (the Audit plugin that will pick up and process the statements, and the two INFORMATION_SCHEMA tables) are in the same plugin library, so that they can share the same data: the lists of SQL statements. The lists are protected by an internal mutex, so that multiple threads can use the plugin simultaneously without breaking anything.<br /><br />One magic aspect here is the Audit plugin API? What is that you ask? It is actually pretty well documented these days (see <a href="http://dev.mysql.com/doc/refman/5.5/en/audit-plugins.html">http://dev.mysql.com/doc/refman/5.5/en/audit-plugins.html</a>). Basically how I use it in this instance is to pick up the statements every time they are written to, or would be written to, the general log. Note that the general log does <span>NOT</span> have to be enabled anywhere for the plugin to work! That's a releif, right?<br /><br />So, once the plugin is installed, if you follow the documentation, you can see the most recently executed statements in the SQLSTATS_LASTSQL tables in the INFORMATION_SCHEMA schema, like this for example:<br /><span>SELECT * FROM INFORMATION_SCHEMA.SQLSTATS_LASTSQL;</span><br />The columns are described in the documentation, but the most important ones are:<br /><ul><li>STATEMENT - The normalized statement.</li><li>SAMPLE_STATEMENT - The first real statement that was turned into the normalized statement in the STATEMENT column.</li><li>NUM_EXECUTES - The number of times the statement has been executed.</li><li>NUM_ROWS_TOTAL - The total number of rows retrieved by all NUM_EXECUTES executions of the statement.</li></ul>The SQLSTATS_TOPSQL table looks the same, but has different rows in it of course.<br /><br />You can turn collection of statements on and off by setting the<span> sqlstats_enable</span> global variable:<br /><span>SET GLOBAL sqlstats_enable=1; -- Turn SQLSTATS on</span><br />The installation script will turn it on. You may also adjust the size of the lists using the global variables <span>sqlstats_lru_stmts</span> and <span>sqlstats_top_stmts</span> global variables. The way these work now, they will not really be adjusted down below the current size of the list.<br /><br />To install the plugin, just follow the documentation. As you have to link with the MySQL sourcecode, the build process is slightly iffy, but once built, the plugin can be installed and deinstalled and recinfigured, without shuting down the server or anything.<br /><br />I think that the Audit API is good enough reason to go with MySQL 5.5, if you ask me. My testing, and some semi-production testing here at RF, has shown that the overhead of the plugin is hardly noticable.<br /><br />/Karlsson<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/9144505959002328789-1447468726869725257?l=karlssonondatabases.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26620&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26620&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/11/30/more-on-the-sqlstats-sql-statement-monitor-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The King is dead, long live the King</title>
		<link>http://mikaelronstrom.blogspot.com/2010/11/king-is-dead-long-live-king.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-king-is-dead-long-live-the-king</link>
		<comments>http://mikaelronstrom.blogspot.com/2010/11/king-is-dead-long-live-king.html#comments</comments>
		<pubDate>Tue, 30 Nov 2010 11:52:00 +0000</pubDate>
		<dc:creator>Mikael Ronstr&#246;m</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[In MySQL 5.5 we introduced a possibility to use alternative malloc implementations for MySQL. In Solaris we have found mtmalloc to be the optimal malloc implementation. For Linux we've previously found tcmalloc to be the optimal malloc implementation. However recently when working on a new MySQL feature I discovered a case where tcmalloc had a performance regression after running a very tough benchmark for about an hour. Actually I found a similar issue with the standard libc malloc implementation. So it seems that many malloc implementations gets into fragmentation issues when running for an extended period at very high load.So I decided to contact Mark Callaghan to see if he had seen similar issues. He hadn't, but he pointed me towards an alternative malloc implementation which is jemalloc. It turns out that jemalloc is the malloc implementation used in FreeBSD among other things. I found a downloadable tarball of jemalloc, downloaded it and installed it on my benchmark computers. Given that MySQL already supports any generic malloc implementation it was a simple matter of pointing LD_PRELOAD towards jemalloc instead of towards tcmalloc to make this experiment.The background is that tcmalloc gave about +5-10% better performance than libc malloc on Linux. Both libc malloc and tcmalloc have had performance regressions in certain situations. So the new results for jemalloc was very exciting. I got +15% compared to libc malloc and so far after using it for about a month I have found no performance regressions using jemalloc.]]></description>
			<content:encoded><![CDATA[In MySQL 5.5 we introduced a possibility to use alternative malloc implementations for MySQL. In Solaris we have found mtmalloc to be the optimal malloc implementation. For Linux we've previously found tcmalloc to be the optimal malloc implementation. However recently when working on a new MySQL feature I discovered a case where tcmalloc had a performance regression after running a very tough benchmark for about an hour. Actually I found a similar issue with the standard libc malloc implementation. So it seems that many malloc implementations gets into fragmentation issues when running for an extended period at very high load.<br /><br />So I decided to contact Mark Callaghan to see if he had seen similar issues. He hadn't, but he pointed me towards an alternative malloc implementation which is jemalloc. It turns out that jemalloc is the malloc implementation used in FreeBSD among other things. I found a downloadable tarball of jemalloc, downloaded it and installed it on my benchmark computers. Given that MySQL already supports any generic malloc implementation it was a simple matter of pointing LD_PRELOAD towards jemalloc instead of towards tcmalloc to make this experiment.<br /><br />The background is that tcmalloc gave about +5-10% better performance than libc malloc on Linux. Both libc malloc and tcmalloc have had performance regressions in certain situations. So the new results for jemalloc was very exciting. I got +15% compared to libc malloc and so far after using it for about a month I have found no performance regressions using jemalloc.<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/14455177-1296514883088467156?l=mikaelronstrom.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26619&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26619&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/11/30/the-king-is-dead-long-live-the-king/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What? Me Grumpy? Me?? or MySQL on Windows, what&#8217;s the deal?</title>
		<link>http://karlssonondatabases.blogspot.com/2010/11/what-me-grumpy-me-or-mysql-on-windows.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=what-me-grumpy-me-or-mysql-on-windows-whats-the-deal</link>
		<comments>http://karlssonondatabases.blogspot.com/2010/11/what-me-grumpy-me-or-mysql-on-windows.html#comments</comments>
		<pubDate>Tue, 30 Nov 2010 06:22:00 +0000</pubDate>
		<dc:creator>Anders Karlsson</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[So you have seen my writings on MySQL on Windows. Most recently regarding MySQL 5.5 and before that on Cluster and 5.1. So, what is the deal? Am I a mean person attacking MySQL? Am I a Windows hater trying to show how badly Windows works? Or maybe a Linux / Unix hater who want to keep those bearded 1970's terminal junkies out of my GUI Windows world?Actually none of those. My ambition is to point out this that should be addressed in MySQL for Windows to make it more Windows friendly, for Windows users and developers. As MySQL on Windows stands right now,, it is OK for the Linux / Unix user user who also wants to run on Windows, and for those with cross-platform knowledge and ambition who want to run MySQL across the range. And I put myself among those. But I also want the Windows hard-core users to find out about, use and love MySQL. And MySQL sure could do much more in that area, but before that happens, we (yes we. We who are cross platform folks, we who who can take the time to check things out a bit and has somewhat of an understanding of what those rough edges are and we who care about MySQL and it's adoption on ALL platforms).I really do not think that a Windows user, who is not used to Linux / Unix, whould have to learn some Linux stuff just to use MySQL on Windows. Come on, MySQL is a database system, using the SQL standard and that runs fine on Windows. Yes it DOES! And there are some good Windows integration, like the VS plugin, .NET connector and much more. MySQL 5.5 really does do away with many MySQL on Windows limitations also.I recently reported some bugs on this matter, really minor bugs, but things that could easily be fixed and that would make MySQL on Windows a bit more polished. One issue I reported was that there are still Perl-scripts distributed with MySQL for Windows, even in 5.5. Now, installing Perl just to use MySQL is bad enough. But the thing is that many Windows users / developers don't even know what a .pl file is, and that a Perl runtime is needed! If MySQL on Windows really needs Perl to be fully functional (I don't think this should be the case. If Oracle can do without Perl, then MySQL should be able to do this also, but this is a different issue), then ship a Perl runtime with MySQL!The reason I am reporting these minor bugs on MySQL on Windows is not that I dislike or hate this or that technology. I am waaay too old to get that emotional about technology in and of itself. The reason I am doing it is that this is low-hanging fruit on the way to make MySQL work, look and behave really good on Windows./Karlsson]]></description>
			<content:encoded><![CDATA[So you have seen my writings on MySQL on Windows. Most recently regarding MySQL 5.5 and before that on Cluster and 5.1. So, what is the deal? Am I a mean person attacking MySQL? Am I a Windows hater trying to show how badly Windows works? Or maybe a Linux / Unix hater who want to keep those bearded 1970's terminal junkies out of my GUI Windows world?<br /><br />Actually none of those. My ambition is to point out this that should be addressed in MySQL for Windows to make it more Windows friendly, for <span>Windows users and developers</span>. As MySQL on Windows stands right now,, it is OK for the Linux / Unix user user who also wants to run on Windows, and for those with cross-platform knowledge and ambition who want to run MySQL across the range. And I put myself among those. But I also want the Windows hard-core users to find out about, use and love MySQL. And MySQL sure could do much more in that area, but before that happens, we (yes <span>we</span>. We who are cross platform folks, we who who can take the time to check things out a bit and has somewhat of an understanding of what those rough edges are and we who care about MySQL and it's adoption on <span>ALL</span> platforms).<br /><br />I really do not think that a Windows user, who is not used to Linux / Unix, whould have to learn some Linux stuff just to use MySQL on Windows. Come on, MySQL is a database system, using the SQL standard and that runs fine on Windows. Yes it DOES! And there are some good Windows integration, like the VS plugin, .NET connector and much more. MySQL 5.5 really does do away with many MySQL on Windows limitations also.<br /><br />I recently reported some bugs on this matter, really minor bugs, but things that could easily be fixed and that would make MySQL on Windows a bit more polished. One issue I reported was that there are still Perl-scripts distributed with MySQL for Windows, even in 5.5. Now, installing Perl just to use MySQL is bad enough. But the thing is that many Windows users / developers don't even know what a <span>.pl</span> file is, and that a Perl runtime is needed! If MySQL on Windows really needs Perl to be fully functional (I don't think this should be the case. If Oracle can do without Perl, then MySQL should be able to do this also, but this is a different issue), then ship a Perl runtime with MySQL!<br /><br />The reason I am reporting these minor bugs on MySQL on Windows is not that I dislike or hate this or that technology. I am <span>waaay too old</span> to get that emotional about technology in and of itself. The reason I am doing it is that this is low-hanging fruit on the way to make MySQL work, look and behave really good on Windows.<br /><br />/Karlsson<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/9144505959002328789-4113383158444436273?l=karlssonondatabases.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26615&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26615&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/11/30/what-me-grumpy-me-or-mysql-on-windows-whats-the-deal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

