
{"id":3193,"date":"2019-07-09T07:20:45","date_gmt":"2019-07-09T06:20:45","guid":{"rendered":"http:\/\/dasini.net\/blog\/?p=3193"},"modified":"2019-09-10T08:45:28","modified_gmt":"2019-09-10T07:45:28","slug":"mysql-innodb-cluster-recovering-and-provisioning-with-mysqldump","status":"publish","type":"post","link":"https:\/\/dasini.net\/blog\/2019\/07\/09\/mysql-innodb-cluster-recovering-and-provisioning-with-mysqldump\/","title":{"rendered":"MySQL InnoDB Cluster &#8211;  Recovering and provisioning with mysqldump"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/Butterfly_800x398_by_olivier_dasini.png\" alt=\"Butterfly by Olivier DASINI\"\/><\/figure><\/div>\n\n\n\n<p>As the administrator of a cluster, among other tasks, you should be able to restore failed nodes and grow (or shrink) your cluster by adding (or removing) new nodes.<\/p>\n\n\n\n<p>In MySQL, as a backup tool (and if your amount of data is not too big), you can use <strong><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/mysqldump.html\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (s\u2019ouvre dans un nouvel onglet)\">mysqldump<\/a><\/strong> a client utility that performs <a rel=\"noreferrer noopener\" aria-label=\"logical backups (opens in a new tab)\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/glossary.html#glos_logical_backup\" target=\"_blank\">logical backups<\/a>. <br>The results are SQL statements that reproduce the original schema objects and data.<\/p>\n\n\n\n<p>For substantial amounts of data however, a <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/glossary.html#glos_physical_backup\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (s\u2019ouvre dans un nouvel onglet)\">physical backup<\/a>&nbsp;solution such as&nbsp;<strong><a rel=\"noreferrer noopener\" aria-label=\"MySQL Enterprise Backup (opens in a new tab)\" href=\"https:\/\/www.mysql.com\/products\/enterprise\/backup.html\" target=\"_blank\">MySQL Enterprise Backup<\/a><\/strong> is faster, particularly for the restore operation.<br>Hey! guess what? You can read: <a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2019\/07\/11\/mysql-innodb-cluster-recovering-and-provisioning-with-mysql-enterprise-backup\/\" target=\"_blank\">MySQL InnoDB Cluster \u2013 Recovering and provisioning with MySQL Enterprise Backup<\/a><\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\">Context<\/h2>\n\n\n\n<p>Let&rsquo;s make it as simple as possible \ud83d\ude42<br>I&rsquo;m using MySQL <strong>8.0.16<\/strong>.<br>I have an <strong>InnoDB Cluster<\/strong> <a rel=\"noreferrer noopener\" aria-label=\" (s\u2019ouvre dans un nouvel onglet)\" href=\"http:\/\/dasini.net\/blog\/2019\/09\/03\/tutoriel-deployer-mysql-8-0-innodb-cluster-09-2019\/\" target=\"_blank\">setup<\/a> &#8211; up and running.<br>So my main assumption is that you already know what is <a rel=\"noreferrer noopener\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/group-replication.html\" target=\"_blank\">MySQL Group Replication<\/a> &amp; <a rel=\"noreferrer noopener\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/mysql-innodb-cluster-userguide.html\" target=\"_blank\">MySQL InnoDB Cluster<\/a>.<br>Additionally you can read <a href=\"http:\/\/dasini.net\/blog\/2019\/09\/03\/tutoriel-deployer-mysql-8-0-innodb-cluster-09-2019\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (s\u2019ouvre dans un nouvel onglet)\">this tutorial<\/a> and this <a rel=\"noreferrer noopener\" href=\"https:\/\/lefred.be\/content\/mysql-innodb-cluster-howto-install-it-from-scratch\/\" target=\"_blank\">article<\/a> from my colleague <a rel=\"noreferrer noopener\" href=\"https:\/\/lefred.be\/\" target=\"_blank\">lefred<\/a> or <a rel=\"noreferrer noopener\" href=\"http:\/\/mysqlhk.blogspot.com\/2019\/05\/mysql-innodb-cluster-setup-on-windows.html\" target=\"_blank\">this one on Windows Platform<\/a> from my colleague <a rel=\"noreferrer noopener\" href=\"http:\/\/mysqlhk.blogspot.com\/\" target=\"_blank\">Ivan<\/a>. <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><u><em>Note<\/em><\/u>:<\/p><p>Depending on how you configured your MySQL InnoDB Cluster, some steps could be slightly different.<\/p><\/blockquote>\n\n\n\n\n\n<h2 class=\"wp-block-heading\">Scenario 1 &#8211; Node Recovering<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>A 3 nodes MySQL InnoDB Cluster &#8211; M1 \/ M2 \/ M3, in single primary mode<\/li><li>MySQL Router is configured to enable R\/W connections on port 3306 and RO connections on port 3307<\/li><li>M1 is currently the primary (so in Read\/Write mode)<\/li><li>M2 &amp; M3 are currently the secondaries (i.e. Read Only mode)<\/li><li>M1 failed! Some tables are irreconcilably corrupted \ud83d\ude41<\/li><li>M2 &amp; M3 are now the (new temporary) cluster<\/li><\/ul>\n\n\n\n<p>The goal then is to rebuild M1 and put it back to the cluster.<\/p>\n\n\n\n\n\n<p>So like I stated we have a 3 nodes MySQL 8.0.16 InnoDB Cluster up and running:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ mysqlsh clusterAdmin@{mysqlRouterIP}:3306 --cluster\n...\n\nMySQL JS> cluster.status()\n{\n    \"clusterName\": \"pocCluster\", \n    \"defaultReplicaSet\": {\n        \"name\": \"default\", \n        \"primary\": \"M1:3306\", \n        \"ssl\": \"REQUIRED\", \n        \"status\": \"OK\", \n        \"statusText\": \"Cluster is ONLINE and can tolerate up to ONE failure.\", \n        \"topology\": {\n            \"M1:3306\": {\n                \"address\": \"M1:3306\", \n                \"mode\": \"R\/W\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M2:3306\": {\n                \"address\": \"M2:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M3:3306\": {\n                \"address\": \"M3:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }\n        }, \n        \"topologyMode\": \"Single-Primary\"\n    }, \n    \"groupInformationSourceMember\": \"M1:3306\"\n}<\/code><\/pre>\n\n\n\n<p>Then M1 failed (status is \u00ab\u00a0<em>MISSING<\/em>\u00ab\u00a0) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MySQL JS> cluster.status()\n{\n    \"clusterName\": \"pocCluster\", \n    \"defaultReplicaSet\": {\n        \"name\": \"default\", \n        \"primary\": \"M2:3306\", \n        \"ssl\": \"REQUIRED\", \n        \"status\": \"OK_NO_TOLERANCE\", \n        \"statusText\": \"Cluster is NOT tolerant to any failures. 1 member is not active\", \n        \"topology\": {\n            \"M1:3306\": {\n                \"address\": \"M1:3306\", \n                \"mode\": \"n\/a\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"(MISSING)\"\n            }, \n            \"M2:3306\": {\n                \"address\": \"M2:3306\", \n                \"mode\": \"R\/W\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M3:3306\": {\n                \"address\": \"M3:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }\n        }, \n        \"topologyMode\": \"Single-Primary\"\n    }, \n    \"groupInformationSourceMember\": \"M2:3306\"\n}<\/code><\/pre>\n\n\n\n<p>M1 was the primary. <br>The cluster initiated an automatic database failover to elect a new primary&#8230; blablabla<br>Anyway you already know the story \ud83d\ude42<\/p>\n\n\n\n<p>After a while M1 is finally fixed and ready to be part of the cluster again.<br>To minimize the recovery time instead of using the last dump we prefer to  take a fresh one.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Speaking of backup, I recommend reading the excellent blog post from my colleague <a rel=\"noreferrer noopener\" aria-label=\"Jesper (opens in a new tab)\" href=\"https:\/\/mysql.wisborg.dk\/\" target=\"_blank\">Jesper<\/a>  &#8211;  <a rel=\"noreferrer noopener\" aria-label=\"MySQL Backup Best Practices (opens in a new tab)\" href=\"https:\/\/mysql.wisborg.dk\/2019\/03\/31\/mysql-backup-best-practices\/\" target=\"_blank\">MySQL Backup Best Practices<\/a>.<\/p><\/blockquote>\n\n\n\n<p>Let&rsquo;s take a fresh dump on a secondary node using MySQL Router, on port 3307 with my custom configuration (we could also used the primary).<br>The dump will  roughly looks like  :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysqldump --defaults-file=\/etc\/my.cnf -u mdump -p -h {mysqlRouterIP} -P 3307 --all-databases --routines --events --single-transaction --flush-privileges --hex-blob --log-error=\/var\/log\/mysqldump.log --result-file=\/data\/backups\/dump.sql<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><u>Minimum privileges for the MySQL user with which mysqldump connects to the server<\/u><\/p><p>Actually this minimum privileges depends on what object you wan to  dump and what for the dump it is.<\/p><p>However the following privileges <u>should<\/u> be fine for most of the classical usages:<\/p><p>GRANT <strong>SELECT, SHOW VIEW, EVENT, TRIGGER, LOCK TABLES, CREATE, ALTER, RELOAD, REPLICATION CLIENT, REPLICATION_SLAVE_ADMIN<\/strong> ON *<em>.*<\/em> TO &lt;dumpUser&gt;<\/p><\/blockquote>\n\n\n\n<p>Please note that it is <u>highly recommended<\/u>, in addition to the <strong><a rel=\"noreferrer noopener\" aria-label=\"my.cnf (opens in a new tab)\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/glossary.html#glos_my_cnf\" target=\"_blank\"><em>my.cnf<\/em><\/a><\/strong>, to include in your backup process a copy of the <a rel=\"noreferrer noopener\" aria-label=\"auto.cnf (opens in a new tab)\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/option-files.html\" target=\"_blank\"><strong><em>auto.cnf<\/em><\/strong><\/a> and <a rel=\"noreferrer noopener\" aria-label=\"mysqld-auto.cnf (opens in a new tab)\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/persisted-system-variables.html\" target=\"_blank\"><strong><em>mysqld-auto.cnf<\/em><\/strong><\/a> configuration files for all nodes.<br><\/p>\n\n\n\n<p>If you \u00ab\u00a0lose\u00a0\u00bb your <em>auto.cnf<\/em> file, don&rsquo;t worry the server will generate a new one for you. <br>However the recovery process will be slightly different&#8230; (more on that below). <\/p>\n\n\n\n<p>Now it&rsquo;s time to restore this dump on node M1.<\/p>\n\n\n\n<p>Because this server is part of InnoDB Cluster, clearly there are some extra steps compare to a standalone server restoration.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Restore the data<\/h3>\n\n\n\n<p><u>First<\/u>, restore the data on M1:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>It&rsquo;s a logical restoration so the server to restore must be up \ud83d\ude00<\/li><li>Group Replication plugin must be stopped<ul><li>STOP GROUP_REPLICATION;<\/li><\/ul><\/li><li>Disable logging to the binary log<ul><li>SET SQL_LOG_BIN=0;<\/li><\/ul><\/li><li>Delete binary log files<ul><li>RESET MASTER; <\/li><\/ul><\/li><li>Clear the master info and relay log info repositories and deletes all the relay log files<ul><li>RESET SLAVE;<\/li><\/ul><\/li><li>Enable updates<ul><li>SET GLOBAL super_read_only=0;<\/li><\/ul><\/li><li>Load the dump<br><ul><li>source \/data\/backups\/dump.sql<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>This gives us:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysqlsh root@M1:3306 --sql\n...\n\nM1 SQL> STOP GROUP_REPLICATION;\nQuery OK, 0 rows affected (12.04 sec)\n\nM1 SQL> SET SQL_LOG_BIN=0;\nQuery OK, 0 rows affected (0.00 sec)\n\nM1 SQL> RESET MASTER; \nQuery OK, 0 rows affected (0.06 sec)\n\nM1 SQL> RESET SLAVE;\nQuery OK, 0 rows affected (0.13 sec)\n\nM1 SQL> SET GLOBAL super_read_only=0;\nQuery OK, 0 rows affected (0.00 sec)\n\nM1 SQL> source \/data\/backups\/dump.sql\nQuery OK, 0 rows affected (0.00 sec)\n...<\/code><\/pre>\n\n\n\n\n\n<h3 class=\"wp-block-heading\" id=\"mce_18\">Put the node back to the cluster<\/h3>\n\n\n\n<p><u>Second<\/u>, put the node back to the cluster.<br>Connect to MySQL Router on the <u>primary<\/u> (port 3306 in my case):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ mysqlsh clusterAdmin@{mysqlRouterIP}:3306 --cluster\n...\n\nMySQL JS> cluster.rejoinInstance(\"clusterAdmin@M1:3306\")\nRejoining the instance to the InnoDB cluster. Depending on the original problem that made the instance unavailable, the rejoin operation might not be successful and further manual steps will be needed to fix the underlying problem.\n\nPlease monitor the output of the rejoin operation and take necessary action if the instance cannot rejoin.\n\nRejoining instance to the cluster ...\n\nThe instance 'M1:3306' was successfully rejoined on the cluster.\n<\/code><\/pre>\n\n\n\n<p>Now you should check the new cluster status<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MySQL JS> cluster.status()\n{\n    \"clusterName\": \"pocCluster\", \n    \"defaultReplicaSet\": {\n        \"name\": \"default\", \n        \"primary\": \"M2:3306\", \n        \"ssl\": \"REQUIRED\", \n        \"status\": \"OK\", \n        \"statusText\": \"Cluster is ONLINE and can tolerate up to ONE failure.\", \n        \"topology\": {\n            \"M1:3306\": {\n                \"address\": \"M1:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M2:3306\": {\n                \"address\": \"M2:3306\", \n                \"mode\": \"R\/W\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M3:3306\": {\n                \"address\": \"M3:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }\n        }, \n        \"topologyMode\": \"Single-Primary\"\n    }, \n    \"groupInformationSourceMember\": \"M2:3306\"\n}<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><u><em>Note<\/em><\/u>:<\/p><p>The  cluster status of the restored node will be in the status \u00ab\u00a0RECOVERING\u00a0\u00bb before to be \u00ab\u00a0ONLINE\u00a0\u00bb.<\/p><\/blockquote>\n\n\n\n\n\n<h3 class=\"wp-block-heading\">Lost the auto.cnf file<\/h3>\n\n\n\n<p>As promised, the case when the <em><strong>auto.cnf<\/strong><\/em> configuration file is not restored. <br>In fact, in that case the cluster would see this node as a new node (because the server will have a new UUID).<br>So the process for putting it back is different.<\/p>\n\n\n\n<p>Also note that if you loose the <strong><em>mysqld-auto.cnf<\/em><\/strong> file you&rsquo;ll probably need to configure (again) the server to be Group Replication aware.<\/p>\n\n\n\n<p>So basically the process is doing some cleaning and then add the old node like it was a new node.<\/p>\n\n\n\n<p><br>Assuming Group Replication plugin is stopped on M1:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Check the configuration even more important if you lost mysqld-auto.cnf :)\nMySQL JS> dba.checkInstanceConfiguration('clusterAdmin@M1:3306')\nValidating MySQL instance at M1:3306 for use in an InnoDB cluster...\n\nThis instance reports its own address as M1\n\nChecking whether existing tables comply with Group Replication requirements...\nNo incompatible tables detected\n\nChecking instance configuration...\nInstance configuration is compatible with InnoDB cluster\n\nThe instance 'M1:3306' is valid for InnoDB cluster usage.\n\n{\n    \"status\": \"ok\"\n}\n\n\n\/\/ If needed configure your instance\nMySQL JS> dba.configureInstance('clusterAdmin@M1:3306')\n\n\n\/\/ Remove the old node from the cluster metadata\nMySQL JS> cluster.rescan()\nRescanning the cluster...\n\nResult of the rescanning operation for the 'default' ReplicaSet:\n{\n    \"name\": \"default\", \n    \"newTopologyMode\": null, \n    \"newlyDiscoveredInstances\": [], \n    \"unavailableInstances\": [\n        {\n            \"host\": \"M1:3306\", \n            \"label\": \"M1:3306\", \n            \"member_id\": \"a3f1ee50-9be3-11e9-a3fe-0242ac13000b\"\n        }\n    ]\n}\n\nThe instance 'M1:3306' is no longer part of the ReplicaSet.\nThe instance is either offline or left the HA group. You can try to add it to the cluster again with the cluster.rejoinInstance('M1:3306') command or you can remove it from the cluster configuration.\nWould you like to remove it from the cluster metadata? [Y\/n]: Y\nRemoving instance from the cluster metadata...\nThe instance 'M1:3306' was successfully removed from the cluster metadata.\n\n\n\/\/ Add the new instance\nMySQL JS> cluster.addInstance(\"clusterAdmin@M1:3306\")\nA new instance will be added to the InnoDB cluster. Depending on the amount of data on the cluster this might take from a few seconds to several hours.\n\nAdding instance to the cluster ...\n\nValidating instance at M1:3306...\n\nThis instance reports its own address as M1\n\nInstance configuration is suitable.\nThe instance 'clusterAdmin@M1:3306' was successfully added to the cluster.\n\n\n\/\/ Check\nMySQL JS> cluster.status()\n{\n    \"clusterName\": \"pocCluster\", \n    \"defaultReplicaSet\": {\n        \"name\": \"default\", \n        \"primary\": \"M2:3306\", \n        \"ssl\": \"REQUIRED\", \n        \"status\": \"OK\", \n        \"statusText\": \"Cluster is ONLINE and can tolerate up to ONE failure.\", \n        \"topology\": {\n            \"M1:3306\": {\n                \"address\": \"M1:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M2:3306\": {\n                \"address\": \"M2:3306\", \n                \"mode\": \"R\/W\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M3:3306\": {\n                \"address\": \"M3:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }\n        }, \n        \"topologyMode\": \"Single-Primary\"\n    }, \n    \"groupInformationSourceMember\": \"M2:3306\"\n}<\/code><\/pre>\n\n\n\n<p>Et voil\u00e0 !<\/p>\n\n\n\n\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mce_2\">Scenario 2 &#8211; Node Provisioning<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>A 3 nodes MySQL InnoDB Cluster &#8211; M1 \/ M2 \/ M3 in single primary mode<\/li><li>MySQL Router is configured to enable R\/W connections on port 3306 and RO connections on port 3307<\/li><li>M2 is currently the primary in Read\/Write mode<\/li><li>M1 &amp; M3 are currently the secondaries in Read Only mode<\/li><\/ul>\n\n\n\n<p>The goal then is to add 2 new nodes: M4 &amp; M5<\/p>\n\n\n\n\n\n<p>So we have the 3 nodes MySQL 8.0.16 InnoDB Cluster that we used in the first part of this article. <br>And it is up and running.<\/p>\n\n\n\n<p>Actually adding new nodes is very close to what we have done previously.<\/p>\n\n\n\n<p>The process is :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Deploy the new MySQL instance preferably already configured for Group Replication<\/li><li>Restore the data in the way that we have seen previously<\/li><\/ul>\n\n\n\n\n\n<p>Check the configuration and the configuration itself can be done respectively with <a rel=\"noreferrer noopener\" aria-label=\"dba.checkInstanceConfiguration (opens in a new tab)\" href=\"https:\/\/dev.mysql.com\/doc\/dev\/mysqlsh-api-javascript\/8.0\/classmysqlsh_1_1dba_1_1_dba.html#aef7387e5a7be5b449af2559bb4e66099\" target=\"_blank\">dba.checkInstanceConfiguration<\/a>() and <a rel=\"noreferrer noopener\" aria-label=\"dba.configure (opens in a new tab)\" href=\"https:\/\/dev.mysql.com\/doc\/dev\/mysqlsh-api-javascript\/8.0\/classmysqlsh_1_1dba_1_1_dba.html#af4510380474d531a9fb775693e94eaac\" target=\"_blank\">dba.configure<\/a>() functions (and it could also be useful to use <em><strong><a rel=\"noreferrer noopener\" href=\"https:\/\/dev.mysql.com\/doc\/dev\/mysqlsh-api-javascript\/8.0\/classmysqlsh_1_1dba_1_1_cluster.html#ae589dbf4e07c85108ab47b3735c3114a\" target=\"_blank\">checkInstanceState<\/a>()<\/strong><\/em> &#8211; <a rel=\"noreferrer noopener\" aria-label=\"see this article (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2018\/08\/30\/tutoriel-deployer-mysql-8-0-innodb-cluster\/\" target=\"_blank\">see this article<\/a>).<br>e.g. on node M4:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ mysqlsh clusterAdmin@M4:3306 -- dba checkInstanceConfiguration\nValidating MySQL instance at M4:3306 for use in an InnoDB cluster...\n\nThis instance reports its own address as M4\n\nChecking whether existing tables comply with Group Replication requirements...\nNo incompatible tables detected\n\nChecking instance configuration...\nInstance configuration is compatible with InnoDB cluster\n\nThe instance 'M4:3306' is valid for InnoDB cluster usage.\n\n{\n    \"status\": \"ok\"\n}<\/code><\/pre>\n\n\n\n\n\n<p>The first part of the restore process is the same than the one we have seen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysqlsh root@M4:3306 --sql\n...\n\nM4 SQL> STOP GROUP_REPLICATION; -- if necessary\nQuery OK, 0 rows affected (12.04 sec)\n\nM4 SQL> SET SQL_LOG_BIN=0;\nQuery OK, 0 rows affected (0.00 sec)\n\nM4 SQL> RESET MASTER; \nQuery OK, 0 rows affected (0.06 sec)\n\nM4 SQL> RESET SLAVE;\nQuery OK, 0 rows affected (0.13 sec)\n\nM4 SQL> SET GLOBAL super_read_only=0;\nQuery OK, 0 rows affected (0.00 sec)\n\nM4 SQL> source \/data\/backups\/dump.sql\nQuery OK, 0 rows affected (0.00 sec)\n...<\/code><\/pre>\n\n\n\n\n\n<p>For the second part, we will now add the new node (M4) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Add the new instance\nMySQL JS> cluster.addInstance(\"clusterAdmin@M4:3306\")\n\n\n\/\/ Check\nMySQL JS> cluster.status()\n{\n    \"clusterName\": \"pocCluster\", \n    \"defaultReplicaSet\": {\n        \"name\": \"default\", \n        \"primary\": \"M2:3306\", \n        \"ssl\": \"REQUIRED\", \n        \"status\": \"OK\", \n        \"statusText\": \"Cluster is ONLINE and can tolerate up to ONE failure.\", \n        \"topology\": {\n            \"M1:3306\": {\n                \"address\": \"M1:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M2:3306\": {\n                \"address\": \"M2:3306\", \n                \"mode\": \"R\/W\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M3:3306\": {\n                \"address\": \"M3:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M4:3306\": {\n                \"address\": \"M4:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }\n        }, \n        \"topologyMode\": \"Single-Primary\"\n    }, \n    \"groupInformationSourceMember\": \"M2:3306\"\n}<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><u><strong><em>Note<\/em><\/strong><\/u>:<\/p><p>If necessary, just before the <em>addInstance()<\/em> you can do the <em>checkInstanceConfiguration()<\/em> and <em>configureInstance()<\/em>.<\/p><\/blockquote>\n\n\n\n\n\n<p>Same process for the last node, M5.<\/p>\n\n\n\n<p>And finally you got a 5 nodes MySQL InnoDB Cluster \\o\/:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MySQL JS> cluster.status()\n{\n    \"clusterName\": \"pocCluster\", \n    \"defaultReplicaSet\": {\n        \"name\": \"default\", \n        \"primary\": \"M2:3306\", \n        \"ssl\": \"REQUIRED\", \n        \"status\": \"OK\", \n        \"statusText\": \"Cluster is ONLINE and can tolerate up to 2 failures.\", \n        \"topology\": {\n            \"M1:3306\": {\n                \"address\": \"M1:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M2:3306\": {\n                \"address\": \"M2:3306\", \n                \"mode\": \"R\/W\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M3:3306\": {\n                \"address\": \"M3:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M4:3306\": {\n                \"address\": \"M4:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }, \n            \"M5:3306\": {\n                \"address\": \"M5:3306\", \n                \"mode\": \"R\/O\", \n                \"readReplicas\": {}, \n                \"role\": \"HA\", \n                \"status\": \"ONLINE\", \n                \"version\": \"8.0.16\"\n            }\n        }, \n        \"topologyMode\": \"Single-Primary\"\n    }, \n    \"groupInformationSourceMember\": \"M2:3306\"\n}<\/code><\/pre>\n\n\n\n\n\n<p>This is one way to do node recovery and provisioning using mysqldump, when your amount of data is not big.<\/p>\n\n\n\n<p>When logical backup is not efficient it is time to use an hot, online and non-blocking physical backup tool like <strong><a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"https:\/\/www.mysql.com\/products\/enterprise\/backup.html\" target=\"_blank\">MySQL Enterprise Backup<\/a><\/strong>.<br>Actually, it&rsquo;s even easier! <br>Please read: <a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2019\/07\/11\/mysql-innodb-cluster-recovering-and-provisioning-with-mysql-enterprise-backup\/\" target=\"_blank\">MySQL InnoDB Cluster \u2013 Recovering and provisioning with MySQL Enterprise Backup<\/a>.<\/p>\n\n\n\n<p>A final word to say that some new features are coming in this area&#8230; \ud83d\ude42<br>Stay tuned! <br><br><\/p>\n\n\n\n\n\n<h3 class=\"wp-block-heading\" id=\"mce_0\">References<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/mysql-innodb-cluster-userguide.html\" target=\"_blank\">MySQL InnoDB Cluster<\/a> <\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/group-replication.html\" target=\"_blank\">MySQL Group Replication<\/a> <\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/dev.mysql.com\/doc\/mysql-shell\/8.0\/en\/\" target=\"_blank\">MySQL Shell<\/a> <\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/dev.mysql.com\/doc\/mysql-router\/8.0\/en\/\" target=\"_blank\">MySQL Router<\/a> <\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" aria-label=\"mysqldump \u2014 A Database Backup Program (opens in a new tab)\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/mysqldump.html\" target=\"_blank\">mysqldump \u2014 A Database Backup Program<\/a> <\/li><li><a rel=\"noreferrer noopener\" aria-label=\"Using mysqldump for Backups (opens in a new tab)\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/using-mysqldump.html\" target=\"_blank\">Using mysqldump for Backups<\/a> <\/li><li><a rel=\"noreferrer noopener\" aria-label=\"Logical backup (opens in a new tab)\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/glossary.html#glos_logical_backup\" target=\"_blank\">Logical backup<\/a> <\/li><li><a href=\"https:\/\/mysql.wisborg.dk\/2019\/03\/31\/mysql-backup-best-practices\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (s\u2019ouvre dans un nouvel onglet)\">MySQL Backup Best Practices<\/a> <\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" aria-label=\" (s\u2019ouvre dans un nouvel onglet)\" href=\"http:\/\/dasini.net\/blog\/2019\/09\/03\/tutoriel-deployer-mysql-8-0-innodb-cluster-09-2019\/\" target=\"_blank\">Tutoriel \u2013 D\u00e9ployer MySQL 8.0 InnoDB Cluster (09-2019)<\/a><\/li><li><a href=\"http:\/\/dasini.net\/blog\/2019\/09\/10\/mysql-innodb-cluster-easy-recovering-and-provisioning\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (s\u2019ouvre dans un nouvel onglet)\">MySQL InnoDB Cluster \u2013 Easy Recovering and provisioning<\/a><\/li><li><a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2019\/07\/11\/mysql-innodb-cluster-recovering-and-provisioning-with-mysql-enterprise-backup\/\" target=\"_blank\">MySQL InnoDB Cluster \u2013 Recovering and provisioning with MySQL Enterprise Backup<\/a> <\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/dasini.net\/blog\/2019\/04\/11\/mysql-innodb-cluster-howto-1-monitor-your-cluster\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (s\u2019ouvre dans un nouvel onglet)\">MySQL InnoDB Cluster \u2013 HowTo #1 \u2013 Monitor your cluster<\/a><\/li><li><a rel=\"noreferrer noopener\" href=\"http:\/\/dasini.net\/blog\/2019\/05\/21\/mysql-innodb-cluster-howto-2-validate-an-instance\/\" target=\"_blank\">MySQL InnoDB Cluster \u2013 HowTo #2 \u2013 Validate an instance<\/a> <\/li><\/ul>\n\n\n\n\n\n<p><strong><u>Misc<\/u><\/strong><br>Node 1 &#8211; Group Replication configuration<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysql> SHOW VARIABLES LIKE 'group_replication%';\n+-----------------------------------------------------+-------------------------------------+\n| Variable_name                                       | Value                               |\n+-----------------------------------------------------+-------------------------------------+\n| group_replication_allow_local_lower_version_join    | OFF                                 |\n| group_replication_auto_increment_increment          | 7                                   |\n| group_replication_autorejoin_tries                  | 1                                   |\n| group_replication_bootstrap_group                   | OFF                                 |\n| group_replication_communication_debug_options       | GCS_DEBUG_NONE                      |\n| group_replication_communication_max_message_size    | 10485760                            |\n| group_replication_components_stop_timeout           | 31536000                            |\n| group_replication_compression_threshold             | 1000000                             |\n| group_replication_consistency                       | EVENTUAL                            |\n| group_replication_enforce_update_everywhere_checks  | OFF                                 |\n| group_replication_exit_state_action                 | READ_ONLY                           |\n| group_replication_flow_control_applier_threshold    | 25000                               |\n| group_replication_flow_control_certifier_threshold  | 25000                               |\n| group_replication_flow_control_hold_percent         | 10                                  |\n| group_replication_flow_control_max_quota            | 0                                   |\n| group_replication_flow_control_member_quota_percent | 0                                   |\n| group_replication_flow_control_min_quota            | 0                                   |\n| group_replication_flow_control_min_recovery_quota   | 0                                   |\n| group_replication_flow_control_mode                 | QUOTA                               |\n| group_replication_flow_control_period               | 1                                   |\n| group_replication_flow_control_release_percent      | 50                                  |\n| group_replication_force_members                     |                                     |\n| group_replication_group_name                        | d1b109bf-9be3-11e9-9ea2-0242ac13000b|\n| group_replication_group_seeds                       | M2:33061,M3:33061,M4:33061,M5:33061 |\n| group_replication_gtid_assignment_block_size        | 1000000                             |\n| group_replication_ip_whitelist                      | AUTOMATIC                           |\n| group_replication_local_address                     | M1:33061                            |\n| group_replication_member_expel_timeout              | 0                                   |\n| group_replication_member_weight                     | 50                                  |\n| group_replication_message_cache_size                | 1073741824                          |\n| group_replication_poll_spin_loops                   | 0                                   |\n| group_replication_recovery_complete_at              | TRANSACTIONS_APPLIED                |\n| group_replication_recovery_get_public_key           | OFF                                 |\n| group_replication_recovery_public_key_path          |                                     |\n| group_replication_recovery_reconnect_interval       | 60                                  |\n| group_replication_recovery_retry_count              | 10                                  |\n| group_replication_recovery_ssl_ca                   |                                     |\n| group_replication_recovery_ssl_capath               |                                     |\n| group_replication_recovery_ssl_cert                 |                                     |\n| group_replication_recovery_ssl_cipher               |                                     |\n| group_replication_recovery_ssl_crl                  |                                     |\n| group_replication_recovery_ssl_crlpath              |                                     |\n| group_replication_recovery_ssl_key                  |                                     |\n| group_replication_recovery_ssl_verify_server_cert   | OFF                                 |\n| group_replication_recovery_use_ssl                  | ON                                  |\n| group_replication_single_primary_mode               | ON                                  |\n| group_replication_ssl_mode                          | REQUIRED                            |\n| group_replication_start_on_boot                     | ON                                  |\n| group_replication_transaction_size_limit            | 150000000                           |\n| group_replication_unreachable_majority_timeout      | 0                                   |\n+-----------------------------------------------------+-------------------------------------+<\/code><\/pre>\n\n\n\n\n\n<div style=\"height:75px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-vivid-red-color has-text-color\"><strong>Thanks for using MySQL!<\/strong><\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><a href=\"https:\/\/www.linkedin.com\/groups\/12524512\/\" target=\"_blank\" rel=\"noopener\" title=\"Olivier DASINI on Linkedin\">Follow me on Linkedin<\/a><\/p>\n\n\n\n<p>Watch my videos on my <a href=\"https:\/\/www.youtube.com\/channel\/UC12TulyJsJZHoCmby3Nm3WQ\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Olivier's MySQL Channel\">YouTube channel<\/a> and <a href=\"https:\/\/www.youtube.com\/channel\/UC12TulyJsJZHoCmby3Nm3WQ\/?sub_confirmation=1\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Subscribe\">subscribe<\/a>.<\/p>\n\n\n\n<p>My <a href=\"https:\/\/www.slideshare.net\/freshdaz\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Olivier DASINI on Slideshare\">Slideshare account<\/a>.<\/p>\n\n\n\n<p>My <a href=\"https:\/\/speakerdeck.com\/freshdaz\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Olivier DASINI on Speaker Deck\">Speaker Deck account<\/a>.<\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-vivid-red-color has-text-color\"><strong>Thanks for using HeatWave &amp; MySQL!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>As the administrator of a cluster, among other tasks, you should be able to restore failed nodes and grow (or shrink) your cluster by adding (or removing) new nodes.<br \/>\nIn MySQL, as a backup tool (and if your amount of data is not too big), you can use mysqldump a client utility that performs logical backups.<br \/>\nThe results are SQL statements that reproduce the original schema objects and data.<br \/>\nFor substantial amounts of data however, a physical backup solution such as MySQL Enterprise Backup is faster, particularly for the restore operation.<br \/>\nBut this is the topic of my next blog post \ud83d\ude42<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[351,355,203,339],"tags":[413,343,345,349],"class_list":["post-3193","post","type-post","status-publish","format-standard","hentry","category-group-replication-en","category-high-availability","category-mysql-en","category-tuto-en","tag-cluster-en","tag-group-replication-en","tag-high-availability-en","tag-tuto-en"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9LfWW-Pv","jetpack-related-posts":[{"id":3219,"url":"https:\/\/dasini.net\/blog\/2019\/07\/11\/mysql-innodb-cluster-recovering-and-provisioning-with-mysql-enterprise-backup\/","url_meta":{"origin":3193,"position":0},"title":"MySQL InnoDB Cluster &#8211; Recovering and provisioning with MySQL Enterprise Backup","author":"Olivier DASINI","date":"11 juillet 2019","format":false,"excerpt":"Like I stated in my previous article - MySQL InnoDB Cluster - Recovering and provisioning with mysqldump : \"As the administrator of a cluster, among others tasks, you should be able to restore failed nodes and to add (or remove) new nodes\". Well, I still agree with myself :) MySQL\u2026","rel":"","context":"Dans &quot;Group Replication&quot;","block_context":{"text":"Group Replication","link":"https:\/\/dasini.net\/blog\/category\/group-replication-en\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3360,"url":"https:\/\/dasini.net\/blog\/2019\/09\/10\/mysql-innodb-cluster-easy-recovering-and-provisioning\/","url_meta":{"origin":3193,"position":1},"title":"MySQL InnoDB Cluster &#8211; Easy Recovering and provisioning","author":"Olivier DASINI","date":"10 septembre 2019","format":false,"excerpt":"Up to MySQL 8.0.16, to perform these tasks you could: - Use MySQL Enterprise Backup : - Use mysqldump Starting with MySQL 8.0.17, the easiest and recommended method is to use the CLONE feature.","rel":"","context":"Dans &quot;Group Replication&quot;","block_context":{"text":"Group Replication","link":"https:\/\/dasini.net\/blog\/category\/group-replication-en\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3086,"url":"https:\/\/dasini.net\/blog\/2019\/05\/21\/mysql-innodb-cluster-howto-2-validate-an-instance\/","url_meta":{"origin":3193,"position":2},"title":"MySQL InnoDB Cluster &#8211; HowTo #2 &#8211; Validate an instance","author":"Olivier DASINI","date":"21 mai 2019","format":false,"excerpt":"Q: Validate an instance for MySQL InnoDB Cluster usage? A: Use check_instance_configuration()","rel":"","context":"Dans &quot;Group Replication&quot;","block_context":{"text":"Group Replication","link":"https:\/\/dasini.net\/blog\/category\/group-replication-en\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2951,"url":"https:\/\/dasini.net\/blog\/2019\/04\/11\/mysql-innodb-cluster-howto-1-monitor-your-cluster\/","url_meta":{"origin":3193,"position":3},"title":"MySQL InnoDB Cluster &#8211; HowTo #1 &#8211; Monitor your cluster","author":"Olivier DASINI","date":"11 avril 2019","format":false,"excerpt":"MySQL InnoDB Cluster - HowTo #1 - Monitor your cluster Q: How do I monitor the status & the configuration of my cluster? A: Use status() or status({extended:true}) or status({queryMembers:true})?","rel":"","context":"Dans &quot;Group Replication&quot;","block_context":{"text":"Group Replication","link":"https:\/\/dasini.net\/blog\/category\/group-replication-en\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2090,"url":"https:\/\/dasini.net\/blog\/2018\/01\/09\/setting-up-proxysql-1-4-with-mysql-5-7-group-replication\/","url_meta":{"origin":3193,"position":4},"title":"Setting up ProxySQL 1.4 with MySQL 5.7 Group Replication","author":"Olivier DASINI","date":"9 janvier 2018","format":false,"excerpt":"There are 3\u00a0pillars for a database architecture: Monitoring, Backup \/ Restore process, High Availability This blog post is about database High Availability; more precisely about one of the best combo of the moment : MySQL 5.7 Group Replication\u00a0: the only native HA solution for MySQL, it's a\u00a0Single\/Multi-master update everywhere replication\u2026","rel":"","context":"Dans &quot;Group Replication&quot;","block_context":{"text":"Group Replication","link":"https:\/\/dasini.net\/blog\/category\/group-replication-en\/"},"img":{"alt_text":"MySQL","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/mysql_300x161.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":4462,"url":"https:\/\/dasini.net\/blog\/2021\/04\/13\/heatwave-a-mysql-cloud-feature-to-speed-up-your-queries\/","url_meta":{"origin":3193,"position":5},"title":"HeatWave &#8211; A MySQL cloud feature to speed up your queries","author":"Olivier DASINI","date":"13 avril 2021","format":false,"excerpt":"If you have (too) long running select queries it is probably because of lack of relevant indexes, problematic schema that lead to poor queries or inadequate hardware. That said, sometime even if you doing it right, the query execution time could be too long regarding of what the application or\u2026","rel":"","context":"Dans &quot;Cloud&quot;","block_context":{"text":"Cloud","link":"https:\/\/dasini.net\/blog\/category\/cloud\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/04\/MySQL-Database-Service-HeatWave-Replication.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/04\/MySQL-Database-Service-HeatWave-Replication.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/04\/MySQL-Database-Service-HeatWave-Replication.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/04\/MySQL-Database-Service-HeatWave-Replication.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/3193","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/comments?post=3193"}],"version-history":[{"count":59,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/3193\/revisions"}],"predecessor-version":[{"id":3459,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/3193\/revisions\/3459"}],"wp:attachment":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/media?parent=3193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/categories?post=3193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/tags?post=3193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}