<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>FromDual GmbH</title><link>https://www.fromdual.com/blog/abdel-mawla/</link><description>Recent content on FromDual GmbH</description><generator>Hugo</generator><language>en-GB</language><managingEditor>oli.sennhauser@fromdual.com (Oli Sennhauser)</managingEditor><webMaster>oli.sennhauser@fromdual.com (Oli Sennhauser)</webMaster><copyright>© FromDual GmbH</copyright><lastBuildDate>Fri, 19 Jan 2024 17:30:18 +0000</lastBuildDate><atom:link href="https://www.fromdual.com/blog/abdel-mawla/index.xml" rel="self" type="application/rss+xml"/><item><title>How to recover deleted tablespace?</title><link>https://www.fromdual.com/blog/how-to-recover-deleted-tablespace/</link><pubDate>Fri, 14 Nov 2014 22:56:17 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/how-to-recover-deleted-tablespace/</guid><description>&lt;p>Sometimes, MySQL tablespace file(s) might be deleted by mistake, e.g. delete the shared tablespace (ibdata1) or an individual tablespace (table_name.ibd).&lt;/p>
&lt;p>In this post I will show you how to recover those files (on Linux OS) having only one condition, MySQL service should still be running. If MySQL service stopped after deleting that file, this method will not work, so it is extremely important to act as quick as possible to avoid data loss.&lt;/p>
&lt;p>The following is a simple table creation (innodb_file_per_table is enabled) and the records count inside that table:&lt;/p>
&lt;pre>&lt;code>SQL&amp;gt; SHOW CREATE TABLE t&amp;lt;br&amp;gt;G
*************************** 1. row ***************************
 Table: t
Create Table: CREATE TABLE `t` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

SQL&amp;gt; SELECT COUNT(*) FROM t;
+----------+
| COUNT(*) |
+----------+
| 22 |
+----------+
1 row in set (0.02 sec)
&lt;/code>&lt;/pre>
&lt;p>Now, lets delete the individual tablespace for that table:&lt;/p>
&lt;pre>&lt;code>shell&amp;gt; rm -rf /var/lib/mysql/test/t.ibd
&lt;/code>&lt;/pre>
&lt;p>At this time, we can still select and modify that table!!&lt;/p>
&lt;pre>&lt;code>SQL&amp;gt; INSERT INTO t VALUES (NULL);
Query OK, 1 row affected (0.00 sec)

SQL&amp;gt; SELECT COUNT(*) FROM t;
+----------+
| COUNT(*) |
+----------+
| 23 |
+----------+
1 row in set (0.00 sec)
&lt;/code>&lt;/pre>
&lt;p>To be more accurate, &lt;code>rm&lt;/code> does not actually delete the file, rather it removes the directory entry pointing to the file&amp;rsquo;s inode. The inode - and in consequence the file - will be removed only if this is the last reference, but as long as the MySQL server process has the file opened, there is another reference which is the open file handle (that&amp;rsquo;s why the &amp;ldquo;mysqld&amp;rdquo; server process must still be running).&lt;/p>
&lt;p>To list the opened files we can use the Linux command &lt;strong>&lt;code>lsof&lt;/code>&lt;/strong> (we filter the output to get only the deleted tablespace information):&lt;/p>
&lt;pre>&lt;code>shell&amp;gt; lsof |grep t.ibd
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 11401 mysql 25uW …&lt;/code>&lt;/pre></description></item><item><title>Things you should consider before using GTID</title><link>https://www.fromdual.com/blog/things-you-should-consider-before-using-gtid/</link><pubDate>Fri, 14 Nov 2014 16:50:19 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/things-you-should-consider-before-using-gtid/</guid><description>&lt;p>Global Transaction ID (&lt;a href="http://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html" target="_blank" title="GTID">GTID&lt;/a>) is one of the major features that were introduced in MySQL 5.6 which provides a lot of benefits.
I have talked about the GTID concept, implementation and possible troubleshooting at &lt;a href="https://www.percona.com/live/london-2014/program" target="_blank" title="Percona Live London 201">Percona Live London 2014&lt;/a>, you can download the slides from &lt;a href="http://fromdual.com/presentations" target="_blank" title="presentations">our presentations repository&lt;/a> or from &lt;a href="https://www.percona.com/live/london-2014/sessions/gtid-replication-implementation-and-troubleshooting" target="_blank" title="my session at Percona Live">my session at Percona Live&lt;/a>.&lt;/p>
&lt;p>On the other hand, there are some important things you should consider before deploying GTID in production, I&amp;rsquo;m going to list them here in this blog post.&lt;/p>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/things-you-should-consider-before-using-gtid/#migration">Migration to GTID replication&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/things-you-should-consider-before-using-gtid/#non-transactionally-safe">Non transactionally safe statement will raise errors now&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/things-you-should-consider-before-using-gtid/#performance">MySQL Performance in GTID&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/things-you-should-consider-before-using-gtid/#mysql_upgrade">mysql_upgrade script&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/things-you-should-consider-before-using-gtid/#errant-transactions">Errant transactions!&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/things-you-should-consider-before-using-gtid/#slave-filtration">Filtration on the slave&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/things-you-should-consider-before-using-gtid/#conclusion">Conclusion&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;span id="migration">&lt;/span>&lt;/p>
&lt;h3 id="migration-to-gtid-replication">Migration to GTID replication&lt;/h3>
&lt;p>It is required to shutdown MySQL service on all servers in the replication setup in order to perform the &lt;a href="http://fromdual.com/gtid_in_action#migration" target="_blank" title="GTID Migration">migration from classic replication (based on binary logs information) to the transaction-based (GTID) replication&lt;/a> which means that the migration process requires downtime.&lt;/p>
&lt;p>The online migration to GTID replication is not yet available.
&lt;a href="https://www.facebook.com/" target="_blank" title="Facebook">Facebook&lt;/a> and &lt;a href="http://www.booking.com/" target="_blank" title="Booking.com">Booking.com&lt;/a> provided some MySQL patches for this, but they are not yet contained in Oracle&amp;rsquo;s binaries.
So, if you can&amp;rsquo;t afford a downtime during the migration process, then you might not be able to make the change.&lt;/p>
&lt;p>&lt;span id="non-transactionally-safe">&lt;/span>&lt;/p>
&lt;h3 id="non-transactionally-safe-statement-will-raise-errors-now">Non transactionally safe statement will raise errors now&lt;/h3>
&lt;p>It is required to enable the system variable (enforce_gtid_consistency) on all servers inside the GTID replication setup which prevent executing the non transactionally safe statements (check &lt;a href="http://dev.mysql.com/doc/refman/5.6/en/replication-gtids-restrictions.html" target="_blank" title="GTID restrictions">GTID restrictions&lt;/a>) like:&lt;/p>
&lt;ul>
&lt;li>CREATE TABLE .. SELECT.&lt;/li>
&lt;li>CREATE TEMPORARY TABLE (inside a transaction).&lt;/li>
&lt;li>Statements that update non-transactional tables inside a transaction.&lt;/li>
&lt;/ul>
&lt;p>So, you will have to fix your application first if it contains any of the above statements before using GTID replication.&lt;/p>
&lt;p>&lt;span id="performance">&lt;/span>&lt;/p>
&lt;h3 id="mysql-performance-in-gtid">MySQL Performance in GTID&lt;/h3>
&lt;p>It is required to enable the variables (bin_log and log_slave_updates) on - at least - the slave servers which affects the performance on those slaves negatively. …&lt;/p></description></item><item><title>Galera Cluster and XA Transactions</title><link>https://www.fromdual.com/blog/galera-cluster-and-xa-transactions/</link><pubDate>Thu, 23 Oct 2014 23:47:03 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/galera-cluster-and-xa-transactions/</guid><description>&lt;p>A few weeks ago, we received an interesting Galera Cluster support case from one of our customers that the application is not working well and they face a lot of troubles in their Galera Cluster setup.&lt;/p>
&lt;p>After some investigations, we found a lot of insert queries in state &amp;ldquo;query end&amp;rdquo; and lasting for long time without being completed. Also some other queries which were sleeping for long time having the info of &amp;ldquo;XA COMMIT&amp;rdquo;:&lt;/p>
&lt;pre>&lt;code>SQL&amp;gt; SHOW PROCESSLIST;

27 user host:33214 foodmart Query 14440 sleeping XA COMMIT 0x31302e31312e31332e34372e746d30303336383030303031,0x31302e31312e31332e34372e746d333638,0x

SQL&amp;gt; SHOW ENGINE INNODB STATUS;

TRANSACTIONS
============
---TRANSACTION 2DE71D, ACTIVE 14459 sec
9 lock struct(s), heap size 1248, 1 row lock(s), undo log entries 115
MySQL thread id 27, OS thread handle 0x7fc21a42c700, query id 96187 host host-ip foodmart sleeping
XA COMMIT 0x31302e31312e31332e34372e746d30303336383030303031,0x31302e31312e31332e34372e746d333638,0x41544f4d ONE PHASE
&lt;/code>&lt;/pre>
&lt;p>XA means e&lt;strong>X&lt;/strong>tended &lt;strong>A&lt;/strong>rchitecture and &amp;ldquo;XA COMMIT&amp;rdquo; statement is one of the distributed transactions (&lt;a href="http://dev.mysql.com/doc/refman/5.6/en/xa.html" target="_blank" title="XA Transactions">XA Transactions&lt;/a>) commands which are clearly NOT supported in Galera Cluster and one of its &lt;a href="http://galeracluster.com/documentation-webpages/limitations.html" target="_blank" title="Galera Cluster Limitations">limitations&lt;/a> because of possible rollback on commit.&lt;/p>
&lt;p>The following command can be used to check if XA Transactions are being used by your application or not:&lt;/p>
&lt;pre>&lt;code>SQL&amp;gt; SHOW GLOBAL STATUS LIKE 'Com_xa%';
 
+-------------------+---------+
| Variable_name | Value |
+-------------------+---------+
| Com_xa_commit | 2828094 |
| Com_xa_end | 2828221 |
| Com_xa_prepare | 0 |
| Com_xa_recover | 2205697 |
| Com_xa_rollback | 42 |
| Com_xa_start | 2828305 |
+-------------------+---------+
6 rows in set (0.00 sec)
&lt;/code>&lt;/pre>
&lt;p>There are only two possible solutions for this problem:&lt;/p>
&lt;ul>
&lt;li>Get rid of all XA transactions in the application to get the Galera Cluster work.&lt;/li>
&lt;li>Use another HA solution (Active/passive, Master/Slave, &amp;hellip; etc) but not Galera Cluster.&lt;/li>
&lt;/ul>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;ul>
&lt;li>XA transactions can not …&lt;/li>&lt;/ul></description></item><item><title>GTID Replication talk at Percona Live London 2014</title><link>https://www.fromdual.com/blog/gtid-replication-talk-pluk-2014/</link><pubDate>Tue, 21 Oct 2014 14:58:10 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/gtid-replication-talk-pluk-2014/</guid><description>&lt;p>&lt;a href="http://www.percona.com/live/london-2014/">&lt;img src="http://s0.percona.com/percona-live/pluk14/118x239_UKSpeaking_14.png" title="Percona Live London, November 3-4, 2014" width="118" height="239" alt="Percona Live London, November 3-4, 2014" />&lt;/a>&lt;/p>
&lt;p>Global Transaction ID (GTID) is a new feature coming with MySQL 5.6 which introduced a new MySQL replication method called Transaction-based Replication that is depend on GTID.&lt;/p>
&lt;p>In a few weeks, I will be speaking at &lt;a href="http://www.percona.com/live/london-2014/" target="_blank" title="Percona Live London 2014">Percona Live London 2014&lt;/a> (November 3-4) about &amp;ldquo;&lt;a href="https://www.percona.com/live/london-2014/sessions/gtid-replication-implementation-and-troubleshooting" target="_blank" title="GTID REPLICATION">Transaction-based REPLICATION (GTID) - IMPLEMENTATION AND TROUBLESHOOTING&lt;/a>&amp;rdquo;. I&amp;rsquo;ll talk about how to implement GTID replication in different scenarios and how to troubleshoot most of the common issues in GTID replication.&lt;/p>
&lt;p>Anyone interested in learning more about GTID replication or planing to go with GTID replication in production should attend this talk.&lt;/p>
&lt;p>Face-to-face meetings are very welcome, please let me know if you are interested so we can schedule a meeting.&lt;/p>
&lt;p>Looking forward to seeing you there!!&lt;/p></description></item><item><title>How to install multiple MySQL instances on a single host using MyEnv?</title><link>https://www.fromdual.com/blog/how-to-install-multiple-mysql-instances-on-a-single-host-using-myenv/</link><pubDate>Thu, 16 Oct 2014 16:36:51 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/how-to-install-multiple-mysql-instances-on-a-single-host-using-myenv/</guid><description>&lt;p>We have been asked several times by MySQL users about how to install multiple MySQL instances on a single host.&lt;br>
Typically, this is required when testing different MySQL versions or MySQL servers (MySQL server, Percona server and MariaDB server) while no available resources are available.&lt;br>
Sometimes, it is even required to install multiple MySQL instances on a single production server.&lt;/p>
&lt;p>In this article, I&amp;rsquo;ll go through the steps needed to install multiple MySQL instances on a single host (using the tar balls binaries) and how our popular tool &lt;a href="http://fromdual.com/myenv-mysql-basenv" target="_blank" title="MyEnv">MyEnv&lt;/a> can make such process so easy.&lt;/p>
&lt;h2 id="prepare-mysql-environment">Prepare MySQL environment&lt;/h2>
&lt;pre>&lt;code>[root@centos-temp ~]# groupadd mysql
[root@centos-temp ~]# useradd -g mysql mysql
[root@centos-temp ~]# su - mysql
[mysql@centos-temp:~]$ mkdir ~/product
[mysql@centos-temp:~]$ mkdir ~/data
[mysql@centos-temp ~]$ cd /downloads
[mysql@centos-temp ~]$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
[mysql@centos-temp ~]$ cd ~/product
[mysql@centos-temp ~]$ tar xf /downloads/mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
[mysql@centos-temp ~]$ ln -s mysql-5.6.21-linux-glibc2.5-x86_64 mysql-5.6.21
&lt;/code>&lt;/pre>
&lt;h2 id="install-myenv">Install MyEnv&lt;/h2>
&lt;p>MyEnv can be downloaded from &lt;a href="http://fromdual.com/download#myenv" target="_blank">here&lt;/a> and the installation steps are listed &lt;a href="http://fromdual.com/myenv-mysql-basenv#install_myenv" target="_blank">here&lt;/a>.&lt;/p>
&lt;h2 id="install-the-first-instance-named-master">Install the first instance (named master)&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>Launch the myenv installer:&lt;/p>
&lt;pre>&lt;code>[mysql@centos-temp ~]$ ~/product/myenv/bin/installMyEnv.sh
PHP is installed on /usr/bin/php
Starting MyEnv installer: /home/mysql/product/myenv-1.1.2/bin/installMyEnv.php


Configuration file /etc/myenv/myenv.conf does NOT exist.
Copy from template or abort (T, a): 
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>Since this is the first instance, the myenv config file does not exist yet, we take the template (t):&lt;/p>
&lt;pre>&lt;code>Copy from template or abort (T, a): t
Copy /home/mysql/product/myenv-1.1.2/etc/myenv.conf.template to /etc/myenv/myenv.conf
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>Then MyEnv will detect that no instances are there, we choose the first option (a) to add a new instance:&lt;/p>
&lt;pre>&lt;code>No instance exists yet.
An instance is the same as a mysqld process.

What do you want to do next?
o Add a new instance,
o …&lt;/code>&lt;/pre>&lt;/li>&lt;/ul></description></item><item><title>Galera Cluster VS PXC VS MariaDB Galera Cluster - Benchmarking</title><link>https://www.fromdual.com/blog/galera-cluster-vs-pxc-vs-mariadb-galera-cluster-benchmarking/</link><pubDate>Thu, 07 Aug 2014 15:36:29 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/galera-cluster-vs-pxc-vs-mariadb-galera-cluster-benchmarking/</guid><description>&lt;p>It is not clear for many MySQL users that &lt;a href="http://www.percona.com/software/percona-xtradb-cluster" target="_blank" title="Percona XtraDB Cluster">Percona XtraDB Cluster&lt;/a> (PXC) and &lt;a href="https://mariadb.com/kb/en/mariadb/mariadb-documentation/replication-cluster-multi-master/galera/what-is-mariadb-galera-cluster" target="_blank" title="MariaDB Galera Cluster">MariaDB Galera Cluster&lt;/a> depend on the same Galera library i.e used in &lt;a href="http://galeracluster.com" target="_blank" title="Galera Cluster">Galera Cluster&lt;/a> for MySQL which is provided by Codership team:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Galera Cluster:&lt;/strong> MySQL Server (by Oracle) + Galera library.&lt;/li>
&lt;li>&lt;strong>Percona XtraDB Cluster:&lt;/strong> Percona Server + Galera library.&lt;/li>
&lt;li>&lt;strong>MariaDB Galera Cluster:&lt;/strong> MariaDB Server + Galera library.&lt;/li>
&lt;/ul>
&lt;p>But the question is, are there any performance differences between the three of them ?&lt;/p>
&lt;p>Let&amp;rsquo;s discover that by doing some simple benchmark to test MySQL write performance in Galera Cluster, PXC and MariaDB Galera Cluster installations.&lt;/p>
&lt;h2 id="system-information">System Information:&lt;/h2>
&lt;h3 id="hw-configurations-aws-servers">HW configurations (AWS Servers):&lt;/h3>
&lt;h4 id="nodes-servers-hw-configurations">Nodes Servers HW configurations:&lt;/h4>
&lt;ul>
&lt;li>CPU: Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz (# of cores 8, &lt;br># of threads 16, HT enabled).&lt;/li>
&lt;li>Memory: 16GB RAM.&lt;/li>
&lt;li>Storage: HDD 120GB/ 5400RPM.&lt;/li>
&lt;/ul>
&lt;h4 id="load-balancer-server-hw-configurations">Load balancer Server HW configurations:&lt;/h4>
&lt;ul>
&lt;li>CPU: Intel(R) Xeon(R) CPU E5-2651 v2 @ 1.80GHz (# of cores 4, &lt;br># of threads 8, HT enabled).&lt;/li>
&lt;li>Memory: 16GB RAM.&lt;/li>
&lt;li>Storage: HDD 10GB/ 5400RPM.&lt;/li>
&lt;/ul>
&lt;h4 id="load-generator-server-hw-configurations">Load generator Server HW configurations:&lt;/h4>
&lt;ul>
&lt;li>CPU: Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz (# of cores 16, &lt;br># of threads 32, HT enabled).&lt;/li>
&lt;li>Memory: 32GB RAM.&lt;/li>
&lt;li>Storage: HDD 10GB/ 5400RPM.&lt;/li>
&lt;/ul>
&lt;h3 id="software-configurations">Software configurations:&lt;/h3>
&lt;ul>
&lt;li>OS : Red Hat Enterprise Linux Server release 6.5 (Santiago)&lt;/li>
&lt;li>Sysbench : 0.5.3&lt;/li>
&lt;li>GLB : 1.0.0&lt;/li>
&lt;li>Galera Cluster : 5.5.34 and 5.6.16&lt;/li>
&lt;li>Percona XtraDB Cluster : 5.5.37 and 5.6.19&lt;/li>
&lt;li>MariaDB Galera Cluster : 5.5.38 and 10.0.12&lt;/li>
&lt;li>Galera Library : 3.5&lt;/li>
&lt;/ul>
&lt;h3 id="test-information">Test Information:&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>The testing environment consists of 5 AWS servers, three servers for a three-node cluster (each node is installed on a single server), one server for the load balancer and the final server for the load generator in which sysbench is installed to send requests to the load balancer from.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Sysbench command: &lt;code>sysbench --num-threads=64 --max-requests=1000 --db-driver=mysql --test=/usr/share/doc/sysbench/tests/db/oltp.lua --mysql-table-engine=InnoDB --mysql-user=dev --mysql-password='test' --mysql-host=load_balancer_ip run&lt;/code> .&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Table structure which was used …&lt;/p>&lt;/li>&lt;/ul></description></item><item><title>RE: EMPTY TRANSACTIONS CAN BE DANGEROUS</title><link>https://www.fromdual.com/blog/replication-troubleshooting-classic-vs-gtid/comment-956/</link><pubDate>Mon, 07 Jul 2014 12:45:28 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/replication-troubleshooting-classic-vs-gtid/comment-956/</guid><description>&lt;p>If you used the combination of Percona tools (pt-table-checksum and pt-table-sync) - as I mentioned - to get the data synchronized after injecting an empty transaction and starting the slave you won&amp;rsquo;t face that problem. Otherwise, yes this could be dangerous if that slave promoted to be master AND the other slaves didn&amp;rsquo;t replicate that transaction yet or when you take a database backup from that slave as well.&lt;/p></description></item><item><title>Replication Troubleshooting - Classic VS GTID</title><link>https://www.fromdual.com/blog/replication-troubleshooting-classic-vs-gtid/</link><pubDate>Fri, 04 Jul 2014 15:05:58 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/replication-troubleshooting-classic-vs-gtid/</guid><description>&lt;p>In previous posts, I was talking about how to set up MySQL replication, &lt;a href="http://fromdual.com/how_to_setup_mysql_master-slave_replication" target="_blank" title="How to Setup MySQL Replication">Classic Replication&lt;/a> (based on binary logs information) and &lt;a href="http://fromdual.com/gtid_in_action" target="_blank" title="GTID In Action">Transaction-based Replication&lt;/a> (based on GTID). In this article I&amp;rsquo;ll summarize how to troubleshoot MySQL replication for the most common issues we might face with a simple comparison how can we get them solved in the different replication methods (Classic VS GTID).&lt;/p>
&lt;p>There are two main operations we might need to do in a replication setup:&lt;/p>
&lt;ul>
&lt;li>Skip or ignore a statement that causes the replication to stop.&lt;/li>
&lt;li>Re-initialize a slave when the Replication is broke and could not be started anymore.&lt;/li>
&lt;/ul>
&lt;h2 id="skip-or-ignore-statement">Skip or Ignore statement&lt;/h2>
&lt;p>Basically, the slave should be always synchronized with its master having the same copy of data, but for some reasons there might be inconsistency between both of them (unsafe statement in SBR, Slave is not read_only and was modified apart of replication queries, .. etc) which causes errors and stops the replication, e.g. if the master inserted a record which was already inserted on the slave (Duplicate entry) or updated/deleted a row which was not exist on the slave, &amp;hellip; etc.&lt;/p>
&lt;p>To solve this issue, we have to either reverse what we have done on the slave (e.g. delete the inserted rows) if that was made by mistake and is known or we can skip executing those statements on the slave and continue the replication again (I&amp;rsquo;ll focus on skipping a statement in this post as it needs different interaction in Classic and GTID replication).&lt;/p>
&lt;h5 id="sample-error-messages-from-show-slave-status-output">Sample error messages (from &lt;code>SHOW SLAVE STATUS&lt;/code> output):&lt;/h5>
&lt;pre>&lt;code>Last_SQL_Error: Could not execute Write_rows event on table test.t1; Duplicate entry '4' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000304, end_log_pos 285

Last_SQL_Error: Could not execute Update_rows event on table test.t1; Can't find record in 't1', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000304, end_log_pos 492

Last_SQL_Error: Could not execute Delete_rows event on …&lt;/code>&lt;/pre></description></item><item><title>MySQL 5.5 and 5.6 ?!</title><link>https://www.fromdual.com/blog/replication-channel-fail-over-with-galera-cluster-for-mysql/comment-954/</link><pubDate>Fri, 27 Jun 2014 14:04:00 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/replication-channel-fail-over-with-galera-cluster-for-mysql/comment-954/</guid><description>&lt;p>Just to confirm, the above channel failover steps are valid in Galera Cluster for both MySQL versions 5.5 and 5.6.
Enjoy!!&lt;/p></description></item><item><title>GTID In Action</title><link>https://www.fromdual.com/blog/gtid_in_action/</link><pubDate>Thu, 12 Jun 2014 14:09:05 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/gtid_in_action/</guid><description>&lt;p>In a previous post I was talking about &lt;a href="http://fromdual.com/how_to_setup_mysql_master-slave_replication" target="_blank" title="How to Setup MySQL Replication">How to Setup MySQL Replication&lt;/a> using the classic method (based on binary logs information). In this article I&amp;rsquo;ll go through the transaction-based replication implementation using &lt;a href="http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html" target="_blank" title="GTID Replication">GTID&lt;/a> in different scenarios.&lt;/p>
&lt;p>The following topics will be covered in this blog:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/gtid_in_action/#concept">What is the concept of GTID protocol?&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/gtid_in_action/#implementation">GTID Replication Implementation&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/gtid_in_action/#fresh_installation">Fresh Installations&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/gtid_in_action/#add_new_slave">Adding New Slave&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/gtid_in_action/#migration">Migration from classic replication to GTID replication&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/gtid_in_action/#perform_migration">How to perform the migration?&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/gtid_in_action/#online_migration">Is online migration from classic to GTID replication available?&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/gtid_in_action/#workaround">Workaround ??&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/gtid_in_action/#benefits">GTID Benefits&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="what-is-the-concept-of-gtid-protocol">&lt;span id="concept">What is the concept of GTID protocol?&lt;/span>&lt;/h2>
&lt;p>GTID is a Global Transaction IDentifier which introduced in MySQL 5.6.5. It&amp;rsquo;s not only unique on the server it was originated but it&amp;rsquo;s unique among all servers in a replication setup.&lt;br>
GTID also guarantee consistency because once a transaction is committed on a server, any other transaction having the same GTID will be ignored, i.e. a committed transaction on a master will be applied only once on the slaves.&lt;/p>
&lt;p>GTID consists of two parts separated by a column {source_id:transactions_id}.&lt;/p>
&lt;p>&lt;strong>WHERE&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>source_id:&lt;/strong> Normally the server&amp;rsquo;s UUID on which the transaction originates. e.g. &amp;ldquo;&lt;code>b9b4712a-df64-11e3-b391-60672090eb04&lt;/code>&amp;rdquo; .&lt;/li>
&lt;li>&lt;strong>transaction_id:&lt;/strong> A sequence number determining the order of the committed transaction.&lt;/li>
&lt;/ul>
&lt;p>The following is the GTID for the third transaction on a server having the uuid &amp;ldquo;b9b4712a-df64-11e3-b391-60672090eb04&amp;rdquo;:&lt;br>
&lt;code>b9b4712a-df64-11e3-b391-60672090eb04:3&lt;/code>&lt;/p>
&lt;p>As a new protocol in MySQL there is a set of new related variables, the following are the most important ones (IMHO):&lt;/p>
&lt;ul>
&lt;li>&lt;strong>gtid-mode:&lt;/strong> ON|OFF to enable or disable GTID, this is not a Boolean variable (0 and 1 are not acceptable).&lt;/li>
&lt;li>&lt;strong>enforce-gtid-consistency:&lt;/strong> prevent executing the non transactionally safe statements, like:
&lt;ul>
&lt;li>CREATE TABLE .. SELECT.&lt;/li>
&lt;li>CREATE TEMPORARY TABLE (inside a transaction).&lt;/li>
&lt;li>Statements that update nontransactional tables inside a transaction.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>gtid_purged:&lt;/strong> The set of transactions that have …&lt;/li>&lt;/li>&lt;/ul>&lt;/li>&lt;/ul>&lt;/ul>&lt;/li>&lt;/li>&lt;/ul>&lt;/li>&lt;/ul></description></item><item><title>COMMIT!</title><link>https://www.fromdual.com/blog/mysql-total-record-count-issue/comment-948/</link><pubDate>Wed, 04 Jun 2014 08:16:14 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/mysql-total-record-count-issue/comment-948/</guid><description>&lt;p>Kalasha,&lt;/p>
&lt;p>Since autocommit is disabled, did you issue &amp;ldquo;COMMIT&amp;rdquo; after inserting those records ?
If not, then you have to either enable autocommit or commit your DML statements manually (issue &amp;ldquo;COMMIT&amp;rdquo; or execute DDL statement)&lt;/p></description></item><item><title>Loading "Digest::SHA1" instead</title><link>https://www.fromdual.com/blog/mpm-upgrade-to-0.9.2/comment-923/</link><pubDate>Thu, 08 May 2014 10:50:07 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/mpm-upgrade-to-0.9.2/comment-923/</guid><description>&lt;p>Obyis,&lt;/p>
&lt;p>Try to load &amp;ldquo;Digest::SHA1&amp;rdquo; instead of &amp;ldquo;Digest::SHA&amp;rdquo; at the beginning of &amp;ldquo;InnoDbStatus.pm&amp;rdquo; file by replacing &amp;ldquo;use Digest::SHA&amp;rdquo; with &amp;ldquo;use Digest::SHA1&amp;rdquo;.
It should work after that.&lt;/p></description></item><item><title>How to Setup MySQL Master/Slave Replication ?</title><link>https://www.fromdual.com/blog/how_to_setup_mysql_master-slave_replication/</link><pubDate>Thu, 24 Apr 2014 15:53:07 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/how_to_setup_mysql_master-slave_replication/</guid><description>&lt;p>It&amp;rsquo;s not usual to find an easy source on how to setup MySQL replication, I thought it might be useful at least for the beginners to write a direct and simple howto blog on setting up Master/Slave replication in MySQL using the classic method (binary log information). Check out my post &lt;a href="http://fromdual.com/gtid_in_action" target="_blank" title="GTID In Action">GTID In Action&lt;/a> for information about transaction-based replication using GTID.&lt;/p>
&lt;p>Before going through the replication setup steps, I think it&amp;rsquo;s better to explain first how Replication works in MySQL.&lt;/p>
&lt;p>MySQL replication mainly consists of three-part process:&lt;/p>
&lt;ul>
&lt;li>The master server records all data changes to its binary logs (binary log events) and send it to the slave using a thread called (&lt;strong>Binlog dump thread&lt;/strong>) once the slave connects to the master.&lt;/li>
&lt;li>The slave copies the binary log events sent by the master&amp;rsquo;s binlog dump thread to its relay logs using a thread called (&lt;strong>Slave I/O thread&lt;/strong>).&lt;/li>
&lt;li>The slave applies these changes from the relay logs to its data by replaying (executing) all events using a thread called (&lt;strong>Slave SQL thread&lt;/strong>).&lt;/li>
&lt;/ul>
&lt;p>Now, lets go through the setup process which is divided into 3 main sections (assuming you have already installed MySQL on master and slave servers):&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/how_to_setup_mysql_master-slave_replication/#master_config">Master&amp;rsquo;s side configurations&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/how_to_setup_mysql_master-slave_replication/#slave_config">Slave&amp;rsquo;s side configurations&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/how_to_setup_mysql_master-slave_replication/#troubleshooting">Replication checking and troubleshooting&lt;/a>.&lt;/li>
&lt;/ul>
&lt;h2 id="masters-side-configuration">&lt;span id="master_config">Master&amp;rsquo;s side configuration&lt;/span>:&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>Add the following variables to the MySQL configuration file (my.cnf):&lt;/p>
&lt;pre>&lt;code>[mysqld]
server-id=1 ## must be unique
log-bin=mysql-bin
binlog_format=ROW
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>Restart MySQL so that configuration changes take place:&lt;/p>
&lt;pre>&lt;code>shell&amp;gt; /etc/init.d/mysql restart
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>Create a MySQL user to be used by the slave:&lt;/p>
&lt;pre>&lt;code>SQL&amp;gt; GRANT REPLICATION SLAVE ON *.* TO 'slave_user_name'@'slave_ip' IDENTIFIED BY 's3cret';
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>Take a full snapshot from the master&amp;rsquo;s databases:&lt;/p>
&lt;pre>&lt;code>shell&amp;gt; mysqldump -u root -p --all-databases --flush-privileges --single-transaction --master-data=2 --flush-logs --triggers --routines --events --hex-blob &amp;gt;/path/to/backupdir/full_backup-$TIMESTAMP.sql
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>Note:&lt;/strong>&lt;/p>
&lt;p>If you have MyISAM tables you should omit the option …&lt;/p>&lt;/li>&lt;/ul></description></item><item><title>Setting the right GCache size in Galera Cluster</title><link>https://www.fromdual.com/blog/gcache_size_in_galera_cluster/</link><pubDate>Thu, 17 Apr 2014 13:52:10 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/gcache_size_in_galera_cluster/</guid><description>&lt;p>One of our customers had a question related to the right value of Galera Cache size (gcache.size) in &lt;a href="http://fromdual.com/galera-cluster-for-mysql" target="_blank" title="Galera Cluster for MySQL">Galera Cluster for MySQL&lt;/a> which I would like to share with you.&lt;/p>
&lt;p>&lt;strong>The question was:&lt;/strong> My maintenance window takes 4 hours for my 5TB DB. How can I avoid an SST ?!&lt;/p>
&lt;p>Basically, having too small GCache size will lead to SST (Snapshot State Transfer) instead of IST (Incremental State Transfer), thus we can avoid the SST by setting the GCache to the appropriate value.&lt;/p>
&lt;p>To check the current value of the GCache size:&lt;/p>
&lt;pre>&lt;code>mysql&amp;gt; SHOW GLOBAL VARIABLES LIKE 'wsrep_provider_options'&amp;lt;br&amp;gt;G
Variable_name: wsrep_provider_options
 Value: base_host = 192.168.1.12;
.
.
.
gcache.page_size = 128M; gcache.size = 128M; gcs.fc_debug = 0;
.
.
.
&lt;/code>&lt;/pre>
&lt;p>The value of GCache size could be changed by adding the following line in the my.cnf file and restarting the node (it could NOT be changed online):&lt;/p>
&lt;pre>&lt;code>#my.cnf
[mysqld]
wsrep_provider_options=&amp;quot;gcache.size=256M&amp;quot;
&lt;/code>&lt;/pre>
&lt;p>But the question is how can we calculate the right value for GCache size to cover the maintenance window and at the same time not larger than what it needs?&lt;/p>
&lt;p>To answer that question we should first find out how much GCache can handle which could be calculated by the following formula:&lt;/p>
&lt;p>Hold time = GCache size / Replication Rate.&lt;/p>
&lt;p>&lt;strong>Where:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Replication Rate = Amount of replicated data / time.&lt;/li>
&lt;li>Amount of replicated data = (&lt;code>wsrep_replicated_bytes&lt;/code> + &lt;code>wsrep_received_bytes&lt;/code>) after the maintenance window - (&lt;code>wsrep_replicated_bytes&lt;/code> + &lt;code>wsrep_received_bytes&lt;/code>) before the maintenance window.&lt;/li>
&lt;/ul>
&lt;p>The amount of replicated data for the customer&amp;rsquo;s case = 7200MB.&lt;/p>
&lt;p>Now, we can find out how much GCache (default 128M) can handle for the customer&amp;rsquo;s case:&lt;/p>
&lt;p>Hold time = 128MB / (7200MB / 4h) = 128MB / 0.5 MB = 256s.&lt;/p>
&lt;p>Then, we can calculate the right GCache size value to handle the maintenance window by the following formula:&lt;br>
GCache = Maintenance window &lt;br>* Replication Rate = 14400s &lt;br>* 0.5 MB.&lt;br>
GCache = 7200MB.&lt;/p>
&lt;p>In other words, the right GCache size should be equivalent to (or not less than) the amount of …&lt;/p></description></item><item><title>Impact of General Query Log on MySQL Performance</title><link>https://www.fromdual.com/blog/general_query_log_vs_mysql_performance/</link><pubDate>Tue, 08 Apr 2014 11:19:06 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/general_query_log_vs_mysql_performance/</guid><description>&lt;p>Sometimes, it is required to enable the General Query Log (which is disabled by default). If the General Query Log is enabled the server writes to this log information when clients connect or disconnect, and each SQL statement received from the client.&lt;/p>
&lt;p>The question is, does enabling the General Query Log affects the MySQL performance ?&lt;br>
Also, it is possible to record the output of this log into either file or table in the mysql database (mysql.general_log), what is the performance impact of each one?&lt;/p>
&lt;p>Let&amp;rsquo;s do some simple benchmark for those scenarios to measure the actual impact on the mysql performance.&lt;/p>
&lt;h2 id="system-information">System Information:&lt;/h2>
&lt;h3 id="hw-configurations">HW configurations:&lt;/h3>
&lt;ul>
&lt;li>CPU: &lt;a href="http://ark.intel.com/products/64893/Intel-Core-i7-3520M-Processor-4M-Cache-up-to-3_60-GHz" target="_blank" title="Core™ i7-3520M">Intel® Core™ i7-3520M Processor&lt;/a> (4M Cache, up to 3.60 GHz).
&lt;ul>
&lt;li>2 cores, 4 threads, HT enabled.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Memory: 8GB RAM (1600).&lt;/li>
&lt;li>Storage: HDD 1TB/ 5400RPM.&lt;/li>
&lt;/ul>
&lt;h3 id="software-configurations">Software configurations:&lt;/h3>
&lt;ul>
&lt;li>OS: Ubuntu 12.04&lt;/li>
&lt;li>MySQL Server: 5.6.17&lt;/li>
&lt;li>Sysbench: 0.4.12&lt;/li>
&lt;/ul>
&lt;h3 id="test-information">Test Information:&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>Sysbench command: &lt;code>sysbench --num-threads=1 --max-requests=1000 --db-driver=mysql --test=oltp --mysql-table-engine=InnoDB --mysql-user=root run&lt;/code> .&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Table structure which was used by sysbench tests:&lt;/p>
&lt;pre>&lt;code>mysql&amp;gt; show create table sbtest.sbtest&amp;lt;br&amp;gt;G

CREATE TABLE `sbtest` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `k` int(10) unsigned NOT NULL DEFAULT '0',
 `c` char(120) NOT NULL DEFAULT '',
 `pad` char(60) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`),
 KEY `k` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=8574 DEFAULT CHARSET=latin1
&lt;/code>&lt;/pre>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Note:&lt;/strong>&lt;/p>
&lt;p>The test had been made against 1,2,4,8,16 and 32 threads, each throughput/response time value for each thread&amp;rsquo;s number for each test case is generated by the average of ten (10) times execution.&lt;/p>
&lt;h2 id="general-query-log-disabled">General Query Log Disabled:&lt;/h2>
&lt;p>To make sure that the General Query Log is disabled:&lt;/p>
&lt;pre>&lt;code>mysql&amp;gt; show global variables like'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | OFF |
+---------------+-------+
&lt;/code>&lt;/pre>
&lt;p>Testing results:&lt;/p>
&lt;p>&lt;a href="https://www.fromdual.com/sites/default/files/general_log_off.png" target="_blank">&lt;img src="https://www.fromdual.com/sites/default/files/general_log_off.png" title="general_log_off" width="650" alt="general_log_off.png" />&lt;/a>&lt;/p>
&lt;h2 id="general-query-log-enabled">General Query Log enabled:&lt;/h2>
&lt;p>The general query log is a dynamic variable which means that it could be …&lt;/p>&lt;/ul>&lt;/li>&lt;/ul></description></item><item><title>What is the log output?</title><link>https://www.fromdual.com/blog/general-query-log-is-not-working/comment-908/</link><pubDate>Thu, 20 Mar 2014 13:00:20 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/general-query-log-is-not-working/comment-908/</guid><description>&lt;p>Are you using FILE or TABLE as log output ?&lt;br>
Try &amp;ldquo;show global variables like&amp;rsquo;log_output&amp;rsquo;;&amp;rdquo;&lt;/p></description></item><item><title>FLUSH LOGS!</title><link>https://www.fromdual.com/blog/general-query-log-is-not-working/comment-905/</link><pubDate>Thu, 20 Mar 2014 12:26:03 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/general-query-log-is-not-working/comment-905/</guid><description>&lt;p>Kalasha,&lt;br>
You might need to execute the SQL statement (FLUSH LOGS;) and then check the log files.&lt;/p></description></item><item><title>Advantage of pt-online-schema-change</title><link>https://www.fromdual.com/blog/online-ddl_vs_pt-online-schema-change/comment-895/</link><pubDate>Fri, 21 Feb 2014 19:43:17 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/online-ddl_vs_pt-online-schema-change/comment-895/</guid><description>&lt;p>Hi Przemek,&lt;/p>
&lt;p>I do agree with you that the replication will be blocked until the slaves finish executing the alter statement, but the table being changed on the slaves themselves wont be blocked during the alter statement the same like the master.
I agree also that this could be considered as an advantage of pt-online-schema-change over Online DDL.
I&amp;rsquo;ll add that to the blog.
Thanks Przemek for the hint &amp;hellip;&lt;/p></description></item><item><title>Replication in Online DDL</title><link>https://www.fromdual.com/blog/online-ddl_vs_pt-online-schema-change/comment-893/</link><pubDate>Tue, 18 Feb 2014 18:28:00 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/online-ddl_vs_pt-online-schema-change/comment-893/</guid><description>&lt;p>Hi Shlomi&lt;/p>
&lt;p>Can you please explain more on how did you produce your results?&lt;br>
Because Online DDL are DDL statements anyway and will be written to the binary log as statements (even if RBR is being used) which means that it will be executed on the slave the same like it was on the master.&lt;/p>
&lt;p>By the way, I've tested it in a replication environment and the table being changed on the slave was not blocked during the statement execution and it took approximately the same or even less time than it was on the master.&lt;/p>
&lt;p>Also I double checked the online documentation and didn't find any hints about slave blocking with online DDL &lt;a href="http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-limitations.html" target="_blank" title="Limitations">Limitations of Online DDL&lt;/a>.&lt;/p></description></item><item><title>Online DDL vs pt-online-schema-change</title><link>https://www.fromdual.com/blog/online-ddl_vs_pt-online-schema-change/</link><pubDate>Wed, 12 Feb 2014 18:14:22 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/online-ddl_vs_pt-online-schema-change/</guid><description>&lt;p>One of the most expensive database operations is performing Data Definition Language (DDL, e.g. CREATE, DROP, ALTER, etc.) statements, specially, the ALTER statements because MySQL blocks the entire table for both reads and writes while modifying the table.&lt;/p>
&lt;p>For the huge tables, this might take hours to get the table changed which affects the application, so that, a good planning is required for such operations in order to avoid doing these changes during the peak times. For those people who have 24/7 services or limited maintenance window, DDL on huge tables is a really nightmare.&lt;/p>
&lt;p>&lt;a href="http://www.percona.com/" target="_blank" title="Percona">Percona&lt;/a> developed a very good tool called &lt;a href="http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html" target="_blank" title="pt-online-schema-change">&lt;strong>pt-online-schema-change&lt;/strong>&lt;/a> (version 2.2.6 at the time of writing this article) to perform such operations online without blocking/affecting the application and read/write operations to the table being changed is available.
Also &lt;a href="http://www.mysql.com/" target="_blank" title="MySQL">MySQL&lt;/a> made some enhancements for DDL statements and introduced the &lt;a href="http://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl.html" target="_blank" title="Online DDL">&lt;strong>Online DDL&lt;/strong>&lt;/a> feature in MySQL 5.6.&lt;/p>
&lt;p>In this article, I will talk about an overview of both ways (Online DDL &amp;amp; pt-online-schema-change) alongside with an example and which one of them should be used in different scenarios.&lt;/p>
&lt;h2 id="pt-online-schema-change">pt-online-schema-change&lt;/h2>
&lt;h3 id="overview">Overview&lt;/h3>
&lt;p>This tool is developed by Percona to alter tables without locking them during the ALTER operation.
Simply, this tool creates a new empty table like the original table with the needed structure change, copy the data from the original table in small chunks to the new table, drop the original table and then rename the new table to the original name. During the copy process all new changes to the original table are being applied to the new one because a trigger is created on the original table which ensure that all new changes will be applied on the new table.&lt;/p>
&lt;p>For more information about pt-online-schema-change tool, check out &lt;a href="http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html" target="_blank" title="pt-online-schema-change">the manual documentation&lt;/a>.&lt;/p>
&lt;h3 id="example">Example&lt;/h3>
&lt;p>Altering a table called &amp;ldquo;test.test1&amp;rdquo; by adding an index (name_idx) on column &amp;ldquo;name&amp;rdquo;:&lt;/p>
&lt;pre>&lt;code>[root@gcservera ~]# pt-online-schema-change --execute --alter &amp;quot;add index name_idx …&lt;/code>&lt;/pre></description></item><item><title>NDB Alignment</title><link>https://www.fromdual.com/blog/impact-of-column-types-on-mysql-join-performance/comment-874/</link><pubDate>Thu, 12 Dec 2013 23:04:00 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/impact-of-column-types-on-mysql-join-performance/comment-874/</guid><description>&lt;p>Hi Joffrey,&lt;/p>
&lt;p>I think NDB tables use 4-byte alignment not InnoDB:&lt;/p>
&lt;p>&lt;i>&lt;code>NDB&lt;/code> tables use &lt;strong>4-byte alignment&lt;/strong>; all &lt;code>NDB&lt;/code> data storage is done in multiples of 4 bytes. Thus, a column value that would typically take 15 bytes requires 16 bytes in an &lt;code>NDB&lt;/code> table. For example, in &lt;code>NDB&lt;/code> tables, the &lt;code>TINYINT&lt;/code>, &lt;code>SMALLINT&lt;/code>, &lt;code>MEDIUMINT&lt;/code>, and &lt;code>INTEGER&lt;/code> (&lt;code>INT&lt;/code>) column types each require 4 bytes storage per record due to the alignment factor.&lt;/i>&lt;/p>
&lt;p>Check this &lt;a href="http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html" target="_blank" title="Storage Requirements">manual page&lt;/a> for reference.&lt;/p>
&lt;p>Thanks,&lt;br>
Abdel-Mawla&lt;/p></description></item><item><title>Workbench starting/stopping multiple instance set-ups with myenv</title><link>https://www.fromdual.com/blog/workbench-with-multiple-instance-set-ups-and-myenv/</link><pubDate>Sat, 23 Nov 2013 16:03:08 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/workbench-with-multiple-instance-set-ups-and-myenv/</guid><description>&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/workbench-with-multiple-instance-set-ups-and-myenv/#introduction">Introduction&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/workbench-with-multiple-instance-set-ups-and-myenv/#prerequisites">Prerequisites&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/workbench-with-multiple-instance-set-ups-and-myenv/#MyEnv">What is MyEnv?&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/workbench-with-multiple-instance-set-ups-and-myenv/#wb">MySQL Workbench configuration.&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/workbench-with-multiple-instance-set-ups-and-myenv/#add_to_wb">Add MySQL connections to MySQL Workbench.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/workbench-with-multiple-instance-set-ups-and-myenv/#fix_btn">Start/Stop instance configurations.&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>MySQL Workbench is a very good and free GUI tool provided by Oracle to manage MySQL administration and development tasks. Opening many MySQL connections (same or different instances, remote or local MySQL servers) at the same time is one of its main features. While it&amp;rsquo;s working fine to perform SQL statements on the different connections opened for multiple instances, but some people are asking if it is available as well to start and stop multiple MySQL instances using MySQL Workbench? if yes, how to configure it to perform such task? and also does that make any conflict with MyEnv tool - if it&amp;rsquo;s installed - or not?
Yes, MySQL Workbench could be configured to start and stop multiple MySQL instances (local or remote) and it does not make any conflict with MyEnv tool.&lt;/p>
&lt;p>In this article, I will describe how to configure MySQL Workbench to start and stop multiple MySQL instances and getting benefits from MyEnv scripts in this purpose.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;p>System information and installed packages:&lt;/p>
&lt;ul>
&lt;li>Operating System: Ubuntu 12.04 (64 bit) .&lt;/li>
&lt;li>MySQL Server: Any mysql version (I used MySQL 5.5 tarballs).&lt;/li>
&lt;li>Number of MySQL Instances: Two instances are installed (mysql1 &amp;amp; mysql2).&lt;/li>
&lt;li>MySQL Workbench: &lt;a href="http://dev.mysql.com/downloads/tools/workbench/" target="_blank" title="workbench download">Version 6.0&lt;/a> .&lt;/li>
&lt;li>MyEnv: &lt;a href="http://support.fromdual.com/admin/public/download.php?operation=download&amp;amp;file_name=myenv-1.0.1.tar.gz&amp;amp;id=5" target="_blank" title="myenv">Version 1.0.1&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>&lt;span id="MyEnv">&lt;/span>&lt;/p>
&lt;h2 id="what-is-myenv">What is MyEnv?&lt;/h2>
&lt;p>MyEnv is a set of scripts to run comfortably multiple MySQL, Percona Server or MariaDB database instances on the same server. You can even run multiple database instances with different binary versions. If you have MySQL multiple instance setups, you really should try out MyEnv.&lt;/p>
&lt;p>I will not talk more about MyEnv features and its benefits rather, I&amp;rsquo;d like to mention that if you&amp;rsquo;re using MyEnv and want to use MySQL Workbench at the same time, you will not face any conflict between them both and you can manage your MySQL instances by either MyEnv or MySQL Workbench. More over, you …&lt;/p>&lt;/ul>&lt;/li>&lt;/ul></description></item><item><title>Galera 3.1 is now Released</title><link>https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/comment-864/</link><pubDate>Wed, 20 Nov 2013 13:02:18 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/comment-864/</guid><description>&lt;p>I just want to mention here that &lt;a href="http://fromdual.com/galera-cluster-3.1-is-ga" target="_blank" title="Galera 3.1">Galera 3.1 GA is now released&lt;/a> but the online upgrade from MySQL 5.5 to 5.6 has some problems and a workaround should be made (&lt;a href="https://bugs.launchpad.net/codership-mysql/+bug/1251137" target="_blank" title="Galer 3.1 bug">Bug #1251137&lt;/a>) to get this process done.&lt;/p></description></item><item><title>Hi,</title><link>https://www.fromdual.com/blog/monitoring-load-database-in-mysql/comment-861/</link><pubDate>Tue, 19 Nov 2013 22:48:00 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/monitoring-load-database-in-mysql/comment-861/</guid><description>&lt;p>Hi,
&lt;br>&lt;br>
The output you just provided could be gotten by having your database&amp;rsquo;s tables backed up individually and then restore them the same way.
&lt;br>
For this purpose, the backup script should be something like:&lt;/p>
&lt;pre>&lt;blockquote>&lt;code>#!/bin/bash
cd /backup/script/
for x in `cat tables.txt`
do 
echo $x
mysqldump --user=user_name --password='password' database_name $x > /backup/$x.sql

echo 'Table '.$x.' completed ...'
done
echo 'Database backed up successfully ...'
&lt;/pre>&lt;/blockquote>&lt;/code>
&lt;p>Where the tables.txt file contains all tables names separated by new lines.
&lt;br>&lt;br>
And the restore script should be something like:&lt;/p>
&lt;pre>&lt;blockquote>&lt;code>#!/bin/bash
cd /backup/script/
for x in `cat tables.txt`
do 
echo $x
mysql --user=user_name --password='password' database_name &amp;lt; /backup/$x.sql

echo 'Table '.$x.' completed ...'
done
echo 'Database loaded successfully ...'
&lt;/pre>&lt;/blockquote>&lt;/code>
&lt;br>
OR if you have all tables backed up in only one file, you can monitor the whole process progress by using the "pv" command in the restore as follows:
&lt;br>
&lt;pre>&lt;blockquote>&lt;code># pv /backup/database_backup_file.sql | mysql --user=user_name --password='password' database_name
96.8MB 0:00:17 [5.51MB/s] [==> ] 11% ETA 0:02:10
&lt;/pre>&lt;/blockquote>&lt;/code>
&lt;br>
&lt;p>BTW, at the end of each method, you might need to run the &lt;code>mysqlcheck&lt;/code> command against the restored database to double check that everything is going fine after the restore.
&lt;br>&lt;br>
I hope that helped.
&lt;br>&lt;br>
Abdel-Mawla&lt;/p></description></item><item><title>what exactly to be monitored ?</title><link>https://www.fromdual.com/blog/monitoring-load-database-in-mysql/comment-851/</link><pubDate>Fri, 15 Nov 2013 14:36:24 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/monitoring-load-database-in-mysql/comment-851/</guid><description>&lt;p>Hi Srihari,
&lt;br>&lt;br>&lt;/p>
&lt;p>What exactly you want to monitor in MySQL ?&lt;/p></description></item><item><title>Xtrabackup in a nutshell</title><link>https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/</link><pubDate>Wed, 06 Nov 2013 14:23:50 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/</guid><description>&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#introduction">Introduction&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#prerequisites">Prerequisites&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#full">Full Backup&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#fb_create_backup">Create Full Backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#fb_prepare_backup">Prepare Full Backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#fb_restore">Restore Full Backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#fb_restore_slave">Prepare slave from full backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#fb_restore_gtid_slave">Prepare GTID slave from full backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#fb_adv">Advantages / Disadvantages&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#fb_imp">Important Hints&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#incremental">Incremental Backup&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#ib_create_backup">Create Incremental Backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#ib_prepare_backup">Prepare Incremental Backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#ib_restore">Restore Incremental Backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#ib_adv">Advantages / Disadvantages&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#ib_imp">Important Hints&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#diff">Differential Backup&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#partial">Partial Backup&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#pb_create_backup">Create Partial Backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#pb_prepare_backup">Prepare Partial Backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#pb_restore">Restore Partial Backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#pb_adv">Advantages / Disadvantages&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/xtrabackup_in_a_nutshell/#pb_imp">Important Hints&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>No one can deny that one of the most important and daily tasks for DBAs is performing backup and restore operations, we&amp;rsquo;re not required to perform backup and restore operations only when we want to add new replication slave, when we want to implement disaster recovery procedures or when we want to prepare testing or staging server for the running production system, but even if we&amp;rsquo;re going to make any changes to the database schema in order to enhance the database performance, it&amp;rsquo;s recommended to have fresh backup copy before making any live changes, so if backup and restore operations cannot be handled smoothly, we&amp;rsquo;re going to face many troubles in our daily work. If we&amp;rsquo;re going to talk about backup and restore operations, Xtrabackup tool will be strongly appeared.&lt;/p>
&lt;p>Xtrabackup tool is a free open source tool developed by &lt;a href="http://www.percona.com/" target="_blank" title="Percona">Percona&lt;/a> to perform physical backup and restore operations which is much faster than performing logical backup and restore using the MySQL utilities (mysqldump and mysql), and many other advantages.&lt;/p>
&lt;p>Xtrabackup tool has many options and features which are very useful, but in this article, I&amp;rsquo;ll go through only on how to use this tool to perform simple full, incremental and partial backups and restores, advantages and disadvantages of each method and some important tips.&lt;/p>
&lt;p>For more information about Xtrabackup tool, you can browse the manual document from &lt;a href="http://www.percona.com/doc/percona-xtrabackup/2.1/" target="_blank" title="Manual">here&lt;/a>.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;ul>
&lt;li>MySQL server installed.&lt;/li>
&lt;li>&lt;a href="http://www.percona.com/downloads/XtraBackup/LATEST/" target="_blank" title="Latest">Download&lt;/a> the xtrabackup tool.&lt;/li>
&lt;li>Install it …&lt;/li>&lt;/ul>&lt;/ul>&lt;/li>&lt;/li>&lt;/ul>&lt;/li>&lt;/li>&lt;/ul>&lt;/li>&lt;/ul></description></item><item><title>No such way available</title><link>https://www.fromdual.com/blog/user-password-change-date/comment-848/</link><pubDate>Wed, 30 Oct 2013 17:28:00 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/user-password-change-date/comment-848/</guid><description>&lt;p>I don&amp;rsquo;t think that there&amp;rsquo;s such way in MySQL like MSSQL to track users modifications, but you can check the general log file (if it&amp;rsquo;s enabled) and search for all DCL statements related to the user in question.
In the general log file, MySQL records all commands received by the client along with the issuance timestamp.
I hope that helps..&lt;/p></description></item><item><title>Querying the GLB, draining, removing and adding nodes in CentOS</title><link>https://www.fromdual.com/blog/mysql-and-galera-load-balancer/comment-846/</link><pubDate>Sun, 27 Oct 2013 23:26:00 +0200</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/mysql-and-galera-load-balancer/comment-846/</guid><description>&lt;p>Thanks Oli for the very helpful post, it really helped me to understand how to use and operate GLB, but I'd like to mention here that the option "-q" works only in Ubuntu, but in CentOS, it should be replaced by "-s" to be used as follows:&lt;/p> 
- To query the GLB on CentOS, the following command should be used instead:
&lt;pre>&lt;blockquote> &lt;code>echo getinfo | nc -s 1 127.0.0.1 4444&lt;/blockquote> &lt;/code>&lt;/pre>
&lt;p>&lt;br>&lt;p>- To drain a node from the GLB, the following command should be used:&lt;/p>&lt;/p>
&lt;pre>&lt;blockquote> &lt;code>echo 192.168.56.101:3306:0 | nc -s 1 127.0.0.1 4444&lt;/blockquote> &lt;/code>&lt;/pre>
&lt;p>&lt;br>&lt;p>- To add or remove a node from the GLB, the following commands should be used:&lt;/p>&lt;/p>
&lt;pre>&lt;blockquote> &lt;code>echo 192.168.56.103:3306:-1 | nc -s 1 127.0.0.1 4444&lt;/blockquote> &lt;/code>
&lt;blockquote> &lt;code>echo 192.168.56.103:3306:1 | nc -s 1 127.0.0.1 4444&lt;/blockquote> &lt;/code>&lt;/pre></description></item><item><title>Upgrade from Galera Cluster 2.x to 3.0</title><link>https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/</link><pubDate>Thu, 24 Oct 2013 21:25:22 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/</guid><description>&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#introduction">Introduction&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#prerequisites">Prerequisites&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#system_information">System information&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#installed_packages">Installed packages&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#required_packages">Required packages&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#upgrade_1_node">Upgrade the first node&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#upgrade_binaries">Upgrade the installed binaries&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#schema_upgrade">Upgrade mysql schema&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#prepare_to_join">Prepare the node to join the cluster&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#join_back">Joining the cluster&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#rolling_upgrade">Rolling upgrade the other nodes&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.fromdual.com/blog/galera_upgrade_2.x_to_3.0/#rid_old_option">Get rid of old release option&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="introduction">Introduction&lt;/h3>
&lt;p>Codership announced from weeks ago introducing the Galera Cluster new release 3.0 having many bug fixes, performance enhancements plus the main purpose which is working with MySQL 5.6. In this article, I&amp;rsquo;ll go through the upgrade steps from Galera 2.x to the new release 3.0, but at the time of writing this article - as mentioned in the Codership release notes - THIS IS A BETA QUALITY RELEASE FOR TESTING PURPOSES. NOT RECOMMENDED FOR PRODUCTION YET.&lt;/p>
&lt;p>&lt;strong>Important note:&lt;/strong> a new Galera version (3.1) will be available soon for production and it will be &lt;strong>INCOMPATIBLE&lt;/strong> with this beta version (3.0) but still compatible with 2.x, so again DO NOT go for production using 3.0 and postpone the production upgrade process until 3.1 become available.&lt;/p>
&lt;h3 id="prerequisites">Prerequisites&lt;/h3>
&lt;h2 id="system-information">System information&lt;/h2>
&lt;p>The following are the cluster system information:&lt;/p>
&lt;ul>
&lt;li>Operating System: CentOS release 6.4 (64 bit)&lt;/li>
&lt;li>Cluster system consists of 3 cluster nodes (192.168.1.251 &amp;ldquo;gcservera&amp;rdquo;,192.168.1.252 &amp;ldquo;gcserverb&amp;rdquo; &amp;amp; 192.168.1.253 &amp;ldquo;gcserverc&amp;rdquo;)&lt;/li>
&lt;/ul>
&lt;h2 id="installed-packages">Installed packages&lt;/h2>
&lt;p>The following are the packages installed on the three cluster nodes:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>MySQL version: mysql-5.5.33_wsrep_23.7.6 (RPM)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Galera provider version:galera-23.2.7 (RPM)&lt;/p>
&lt;pre>&lt;code>mysql&amp;gt; show global variables like'%version%';
+-------------------------+--------------------------------------------------+
| Variable_name | Value |
+-------------------------+--------------------------------------------------+
| innodb_version | 5.5.33 |
| protocol_version | 10 |
| slave_type_conversions | …&lt;/code>&lt;/pre>&lt;/li>&lt;/ul>&lt;/ul>&lt;/li>&lt;/li>&lt;/ul>&lt;/li>&lt;/ul></description></item><item><title/><link>https://www.fromdual.com/blog/abdel-mawla/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>oli.sennhauser@fromdual.com (Oli Sennhauser)</author><guid>https://www.fromdual.com/blog/abdel-mawla/</guid><description/></item></channel></rss>