<?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>MariaDB - dbi Blog</title>
	<atom:link href="https://www.dbi-services.com/blog/category/mariadb/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.dbi-services.com/blog/category/mariadb/</link>
	<description></description>
	<lastBuildDate>Tue, 08 Sep 2026 14:06:42 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/05/cropped-favicon_512x512px-min-32x32.png</url>
	<title>MariaDB - dbi Blog</title>
	<link>https://www.dbi-services.com/blog/category/mariadb/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>MariaDB 12.3 &#8211; Binlog Inside InnoDB</title>
		<link>https://www.dbi-services.com/blog/mariadb-12-3-binlog-inside-innodb/</link>
					<comments>https://www.dbi-services.com/blog/mariadb-12-3-binlog-inside-innodb/#respond</comments>
		
		<dc:creator><![CDATA[Adrien Obernesser]]></dc:creator>
		<pubDate>Sun, 15 Mar 2026 16:17:27 +0000</pubDate>
				<category><![CDATA[MariaDB]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=43437</guid>

					<description><![CDATA[<p>MariaDB has been quite active lately, the version 11.8 was already quite a step forward and apart from the changes on LTS schedule and the EOL durations, the RC 12.3 LTS is bringing some interesting changes to binlogs, pushing even further performance improvements and reliability. Instead of using the traditional flat file binlogs, they can [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/mariadb-12-3-binlog-inside-innodb/">MariaDB 12.3 &#8211; Binlog Inside InnoDB</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">MariaDB has been quite active lately, the version 11.8 was already quite a step forward and apart from the changes on LTS schedule and the EOL durations, the RC 12.3 LTS is bringing some interesting changes to binlogs, pushing even further performance improvements and reliability. Instead of using the traditional flat file binlogs, they can be now integrated into InnoDB WALs. This is quite the change and will have some implications for production. Although this is quite new and there will be some optimizations in the future I guess, I figured we could already benchmark the performance gains and the pros and cons.</p>



<p class="wp-block-paragraph">Every MariaDB (and MySQL) production DBA has felt the pain of the classic binlog performance tax or replication management. Every committed transaction must cross a <strong>two-phase commit (2PC) boundary</strong> between InnoDB and the binary log — two separate, sequential <code>fsync()</code> calls per transaction group, regardless of what <code>innodb_flush_log_at_trx_commit</code> is set to. The binlog has always been a flat file, written independently of InnoDB&#8217;s Write-Ahead Log (WAL), which means:</p>



<ul class="wp-block-list">
<li>Two durability paths to synchronize on every commit</li>



<li>Complex crash recovery logic to reconcile InnoDB state with binlog state</li>



<li><code>sync_binlog=1</code> + <code>innodb_flush_log_at_trx_commit=1</code> = two fsyncs, always</li>



<li>Performance degrades steeply under high concurrency, especially on cloud disks where <code>fsync</code> latency is measured in milliseconds</li>
</ul>



<p class="wp-block-paragraph">MariaDB 12.3 ships a fundamental architectural answer to this problem, tracked under <strong>MDEV-34705</strong> and authored by Kristian Nielsen: the binary log is now stored <em>inside InnoDB tablespaces</em>, using InnoDB&#8217;s own Write-Ahead Log for durability. This is not an incremental tuning — it is a redesign of the commit pipeline.</p>



<p class="wp-block-paragraph">To understand what changed, you need to understand what the classic binlog commit path looks like:</p>



<pre class="wp-block-code"><code>BEGIN transaction
  → InnoDB: write undo log (redo log)
  → InnoDB: prepare (XA prepare, writes to redo log)
  → Binlog: write event to binlog file
  → Binlog: fsync() &#091;sync_binlog=1]
  → InnoDB: commit (writes commit record to redo log)
  → InnoDB: fsync() &#091;innodb_flush_log_at_trx_commit=1]
COMMIT
</code></pre>



<p class="wp-block-paragraph"><strong>The problem: two separate <code>fsync()</code> calls,</strong> two separate file paths, and InnoDB cannot commit without first knowing that the binlog has been durably written. If the server crashes between the binlog write and the InnoDB commit, recovery must scan the binlog to find prepared-but-not-committed transactions. This is expensive both in steady-state (latency) and at recovery time (scan time).</p>



<p class="wp-block-paragraph"><strong>Group commit mitigates this partially </strong>— multiple transactions can be flushed together — but the fundamental 2PC overhead remains.</p>



<p class="wp-block-paragraph"><strong>With <code>binlog_storage_engine=innodb</code>, the binlog is no longer a separate flat file</strong>. It lives inside the InnoDB storage engine, in InnoDB tablespace files with the <code>.ibb</code> extension, pre-allocated at <code>max_binlog_size</code> (default 1 GB each). The commit path becomes:</p>



<pre class="wp-block-code"><code>BEGIN transaction
  → InnoDB: write undo log + binlog event (single redo log)
  → InnoDB: commit (one fsync if innodb_flush_log_at_trx_commit=1)
COMMIT
</code></pre>



<p class="wp-block-paragraph">The two-phase commit between binlog and engine is <strong>eliminated</strong>. The binlog and data changes are atomic — they land or fail together in the InnoDB WAL.</p>



<p class="wp-block-paragraph">This has two dramatic consequences:</p>



<p class="wp-block-paragraph"><strong>1. <code>innodb_flush_log_at_trx_commit=0</code> or <code>=2</code> becomes safe.</strong> Because crash recovery is now handled entirely by InnoDB, you can run with <code>innodb_flush_log_at_trx_commit=0</code> (no fsync, OS buffer only) and still have a <em>consistent</em> binlog after a crash. Previously, this setting was dangerous for replication because the binlog and InnoDB could diverge after a crash. With the new model, they cannot diverge — they are the same file.</p>



<p class="wp-block-paragraph"><strong>2. With <code>innodb_flush_log_at_trx_commit=1</code>, one fsync replaces two.</strong> The most common production setting now only costs a single WAL fsync. Group commit opportunities also improve because the binlog is no longer a separate bottleneck.</p>



<p class="wp-block-paragraph">(You might want to check the documentation for this parameter <a href="https://mariadb.com/docs/server/server-usage/storage-engines/innodb/innodb-system-variables#innodb_flush_log_at_trx_commit" id="https://mariadb.com/docs/server/server-usage/storage-engines/innodb/innodb-system-variables#innodb_flush_log_at_trx_commit">link</a>.)</p>



<p class="wp-block-paragraph">New binlog files use the <code>.ibb</code> extension and are pre-allocated. Here is what the binlog directory looks like side by side:</p>



<p class="wp-block-paragraph"><strong>Classic FILE binlog:</strong></p>



<pre class="wp-block-code"><code>$ ls -lah /var/lib/mysql/binlog/
drwx------ 2 mysql mysql 4.0K  #binlog_cache_files
-rw-rw---- 1 mysql mysql 1.9K  mysqld-bin.000001
-rw-rw---- 1 mysql mysql 4.0K  mysqld-bin.000001.idx
-rw-rw---- 1 mysql mysql 1.4K  mysqld-bin.000002
-rw-rw---- 1 mysql mysql    0  mysqld-bin.000002.idx
-rw-rw---- 1 mysql mysql   80  mysqld-bin.index
</code></pre>



<p class="wp-block-paragraph"><strong>InnoDB binlog:</strong></p>



<pre class="wp-block-code"><code>$ ls -lah /var/lib/mysql/binlog/
-rw-rw---- 1 mysql mysql 1.0G  binlog-000000.ibb
-rw-rw---- 1 mysql mysql 1.0G  binlog-000001.ibb
</code></pre>



<p class="wp-block-paragraph">The difference is immediately striking: the <code>.ibb</code> files are <strong>pre-allocated at <code>max_binlog_size</code></strong> (default 1 GB). There is no <code>.index</code> file, no <code>.idx</code> GTID index files, no <code>.state</code> file. GTID state is periodically written as <em>state records</em> inside the binlog itself, controlled by <code>--innodb-binlog-state-interval</code> (bytes between state records). GTID position recovery scans from the last state record forward.</p>



<p class="wp-block-paragraph">Another subtle difference visible in the <code>mariadb-binlog</code> output: all InnoDB binlog events show <code>end_log_pos 0</code> (position tracking is handled by InnoDB internally), whereas FILE binlog events show actual byte offsets (<code>end_log_pos 257</code>, <code>end_log_pos 330</code>, etc.).</p>



<p class="wp-block-paragraph">Events can span multiple <code>.ibb</code> files, and parts of the same event can be interleaved across files. <code>mariadb-binlog</code> coalesces them transparently. For correct output across files, pass all files at once in order.</p>



<p class="wp-block-paragraph">This is a significant improvement over the old model: <code>mariadb-backup</code> now <strong>includes the binlog in the backup by default</strong>, transactionally consistent with the data. The backed-up server is not blocked during binlog copy. A restored backup can be turned into a replica using <code>CHANGE MASTER ... MASTER_DEMOTE_TO_SLAVE=1</code> directly — no separate binlog position reconciliation needed.</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading" id="h-operational-impact-gtid-replica-resync-and-split-brain-recovery">Operational Impact: GTID, Replica Resync, and Split-Brain Recovery</h2>



<p class="wp-block-paragraph">This is arguably the most impactful day-to-day change for DBAs apart from the TPS throughput. You can&#8217;t use anything else than GTID mode for replication if you use innodb as the binlog storage engine. I still run into a lot of MariaDB 10.11 so some DBAs might not use this on a daily basis yet. To help them understand the next part is a quick reminder of the GTID capabilities that has been around for 12 years already&#8230;</p>



<h3 class="wp-block-heading" id="h-what-master-use-gtid-slave-pos-actually-means">What <code>MASTER_USE_GTID = slave_pos</code> Actually Means</h3>



<p class="wp-block-paragraph">A common point of confusion when reading MariaDB documentation for the first time: in the <code>CHANGE MASTER TO</code> statement, <code>slave_pos</code> looks like a placeholder you are supposed to fill in. It is not. It is a <strong>literal enum keyword</strong> — one of exactly three accepted values:</p>



<pre class="wp-block-code"><code>MASTER_USE_GTID = no           -- classic file/offset mode, GTID disabled
MASTER_USE_GTID = slave_pos    -- use @@gtid_slave_pos (what this replica last received)
MASTER_USE_GTID = current_pos  -- use @@gtid_current_pos (slave_pos + any local writes)
</code></pre>



<p class="wp-block-paragraph"><code>slave_pos</code> is not a value you provide — it is an instruction telling MariaDB to read the starting replication position from the server&#8217;s own <code>@@gtid_slave_pos</code> system variable, which was populated automatically during the backup restore. You are providing an <strong>instruction</strong>, not data. The actual position is determined by the engine, not by you.</p>



<p class="wp-block-paragraph">For completeness: MariaDB accepts the keyword unquoted (unlike MySQL&#8217;s tendency to quote string enums), which is why it looks like a variable name in documentation examples.</p>



<h3 class="wp-block-heading" id="h-replica-resync-before-and-after-the-concrete-difference">Replica Resync Before and After: The Concrete Difference</h3>



<p class="wp-block-paragraph">This is best understood by comparing the full procedure side by side.</p>



<p class="wp-block-paragraph"><strong>With FILE binlog (classic):</strong></p>



<p class="wp-block-paragraph">Problem: two independent sources of truth to reconcile.</p>



<ol class="wp-block-list">
<li>Take fresh backup with mariadb-backup</li>



<li>Read xtrabackup_binlog_info from the backup:<br>→ binlog.000042 position 198472910<br>BUT: this position may not match what InnoDB actually committed<br>(MDEV-21611 — mariabackup does not always update the InnoDB<br>binlog position during prepare, causing mismatch)</li>



<li>Restore the backup on the replica</li>



<li>Manually declare:<br>CHANGE MASTER TO<br>MASTER_LOG_FILE = &#8216;binlog.000042&#8217;, ← you looked this up<br>MASTER_LOG_POS = 198472910; ← you looked this up</li>



<li>START SLAVE;</li>



<li>Watch for errors, validate row counts, hope the position was right</li>
</ol>



<p class="wp-block-paragraph">The fragility: step 2/4 requires you to provide specific <strong>data</strong> (a filename string and a byte offset integer). If that data is wrong by even one transaction — which MDEV-21611 demonstrates can happen — the replica either re-applies events it already has, or misses events entirely. This produces silent data drift, not an immediate error.</p>



<p class="wp-block-paragraph"><strong>With InnoDB binlog + GTID:</strong></p>



<p class="wp-block-paragraph">Problem: eliminated. One source of truth.</p>



<ol class="wp-block-list">
<li>Take fresh backup with mariadb-backup<br>→ .ibb binlog files included automatically, consistent with data</li>



<li>Restore the backup on the replica<br>→ @@gtid_slave_pos populated from InnoDB state automatically</li>



<li>Declare the replica:<br>CHANGE MASTER TO<br>MASTER_HOST = &#8216;primary&#8217;,<br>MASTER_USER = &#8216;replicator&#8217;,<br>MASTER_PASSWORD = &#8216;replpass&#8217;,<br>MASTER_USE_GTID = slave_pos, ← instruction, not a value<br>MASTER_DEMOTE_TO_SLAVE = 1; ← folds local writes into GTID pos</li>



<li>START SLAVE;<br>→ replica announces its GTID set to the primary<br>→ primary streams from that point forward<br>→ done</li>
</ol>



<p class="wp-block-paragraph">You never touch a file name or a byte offset. The position is embedded in the InnoDB state from the moment the backup was consistent.</p>



<h3 class="wp-block-heading" id="h-split-brain-recovery">Split-Brain Recovery </h3>



<p class="wp-block-paragraph">Split-brain is where this matters most. Consider a scenario where the primary and replica became isolated:</p>



<pre class="wp-block-code"><code>Primary:  committed GTIDs 0-1-1 through 0-1-10042
Replica:  applied GTIDs   0-1-1 through 0-1-10039  (was lagging at split)
          then received 3 rogue writes (briefly promoted to primary)
          now has:  0-1-10040, 0-1-10041, 0-1-10042  (divergent, different transactions)
</code></pre>



<p class="wp-block-paragraph"><strong>With FILE binlog</strong>, reconciling this required manually scanning both binlog files to find the exact divergence point — line by line, event by event. Many teams simply wiped the replica and re-provisioned from scratch to be safe. Even experienced DBAs would spend hours on this.</p>



<p class="wp-block-paragraph"><strong>With GTID</strong>, the divergence is immediately visible and unambiguous:</p>



<pre class="wp-block-code"><code>-- On the drifted replica:
SELECT @@gtid_slave_pos;
-- Returns: 0-1-10042  (but these last 3 GTIDs are rogue, divergent from primary)

-- On the primary:
SELECT @@gtid_binlog_pos;
-- Returns: 0-1-10042  (completely different transactions at 10040-10042)
</code></pre>



<p class="wp-block-paragraph">To resync, declare the last known good position explicitly and restart:</p>



<pre class="wp-block-code"><code>STOP SLAVE;
RESET SLAVE;
SET GLOBAL gtid_slave_pos = '0-1-10039';  -- last confirmed good GTID from primary
START SLAVE;
-- MariaDB streams 10040-10042 from the primary, no manual intervention
</code></pre>



<p class="wp-block-paragraph">With <code>gtid_strict_mode = ON</code> (recommended), MariaDB will refuse to apply a GTID it has already seen with different content — you get an explicit error rather than silent data corruption. The divergence surface is precisely identified, not guessed at.</p>



<h3 class="wp-block-heading" id="h-master-demote-to-slave-1-the-safety-net-for-former-primaries"><code>MASTER_DEMOTE_TO_SLAVE=1</code> — The Safety Net for Former Primaries</h3>



<p class="wp-block-paragraph">When resetting a server that was briefly acting as a primary (during split-brain, or when repurposing a former primary as a replica), its <code>@@gtid_binlog_pos</code> includes local writes that the current primary does not know about. Without reconciliation, <code>MASTER_USE_GTID = slave_pos</code> would start from <code>@@gtid_slave_pos</code>, which might be behind the local writes — creating a gap.</p>



<p class="wp-block-paragraph"><code>MASTER_DEMOTE_TO_SLAVE = 1</code> handles this automatically: it computes the union of <code>@@gtid_slave_pos</code> and <code>@@gtid_binlog_pos</code>, sets that as the new <code>gtid_slave_pos</code>, and proceeds. In plain English: <em>&#8220;I may have had local writes — include them in my starting position declaration so I don&#8217;t replay things I already have.&#8221;</em><br></p>



<p class="wp-block-paragraph">Without MASTER_DEMOTE_TO_SLAVE=1:<br>&#8212; Risk: potential GTID gap or conflict if server had local writes<br><br>With MASTER_DEMOTE_TO_SLAVE=1:<br>&#8212; MariaDB automatically: SET gtid_slave_pos = gtid_slave_pos ∪ gtid_binlog_pos<br>&#8212; Then connects to primary from that unified position<br>&#8212; Safe regardless of the server&#8217;s previous role</p>



<p class="wp-block-paragraph">In summary, the GTID + InnoDB binlog combination reduces your split-brain/resync runbook from a multi-step forensic procedure with manual position arithmetic to three commands:</p>



<pre class="wp-block-code"><code>STOP SLAVE;
SET GLOBAL gtid_slave_pos = '&lt;last_known_good_gtid&gt;';
CHANGE MASTER TO MASTER_USE_GTID = slave_pos, MASTER_DEMOTE_TO_SLAVE = 1;
START SLAVE;
</code></pre>



<p class="wp-block-paragraph">For teams (like me) that have been burned by binlog position mismatches in production, this operational simplification was a game changer, and now with adding binlogs into InnoDB WALs, the procedure is position-agnostic. This means a faster and easier way to create a replica and automate a full re-sync because mariadb-backup captures data and binlog atomically and restoring sets @@gtid_slave_pos automatically. No parsing, no conditionals, no positions arithmetic, the same script will work whether you re-sync after lag, crash, or split-brain (which is even less likely) idempotently.  </p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading" id="h-galera-cluster-and-innodb-cluster-what-changes-and-what-doesn-t">Galera Cluster and InnoDB Cluster: What Changes (and What Doesn&#8217;t)</h2>



<h3 class="wp-block-heading" id="h-why-galera-is-blocked-and-why-it-s-non-trivial-to-fix">Why Galera Is Blocked and Why It&#8217;s Non-Trivial to Fix</h3>



<p class="wp-block-paragraph">Understanding the block requires understanding what Galera actually does at commit time — and crucially, what it does <strong>not</strong> use the binlog for between cluster nodes.</p>



<p class="wp-block-paragraph">Galera nodes do not replicate by shipping binlog events to each other. The replication mechanism is the <strong>wsrep write set protocol</strong>: at commit time, the node extracts the changed rows as a write set, broadcasts it to all cluster nodes, and all nodes run a certification protocol (conflict detection) before any node commits. The commit is synchronous across all nodes.</p>



<pre class="wp-block-code"><code>Galera write path:
  Client writes to Node A
  → InnoDB: prepare transaction
  → wsrep: extract write set from transaction
  → wsrep: broadcast write set to all nodes
  → wsrep: certification round (all nodes vote — conflicts?)
  → wsrep: apply write set on all nodes simultaneously
  → InnoDB: commit on all nodes
  → binlog written AFTER commit (for async slaves attached to the cluster)
</code></pre>



<p class="wp-block-paragraph">The binlog in a Galera cluster has exactly one purpose: feeding <strong>async replica slaves</strong> that hang off one of the cluster nodes for analytics, backup, or reporting. The Galera nodes themselves never read each other&#8217;s binlog.</p>



<p class="wp-block-paragraph">The problem with InnoDB binlog is the certification hook. The wsrep plugin currently intercepts <strong>between InnoDB prepare and InnoDB commit</strong> — it sits at the 2PC boundary that InnoDB binlog eliminates. With the new architecture, InnoDB prepare and commit are atomic — there is no pause point where wsrep can insert its certification round. The wsrep plugin needs to be re-integrated at a different layer of the storage engine API, which is a significant engineering effort. The <code>GALERA26</code> label on MDEV-34705 acknowledges this as planned future work, but it is not present in 12.3.</p>



<p class="wp-block-paragraph"><strong>What wsrep needs: </strong>       <br>InnoDB prepare → [wsrep certification] → InnoDB commit<br><br><strong>What InnoDB binlog does: </strong><br>InnoDB prepare + commit = atomic, no pause point→ Incompatible. wsrep cannot insert itself.<br></p>



<h3 class="wp-block-heading" id="h-impact-on-galera-async-slaves">Impact on Galera Async Slaves</h3>



<p class="wp-block-paragraph">Even if you are not running Galera nodes with InnoDB binlog, you may be running <strong>async replicas attached to a Galera node</strong> — a common pattern for offloading analytics queries or running <code>mariadb-backup</code> from a dedicated replica. These are unaffected as long as the Galera node itself continues to use <code>binlog_storage_engine=FILE</code>. The async slave receives standard <code>.bin</code> events from the Galera node and nothing in its pipeline changes.</p>



<p class="wp-block-paragraph">The restriction is: the Galera node acting as the async replication source must stay on FILE binlog. You cannot mix binlog storage engines within the same replication chain in a meaningful way — the source determines the format.</p>



<h3 class="wp-block-heading" id="h-production-decision-matrix-by-topology">Production Decision Matrix by Topology</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Topology</th><th>InnoDB binlog viable?</th><th>Notes</th></tr></thead><tbody><tr><td>Standalone primary + async replicas (GTID)</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Yes</td><td>Primary use case, fully supported</td></tr><tr><td>Primary + async replicas (file/offset)</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Not yet</td><td>Migrate to GTID first</td></tr><tr><td>Semi-sync AFTER_COMMIT + async replicas</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Yes</td><td>Supported in 12.3.1; AFTER_SYNC is architecturally incompatible</td></tr><tr><td>Semi-sync AFTER_SYNC</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Never</td><td>Architecturally incompatible with 2PC removal</td></tr><tr><td>Galera cluster nodes</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Not yet</td><td>wsrep hook incompatible, planned for future</td></tr><tr><td>Async slave off a Galera node</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Unaffected</td><td>Galera node uses FILE binlog as source</td></tr><tr><td>MaxScale read/write split</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f536.png" alt="🔶" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Test required</td><td>Replication protocol unchanged, failover scripts may need GTID update</td></tr><tr><td>MySQL InnoDB Cluster</td><td>N/A</td><td>MySQL-only, not applicable to MariaDB</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading" id="h-known-limitations-and-open-issues-12-3-1-rc">Known Limitations and Open Issues (12.3.1 RC)</h2>



<p class="wp-block-paragraph">This feature is marked as opt-in for good reason. The following limitations are documented and/or reported in the JIRA tracker. <strong>Read these before recommending it for production.</strong></p>



<h3 class="wp-block-heading" id="h-documented-limitations-by-design-12-3-1">Documented Limitations (by design, 12.3.1)</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Limitation</th><th>Detail</th></tr></thead><tbody><tr><td><strong>Mutual exclusivity</strong></td><td>Enabling the new binlog ignores existing <code>.bin</code> files. No migration path from old to new binlog format in-place.</td></tr><tr><td><strong>GTID mandatory</strong></td><td>Replicas must use GTID-based replication (<code>CHANGE MASTER ... MASTER_USE_GTID=slave_pos</code>). Filename/offset positions are unavailable (<code>MASTER_POS_WAIT()</code> does not work).</td></tr><tr><td><strong>Semi-sync: AFTER_SYNC not supported</strong></td><td><code>AFTER_SYNC</code> semi-sync cannot work because 2PC no longer exists. <code>AFTER_COMMIT</code> semi-sync is supported. MDEV-38190 tracks further semi-sync enhancements.</td></tr><tr><td><strong><code>sync_binlog</code> ignored</strong></td><td>The option is accepted but silently ignored. Durability is controlled by <code>innodb_flush_log_at_trx_commit</code> only.</td></tr><tr><td><strong>Old filename/offset API gone</strong></td><td><code>BINLOG_GTID_POS()</code>, <code>MASTER_POS_WAIT()</code> unavailable. Use <code>MASTER_GTID_WAIT()</code>.</td></tr><tr><td><strong>Third-party binlog readers</strong></td><td>Tools that read <code>.bin</code> files directly (e.g., older versions of Debezium, Maxwell) will not understand <code>.ibb</code> format. Tools that connect to the server via the replication protocol may work unmodified.</td></tr><tr><td><strong>Galera not supported (12.3.1)</strong></td><td>The GALERA26 label on MDEV-34705 indicates future support, but wsrep-based clusters cannot use this feature in the current RC.</td></tr></tbody></table></figure>



<h3 class="wp-block-heading" id="h-open-jira-issues-as-of-march-2026">Open JIRA Issues (as of March 2026)</h3>



<p class="wp-block-paragraph"><strong>MDEV-38462 — <code>InnoDB: Crash recovery is broken due to insufficient innodb_log_file_size</code> with new binlog</strong> Severity: likely Major. The new binlog writes into the InnoDB redo log, which means large transactions or high write rates can exhaust <code>innodb_log_file_size</code> more rapidly than before. If the redo log is undersized for the binlog load, crash recovery may fail. <strong>Lab implication:</strong> always set <code>innodb_log_file_size</code> generously (≥2 GB) when enabling the new binlog.</p>



<p class="wp-block-paragraph"><strong>MDEV-38304 — InnoDB Binlog to be Stored in Archived Redo Log</strong> A follow-on feature request for archiving binlog data within the InnoDB redo log archiving infrastructure. Not a blocker, but signals that the archival story is incomplete.</p>



<p class="wp-block-paragraph"><strong>MDEV-34705 (parent, closed/fixed in 12.3.1, resolved 2026-02-08)</strong> — The main implementation MDEV. Review the sub-tasks and linked issues for outstanding items, notably MDEV-38190 (semi-sync enhancements) and MDEV-38307 (wsrep/Galera feasibility study).</p>



<h3 class="wp-block-heading" id="h-operational-cautions-for-your-lab">Operational Cautions for Your Lab</h3>



<ul class="wp-block-list">
<li>Do <strong>not</strong> test <code>innodb_flush_log_at_trx_commit=0</code> on a shared Azure disk — results will be misleading due to OS-level write caching. Use a dedicated Premium SSD P30+ or Ultra Disk.</li>



<li>The <code>sync_binlog</code> parameter being silently ignored is a foot-gun during migration — add it to your monitoring alerting if teams use it as a proxy for &#8220;durable binlog.&#8221;</li>



<li>Pre-allocated 1 GB <code>.ibb</code> files mean disk space consumption &#8220;looks&#8221; immediately high even under low load.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading" id="h-the-benchmark-design">The Benchmark Design</h2>



<h3 class="wp-block-heading" id="h-what-we-are-measuring">What We Are Measuring</h3>



<p class="wp-block-paragraph">Three performance dimensions across two configurations:</p>



<p class="wp-block-paragraph"><strong>CONFIG A:</strong> binlog_storage_engine=FILE (classic)<br><strong>CONFIG B:</strong> binlog_storage_engine=innodb (new)</p>



<p class="wp-block-paragraph">Each dimension tested under three durability profiles:</p>



<p class="wp-block-paragraph"><strong>D1</strong>: innodb_flush_log_at_trx_commit=1 + sync_binlog=1 (full durability, &#8220;gold&#8221;)<br><strong>D2</strong>: innodb_flush_log_at_trx_commit=2 + sync_binlog=0 (OS-buffered WAL)<br><strong>D3</strong>: innodb_flush_log_at_trx_commit=0 (no fsync, maximum throughput)</p>



<p class="wp-block-paragraph"><strong>Note:</strong> D2/D3 on CONFIG B is where the architectural gain is most visible. D3 on CONFIG A is effectively unsafe for replication; we benchmark it anyway as a theoretical ceiling.</p>



<h3 class="wp-block-heading" id="h-metrics">Metrics</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Metric</th><th>Tool</th><th>Notes</th></tr></thead><tbody><tr><td>Write TPS</td><td>sysbench oltp_write_only</td><td>Primary headline number</td></tr><tr><td>Commit latency p50/p95/p99</td><td>sysbench</td><td>Shows tail latency behavior</td></tr><tr><td>Large transaction commit time</td><td>custom SQL</td><td>Single 100MB INSERT</td></tr><tr><td>Crash recovery time</td><td><code>kill -9</code> + timer</td><td>Wall clock to <code>[Ready for connections]</code></td></tr><tr><td>Replica lag under load</td><td><code>Seconds_Behind_Master</code></td><td>1 primary → 1 replica</td></tr><tr><td>InnoDB redo log write bytes</td><td><code>SHOW ENGINE INNODB STATUS</code></td><td>Redo amplification</td></tr><tr><td>fsync count (fio/strace proxy)</td><td>iostat + custom</td><td>Actual IO calls</td></tr></tbody></table></figure>



<h3 class="wp-block-heading" id="h-concurrency-levels">Concurrency Levels</h3>



<ul class="wp-block-list">
<li>1 thread (establish single-threaded overhead)</li>



<li>8 threads (typical application concurrency)</li>



<li>32 threads (high concurrency, group commit regime)</li>



<li>64 threads (stress, disk saturation test)</li>
</ul>



<h3 class="wp-block-heading" id="h-azure-lab-setup">Azure Lab Setup</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Component</th><th>Primary</th><th>Replica</th></tr></thead><tbody><tr><td>VM SKU</td><td><code>Standard_E4ds_v5</code> (4 vCPU, 32 GB RAM)</td><td><code>Standard_E2ds_v5</code> (2 vCPU, 16 GB RAM)</td></tr><tr><td>OS Disk</td><td>Premium SSD (128 GB)</td><td>Premium SSD (128 GB)</td></tr><tr><td>Data Disk</td><td><strong>P30 Premium SSD 500 GB (5,000 IOPS)</strong></td><td><strong>P30 Premium SSD 500 GB (5,000 IOPS)</strong></td></tr><tr><td>OS</td><td>Ubuntu 24.04 LTS</td><td>Ubuntu 24.04 LTS</td></tr><tr><td>MariaDB</td><td>12.3.1 RC (binary tarball)</td><td>12.3.1 RC (binary tarball)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Host caching was set to <strong>None</strong> on both P30 data disks to ensure we measure actual I/O latency, not Azure&#8217;s host-level read cache. The data directory, InnoDB redo log, and binlog all reside on the P30 data disk (<code>/data/mysql</code>).</p>



<p class="wp-block-paragraph">Each profile was tested with 2 runs per thread count (averaged). The datadir was fully reinitialized between profiles to prevent cross-contamination.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading" id="h-my-lab-results">My Lab Results</h2>



<p class="wp-block-paragraph">The following results were obtained on Azure <code>Standard_E4ds_v5</code> VMs (4 vCPU, 32 GB RAM) with P30 Premium SSD data disks (500 GB, 5,000 IOPS, host caching disabled). MariaDB 12.3.1 RC installed from binary tarball.</p>



<p class="wp-block-paragraph"><strong>Lab parameters:</strong> sysbench <code>oltp_write_only</code>, 4 tables × 1M rows, 60s per run (15s warmup), 2 runs per data point (averaged), 20 GB InnoDB buffer pool, 4 GB redo log.</p>



<h3 class="wp-block-heading" id="h-write-tps-the-d1-headline-2-4-3-3-faster">Write TPS — The D1 Headline: 2.4–3.3× Faster</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Threads</th><th>FILE (D1) TPS</th><th>InnoDB (D1) TPS</th><th>Speedup</th><th>FILE p99</th><th>InnoDB p99</th></tr></thead><tbody><tr><td>1</td><td>129</td><td>307</td><td><strong>2.4×</strong></td><td>16.1 ms</td><td>8.1 ms</td></tr><tr><td>8</td><td>444</td><td>1,073</td><td><strong>2.4×</strong></td><td>37.3 ms</td><td>15.1 ms</td></tr><tr><td>32</td><td>1,392</td><td>4,625</td><td><strong>3.3×</strong></td><td>43.8 ms</td><td>34.1 ms</td></tr><tr><td>64</td><td>2,564</td><td>8,279</td><td><strong>3.2×</strong></td><td>72.1 ms</td><td>29.4 ms</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Even at single-thread concurrency, InnoDB binlog is 2.4× faster. At 64 threads, the gap widens to 3.2× — the elimination of the binlog <code>fsync</code> becomes more valuable as group commit contention increases.</p>



<p class="wp-block-paragraph">The p99 latency tells the story most clearly: FILE binlog latency rises steeply with concurrency (16 ms → 72 ms), while InnoDB binlog stays dramatically lower (8 ms → 29 ms at 64 threads). The second <code>fsync</code> creates a latency cliff under contention that InnoDB binlog simply does not have.</p>



<h3 class="wp-block-heading" id="h-d2-d3-parity-when-fsyncs-are-already-gone">D2/D3 — Parity When fsyncs Are Already Gone</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Threads</th><th>FILE (D2) TPS</th><th>InnoDB (D2) TPS</th><th>FILE (D3) TPS</th><th>InnoDB (D3) TPS</th></tr></thead><tbody><tr><td>1</td><td>2,950</td><td>2,861</td><td>2,943</td><td>2,985</td></tr><tr><td>8</td><td>9,961</td><td>9,924</td><td>10,027</td><td>11,681</td></tr><tr><td>32</td><td>10,818</td><td>11,091</td><td>11,202</td><td>10,973</td></tr><tr><td>64</td><td>10,815</td><td>10,462</td><td>11,121</td><td>10,751</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">At D2 (<code>innodb_flush_log_at_trx_commit=2</code>, OS-buffered) and D3 (<code>=0</code>, no fsync), both binlog engines produce nearly identical throughput: <strong>~10,000–11,000 TPS at saturation</strong>. The bottleneck shifts from binlog sync overhead to InnoDB page writes and the P30 disk&#8217;s 5,000 IOPS ceiling.</p>



<p class="wp-block-paragraph">This is the control experiment that validates the D1 results: the InnoDB binlog advantage comes specifically from eliminating the <code>sync_binlog=1</code> fsync. When fsyncs are already absent, there is nothing to eliminate.</p>



<h3 class="wp-block-heading" id="h-crash-recovery-same-speed-different-architecture">Crash Recovery — Same Speed, Different Architecture</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Profile</th><th>Recovery time</th><th>Pages to recover</th><th>Notes</th></tr></thead><tbody><tr><td>file_d1</td><td>34.1s</td><td>54,820</td><td>5+ XA prepared transactions, 2PC reconciliation</td></tr><tr><td>innodb_d1</td><td>39.2s</td><td>41,688</td><td>Single-engine recovery, no XA</td></tr><tr><td>file_d2</td><td>29.1s</td><td>45,430</td><td>XA prepared, binlog sync needed</td></tr><tr><td>innodb_d2</td><td>27.1s</td><td>43,219</td><td>Clean single-path recovery</td></tr><tr><td>file_d3</td><td>33.1s</td><td>44,309</td><td>Binlog-InnoDB sync at recovery</td></tr><tr><td>innodb_d3</td><td>39.2s</td><td>44,846</td><td>Clean single-path recovery</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">All six profiles: <strong>zero data loss</strong> (1,000,000 rows before crash = 1,000,000 rows after recovery).</p>



<p class="wp-block-paragraph">Recovery times are comparable (~27–39 seconds). The real difference is architectural:</p>



<p class="wp-block-paragraph"><strong>FILE binlog</strong> recovery log shows the classic 2PC reconciliation:</p>



<pre class="wp-block-code"><code>InnoDB: Starting crash recovery from checkpoint LSN=613360854
InnoDB: To recover: 54820 pages
InnoDB: Transaction 1418253 was in the XA prepared state.
InnoDB: Transaction 1418254 was in the XA prepared state.
...
</code></pre>



<p class="wp-block-paragraph"><strong>InnoDB binlog</strong> recovery log shows single-path recovery — no XA coordination:</p>



<pre class="wp-block-code"><code>InnoDB: Starting crash recovery from checkpoint LSN=6438545394
InnoDB: To recover: 41688 pages
InnoDB: Continuing binlog number 2 from position 583656195.
mariadbd: ready for connections.
</code></pre>



<p class="wp-block-paragraph">The critical operational difference: with FILE binlog at D2/D3 (<code>sync_binlog=0</code>), the binlog can lose events on crash while InnoDB has already committed them — creating <strong>silent primary-replica divergence</strong>. With InnoDB binlog, this class of failure is architecturally impossible because the binlog is inside the redo log.</p>



<h3 class="wp-block-heading" id="h-large-transaction-commit-redo-amplification-is-real">Large Transaction Commit — Redo Amplification Is Real</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Metric</th><th>FILE (D1)</th><th>InnoDB (D1)</th></tr></thead><tbody><tr><td>Single 100K-row UPDATE commit time</td><td>1,793 ms</td><td>1,564 ms</td></tr><tr><td>Redo amplification</td><td>1.03×</td><td><strong>1.98×</strong></td></tr><tr><td>Raw data modified</td><td>104 MB</td><td>104 MB</td></tr><tr><td>Redo log written</td><td>107 MB</td><td>206 MB</td></tr><tr><td>Per-iteration (10K rows) redo</td><td>~5.6 MB</td><td>~10.8 MB</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">InnoDB binlog writes <strong>~2× the redo log</strong> because every binlog event is also an InnoDB redo log record. Despite this, the commit time is actually slightly faster (1.56s vs 1.79s) because there is no separate binlog fsync to wait for.</p>



<p class="wp-block-paragraph">For OLTP workloads with small transactions, the redo amplification is negligible — the fsync elimination dominates. For bulk ETL operations producing large redo volumes, this overhead is measurable and should be factored into <code>innodb_log_file_size</code> sizing.</p>



<h3 class="wp-block-heading" id="h-replication-lag-same-lag-56-more-throughput">Replication Lag — Same Lag, 56% More Throughput</h3>



<p class="wp-block-paragraph">We measured replication lag with a single async replica (E2ds_v5, 2 vCPU) under sustained 16-thread write load for 180 seconds, monitoring <code>Seconds_Behind_Master</code> every 10 seconds.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Metric</th><th>FILE (D1)</th><th>InnoDB (D1)</th></tr></thead><tbody><tr><td>Primary TPS during load</td><td>1,276</td><td><strong>1,994</strong></td></tr><tr><td>Lag at 60s</td><td>58s</td><td>89s</td></tr><tr><td>Lag at 120s</td><td>121s</td><td>148s</td></tr><tr><td>Lag at 180s (load stops)</td><td>185s</td><td>206s</td></tr><tr><td>Lag at 300s</td><td>313s</td><td>321s</td></tr><tr><td>Lag growth rate</td><td>~1.0 s/s</td><td>~1.1 s/s</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">The lag growth rate is nearly identical despite the primary pushing 56% more transactions with InnoDB binlog. The bottleneck is the replica&#8217;s single-threaded SQL apply — it falls behind at approximately the same rate regardless of how fast the primary commits.</p>



<pre class="wp-block-code"><code>elapsed_s | file_d1 lag | innodb_d1 lag
       10 |          6s |           39s
       60 |         58s |           89s
      120 |        121s |          148s
      180 |        185s |          206s
      240 |        249s |          265s
      300 |        313s |          321s
</code></pre>



<p class="wp-block-paragraph">The implication: InnoDB binlog does not make replication lag worse — it makes the <em>primary faster</em> while the replica remains the limiting factor. Enabling <code>slave_parallel_threads</code> on the replica would likely amplify the advantage further, but that is a test for another day.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading" id="h-analysis-and-recommendations">Analysis and Recommendations</h2>



<h3 class="wp-block-heading" id="h-what-the-results-mean-for-production">What the Results Mean for Production</h3>



<p class="wp-block-paragraph">The 2.4–3.3× TPS improvement at D1 durability on Azure P30 disks (5,000 IOPS) is not a synthetic artifact — it represents the removal of a real <code>fsync()</code> call from the commit path. On higher-IOPS storage (Azure Ultra Disk at 10K+ IOPS, NVMe at 100K+ IOPS), the absolute TPS numbers will be higher, but the relative improvement should hold because the 2PC <code>fsync</code> overhead is a fixed latency cost per commit group.</p>



<p class="wp-block-paragraph">The p99 latency curve tells the production story most clearly: FILE binlog p99 climbs from 16 ms to 72 ms as threads increase from 1 to 64, while InnoDB binlog stays at 8 ms to 29 ms. Tail latency stability under increasing concurrency is exactly what application teams need.</p>



<p class="wp-block-paragraph">The D2/D3 parity results are equally important: they prove the improvement comes specifically from eliminating <code>sync_binlog=1</code>, not from some general overhead reduction. When fsyncs are already absent, InnoDB binlog adds no benefit — but crucially, it adds no penalty either.</p>



<h3 class="wp-block-heading" id="h-when-not-to-use-innodb-binlog">When NOT to Use InnoDB Binlog</h3>



<p class="wp-block-paragraph">Despite the compelling performance numbers:</p>



<ol class="wp-block-list">
<li><strong>Large batch/ETL workloads:</strong> The 2× redo amplification on large transactions increases redo log pressure. For workloads dominated by bulk INSERTs or mass UPDATEs, size <code>innodb_log_file_size</code> accordingly.</li>



<li><strong>Galera clusters:</strong> Not supported in 12.3.1 RC. The wsrep certification hook is incompatible with the new commit path.</li>



<li><strong>Semi-sync AFTER_SYNC:</strong> Architecturally incompatible — the 2PC boundary that AFTER_SYNC hooks into no longer exists. AFTER_COMMIT is supported and is the only available wait point with InnoDB binlog.</li>



<li><strong>Third-party binlog readers:</strong> Tools that read <code>.bin</code> files directly will not understand <code>.ibb</code> format. Tools using the replication protocol are unaffected.</li>



<li><strong>Disk-constrained environments:</strong> Pre-allocated 1 GB <code>.ibb</code> files mean immediate disk usage even under low load.</li>
</ol>



<h3 class="wp-block-heading" id="h-innodb-log-file-size-recommendation"><code>innodb_log_file_size</code> Recommendation</h3>



<p class="wp-block-paragraph">With <code>binlog_storage_engine=innodb</code>, the redo log absorbs all binlog writes. Our lab used <code>innodb_log_file_size=4G</code> without encountering MDEV-38462. For production with high write throughput, start with 4 GB and monitor <code>SHOW ENGINE INNODB STATUS</code> for checkpoint age approaching the log file size. If crash recovery reports &#8220;insufficient innodb_log_file_size&#8221;, increase to 8 GB for example and monitor. The 2× redo amplification we measured means your redo log needs to be roughly twice as large as it would be without InnoDB binlog.</p>



<h3 class="wp-block-heading" id="h-bottom-line">Bottom Line</h3>



<p class="wp-block-paragraph">For GTID-based async replication with standard tooling, binlog_storage_engine=innodb delivers a 2.4–3.3× TPS improvement at full durability, with 2–2.5× lower p99 latency under<br>concurrency. The migration requires GTID (mandatory), gives up file/offset positioning (use MASTER_GTID_WAIT() instead), and needs generous innodb_log_file_size. At relaxed durability<br>(D2/D3), throughput is identical, but crash consistency is now guaranteed, which was never the case with FILE binlog.</p>



<p class="wp-block-paragraph">More importantly, this changes the architecture decision matrix. Binlog-based replication has always carried a performance tax, that pushed some teams toward Galera<br>clusters not because they needed synchronous multi-master or local HA, but simply to avoid that penalty while maintaining an offsite copy for DR. I often meet teams that conflate HA and<br>DR requirements and end up implementing a 3-node Galera cluster spread across 3 sites — paying the cross-site certification latency on every single commit for the sake of a disaster<br>recovery copy that doesn&#8217;t need to be synchronous. That trade-off no longer exists. With InnoDB binlog, a simple primary + async replica gives you DR capability at effectively the same<br>write throughput as a standalone server, while keeping your Galera cluster (if you need one) local where certification latency stays low.</p>



<p class="wp-block-paragraph">For OLTP workloads, this is the single largest performance improvement available in MariaDB 12.3 and it comes with better crash consistency, simpler automation, and a cleaner<br>separation between HA and DR as a bonus.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading" id="h-references">References</h2>



<ul class="wp-block-list">
<li>MDEV-34705: Improving performance of binary logging by removing the need of syncing it — <a href="https://jira.mariadb.org/browse/MDEV-34705" target="_blank" rel="noreferrer noopener">https://jira.mariadb.org/browse/MDEV-34705</a></li>



<li>MDEV-38462: Crash recovery broken with insufficient innodb_log_file_size (new binlog) — <a href="https://jira.mariadb.org/browse/MDEV-38462" target="_blank" rel="noreferrer noopener">https://jira.mariadb.org/browse/MDEV-38462</a></li>



<li>MariaDB 12.3 Changes &amp; Improvements — <a href="https://mariadb.com/docs/release-notes/community-server/12.3/mariadb-12.3-changes-and-improvements" target="_blank" rel="noreferrer noopener">https://mariadb.com/docs/release-notes/community-server/12.3/mariadb-12.3-changes-and-improvements</a></li>



<li>Official binlog implementation documentation (knielsen branch) — <a href="https://github.com/MariaDB/server/blob/knielsen_binlog_in_engine/Docs/replication/binlog.md" target="_blank" rel="noreferrer noopener">https://github.com/MariaDB/server/blob/knielsen_binlog_in_engine/Docs/replication/binlog.md</a></li>



<li>Mark Callaghan&#8217;s benchmark of the new binlog feature — referenced in the MariaDB.org release blog</li>



<li>MariaDB Foundation: New binlog implementation blog post — <a href="https://mariadb.org/tag/mariadb-releases/" target="_blank" rel="noreferrer noopener">https://mariadb.org/tag/mariadb-releases/</a></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/mariadb-12-3-binlog-inside-innodb/">MariaDB 12.3 &#8211; Binlog Inside InnoDB</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/mariadb-12-3-binlog-inside-innodb/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Setting up MariaDB Galera Cluster</title>
		<link>https://www.dbi-services.com/blog/setting-up-mariadb-galera-cluster/</link>
					<comments>https://www.dbi-services.com/blog/setting-up-mariadb-galera-cluster/#respond</comments>
		
		<dc:creator><![CDATA[Open source Team]]></dc:creator>
		<pubDate>Thu, 15 Aug 2024 08:56:06 +0000</pubDate>
				<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[Galera Cluster]]></category>
		<category><![CDATA[Setup]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=34292</guid>

					<description><![CDATA[<p>In this blog I will show you how you can setup a basic MariaDB Galera Cluster on Debian 11 (bullseye).If you wish to have a more general overview first you can have a look here: https://mariadb.com/kb/en/what-is-mariadb-galera-cluster/ For this we have 3 servers: galera-cluster-1a/b/c. The following steps will first be executed on my first node, galera-cluster-1a [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/setting-up-mariadb-galera-cluster/">Setting up MariaDB Galera Cluster</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In this blog I will show you how you can setup a basic MariaDB Galera Cluster on Debian 11 (bullseye).<br>If you wish to have a more general overview first you can have a look here: <a href="https://mariadb.com/kb/en/what-is-mariadb-galera-cluster/" target="_blank" rel="noreferrer noopener">https://mariadb.com/kb/en/what-is-mariadb-galera-cluster/</a> <br>For this we have 3 servers: galera-cluster-1a/b/c. The following steps will first be executed on my first node, galera-cluster-1a still these steps have to executed on the other nodes as well to build the whole cluster.</p>



<h2 class="wp-block-heading" id="h-step-1-installation">Step 1: Installation</h2>



<p class="wp-block-paragraph">First the servers will be prepared for the installation. This includes different packages to be installed and ports to be opened.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
galera-cluster-1a:~$ sudo apt update
galera-cluster-1a:~$ sudo apt-get install ufw
galera-cluster-1a:~$ sudo ufw enable
galera-cluster-1a:~$ sudo ufw allow 3306
galera-cluster-1a:~$ sudo ufw allow 4444
galera-cluster-1a:~$ sudo ufw allow 4567
galera-cluster-1a:~$ sudo ufw allow 4568
galera-cluster-1a:~$ sudo ufw allow 22
</pre></div>


<p class="wp-block-paragraph">Installing MariaDB 11.3.2 and other packages</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
galera-cluster-1a:~$ sudo apt-get install libsnmp-perl -y
galera-cluster-1a:~$ sudo curl -LsS -O https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
galera-cluster-1a:~$ sudo bash mariadb_repo_setup --os-type=debian --os-version=bullseye --mariadb-server-version=11.3.2
galera-cluster-1a:~$ sudo wget http://ftp.us.debian.org/debian/pool/main/r/readline5/libreadline5_5.2+dfsg-3+b13_amd64.deb
galera-cluster-1a:~$ sudo dpkg -i libreadline5_5.2+dfsg-3+b13_amd64.deb
galera-cluster-1a:~$ sudo apt-get update
galera-cluster-1a:~$ sudo apt-get install mariadb-server mariadb-client -y
galera-cluster-1a:~$ sudo systemctl enable mariadb
sudo apt-get install percona-toolkit -y
</pre></div>


<p class="wp-block-paragraph">Now you can login to MariaDB and check the version</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
galera-cluster-1a:~$ mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 32
Server version: 11.3.2-MariaDB-1:11.3.2+maria~deb11 mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type &#039;help;&#039; or &#039;\h&#039; for help. Type &#039;\c&#039; to clear the current input statement.
</pre></div>


<p class="wp-block-paragraph">For the final touch for the basic installation of MariaDB we are going to secure it. Answering yes to all the changes it proposes.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
galera-cluster-1a:~$ sudo mariadb-secure-installation 
</pre></div>


<h2 class="wp-block-heading" id="h-step-2-configuring-mariadb-server">Step 2: Configuring MariaDB server</h2>



<p class="wp-block-paragraph">We recommend creating a dedicated backup user for mariabackup like this:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
galera-cluster-1a:~$ mariadb
MariaDB &#x5B;(none)]&amp;gt; create user &#039;mariabackup&#039;@&#039;%&#039; identified by &#039;XXX&#039;;
Query OK, 0 rows affected (0.001 sec)
MariaDB &#x5B;(none)]&amp;gt; GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO &#039;mariabackup&#039;@&#039;%&#039;;
Query OK, 0 rows affected (0.001 sec)
MariaDB &#x5B;(none)]&amp;gt; create user &#039;mariabackup&#039;@&#039;localhost&#039; identified by &#039;XXX&#039;;
Query OK, 0 rows affected (0.001 sec)
MariaDB &#x5B;(none)]&amp;gt; GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO &#039;mariabackup&#039;@&#039;localhost&#039;;
Query OK, 0 rows affected (0.001 sec)
MariaDB &#x5B;(none)]&amp;gt; flush privileges;
MariaDB &#x5B;(none)]&amp;gt; exit
</pre></div>


<p class="wp-block-paragraph">Creating a dedicated directory for logs.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
sudo mkdir /var/log/mariadb
sudo chown mysql:mysql /var/log/mariadb 
</pre></div>


<p class="wp-block-paragraph">In the /etc/mysql/mariadb.conf.d/50-server.cnf file we add the following options at the end to the [mariadb-11.3] section.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# This group is only read by MariaDB-11.3 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don&#039;t understand
&#x5B;mariadb-11.3]
log_warnings=2
log_error=/var/log/mysql/mariadb.err
general_log = 1
general_log_file = /var/log/mysql/mariadb.log

&#x5B;mysqldump]
user=dump
password=XXX
max_allowed_packet = 512M

&#x5B;mariabackup]
user=mariabackup
password=XXX
databases-exclude=lost+found
</pre></div>


<p class="wp-block-paragraph">If you want to use mariabackup for backups and replication you will have to create the user and add the last section [mariabackup]</p>



<h2 class="wp-block-heading" id="h-step-3-configuring-galera-cluster">Step 3: Configuring Galera Cluster</h2>



<p class="wp-block-paragraph">Change the galera config file to the following. It is also possible to use the IPs instead of hostnames.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
galera-cluster-1a:~$ cat /etc/mysql/mariadb.conf.d/60-galera.cnf
&#x5B;galera]
# Mandatory settings
wsrep_on = ON
wsrep_cluster_name = MariaDB Galera Cluster
wsrep_cluster_address = gcomm://galera-cluster-1a,galera-cluster-1b,galera-cluster-1c
wsrep_provider = /usr/lib/galera/libgalera_smm.so
binlog_format = row
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
# Allow server to accept connections on all interfaces.
bind-address = 0.0.0.0

# Optional settings
wsrep_slave_threads = 1
innodb_flush_log_at_trx_commit = 0
wsrep_sst_auth = mariabackup:manager
wsrep_sst_method=mariabackup
wsrep_node_address=galera-cluster-1a
wsrep_sst_receive_address= galera-cluster-1a
</pre></div>


<h2 class="wp-block-heading" id="h-step-4-bootstrapping-galera-cluster">Step 4: Bootstrapping Galera Cluster</h2>



<p class="wp-block-paragraph">Now everything is ready and we can start the MariaDB Server in cluster mode.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
galera-cluster-1a:~$  sudo systemctl stop mariadb.service
galera-cluster-1a:~$  sudo galera_new_cluster
</pre></div>


<p class="wp-block-paragraph">Lets check if the one node cluster has successfully started. The start position on the very first start should look like the following</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
galera-cluster-1a:~$ ps -f -u mysql
UID        PID  PPID  C STIME TTY          TIME CMD
mysql     2081     1  0 14:37 ?        00:00:00 /usr/sbin/mariadbd --wsrep-new-cluster --wsrep_start_position= 00000000-0000-0000-0000-000000000000:-1 
</pre></div>


<p class="wp-block-paragraph">Login to your instance and check the cluster size</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
galera-cluster-1a:~$ mariadb

MariaDB &#x5B;(none)]&amp;gt; show global status like &#039;wsrep_cluster_size&#039;;
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+
MariaDB &#x5B;(none)]&amp;gt; quit
</pre></div>


<h2 class="wp-block-heading" id="h-step-5-setting-up-the-other-servers">Step 5: Setting up the other servers</h2>



<p class="wp-block-paragraph">Repeat steps 1-3 on the other two nodes but you do not have to bootstrap these nodes.<br>Simply restart the mariadb.service at the end for them to sync with the cluster. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
galera-cluster-1b:~$ sudo systemctl restart mariadb.service
galera-cluster-1c:~$ sudo systemctl restart mariadb.service 
</pre></div>


<p class="wp-block-paragraph">Afterwards you can check the cluster size again.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
galera-cluster-1a:~$ mariadb
MariaDB &#x5B;(none)]&amp;gt; show global status like &#039;wsrep_cluster_size&#039;;
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+
</pre></div>


<p class="wp-block-paragraph">Check out this blog about using mariabackup to repair your replication: <a href="https://www.dbi-services.com/blog/mariadb-repair-replication-through-db-restore-mariabackup/">https://www.dbi-services.com/blog/mariadb-repair-replication-through-db-restore-mariabackup/</a></p>
<p>L’article <a href="https://www.dbi-services.com/blog/setting-up-mariadb-galera-cluster/">Setting up MariaDB Galera Cluster</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/setting-up-mariadb-galera-cluster/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>An overview of “Oracle Cloud Infrastructure: everything for an efficient migration” event by dbi services</title>
		<link>https://www.dbi-services.com/blog/an-overview-of-oracle-cloud-infrastructure-everything-for-an-efficient-migration-event-by-dbi-services/</link>
					<comments>https://www.dbi-services.com/blog/an-overview-of-oracle-cloud-infrastructure-everything-for-an-efficient-migration-event-by-dbi-services/#comments</comments>
		
		<dc:creator><![CDATA[Oracle Team]]></dc:creator>
		<pubDate>Wed, 17 May 2023 12:19:51 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[OMrun]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[YaK]]></category>
		<category><![CDATA[#yak]]></category>
		<category><![CDATA[Autonomous]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[OCI]]></category>
		<category><![CDATA[SQLServer]]></category>
		<category><![CDATA[WebLogic]]></category>
		<category><![CDATA[zdm]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=25334</guid>

					<description><![CDATA[<p>Is the Oracle Cloud a hot topic for you? dbi services organized an event about the Cloud today in Lausanne: &#8220;Oracle Cloud Infrastructure: everything for an efficient migration&#8220;. After a welcome coffee to meet each other, Pascal Zanette shortly introduced the event and the agenda of the day. Our CTO Hervé Schweitzer presented then YaK, [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/an-overview-of-oracle-cloud-infrastructure-everything-for-an-efficient-migration-event-by-dbi-services/">An overview of “Oracle Cloud Infrastructure: everything for an efficient migration” event by dbi services</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Is the Oracle Cloud a hot topic for you?<br> <a href="https://www.dbi-services.com/" target="_blank" rel="noopener">dbi services</a> organized an event about the Cloud today in Lausanne: &#8220;<a href="https://www.dbi-services.com/news/oracle-cloud-infrastructure-everything-for-an-efficient-migration/" target="_blank" rel="noopener">Oracle Cloud Infrastructure: everything for an efficient migration</a>&#8220;.<br></p>



<span id="more-25334"></span>



<p class="wp-block-paragraph">After a welcome coffee to meet each other, <a href="https://www.linkedin.com/in/pascal-zanette-a00422/" target="_blank" rel="noopener">Pascal Zanette</a> shortly introduced the event and the agenda of the day.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2023/05/20230516_083720-1-1024x768.jpg" alt="" class="wp-image-25302"/></figure>



<p class="wp-block-paragraph">Our CTO <a href="https://www.linkedin.com/in/herve-schweitzer/" target="_blank" rel="noopener">Hervé Schweitzer</a> presented then <a href="https://www.dbi-services.com/fr/produits/yak/" target="_blank" rel="noopener">YaK</a>, developed by <a href="https://www.dbi-services.com/" target="_blank" rel="noopener">dbi services</a>.<br>The idea was born 2 years ago, to find a solution to deploy Oracle instances on several Cloud providers (<a href="https://www.oracle.com/cloud/" target="_blank" rel="noopener">Oracle</a>, <a href="https://azure.microsoft.com/en-us/" target="_blank" rel="noopener">Microsoft Azure</a>, <a href="https://aws.amazon.com/?nc1=h_ls" target="_blank" rel="noopener">AWS</a>) and On-Premises:<br>&#8211; in the same heterogeneous way<br>&#8211; avoiding constraints of each Cloud providers solution<br>&#8211; automated through <a href="https://www.ansible.com/" target="_blank" rel="noopener">Ansible</a>.<br>YaK is made of 2 parts:<br>&#8211; <a href="https://gitlab.com/yak4all/yak#get-started-setup-yak-core" target="_blank" rel="noopener">YaK Core</a> &#8211; as an Open Source collection (for the central inventory and instances deployment)<br>&#8211; YaK Components &#8211; based on a subscription (for database deployment and with dbi services best practices integration).<br>Hervé showed how YaK works more in details through a demo, that you can play again <a href="https://www.dbi-services.com/fr/produits/yak/#demo" target="_blank" rel="noopener">here</a>.<br>YaK is already available for <a href="https://www.oracle.com/" target="_blank" rel="noopener">Oracle</a> and <a href="https://www.postgresql.org/" target="_blank" rel="noopener">PostgreSQL</a>. YaK for <a href="https://www.microsoft.com/en-us/sql-server/?rtc=1" target="_blank" rel="noopener">SQL Server</a>, <a href="https://mariadb.com/" target="_blank" rel="noopener">MariaDB</a>, <a href="https://kubernetes.io/" target="_blank" rel="noopener">Kubernetes</a>, <a href="https://www.oracle.com/java/weblogic/" target="_blank" rel="noopener">WebLogic</a>, <a href="https://www.mongodb.com/" target="_blank" rel="noopener">MongoDB</a> and <a href="https://www.alfresco.com/" target="_blank" rel="noreferrer noopener">Alfresco</a> is under development and will come soon, so stay tuned! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2023/05/20230516_084629-1024x768.jpg" alt="" class="wp-image-25303"/></figure>



<p class="wp-block-paragraph"><a href="https://www.linkedin.com/in/marc-wagner-49687b3/" target="_blank" rel="noopener">Marc Wagner</a> presented how to migrate from On-Premises to <a href="https://www.oracle.com/cloud/" target="_blank" rel="noopener">Oracle OCI</a> using <a href="https://www.oracle.com/database/zero-downtime-migration/" target="_blank" rel="noopener">Zero Downtime Migration</a> tool (ZDM).<br>Marc talked about advantages to go to the Cloud (such as scalability and flexibility, no dedicated hardware, less responsibility), but also alerted the audience about things to think about (such as performances and latency, costs monitoring, lock-in risk, sensitive data). Once we decided to make this change, what about downtime to migrate to the Cloud? That&#8217;s why ZDM is interesting: it&#8217;s high available (applying MAA Best Practices), it offers a very short downtime and a minimal impact on production systems and reduces human errors. ZDM allows to migrate to <a href="https://www.oracle.com/cloud/" target="_blank" rel="noopener">Oracle OCI</a> but also to <a href="https://www.oracle.com/cloud/exadata-x9m-cloud-and-on-premises/" target="_blank" rel="noopener">On-Premises Exadata</a>, <a href="https://www.oracle.com/engineered-systems/exadata/cloud-at-customer/" target="_blank" rel="noopener">Exadata Cloud@Customer</a> (ExaCC), <a href="https://www.oracle.com/autonomous-database/" target="_blank" rel="noopener">Autonomous Database</a>, etc&#8230;<br>And finally Marc presented through a live demo how to use ZDM with an Offline Logical Migration workflow to migrate from On-Premises to ADB (you can find a summary <a href="https://www.dbi-services.com/blog/oracle-zero-downtime-migration-offline-logical-database-migration-from-on-premises-to-autonomous-db/" target="_blank" rel="noopener">here</a>).</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2023/05/20230516_101005-1024x768.jpg" alt="" class="wp-image-25304"/></figure>



<p class="wp-block-paragraph">As a last session of the event, <a href="https://www.linkedin.com/in/marc-keller-5b441a/" target="_blank" rel="noopener">Marc Keller</a>, with <a href="https://www.linkedin.com/in/frank-zeindler-b0a07182/" target="_blank" rel="noopener">Frank Zeindler</a> remotely, presented Cloud migration made easier and safer with data validation. Marc explained why an extra validation after a data migration is helpful and how the <a href="https://www.omrun.ch/en/index.html" target="_blank" rel="noopener">OMrun</a> framework can compare data and orchestrate various processes for this purpose. Some OMrun use cases were then explored:<br>
&#8211; Quality assurance for reporting<br>
&#8211; Data integrity monitoring for system changeover and production<br>
&#8211; Data crawling and data cleansing<br>
&#8211; Data masking<br>
&#8211; Data quality assurance during migration to the Cloud.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img decoding="async" data-id="25315" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2023/05/20230516_111644-1024x768.jpg" alt="" class="wp-image-25315"/></figure>
</figure>



<p class="wp-block-paragraph">The event is over. After a nice lunch break with colleagues, customers and attendees, we can come back home keeping in mind the magic triple jump to go to the Cloud (as Marc mentioned during his session):<br>&#8211; <a href="https://www.dbi-services.com/fr/produits/yak/" target="_blank" rel="noopener">dbi services YaK</a><br>&#8211; <a href="https://www.oracle.com/database/zero-downtime-migration/" target="_blank" rel="noopener">Oracle ZDM</a><br>&#8211; <a href="https://www.omrun.ch/en/index.html" target="_blank" rel="noopener">OMrun</a>.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2023/05/20230516_1206181-1024x768.jpg" alt="" class="wp-image-25325"/></figure>



<p class="wp-block-paragraph">Last thing: don&#8217;t forget that another &#8220;<a href="https://www.dbi-services.com/news/oracle-cloud-infrastructure-everything-for-an-efficient-migration/" target="_blank" rel="noopener">Oracle Cloud Infrastructure: everything for an efficient migration</a>&#8221; event will take place on May 23 in Basel.<br>And some other <a href="https://www.dbi-services.com/news/?event_type%5B%5D=1" target="_blank" rel="noopener">dbi services events</a> will be organized during the year about DevOps, Cloud, Data and much more. So again, stay tuned! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">By <a href="https://www.linkedin.com/in/elisausai/">Elisa Usai</a></p>
<p>L’article <a href="https://www.dbi-services.com/blog/an-overview-of-oracle-cloud-infrastructure-everything-for-an-efficient-migration-event-by-dbi-services/">An overview of “Oracle Cloud Infrastructure: everything for an efficient migration” event by dbi services</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/an-overview-of-oracle-cloud-infrastructure-everything-for-an-efficient-migration-event-by-dbi-services/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>MariaDB manual Switchover</title>
		<link>https://www.dbi-services.com/blog/mariadb-manual-switchover/</link>
					<comments>https://www.dbi-services.com/blog/mariadb-manual-switchover/#comments</comments>
		
		<dc:creator><![CDATA[Joan Frey]]></dc:creator>
		<pubDate>Wed, 03 May 2023 13:58:53 +0000</pubDate>
				<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[Database management]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[over]]></category>
		<category><![CDATA[SWITCH]]></category>
		<category><![CDATA[switchover]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=24931</guid>

					<description><![CDATA[<p>I’m going to explain how to do a manual Switchover in a MariaDB HA setups using master-slave replication. In my example, let’s consider that I’ve a server01 and server02, both running on Ubuntu 20.04. server02 is currently the master, server01 the slave. We’ll perform a switchover to come back to a normal status, meaning server01 [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/mariadb-manual-switchover/">MariaDB manual Switchover</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I’m going to explain how to do a manual Switchover in a MariaDB HA setups using master-slave replication.</p>



<p class="wp-block-paragraph">In my example, let’s consider that I’ve a server01 and server02, both running on Ubuntu 20.04.</p>



<p class="wp-block-paragraph">server02 is currently the master, server01 the slave.</p>



<p class="wp-block-paragraph">We’ll perform a switchover to come back to a normal status, meaning server01 as master and server02 as slave.</p>



<h3 class="wp-block-heading">Stop all the connections to the DB</h3>



<pre class="wp-block-code"><code>root@server02:~# mysql
mysql&gt; flush tables with read lock;</code></pre>



<h3 class="wp-block-heading">Recovering information from the master</h3>



<p class="wp-block-paragraph">Note the values for the parameters File and Position.</p>



<pre class="wp-block-code"><code>root@server02:~# mysql
mysql&gt; SHOW MASTER STATUS\G;

***** 1. row *****
File: mysql-bin.007747
Position: 5512879
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)</code></pre>



<h3 class="wp-block-heading">Check slave status</h3>



<p class="wp-block-paragraph">We check that the replication is working properly and that the values for the parameters Master_Log_File and Read_Master_Log_Pos correspond to the values noted in point 1.3.</p>



<pre class="wp-block-code"><code>root@server01:~# mysql
mysql&gt; SHOW SLAVE STATUS\G;</code></pre>



<h3 class="wp-block-heading">Stop slave and do the Switchover</h3>



<p class="wp-block-paragraph">From this step, the slave should switch back to master.</p>



<p class="wp-block-paragraph">Stop the slave, reset the slave configuration to 0, reset the master configuration to 0 and switch over.</p>



<p class="wp-block-paragraph">Finally we check that the changes have been made.</p>



<pre class="wp-block-code"><code>root@server01:~# mysql
mysql&gt; STOP SLAVE;
mysql&gt; reset slave all;
mysql&gt; RESET MASTER;
mysql&gt; SHOW SLAVE STATUS\G;
mysql&gt; SHOW MASTER STATUS\G</code></pre>



<h3 class="wp-block-heading">Change configuration in my.cnf</h3>



<p class="wp-block-paragraph">In the configuration of the instance, we set the slave as read only and the opposite for the master.</p>



<pre class="wp-block-code"><code>### On Master ###
root@server01:~# cd /etc/mysql/
root@server01:/etc/mysql# vi mysql.conf.d/mysqld.cnf

# In my.cnf:
read_only=0
super_read_only=0

### On slave ###
root@server02:~# cd /etc/mysql/
root@server02:/etc/mysql# vi mysql.conf.d/mysqld.cnf

# In my.cnf:
read_only=1
super_read_only=1</code></pre>



<h3 class="wp-block-heading">Restart mysql service</h3>



<p class="wp-block-paragraph">Restart the service to apply the changes in my.cnf</p>



<pre class="wp-block-code"><code>### On Master ###
# Stop the MySQL service
root@server01:~# systemctl stop mysql.service

# Start the MySQL service
root@server01:~# systemctl start mysql.service

### On slave ###
# Stop the MySQL service
root@server02:~# systemctl stop mysql.service

# Start the MySQL service
root@server02:~# systemctl start mysql.service</code></pre>



<h3 class="wp-block-heading">Configure replication on new slave</h3>



<pre class="wp-block-code"><code>root@server02:~# mysql
mysql&gt; CHANGE MASTER TO MASTER_HOST='MASTER IP', MASTER_USER='repl', MASTER_PASSWORD='***';
mysql&gt; START SLAVE;</code></pre>



<h3 class="wp-block-heading">VIP address swap</h3>



<p class="wp-block-paragraph">If the VIP address is on the server with the slave instance, we set up the VIP on the server with the master instance.</p>



<pre class="wp-block-code"><code>### On Slave ###
root@server02:~# ip addr del VIP.AD.DR.ESS/28 dev ens160

### On Master ###
root@server01:~# ip addr add VIP.AD.DR.ESS/28 dev ens160

### If blocked by firewall ###
iptables -I INPUT -i ens160 -d VIP.AD.DR.ESS -p icmp --icmp-type echo-request -j ACCEPT</code></pre>



<h3 class="wp-block-heading">Conclusion</h3>



<p class="wp-block-paragraph">The cluster is now back to a normal status, with server01 as master and server02 as slave.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/mariadb-manual-switchover/">MariaDB manual Switchover</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/mariadb-manual-switchover/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>A generic jdbc tester (part II)</title>
		<link>https://www.dbi-services.com/blog/a-generic-jdbc-tester-part-ii/</link>
					<comments>https://www.dbi-services.com/blog/a-generic-jdbc-tester-part-ii/#respond</comments>
		
		<dc:creator><![CDATA[Middleware Team]]></dc:creator>
		<pubDate>Mon, 30 Jan 2023 09:00:03 +0000</pubDate>
				<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=22058</guid>

					<description><![CDATA[<p>A generic utility to test JDBC connections to any RDBMS or no SQL data source whose JDBC drivers are provided. Oracle OCI, MariaDB and SQLite.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/a-generic-jdbc-tester-part-ii/">A generic jdbc tester (part II)</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This is part II of the article. See <a href="https://www.dbi-services.com/blog/a-generic-jdbc-tester-part-i" target="_blank" rel="noreferrer noopener">Part I</a>.</p>



<h4 class="wp-block-heading">A<em> </em>tale of 2 Oracle drivers</h4>



<p class="wp-block-paragraph">Oracle’s drivers support 2 implementations: the pure java one as used above, also named Thin drivers, with the following URL syntax:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
jdbc:oracle:thin:@//db_machine:listener_port/service_name
</pre></div>


<p class="wp-block-paragraph">but also the so-called OCI-based or Thick Type 2 drivers that rely on SQL*Net and the connect strings defined in <code>tnsnames.ora</code>, with the following syntax:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
jdbc:oracle:oci:@connect_string
</pre></div>


<p class="wp-block-paragraph">Since they use OCI native libraries, they are said to be faster than their pure java implementation counterpart. To have those libraries, an InstantClient is needed at the minimum. Here, I’m using an existing InstantClient v21.7 for Linux installation <code>/u01/dctm/repo01/oracle/instantclient_21_7</code>. It comes with its own jdbc drivers which are incompatible with the ones downloaded before (but can do both Thin and OCI), so let’s switch to the bundled ones. As they depend on native OCI libraries, those must be made accessible through the <code>LD_LIBRARY_PATH</code>.</p>



<p class="wp-block-paragraph">Here is the definition of the connect string <code>mypdb1</code> we will use; it has the same settings as the ones explicitly used with the Thin drivers:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
mypdb1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.21)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )
</pre></div>


<p class="wp-block-paragraph">Let’s adapt the environment and syntax, and try:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [2,11,14,21]; title: ; notranslate">
$ export LD_LIBRARY_PATH=/u01/dctm/repo01/oracle/instantclient_21_7
$ java -cp /u01/dctm/repo01/oracle/instantclient_21_7/ojdbc8.jar:. jdbc_tester_generic oracle.jdbc.driver.OracleDriver repo01 repo01 jdbc:oracle:oci:@mypdb1 &quot;select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual&quot;
The command-line parameters are:
arg 0 = oracle.jdbc.driver.OracleDriver
arg 1 = repo01
arg 2 = repo01
arg 3 = jdbc:oracle:oci:@mypdb1
arg 4 = select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual

Loading driver &#x5B;oracle.jdbc.driver.OracleDriver]:
JDBC Driver oracle.jdbc.driver.OracleDriver successfully loaded

Connecting to url &#x5B;jdbc:oracle:oci:@mypdb1] as user &#x5B;repo01]:
Successful connection to database

Executing SQL query &#x5B;select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual]:

Retrieving the result set:
now in Oracle db: 22/01/2023 15:51:23

JDBC connection successfully tested, quitting …
</pre></div>


<p class="wp-block-paragraph">As illustrated, since those drivers are based on OCI, they go through the SQL*Net stack to read the connectivity configuration behind the connect string <code>mypdb1</code>, namely from the <code>tnsnames.ora</code> file; hence this information does not need to be provided any more, which reflects in the simpler JDBC URL. Whenever the Oracle client is installed along with JDBC programs, it is preferable to use the OCI drivers to avoid replicating connection information instead of accessing it from one single place, although when working with RDBMS from different vendors, it is understandable to standardize to the Thin drivers for generality and portability. Anyway, there are sufficient differences in the URL syntax across RDBMS that one more does not change much. For example, Oracle Thin drivers also allows to specify the URL through the full, inlined <code>tnsnames.ora</code> syntax, e.g.:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [2,11,14,16]; title: ; notranslate">
$ export LD_LIBRARY_PATH=/u01/dctm/repo01/oracle/instantclient_21_7
$ java -cp /u01/dctm/repo01/oracle/instantclient_21_7/ojdbc8.jar:. jdbc_tester_generic oracle.jdbc.driver.OracleDriver repo01 repo01 jdbc:oracle:thin:@&quot;(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=pdb1)))&quot; &quot;select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual&quot;
The command-line parameters are:
arg 0 = oracle.jdbc.driver.OracleDriver
arg 1 = repo01
arg 2 = repo01
arg 3 = jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=pdb1)))
arg 4 = select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual

Loading driver &#x5B;oracle.jdbc.driver.OracleDriver]:
JDBC Driver oracle.jdbc.driver.OracleDriver successfully loaded

Connecting to url &#x5B;jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=pdb1)))] as user &#x5B;repo01]:
Successful connection to database
...
JDBC connection successfully tested, quitting …
</pre></div>


<p class="wp-block-paragraph">and so do the OCI drivers:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [2,11,14,16]; title: ; notranslate">
$ export LD_LIBRARY_PATH=/u01/dctm/repo01/oracle/instantclient_21_7
$ java -cp /u01/dctm/repo01/oracle/instantclient_21_7/ojdbc8.jar:. jdbc_tester_generic oracle.jdbc.driver.OracleDriver repo01 repo01 jdbc:oracle:oci:@&quot;(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=pdb1)))&quot; &quot;select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual&quot;
The command-line parameters are:
arg 0 = oracle.jdbc.driver.OracleDriver
arg 1 = repo01
arg 2 = repo01
arg 3 = jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=pdb1)))
arg 4 = select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual

Loading driver &#x5B;oracle.jdbc.driver.OracleDriver]:
JDBC Driver oracle.jdbc.driver.OracleDriver successfully loaded

Connecting to url &#x5B;jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=pdb1)))] as user &#x5B;repo01]:
Successful connection to database
...
JDBC connection successfully tested, quitting ...
</pre></div>


<h4 class="wp-block-heading"><strong>Using a SID with Oracle JDBC</strong></h4>



<p class="wp-block-paragraph">Oracle JDBC drivers allow to specify a service name, as shown so far, but also the deprecated, old-style SID. The URL syntax changes slighty. Here is a summary of the all the Oracle JDBC URL syntaxes:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [3,5,9,11]; title: ; notranslate">
# with a service name;
# Thin:
jdbc:oracle:thin:@//192.168.0.21:1521/pdb1
# OCI:
jdbc:oracle:oci:@mypdb1

# with a sid;
# Thin:
jdbc:oracle:thin:@192.168.0.21:1521:orcl
# OCI:
jdbc:oracle:oci:@mysid
</pre></div>


<p class="wp-block-paragraph">with the following mysid‘s definition in <code>tnsnames.ora</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [1,6]; title: ; notranslate">
mysid =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = orcl)
    )
  )
</pre></div>


<p class="wp-block-paragraph">where <code>orcl</code> is the sid of the container database. As we are accessing the container database now, and the <code>repo01</code> account does not exist there, we must switch to a different account; let’s use <code>system</code> as it is defined everywhere (however, it is still possible to access a pluggable database through its SID, and use the <code>repo01</code> account; for this, set the listener’s parameter <code>USE_SID_AS_SERVICE_listener=on</code>; I did not try it though and I suspect that the service syntax will have to be used but with a SID instead of a service name).</p>



<p class="wp-block-paragraph">Let’s adapt the environment and syntax, and try first with the OCI drivers:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [2,11,14,16]; title: ; notranslate">
$ export LD_LIBRARY_PATH=/u01/dctm/repo01/oracle/instantclient_21_7
$ java -cp /u01/dctm/repo01/oracle/instantclient_21_7/ojdbc8.jar:. jdbc_tester_generic oracle.jdbc.driver.OracleDriver system manager jdbc:oracle:oci:@mysid &quot;select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual&quot;
The command-line parameters are:
arg 0 = oracle.jdbc.driver.OracleDriver
arg 1 = system
arg 2 = manager
arg 3 = jdbc:oracle:oci:mysid
arg 4 = select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual

Loading driver &#x5B;oracle.jdbc.driver.OracleDriver]:
JDBC Driver oracle.jdbc.driver.OracleDriver successfully loaded

Connecting to url &#x5B;jdbc:oracle:oci:@mysid] as user &#x5B;system]:
Successful connection to database
...
JDBC connection successfully tested, quitting ...
</pre></div>


<p class="wp-block-paragraph">Using the full inline definition behind the mysid connect string:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [2,11,14,16]; title: ; notranslate">
$ export LD_LIBRARY_PATH=/u01/dctm/repo01/oracle/instantclient_21_7
$ java -cp /u01/dctm/repo01/oracle/instantclient_21_7/ojdbc8.jar:. jdbc_tester_generic oracle.jdbc.driver.OracleDriver system manager jdbc:oracle:oci:@&quot;(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SID = orcl)))&quot; &quot;select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual&quot;
The command-line parameters are:
arg 0 = oracle.jdbc.driver.OracleDriver
arg 1 = system
arg 2 = manager
arg 3 = jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SID = orcl)))
arg 4 = select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual

Loading driver &#x5B;oracle.jdbc.driver.OracleDriver]:
JDBC Driver oracle.jdbc.driver.OracleDriver successfully loaded

Connecting to url &#x5B;jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SID = orcl)))] as user &#x5B;system]:
Successful connection to database
...
JDBC connection successfully tested, quitting ...
</pre></div>


<p class="wp-block-paragraph">Let’s try now this SID with the Thin driver:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [1,10,13,15]; title: ; notranslate">
$ java -cp ojdbc11.jar:. jdbc_tester_generic oracle.jdbc.driver.OracleDriver system manager jdbc:oracle:thin:@192.168.0.21:1521:orcl &quot;select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual&quot;
The command-line parameters are:
arg 0 = oracle.jdbc.driver.OracleDriver
arg 1 = system
arg 2 = manager
arg 3 = jdbc:oracle:thin:@192.168.0.21:1521:orcl
arg 4 = select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual

Loading driver &#x5B;oracle.jdbc.driver.OracleDriver]:
JDBC Driver oracle.jdbc.driver.OracleDriver successfully loaded

Connecting to url &#x5B;jdbc:oracle:thin:@192.168.0.21:1521:orcl] as user &#x5B;system]:
Successful connection to database
...
JDBC connection successfully tested, quitting ...
</pre></div>


<p class="wp-block-paragraph">Using the inline connect string definition with the Thin drivers:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [1,10,13,15]; title: ; notranslate">
$ java -cp ojdbc11.jar:.:. jdbc_tester_generic oracle.jdbc.driver.OracleDriver system manager jdbc:oracle:thin:@&quot;(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SID = orcl)))&quot; &quot;select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual&quot; 
The command-line parameters are:
arg 0 = oracle.jdbc.driver.OracleDriver
arg 1 = system
arg 2 = manager
arg 3 = jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SID = orcl)))
arg 4 = select &#039;now in Oracle db: &#039; || to_char(sysdate, &#039;DD/MM/YYYY HH24:MI:SS&#039;) as now from dual

Loading driver &#x5B;oracle.jdbc.driver.OracleDriver]:
JDBC Driver oracle.jdbc.driver.OracleDriver successfully loaded

Connecting to url &#x5B;jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.0.21)(PORT=1521))(CONNECT_DATA=(SID = orcl)))] as user &#x5B;system]:
Successful connection to database
...
JDBC connection successfully tested, quitting ...
</pre></div>


<p class="wp-block-paragraph">As showed above, the utility <code>jdbc_tester_generic</code> is URL- and drivers-agnostic; just provide the right parameters and they will be passed unchanged to the drivers.</p>



<h4 class="wp-block-heading">Other RDBMS</h4>



<p class="wp-block-paragraph">We tested <em>jdbc_tester_generic</em> with PostgreSQL and Oracle and chances are that it is really generic indeed as it could handle Oracle’s multiple specificities. Nonetheless, let’s try it with 7 more RDBMS, e.g. MariaDB/MySQL, SQLite, Firebird, Microsoft SQL Server, HSQLDB, MongoDB and Excel, and see how it behaves. If you don’t have those installed somewhere, concise instructions to do it are presented in several articles published on the dbi-services blog site https://www.dbi-services.com/blog/<a href="https://www.dbi-services.com/blog/installing-the-odbc-driver-manager-with-sqlite-on-linux/">installing-the-odbc-driver-manager-with-</a>*, e.g. <a href="https://www.dbi-services.com/blog/installing-the-odbc-driver-manager-with-sqlite-on-linux/">https://www.dbi-services.com/blog/installing-the-odbc-driver-manager-with-sqlite-on-linux/</a> for SQLite.</p>



<p class="wp-block-paragraph">After the installation of the software and the creation of the databases, their readiness can be verified via ODBC as explained in the articles. Hereafter, we assume that those databases are up and running, with valid credentials where applicable, and we will try to access them via JDBC this time.</p>



<h5 class="wp-block-heading">MariaDB</h5>



<p class="wp-block-paragraph">First, let’s install the JDBC drivers for MariaDB:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [1]; title: ; notranslate">
$ wget https://dbschema.com/jdbc-drivers/MariaDbJdbcDriver.zip
$ unzip MariaDbJdbcDriver.zip
</pre></div>


<p class="wp-block-paragraph">The server’s default port is 3306 but let’s check it:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [5,9,17]; title: ; notranslate">
$ netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
...
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 112172/mariadbd

# or:
$ grep -i &#039;port =&#039; /etc/mysql/my.cnf
$ port = 3306

# or
$ mysql
show variables like &#039;port&#039;;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.006 sec)
</pre></div>


<p class="wp-block-paragraph">Let’s invoke the tester now:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [1,10,13,20]; title: ; notranslate">
$ java -cp mariadb-java-client-3.0.6.jar:. jdbc_tester_generic org.mariadb.jdbc.Driver debian debian jdbc:mariadb://localhost:3306/sampledb &quot;select concat(&#039;now in mysql db: &#039;, DATE_FORMAT(SYSDATE(), &#039;%d/%m/%Y %H:%i:%s&#039;)) as now;&quot;
The command-line parameters are:
arg 0 = org.mariadb.jdbc.Driver
arg 1 = debian
arg 2 = debian
arg 3 = jdbc:mariadb://localhost:3306/sampledb
arg 4 = select concat(&#039;now in mysql db: &#039;, DATE_FORMAT(SYSDATE(), &#039;%d/%m/%Y %H:%i:%s&#039;)) as now;

Loading driver &#x5B;org.mariadb.jdbc.Driver]:
JDBC Driver org.mariadb.jdbc.Driver successfully loaded

Connecting to url &#x5B;jdbc:mariadb://localhost:3306/sampledb] as user &#x5B;debian]:
Successful connection to database

Executing SQL query &#x5B;select concat(&#039;now in mysql db: &#039;, DATE_FORMAT(SYSDATE(), &#039;%d/%m/%Y %H:%i:%s&#039;)) as now;]:

Retrieving the result set:
now in mysql db: 23/01/2023 21:13:00

JDBC connection successfully tested, quitting ...
</pre></div>


<p class="wp-block-paragraph">No surprise with MariaDB.</p>



<h5 class="wp-block-heading">SQLite</h5>



<p class="wp-block-paragraph">First, let’s install the JDBC drivers for SQLite:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
$ wget https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/3.40.0.0/sqlite-jdbc-3.40.0.0.jar
</pre></div>


<p class="wp-block-paragraph">Let’s invoke the tester:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [1,10,13,20]; title: ; notranslate">
$ java -cp sqlite-jdbc-3.40.0.0.jar:. jdbc_tester_generic java.sql.Driver debian debian jdbc:sqlite:/path/to/database/sampledb &quot;select &#039;now in sqlite db: &#039; || STRFTIME(&#039;%d/%m/%Y, %H:%M:%S&#039;, datetime()) as now;&quot;
The command-line parameters are:
arg 0 = java.sql.Driver
arg 1 = debian
arg 2 = debian
arg 3 = jdbc:sqlite:/path/to/database/sampledb
arg 4 = select &#039;now in sqlite db: &#039; || STRFTIME(&#039;%d/%m/%Y, %H:%M:%S&#039;, datetime()) as now;

Loading driver &#x5B;java.sql.Driver]:
JDBC Driver java.sql.Driver successfully loaded

Connecting to url &#x5B;jdbc:sqlite:/path/to/database/sampledb] as user &#x5B;debian]:
Successful connection to database

Executing SQL query &#x5B;select &#039;now in sqlite db: &#039; || STRFTIME(&#039;%d/%m/%Y, %H:%M:%S&#039;, datetime()) as now;]:

Retrieving the result set:
now in sqlite db: 23/01/2023, 22:02:13

JDBC connection successfully tested, quitting ...
</pre></div>


<p class="wp-block-paragraph">No surprise with SQLite either.</p>



<p class="wp-block-paragraph">See <a href="https://www.dbi-services.com/blog/a-generic-jdbc-tester-part-iii/" target="_blank" rel="noreferrer noopener">Part III</a>.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/a-generic-jdbc-tester-part-ii/">A generic jdbc tester (part II)</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/a-generic-jdbc-tester-part-ii/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>What I really like about Percona PMM</title>
		<link>https://www.dbi-services.com/blog/what-i-really-like-about-percona-pmm/</link>
					<comments>https://www.dbi-services.com/blog/what-i-really-like-about-percona-pmm/#respond</comments>
		
		<dc:creator><![CDATA[Open source Team]]></dc:creator>
		<pubDate>Fri, 14 Jan 2022 06:07:33 +0000</pubDate>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Microsoft SQL Server]]></category>
		<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[Percona]]></category>
		<category><![CDATA[PMM]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/2022/01/14/what-i-really-like-about-percona-pmm/</guid>

					<description><![CDATA[<p>Percona Monitoring and Management tool (PMM) is an Open Source product which was developed to help DBAs and developers to monitor and manage MySQL, PostgreSQL and MongoDB performances. In this blog post, we will see that we can do much more with it! I discovered this tool 2 years ago when I started a monitoring [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/what-i-really-like-about-percona-pmm/">What I really like about Percona PMM</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Percona Monitoring and Management tool (<a href="https://www.percona.com/doc/percona-monitoring-and-management/2.x/index.html" target="_blank" rel="noopener">PMM</a>) is an Open Source product which was developed to help DBAs and developers to monitor and manage MySQL, PostgreSQL and MongoDB performances. In this blog post, we will see that we can do much more with it!<br />
I discovered this tool 2 years ago when I started a monitoring study for a customer, and ever since, I&#8217;ve been in love with it. I will explain you why.</p>
<p><img decoding="async" class="alignnone wp-image-53646" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/PMM-1.png" alt="" width="200" height="133" /><br />
<span id="more-519"></span></p>
<h2>It&#8217;s Open Source!</h2>
<h3>Even if money is not everything&#8230;</h3>
<p><a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Money-5.jpg"><img fetchpriority="high" decoding="async" class="alignnone size-medium wp-image-53574" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Money-5.jpg" alt="" width="300" height="300" /></a><br />
PMM is completely Open Source, and this is not surprising coming from <a href="https://www.percona.com/" target="_blank" rel="noopener">Percona</a>. But as we know, the advantage of Open Source is not only the fact of being free&#8230;</p>
<h3>Let&#8217;s contribute</h3>
<p><a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Contribution-1.jpg"><img decoding="async" class="alignnone size-medium wp-image-53575" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Contribution-1.jpg" alt="" width="300" height="300" /></a><br />
One of the keys of Open Source is contribution. When I started using PMM and sometimes I cannot find all the information I needed and more details in the <a href="https://www.percona.com/doc/percona-monitoring-and-management/2.x/index.html" target="_blank" rel="noopener">official documentation</a>, or when I discover a bug or have a question, or even if I would like to have a new feature implemented, a whole community is there to support and share knowledge in a very impressive short time:<br />
&#8211; A <a href="https://jira.percona.com/projects/PMM/issues/" target="_blank" rel="noopener">JIRA</a> issue tracker to submit a bug report.<br />
&#8211; A very useful <a href="https://www.percona.com/blog/" target="_blank" rel="noopener">blog</a> with plenty of posts about new features, technical step-by-step deployment information, tips and much more. And obviously the possibility to write to the author.<br />
&#8211; A <a href="https://forums.percona.com/c/percona-monitoring-and-management-pmm/percona-monitoring-and-management-pmm-v2" target="_blank" rel="noopener">Percona Community Forum</a> to exchange with Percona experts.</p>
<h3>Evolution</h3>
<p><a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Improvements.jpg"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-53589" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Improvements.jpg" alt="" width="300" height="300" /></a><br />
Open Source means also quick evolution of the product. PMM is getting better every month, with continuous improvements, new features, corrections of bugs and so on.</p>
<h2>One tool to monitor several technologies</h2>
<p><a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Techs_SQUARE.jpg"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-53577" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Techs_SQUARE.jpg" alt="" width="300" height="300" /></a><br />
If we speak about monitoring solutions, what makes the difference nowadays? Except rare cases, each of us works with a mix of different database solutions: Open Source vs proprietary, On-Premises vs Cloud. And when we want to identify performance issues on our application, we also need system benchmarks, replication metrics, etc&#8230; PMM is a platform that we can use to centralize our monitoring data, because:<br />
&#8211; Exporters to collect metrics for <a href="https://www.mysql.com/" target="_blank" rel="noopener">MySQL</a>, <a href="https://mariadb.com/" target="_blank" rel="noopener">MariaDB</a>, <a href="https://www.postgresql.org/" target="_blank" rel="noopener">PostgreSQL</a> and <a href="https://www.mongodb.com" target="_blank" rel="noopener">MongoDB</a> instances and their replication, the <a href="https://proxysql.com/" target="_blank" rel="noopener">ProxySQL</a> and the <a href="http://www.haproxy.org/" target="_blank" rel="noopener">HAProxy</a>, instances hosted on <a href="https://aws.amazon.com/rds/" target="_blank" rel="noopener">Amazon RDS</a> or on <a href="https://cloud.google.com/" target="_blank" rel="noopener">Google Cloud Platform</a> are embedded in the PMM tool as well as pre-configured dashboards, so the monitoring can be easily put in place.<br />
&#8211; Even proprietary technologies such as <a href="https://www.oracle.com/index.html" target="_blank" rel="noopener">Oracle</a> and <a href="https://www.microsoft.com/en-us/sql-server/" target="_blank" rel="noopener">SQL Server</a> can be integrated to PMM through external exporters. In this case we have the choice to develop our own exporter and design our own dashboards or use what is already been developed and designed by other contributors. <a href="https://prometheus.io/docs/instrumenting/exporters/" target="_blank" rel="noopener">Here</a> you can find the links to some Third-party exporters.</p>
<h2>Less maintenance tasks</h2>
<p><a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Maintenance.jpg"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-53581" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Maintenance.jpg" alt="" width="300" height="300" /></a><br />
The PMM platform is based on a client-server model. The 2 main components on the server side are the following ones:<br />
&#8211; <a href="https://victoriametrics.com/" target="_blank" rel="noopener">VictoriaMetrics</a>, a time series database (replacing <a href="https://prometheus.io/" target="_blank" rel="noopener">Prometheus</a> since PMM 2.12.0 version) that aggregates metrics collected by exporters<br />
&#8211; <a href="https://grafana.com" target="_blank" rel="noopener">Grafana</a> allowing to visualize the aggregated data in a web interface.<br />
But actually, we don&#8217;t have to care about that! We don&#8217;t need to install Prometheus or VictoriaMetrics components, install Grafana and then configure it to let them talk together. We can just see the PMM platform as a black box: we will have only one tool to install and to maintain.</p>
<h2>Sexy dashboards</h2>
<p>Integrated dashboards are designed with accuracy and provide a detailed and temporal analysis of our data.<br />
Here my favorite ones:<br />
&#8211; <strong>Node Summary</strong><br />
It&#8217;s the system dashboard. We can visualize here metrics such as CPU, memory, disk occupation and performances, processes, network traffic and get some information about our system architecture:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/screencapture-192-168-193-101-graph-d-node-instance-summary-node-summary-2022-01-13-19_48_56.png"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-53586" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/screencapture-192-168-193-101-graph-d-node-instance-summary-node-summary-2022-01-13-19_48_56.png" alt="" width="163" height="300" /></a><br />
We have also the possibility to compare several nodes:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/screencapture-192-168-193-101-graph-d-node-instance-compare-nodes-compare-2022-01-13-19_50_04.png"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-53587" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/screencapture-192-168-193-101-graph-d-node-instance-compare-nodes-compare-2022-01-13-19_50_04.png" alt="" width="131" height="300" /></a><br />
&#8211; <strong>MySQL Summary</strong><br />
It&#8217;s one of the MySQL dashboards which displays general metrics about our instance (uptime, version, InnoDB Buffer Pool size, connections, threads, table locks, traffic, and much more):<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/screencapture-192-168-193-101-graph-d-mysql-instance-summary-mysql-instance-summary-2022-01-13-20_05_36.png"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-53588" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/screencapture-192-168-193-101-graph-d-mysql-instance-summary-mysql-instance-summary-2022-01-13-20_05_36.png" alt="" width="128" height="300" /></a><br />
And we still have the option to compare different instances.<br />
&#8211; <strong>MySQL Replication</strong><br />
It&#8217;s the dashboard which offers us an overview on the MySQL Master-Slave Replication:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/MySQL-Replication.png"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-53591" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/MySQL-Replication.png" alt="" width="300" height="144" /></a><br />
&#8211; <strong>Query Analytics</strong><br />
QAN is a special dashboard that allows us to analyze MySQL and PostgreSQL databases queries over time:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/screencapture-192-168-193-101-graph-d-pmm-qan-pmm-query-analytics-2022-01-13-19_54_41.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-53592" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/screencapture-192-168-193-101-graph-d-pmm-qan-pmm-query-analytics-2022-01-13-19_54_41.png" alt="" width="1920" height="1542" /></a><br />
This can be very useful to identify performance problems.</p>
<h2>Coming soon</h2>
<p><a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Work-in-progress-1.jpg"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-53585" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/Work-in-progress-1.jpg" alt="" width="300" height="300" /></a><br />
Currently the last PMM stable release is 2.25.0. As we told just above, the tool is evolving a lot, and nice features are already available in technical preview:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/New-features.png"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-53596" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/01/New-features.png" alt="" width="300" height="80" /></a><br />
You can already play with that even if for the moment it&#8217;s not suggested to use them for production environments. I tested for example the Integrated Alerting and I cannot wait to have it available as a stable feature (we don&#8217;t need then anymore to configure an External Prometheus Alertmanager to be alerted if something goes wrong on our systems).</p>
<p>I hope you have enjoyed this introduction to PMM.<br />
Now it&#8217;s up to you: don&#8217;t hesitate to test it! For my part, I will surely write again about PMM, so stay tuned! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>L’article <a href="https://www.dbi-services.com/blog/what-i-really-like-about-percona-pmm/">What I really like about Percona PMM</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/what-i-really-like-about-percona-pmm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Some words about SOUG Day in Lausanne</title>
		<link>https://www.dbi-services.com/blog/some-words-about-soug-day-in-lausanne/</link>
					<comments>https://www.dbi-services.com/blog/some-words-about-soug-day-in-lausanne/#respond</comments>
		
		<dc:creator><![CDATA[Oracle Team]]></dc:creator>
		<pubDate>Thu, 14 Nov 2019 15:13:13 +0000</pubDate>
				<category><![CDATA[Big Data]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[Database management]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[Microservice]]></category>
		<category><![CDATA[NewSQL]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/some-words-about-soug-day-in-lausanne/</guid>

					<description><![CDATA[<p>Today I participate to SOUG Day which takes place in Lausanne at the &#8220;Centre Pluriculturel et social d’Ouchy&#8221;. After a coffee and a welcome speech by Yann Neushaus, Ludovico Caldara and Flora Barriele, the event starts with 2 global sessions: A l&#8217;heure du serverless, le futur va-t-il aller aux bases de données distribuées? Franck Pachot [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/some-words-about-soug-day-in-lausanne/">Some words about SOUG Day in Lausanne</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Today I participate to <a href="https://soug.ch/calendrier/soug-day-romandie-en-lausanne" target="_blank" rel="noopener noreferrer">SOUG Day</a> which takes place in Lausanne at the &#8220;Centre Pluriculturel et social d’Ouchy&#8221;.<br />
<span id="more-13008"></span><br />
After a coffee and a welcome speech by <a href="https://www.linkedin.com/in/yannneuhaus/" target="_blank" rel="noopener noreferrer">Yann Neushaus</a>, <a href="https://www.linkedin.com/in/ludovicocaldara/" target="_blank" rel="noopener noreferrer">Ludovico Caldara</a> and <a href="https://www.linkedin.com/in/florabarriele/" target="_blank" rel="noopener noreferrer">Flora Barriele</a>,<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/20191114_090656.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/20191114_090656.jpg" alt="" width="300" height="225" class="alignnone size-medium wp-image-35673" /></a><br />
the event starts with 2 global sessions:</p>
<h3>A l&#8217;heure du serverless, le futur va-t-il aller aux bases de données distribuées?</h3>
<p><a href="https://www.linkedin.com/in/franckpachot/" target="_blank" rel="noopener noreferrer">Franck Pachot</a> makes a comparison between Oracle products (Active Data Guard, RAC, Sharding) and new distributed databases in order to scale-up and scale-out.<br />
Briefly his talk makes reference to:<br />
&#8211; Differences among RDBMS, NoSQL and NewSQL according to the CAP Theorem<br />
&#8211; Definition and needs for NoSQL and NewSQL<br />
&#8211; Definition of services such as <a href="https://cloud.google.com/spanner/" target="_blank" rel="noopener noreferrer">Google&#8217;s Cloud Spanner</a>, <a href="https://pingcap.com/en/" target="_blank" rel="noopener noreferrer">TiDB</a>, <a href="https://www.cockroachlabs.com/db/product/?utm_source=google&amp;utm_medium=cpc&amp;obility_id=73582335042&amp;utm_campaign=EMEA_-_BOFU_-_Search_-_Brand&amp;utm_adgroup=Cockroach_Labs&amp;utm_term=cockroach%20database&amp;utm_content=393745684732&amp;gclid=Cj0KCQiAk7TuBRDQARIsAMRrfUZ_8CvkVtFbS7JZtc_kJts94jCgc-HjEadLi2LOb8UMzGBe22RgrcUaAmN1EALw_wcB" target="_blank" rel="noopener noreferrer">CockroachDB</a>, <a href="https://www.yugabyte.com/" target="_blank" rel="noopener noreferrer">YugabyteDB</a>.</p>
<h3>From DBA to Data Engineer &#8211; How to survive a career transition?</h3>
<p>Kamran Agayev from Azerbaijan speaks about what Big Data in general is and the transition from DBA to Database Engineer.<br />
He addresses several interesting topics:<br />
&#8211; Definition of Big Data<br />
&#8211; Which are the skills for a Data Engineer, a Data Architect (more complex competences than &#8220;just&#8221; being a Database Administrator)<br />
&#8211; Definition of products like Hadoop, Kafka, NoSQL<br />
After the coffee break, the choice is between 2 different streams. Here some words about the sessions I attend.</p>
<h3>Amazing SQL</h3>
<p>Laetitia Avrot from <a href="https://www.enterprisedb.com/" target="_blank" rel="noopener noreferrer">EnterpriseDB</a> talks about SQL, which is much more than what we know. SQL is different from other programming languages but it must be treated as one of them. At school we still learn SQL from before 1992, but in 1999 it changed to add relational algebra and data atomicity. PostgreSQL is very close to this standard. Laetitia shows lots of concrete examples of subqueries, common table expressions (CTE), lateral joins (not implemented in MySQL for the moment), anti joins, rollup, window functions, recursive CTE, and also some explanations about key words such as in, values, not in, not exists.</p>
<h3>Graph Database</h3>
<p>After the lunch, <a href="https://www.linkedin.com/in/gceresa/" target="_blank" rel="noopener noreferrer">Gianni Ceresa</a> presents property graph databases as combination of vertex (node, properties, ID) and edge (node, ID, label, properties). To start working with Oracle graphs, we can use PGX (Oracle Labs Parallel Graph AnalytiX). The OTN version is better for documentation. Through a demo, Gianni shows how to build a graph using Apache Zeppelin as interpreter and Phyton and Jupyter to visualize it. And then we can also use it to write some data analysis.</p>
<h3>5 mistakes that you&#8217;re making while presenting your data</h3>
<p><a href="https://www.linkedin.com/in/luizakoziel/" target="_blank" rel="noopener noreferrer">Luiza Nowak</a>, a non-IT girl working with IT people (she is a board member of <a href="https://poug.org/en/" target="_blank" rel="noopener noreferrer">POUG</a>), talks about IT presentations. There are 4 important parts defining them: the content, the story, the speaker performance and visualization.<br />
Here recurrent errors of IT presentations and how to handle them:<br />
1. Lack of data selection &#8211; you need to filter your data, to consider who and where you are talking to<br />
2. Too much at once &#8211; you need to divide your content, create some suspense and put less information into slides to let the audience listen to you instead of reading them<br />
3. Forget about contrast &#8211; you have to use contrast on purpose because it can be useful to underline something but it can also distract your audience<br />
4. Wrong type of charts &#8211; you have to be clear about your data and explain results<br />
5. You don&#8217;t have any story &#8211; you need to conceptualize your data.</p>
<h3>How can Docker help a MariaDB cluster for disaster/recovery</h3>
<p><a href="https://www.linkedin.com/in/sa%C3%AFd-mendi-a78a1a38/" target="_blank" rel="noopener noreferrer">Saïd Mendi</a> from <a href="https://www.dbi-services.com/" target="_blank" rel="noopener noreferrer">dbi services</a> explains what a <a href="https://mariadb.com/kb/en/library/what-is-mariadb-galera-cluster/" target="_blank" rel="noopener noreferrer">MariaDB Galera Cluster</a> is and his benefits and how Docker can help in some critical situations. Actually you can create some delayed slaves which can be useful to emulate the flashback functionality.</p>
<h3>Conclusion</h3>
<p>SOUG Day arrives to an end. It was a nice opportunity to meet international speakers, discuss with some customers and colleagues, learn and share. As usual, this is part of dbi services spirit and matches with our values!<br />
And now, I have to say you goodbye: it&#8217;s the aperitif and dinner time with the community <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Hope to see you at the next <a href="https://soug.ch/" target="_blank" rel="noopener noreferrer">SOUG</a> event.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/some-words-about-soug-day-in-lausanne/">Some words about SOUG Day in Lausanne</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/some-words-about-soug-day-in-lausanne/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MariaDB 10.3.1x + 10.4.x : mysqld_multi not working properly</title>
		<link>https://www.dbi-services.com/blog/mariadb-10-3-1x-10-4-x-mysqld_multi-not-working-properly/</link>
					<comments>https://www.dbi-services.com/blog/mariadb-10-3-1x-10-4-x-mysqld_multi-not-working-properly/#respond</comments>
		
		<dc:creator><![CDATA[Jérôme Witt]]></dc:creator>
		<pubDate>Wed, 30 Oct 2019 19:28:56 +0000</pubDate>
				<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[elseif should be elsif]]></category>
		<category><![CDATA[mysqld_multi]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/mariadb-10-3-1x-10-4-x-mysqld_multi-not-working-properly/</guid>

					<description><![CDATA[<p>A couple of days ago, we upgraded some MariaDB instances on a consolidated database server. However, after the software update we were not able to manage our instances anymore using mysqld_multi whatever the MariaDB release (10.3.18 or the latest 10.4.x). Previously, everything worked fine with 10.3.14. So, what happened to our system? Lets&#8217; quickly start [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/mariadb-10-3-1x-10-4-x-mysqld_multi-not-working-properly/">MariaDB 10.3.1x + 10.4.x : mysqld_multi not working properly</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>A couple of days ago, we upgraded some MariaDB instances on a consolidated database server. However, after the software update we were not able to manage our instances anymore using mysqld_multi whatever the MariaDB release (10.3.18 or the latest 10.4.x).</p>
<p>Previously, everything worked fine with 10.3.14. So, what happened to our system?<br />
<span id="more-12920"></span><br />
Lets&#8217; quickly start an instance:</p>
<pre class="brush: bash; gutter: true; first-line: 1">mysql@vmoel:/u01/app/mysql/product/mariadb-10.3.18/bin/ [mysqld3] ./mysqld_multi start 3
elseif should be elsif at /u01/app/mysql/product/mariadb-10.3.18/bin/mysqld_multi line 352.
syntax error at /u01/app/mysql/product/mariadb-10.3.18/bin/mysqld_multi line 353, near ")
      {"
syntax error at /u01/app/mysql/product/mariadb-10.3.18/bin/mysqld_multi line 356, near "else"
syntax error at /u01/app/mysql/product/mariadb-10.3.18/bin/mysqld_multi line 404, near "}"
Illegal declaration of subroutine main::stop_mysqlds at /u01/app/mysql/product/mariadb-10.3.18/bin/mysqld_multi line 416.</pre>
<p>Actually, the error message is quite simple to understand and to fix. We let you check &amp; fix the bug by yourself (hint : &#8220;elseif should be elsif&#8221;) <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60e.png" alt="😎" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>That&#8217;s it for now but does your MariaDB instances start now? Hum, try it and check your error log like we did:</p>
<pre class="brush: bash; gutter: true; first-line: 1">2019-10-30 20:53:33 0 [Note] InnoDB: 10.3.18 started; log sequence number 1630952; transaction id 21
2019-10-30 20:53:33 0 [Note] InnoDB: Loading buffer pool(s) from /u02/mysqldata/mysqld3/ib_buffer_pool
2019-10-30 20:53:33 0 [Note] Plugin 'FEEDBACK' is disabled.
2019-10-30 20:53:33 0 [ERROR] /u01/app/mysql/product/mariadb-10.3.18/bin/mysqld: unknown variable 'defaults-group-suffix=mysqld3'
2019-10-30 20:53:33 0 [ERROR] Aborting</pre>
<p>Still not working ? Hum, now after some further analysis of the perl code especially the perl routine &#8220;start_mysqlds&#8221; we could identify the real problem.</p>
<p>While, writing this article we found someone already reported that bug<a href="https://jira.mariadb.org/browse/MDEV-20728"> MDEV-20728</a> !  Thanks to him</p>
<p>The fix is directly available on <a href="https://github.com/MariaDB/server/commit/748c97bc19b1e27e968a6eea684cc8930b634fa3">the MariaDB GitHub repository</a></p>
<p>Good luck <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>L’article <a href="https://www.dbi-services.com/blog/mariadb-10-3-1x-10-4-x-mysqld_multi-not-working-properly/">MariaDB 10.3.1x + 10.4.x : mysqld_multi not working properly</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/mariadb-10-3-1x-10-4-x-mysqld_multi-not-working-properly/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Lazy Loading (feed)

Served from: www.dbi-services.com @ 2026-11-08 16:19:02 by W3 Total Cache
-->