
{"id":5556,"date":"2022-03-09T15:21:07","date_gmt":"2022-03-09T14:21:07","guid":{"rendered":"http:\/\/dasini.net\/blog\/?p=5556"},"modified":"2022-03-09T15:21:08","modified_gmt":"2022-03-09T14:21:08","slug":"data-migration-from-mariadb-to-mysql","status":"publish","type":"post","link":"https:\/\/dasini.net\/blog\/2022\/03\/09\/data-migration-from-mariadb-to-mysql\/","title":{"rendered":"Data Migration from MariaDB to MySQL"},"content":{"rendered":"\n<p>Yet another customer wanted to migrate from MariaDB to MySQL. So I decided to write down the overall data migration process.<\/p>\n\n\n\n<p>Indeed each migration are a unique story so I won&rsquo;t provide you a \u00ab\u00a0How to migrate\u00a0\u00bb&#8230; <br>The idea is to highlight the general path and help you to avoid common pitfalls and thus help you save some precious time.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Context<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Source database <ul><li>MariaDB 10.3<\/li><li>Around 8GB of data<\/li><li>Only InnoDB tables <\/li><li>Many user accounts (important information)<\/li><\/ul><\/li><li>Target databases<ul><li>MySQL Database Service 8.0.28<\/li><li>MySQL 8.0.28<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>In fact, the (real) target was <a href=\"https:\/\/docs.oracle.com\/en-us\/iaas\/mysql-database\/index.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL Database Service - \"><strong>MySQL Database Service<\/strong><\/a> the MySQL PaaS on <a href=\"https:\/\/www.oracle.com\/cloud\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Oracle Cloud Infrastructure - The next-generation cloud designed to run any application, faster and more securely, for less.\"><strong>Oracle Cloud Infrastructure<\/strong><\/a>, but I will also show the workflow for on-premise MySQL. <\/p>\n\n\n\n<p>Please find below a reenactment of the events&#8230;<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">MySQL Shell<\/h2>\n\n\n\n<p>The first step is to install the MySQL DBA <a href=\"https:\/\/www.ladbible.com\/cdn-cgi\/image\/width=648,quality=70,format=webp,fit=pad,dpr=1\/https%3A%2F%2Fs3-images.ladbible.com%2Fs3%2Fcontent%2F928c08d55ef219754120d0a67087ba2d.jpg\" target=\"_blank\" rel=\"noreferrer noopener\">BFF<\/a>: <a href=\"https:\/\/dev.mysql.com\/doc\/mysql-shell\/8.0\/en\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL Shell is an advanced client and code editor for MySQL\"><strong>MySQL Shell<\/strong><\/a>. <br>MySQL Shell is an advanced client and code editor for MySQL. You can manage your data using <strong>SQL<\/strong>, <strong>JavaScript<\/strong> and <strong>Python<\/strong>.<\/p>\n\n\n\n<p>In addition to data manipulation (btw MySQL 8.0 also provides a NoSQL CRUD API to handle JSON documents), there are also a lot of things you can do with MySQL Shell like create a MySQL cluster (<a href=\"https:\/\/dev.mysql.com\/doc\/mysql-shell\/8.0\/en\/mysql-innodb-cluster.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL InnoDB Cluster\">InnoDB Cluster<\/a>, <a href=\"https:\/\/dev.mysql.com\/doc\/mysql-shell\/8.0\/en\/mysql-innodb-replicaset.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL InnoDB ReplicaSet\">InnoDB ReplicaSet<\/a>, <a href=\"https:\/\/dev.mysql.com\/doc\/mysql-shell\/8.0\/en\/innodb-clusterset.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL InnoDB ClusterSet\">InnoDB ClusterSet<\/a>), &nbsp;verify whether your MySQL server instances is ready for upgrade, dump and restore, etc&#8230; :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/MySQL_Shell_Overview-800x515.png?resize=600%2C386\" alt=\"\" class=\"wp-image-5566\" width=\"600\" height=\"386\" srcset=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/MySQL_Shell_Overview.png?resize=800%2C515&amp;ssl=1 800w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/MySQL_Shell_Overview.png?resize=300%2C193&amp;ssl=1 300w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/MySQL_Shell_Overview.png?resize=768%2C495&amp;ssl=1 768w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/MySQL_Shell_Overview.png?w=964&amp;ssl=1 964w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n\n\n\n<p>Believe me if you try it, you will love it \ud83d\ude42 <\/p>\n\n\n\n<p><br>It is way better than the old mysql text client and some of these features work with MariaDB (at least the ones needed for the migration).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/mysql_shell_prompt_theme_normal-800x612.png?resize=600%2C459\" alt=\"\" class=\"wp-image-5565\" width=\"600\" height=\"459\" srcset=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/mysql_shell_prompt_theme_normal.png?resize=800%2C612&amp;ssl=1 800w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/mysql_shell_prompt_theme_normal.png?resize=300%2C230&amp;ssl=1 300w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/mysql_shell_prompt_theme_normal.png?resize=768%2C588&amp;ssl=1 768w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/mysql_shell_prompt_theme_normal.png?w=826&amp;ssl=1 826w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n\n\n\n<p>Easy to install.<br>e.g.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;opc@mariadb10-3 ~]$ \nsudo yum install -y mysql-shell<\/code><\/pre>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">The source dataset<\/h2>\n\n\n\n<p>Let&rsquo;s have a look on the dataset.<\/p>\n\n\n\n<p>Unfortunately MariaDB does not have the <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/sys-schema.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL sys schema\">sys schema<\/a>\u2026<br>We cannot use this very elegant query:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- MySQL 5.7 \/ 8.0+\n\nSELECT sys.format_bytes(sum(data_length)) DATA,\n       sys.format_bytes(sum(index_length)) INDEXES,\n       sys.format_bytes(sum(data_length + index_length)) 'TOTAL SIZE'\nFROM information_schema.TABLES ORDER  BY data_length + index_length\n;<\/code><\/pre>\n\n\n\n<p>So back in the time and let&rsquo;s use the information_schema instead and the following ugly query:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- MySQL (old version) \/ MariaDB --\n\nSQL&gt;\nSELECT \n    CONCAT( SUM( ROUND( DATA_LENGTH \/ (1024 \/ 1024) ,2)), 'MB' ) AS Data,\n    CONCAT( SUM( ROUND( INDEX_LENGTH \/ (1024 \/ 1024) ,2)), 'MB' ) AS Indexes,\n    CONCAT( SUM( ROUND( (DATA_LENGTH + INDEX_LENGTH) \/ (1024 * 1024) ,2)), 'MB' ) AS 'Total Size' \nFROM information_schema.TABLES ORDER BY DATA_LENGTH + INDEX_LENGTH\n;\n\n+-----------------+-----------------+------------+\n| Data            | Indexes         | Total Size |\n+-----------------+-----------------+------------+\n| 3044154215.00MB | 5688978432.00MB | 8328.61MB  |\n+-----------------+-----------------+------------+<\/code><\/pre>\n\n\n\n<p>Approximately 8GB of data.<\/p>\n\n\n\n<p>What about the storage engines?<\/p>\n\n\n\n<p>Again because of lack of sys schema we cannot use this pretty query:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- MySQL 5.7 \/ 8.0+\n\nSELECT count(*) as '# TABLES', sys.format_bytes(sum(data_length)) DATA, \n       sys.format_bytes(sum(index_length)) INDEXES,   \n       sys.format_bytes(sum(data_length + index_length)) 'TOTAL SIZE', \n       engine `ENGINE` FROM information_schema.TABLES \nWHERE TABLE_SCHEMA NOT IN ('sys','mysql', 'information_schema', 'performance_schema', 'mysql_innodb_cluster_metadata')\nGROUP BY engine\nORDER BY engine;<\/code><\/pre>\n\n\n\n<p>So let&rsquo;s back in the time and use instead:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- MySQL (old version) \/ MariaDB --\n\nSQL&gt;\nSELECT \n   count(*) as '# TABLES',\n   CONCAT( SUM( ROUND( DATA_LENGTH \/ (1024 \/ 1024) ,2)), 'MB' ) AS Data,\n   CONCAT( SUM( ROUND( INDEX_LENGTH \/ (1024 \/ 1024) ,2)), 'MB' ) AS Indexes,\n   CONCAT( SUM( ROUND( (DATA_LENGTH + INDEX_LENGTH) \/ (1024 * 1024) ,2)), 'MB' ) AS 'Total Size',\n   engine `ENGINE` FROM information_schema.TABLES \nWHERE TABLE_SCHEMA NOT IN ('sys','mysql', 'information_schema', 'performance_schema', 'mysql_innodb_cluster_metadata')\nGROUP BY engine\nORDER BY engine\n;\n\n+----------+-----------------+-----------------+------------+--------+\n| # TABLES | Data            | Indexes         | Total Size | ENGINE |\n+----------+-----------------+-----------------+------------+--------+\n|        2 | NULL            | NULL            | NULL       | NULL   |\n|       26 | 3043442688.00MB | 5688705024.00MB | 8327.66MB  | InnoDB |\n+----------+-----------------+-----------------+------------+--------+<\/code><\/pre>\n\n\n\n<p>All tables are in InnoDB \\o\/ <br>That&rsquo;s how DBA&rsquo;s life should be \ud83d\ude42<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Migrate the data<\/h2>\n\n\n\n<p>The source is MariaDB 10.3 and the target is MySQL 8.0, <strong>on-premise<\/strong> or using <strong>MySQL Database Service<\/strong>.<\/p>\n\n\n\n<p>With such amount of data ~10GB a dump is not an issue especially if you use  <a href=\"https:\/\/dev.mysql.com\/doc\/mysql-shell\/8.0\/en\/mysql-shell-utilities.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL Shell Utilities\">MySQL Shell utilities<\/a> (please forget about the aging mysqldump &#8211; it deserves a nice retirement).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Migrate to MySQL on-premise<\/h3>\n\n\n\n<p>Because I need the whole instance, I&rsquo;m going to use MySQL Shell <strong><a href=\"https:\/\/dev.mysql.com\/doc\/mysql-shell\/8.0\/en\/mysql-shell-utilities-dump-instance-schema.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL Shell - Instance Dump Utility, Schema Dump Utility, and Table Dump Utility\"><em>dumpInstance<\/em><\/a><\/strong> utility.<\/p>\n\n\n\n<p>An important option of <em>dumpInstance<\/em> is <em><strong>compatibility<\/strong><\/em>. It can <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>enforce  the InnoDB storage engine (<em>force_innodb<\/em>) ie change&nbsp;<a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/create-table.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL - CREATE TABLE Statement\"><code>CREATE TABLE<\/code><\/a>&nbsp;statements to use the&nbsp;<a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/innodb-storage-engine.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL - The InnoDB Storage Engine\"><code>InnoDB<\/code><\/a>&nbsp;storage engine for any tables that do not already use it <\/li><li>ignore any missing primary keys (<em>ignore_missing_pks<\/em>),<\/li><li>automatically add primary keys in invisible columns (<em>create_invisible_pks<\/em>)<\/li><li>etc&#8230;<\/li><\/ul>\n\n\n\n<p>Here, I will only use <em>force_innodb<\/em>. (if your memory is better than mine you remember that all the tables are already in InnoDB, so not really needed in this case, but I must admit that I&rsquo;m paranoid :-O). <br>Joke aside, it is in my opinion a good habit to use this option. <\/p>\n\n\n\n<p>If you are worried about primary keys below a query that would help you to check your schema:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Find tables without PK\n\nSELECT tables.table_schema , tables.table_name , tables.engine  \nFROM information_schema.tables  LEFT JOIN (     \n   SELECT table_schema , table_name\n   FROM information_schema.statistics\n   GROUP BY table_schema, table_name, index_name \n   HAVING SUM( \n     case when non_unique = 0 and nullable != 'YES' then 1 else 0 end ) = count(*) ) puks   \n   ON tables.table_schema = puks.table_schema \n  AND tables.table_name = puks.table_name   \n  WHERE puks.table_name IS null \n  AND tables.table_type = 'BASE TABLE' \n  AND tables.TABLE_SCHEMA NOT IN ('mysql', 'performance_schema', 'information_schema', 'sys');<\/code><\/pre>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>The MySQL Shell dump instance command for dumping data from MariaDB to MySQL 8.0 on-premise looks like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>JS&gt;\nutil.dumpInstance(\"\/bkp\/dumpMariadb1\", {threads: 8, compatibility: &#91;\"force_innodb\"]})<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>The dump will be stored in the<em><strong> \/bkp\/dumpMariadb1<\/strong><\/em> directory<\/li><li><strong><em>threads: 8<\/em><\/strong> -&gt; 8 parallel threads  to dump chunks of data from the MariaDB instance<\/li><li><strong><em>compatibility: force_innodb<\/em><\/strong> -&gt; update to InnoDB for any tables that do not already use it<\/li><\/ul>\n\n\n\n<p>Depending on your context you may have to tune this command.<\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Move the dump on the MySQL 8.0 host and then restore the dump. <\/p>\n\n\n\n<p id=\"crash_recovery\">In MySQL 8.0 there is a special ninja technique \ud83d\ude42 to load a dump at the speed of light&#8230; All right, I may be exaggerating a bit, but at least at the speed of the sound by <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/innodb-redo-log.html#innodb-disable-redo-logging\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL 8.0 - disabling redo logging\">disabling crash recovery aka disabling redo logging<\/a>.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">DISCLAIMER<\/span>: <strong>This feature is intended only for loading data into a new MySQL instance.&nbsp;<em>Do not disable redo logging on a production system.<\/em>&nbsp;It is permitted to shutdown and restart the server while redo logging is disabled, but an unexpected server stoppage while redo logging is disabled <span style=\"text-decoration: underline;\">can cause data loss and instance corruption<\/span>.<\/strong><\/p>\n\n\n\n<p>The commands to restore the dump on MySQL 8.0 on-premise look like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>JS&gt;\n\\sql SET GLOBAL local_infile=1;\n\\sql ALTER INSTANCE DISABLE INNODB REDO_LOG;\n\nutil.loadDump(\"\/restore\/dumpMariadb1\", {threads: 8, ignoreVersion: true , skipBinlog: true, loadUsers: false})\n\n\\sql ALTER INSTANCE ENABLE INNODB REDO_LOG;\n\\sql SET GLOBAL  local_infile=0;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li><strong><em>local_infile=1<\/em><\/strong> -&gt; allows <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/load-data-local-security.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL - Security Considerations for LOAD DATA LOCAL\">local data<\/a> loading<\/li><li><strong><em>ALTER INSTANCE DISABLE INNODB REDO_LOG<\/em><\/strong> -&gt; disable redo logging&nbsp;to speed up data loading<\/li><li>The dump has been moved to the MySQL instance at <strong><em>\/restore\/dumpMariadb1<\/em><\/strong> <\/li><li><strong><em>threads: 8<\/em><\/strong> -&gt; 8 parallel threads  to &nbsp;upload chunks of data to&nbsp;the MySQL instance<\/li><li><strong><em>ignoreVersion: true<\/em><\/strong> -&gt; allow the import of the MariaDB dump into MySQL (MariaDB is taken for a MySQL 5.5 version) <\/li><li><strong><em>skipBinlog: true<\/em><\/strong> -&gt; skips binary logging for the sessions used during the restore <\/li><li><strong><em>loadUsers: false<\/em><\/strong> -&gt; do not import users and their roles and grants. This one is very important because <strong>MariaDB users are <span style=\"text-decoration: underline;\">not compatibles<\/span><\/strong>. Please note that the default is false (paranoid mode enable)&nbsp;<\/li><\/ul>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Migrate to MySQL Database Service<\/h3>\n\n\n\n<p>As a prerequisites I&rsquo;m assuming that you have the basic Oracle Cloud Infrastructure and MySQL Database Service knowledge.<br>If it is not yet the case, please read my <a href=\"http:\/\/dasini.net\/blog\/2021\/08\/03\/discovering-mysql-database-service-episode-1-introduction\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Discovering MySQL Database Service\"><strong>Discovering MySQL Database Service<\/strong><\/a> series.<\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>To migrate your data into MySQL Database Service (MDS), MySQL Shell is again your best friend to export the data.<br>You can either store the data locally or very easily in an OCI <a href=\"https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Object\/Concepts\/objectstorageoverview.htm\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Oracle Cloud Infrastructure - Overview of Object Storage\">object storage bucket<\/a>.<\/p>\n\n\n\n<p>If the data are located in a bucket you can then use the MDS data Import option to automatically create a  new MDS instance populated with your data.<br>If you choose the \u00ab\u00a0local\u00a0\u00bb storage, the import will be manual only.<\/p>\n\n\n\n<p>The main thing to keep in mind during the import process is that you will most likely have a user account issue (<strong>MariaDB users&nbsp;are <span style=\"text-decoration: underline;\">not compatibles<\/span><\/strong>), so my recommendation is to take a MySQL Shell dumps with all the business data (i.e. mysql, information_schema, performance_schema, sys are not include) <span style=\"text-decoration: underline;\"><strong>without the user accounts<\/strong><\/span>.<\/p>\n\n\n\n<p>Because I need the whole instance, in both case I&rsquo;m using MySQL Shell <strong><a href=\"https:\/\/dev.mysql.com\/doc\/mysql-shell\/8.0\/en\/mysql-shell-utilities-dump-instance-schema.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL Shell - Instance Dump Utility, Schema Dump Utility, and Table Dump Utility\"><em>dumpInstance<\/em><\/a><\/strong> utility.<\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Backup the database into a bucket<\/h4>\n\n\n\n<p>I&rsquo;m going to store my dump inside an Object Storage bucket so I must create the bucket before the dump. This is very easy by using the OCI interface.<\/p>\n\n\n\n<p>If you are not familiar with OCI Object Storage you can follow this tutorial: <a href=\"http:\/\/dasini.net\/blog\/2021\/08\/24\/discovering-mysql-database-service-episode-4-dump-your-mysql-data-into-an-object-storage-bucket\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Discovering MySQL Database Service \u2013 Episode 4 \u2013 Dump your MySQL data into an Object Storage bucket\"><\/a><a href=\"http:\/\/dasini.net\/blog\/2021\/08\/24\/discovering-mysql-database-service-episode-4-dump-your-mysql-data-into-an-object-storage-bucket\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Discovering MySQL Database Service \u2013 Episode 4 \u2013 Dump your MySQL data into an Object Storage bucket\">Discovering MySQL Database Service \u2013 Episode 4 \u2013 Dump your MySQL data into an Object Storage bucket<\/a>.<\/p>\n\n\n\n<p>In order to put these data into the OCI bucket, we must make some configuration for allowing MySQL Shell to easily connect to the OCI object storage service.<\/p>\n\n\n\n<p>To this end, we will create an&nbsp;<strong>OCI&nbsp;<a href=\"https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/API\/Concepts\/cliconcepts.htm#Command_Line_Interface_CLI\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"OCI CLI\">CLI<\/a><\/strong>&nbsp;configuration file.<\/p>\n\n\n\n<p>The CLI is a small-footprint tool that you can use on its own or with the&nbsp;Console&nbsp;to complete&nbsp;Oracle Cloud Infrastructure&nbsp;tasks. The CLI provides the same core functionality as the Console, plus additional commands. Some of these, such as the ability to run scripts, extend&nbsp;Console&nbsp;functionality.<\/p>\n\n\n\n<p>To be clear, we will&nbsp;not use the CLI but its configuration file. The configuration file name and default location (on Linux) is \/home\/opc\/.oci\/config.<\/p>\n\n\n\n<p>It should have the following information:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>user<\/strong>: OCID of the user calling the API.<\/li><li><strong>fingerprint<\/strong>: Fingerprint for the public key that was added to this user.<\/li><li><strong>key_file<\/strong>: Full path and filename of the private key.<\/li><li><strong>tenancy<\/strong>: OCID of your tenancy.<\/li><li><strong>region<\/strong>: An Oracle Cloud Infrastructure region.<\/li><\/ul>\n\n\n\n<p>For more details please&nbsp;<a href=\"https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/API\/Concepts\/sdkconfig.htm\" target=\"_blank\" rel=\"noreferrer noopener\">click here<\/a>.<\/p>\n\n\n\n<p>As an example, mine looks like:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[DEFAULT]\nuser=ocid1.user.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\nfingerprint=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx\nkey_file=\/home\/opc\/.oci\/oci_api_key.pem\ntenancy=ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\ncompartment=ocid1.compartment.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\nregion=eu-frankfurt-1<\/pre>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>You may be wondering how to get this information? Fair question! <br>Don&rsquo;t panic I already explained everything in this tutorial: <a href=\"http:\/\/dasini.net\/blog\/2021\/08\/24\/discovering-mysql-database-service-episode-4-dump-your-mysql-data-into-an-object-storage-bucket\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Discovering MySQL Database Service \u2013 Episode 4 \u2013 Dump your MySQL data into an Object Storage bucket\">Discovering MySQL Database Service \u2013 Episode 4 \u2013 Dump your MySQL data into an Object Storage bucket<\/a><\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>My Bucket is named: <em>migrationMariadbNoUser<\/em><\/p>\n\n\n\n<p>The MySQL Shell dump instance command for migrating data from MariaDB to MDS and stored data into  a bucket looks like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>JS&gt;\nutil.dumpInstance(\"\", {users: false, osBucketName: \"migrationMariadbNoUser\", osNamespace: \"abcdefghijkl\", ocimds: true,  threads: 8, compatibility: &#91;\"force_innodb\", \"strip_restricted_grants\", \"strip_definers\", \"strip_tablespaces\"]})<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li><strong><em>users: false<\/em><\/strong> -&gt; exclude users and their roles and grants in the dump<\/li><li><strong><em>osBucketName: \u00ab\u00a0migrationMariadbNoUser\u00a0\u00bb<\/em><\/strong> -&gt; name of the Object Storage bucket to which the dump is to be written<\/li><li><strong><em>osNamespace: \u00ab\u00a0abcdefghijkl\u00a0\u00bb<\/em><\/strong> -&gt; namespace where the Object Storage bucket named by&nbsp;<code>osBucketName<\/code>&nbsp;is located<\/li><li><strong><em>ocimds: true<\/em><\/strong> -&gt; enables checks and modifications for compatibility with MDS<\/li><li><strong><em>threads: 8<\/em><\/strong> -&gt; 8 parallel threads  to dump chunks of data from the MariaDB instance<\/li><li><strong><em>compatibility<\/em><\/strong>:  -&gt; <ul><li><strong><em>force_innodb<\/em><\/strong>  -&gt; change&nbsp;<a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/create-table.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL - CREATE TABLE\"><code>CREATE TABLE<\/code><\/a>&nbsp;statements to use the&nbsp;<a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/innodb-storage-engine.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL InnoDB storage engine\"><code>InnoDB<\/code><\/a>&nbsp;<\/li><li><strong><em>strip_restricted_grants<\/em><\/strong>  -&gt; remove specific privileges that are restricted by MDS<\/li><li><strong><em>strip_definers<\/em><\/strong>  -&gt; remove the&nbsp;<code>DEFINER<\/code>&nbsp;clause from views, routines, events, and triggers<\/li><li><strong><em>strip_tablespaces<\/em><\/strong>  -&gt; all tables are created in their default tablespace<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>Complete documentation is available <a href=\"https:\/\/dev.mysql.com\/doc\/mysql-shell\/8.0\/en\/mysql-shell-utilities-dump-instance-schema.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL Shell Utilities - Instance Dump Utility, Schema Dump Utility, and Table Dump Utility\">here<\/a>.<\/p>\n\n\n\n<p>The command above is storing the dump, compatible with MDS, into the bucket <em>migrationMariadbNoUser<\/em>.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Backup the database locally<\/h3>\n\n\n\n<p>If your dataset is not big and\/or you are too lazy to spend a little time in configuration, the alternative is to dump your data locally. <br>The main drawback is that you will have to import the data into MDS manually &#8211; but this should not be a big deal if your dataset is not huge.<\/p>\n\n\n\n<p>If you want to store the dump locally the command looks like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>JS&gt;\nutil.dumpInstance(\"\/bkp\/dumpMariadbNoUser\", {users: false, threads: 8, compatibility: &#91;\"force_innodb\", \"strip_restricted_grants\", \"strip_definers\", \"strip_tablespaces\", \"create_invisible_pks\"]})<\/code><\/pre>\n\n\n\n<p>The command is close to the one for the on-prem.<br>Please note &#8211; <em><strong>users: false<\/strong><\/em> &#8211; option. You can also dump the user and then run the import without loading the users (default behavior).<\/p>\n\n\n\n<p>In fact, the most import difference compare to an on-prem data migration are the compatibility options. Because MDS is a PaaS you have less flexibility than the on-prem MySQL so more compatibility needs.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Restore into MySQL Database Service from a bucket<\/h3>\n\n\n\n<p>You have 2 solutions, the automated one, easiest but less flexible or the manual.<\/p>\n\n\n\n<p>The first one is the MDS <strong>Data Import<\/strong> feature using the OCI interface.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"527\" height=\"231\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/07\/OCI_create_MDS_form7_Data_Import.png?resize=527%2C231\" alt=\"MySQL Data Service - Data Import\" class=\"wp-image-4916\" srcset=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/07\/OCI_create_MDS_form7_Data_Import.png?w=527&amp;ssl=1 527w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/07\/OCI_create_MDS_form7_Data_Import.png?resize=300%2C131&amp;ssl=1 300w\" sizes=\"auto, (max-width: 527px) 100vw, 527px\" \/><figcaption>MySQL Data Service &#8211; Data Import<\/figcaption><\/figure>\n\n\n\n<p>You&rsquo;ll find the \u00ab\u00a0How To\u00a0\u00bb in: <a href=\"http:\/\/dasini.net\/blog\/2021\/08\/31\/discovering-mysql-database-service-episode-5-create-a-mysql-db-system-from-a-mysql-shell-dump\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Discovering MySQL Database Service \u2013 Episode 5 \u2013 Create a MySQL DB system from a MySQL Shell dump\">Discovering MySQL Database Service \u2013 Episode 5 \u2013 Create a MySQL DB system from a MySQL Shell dump<\/a><\/p>\n\n\n\n<p>More details in the <a href=\"https:\/\/docs.oracle.com\/en-us\/iaas\/mysql-database\/doc\/importing-and-exporting-databases.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL Database Service - Importing and Exporting Databases\">documentation<\/a>.<\/p>\n\n\n\n<p>If you want to speed up your import you can <strong>disable the Crash Recovery<\/strong> (during the import and enable it when it is finished). <a href=\"#crash_recovery\" target=\"_blank\" rel=\"noreferrer noopener\">Some details here<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/MDS_Crash_Recovery_Disable-800x102.png?resize=600%2C77\" alt=\"\" class=\"wp-image-5645\" width=\"600\" height=\"77\" srcset=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/MDS_Crash_Recovery_Disable.png?resize=800%2C102&amp;ssl=1 800w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/MDS_Crash_Recovery_Disable.png?resize=300%2C38&amp;ssl=1 300w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/MDS_Crash_Recovery_Disable.png?resize=768%2C98&amp;ssl=1 768w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/03\/MDS_Crash_Recovery_Disable.png?w=1143&amp;ssl=1 1143w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>You can also restore the dump manually, in a new fresh MDS instance.<\/p>\n\n\n\n<p>The command looks like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>JS&gt;\nutil.loadDump(\"\", {osBucketName: \"migrationMariadbNoUser\", osNamespace: \"abcdefghijkl\", threads: 8, ignoreVersion: true})<\/code><\/pre>\n\n\n\n<p>Please note that in this case, you won&rsquo;t be able to speed up the restore by disabling the crash recovery system (Redo Logs).<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Restore into MySQL Database Service from a local dump<\/h3>\n\n\n\n<p>In this case we cannot use the crash recovery trick nor the Data Import feature.<br>Anyway the MySQL Shell <em>dumpInstance<\/em> function will still do the job.<\/p>\n\n\n\n<p>The command looks like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>JS&gt;\nutil.loadDump(\"\/restore\/dumpMariadbNoUser\", {threads: 8, ignoreVersion: true})<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li><strong><em>threads: 8<\/em><\/strong> -&gt; 8 parallel threads  to &nbsp;upload chunks of data to&nbsp;the MySQL instance<\/li><li><strong><em>ignoreVersion: true<\/em><\/strong> -&gt; allow the import of the MariaDB dump into MySQL (MariaDB is taken for a MySQL 5.5 version) <\/li><\/ul>\n\n\n\n<p><em>loadUsers: false<\/em> is not necessary here because the dump was made with <em>users: false<\/em>. <\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>And don&rsquo;t forget to re-<a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/create-user.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL - CREATE USER Statement\"><strong>create your users<\/strong><\/a> \ud83d\ude42<br>You have plenty of <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/pluggable-authentication.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"MySQL - Pluggable Authentication\"><strong>authentication plugins<\/strong><\/a> to create secure user accounts.<br>We also provide <strong><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/multifactor-authentication.html\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Multifactor Authentication\">Multifactor Authentication<\/a><\/strong>. <\/p>\n\n\n\n<p>Btw if security is one of your concern (and it should be) below some MySQL password management features:<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p><strong><span style=\"text-decoration: underline;\">MySQL Security Serie &#8211; Password Management<\/span><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a aria-label=\"Random Password Generation? (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2020\/04\/15\/mysql-security-random-password-generation\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Random Password Generation<\/a><\/li><li><a aria-label=\"Password Expiration Policy? (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2020\/04\/21\/mysql-security-password-expiration-policy\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Password Expiration Policy<\/a><\/li><li><a aria-label=\"Password Reuse Policy? (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2020\/04\/28\/mysql-security-password-reuse-policy\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Password Reuse Policy<\/a><\/li><li><a aria-label=\"Password Verification-Required Policy? (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2020\/05\/05\/mysql-security-password-verification-required-policy\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Password Verification-Required Policy<\/a><\/li><li><a aria-label=\"Failed-Login Tracking and Temporary Account Locking? (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2020\/05\/12\/mysql-security-failed-login-tracking-and-temporary-account-locking\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Failed-Login Tracking and Temporary Account Locking<\/a><\/li><li><a href=\"http:\/\/dasini.net\/blog\/2020\/05\/19\/mysql-security-dual-password-support\/\" target=\"_blank\" aria-label=\"Dual Password Support (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Dual Password Support<\/a><\/li><\/ul>\n\n\n<\/div><\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Database migration is not only about data migration, so you still have some work to do. But now you should have a better understanding of the overall data migration process.<\/p>\n\n\n\n<div style=\"height:100px\" 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>Yet another customer wanted to migrate from MariaDB to MySQL. So I decided to write down the overall data migration process.<\/p>\n<p>Indeed each migration are a unique story so I won\u2019t provide you a \u201cHow to migrate\u201d\u2026<br \/>\nThe idea is to highlight the general path and help you to avoid common pitfalls and thus help you save some precious time.<\/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":[1638,1634,203],"tags":[250,1639,1620,1647],"class_list":["post-5556","post","type-post","status-publish","format-standard","hentry","category-cloud","category-migration","category-mysql-en","tag-mariadb","tag-mds","tag-migration","tag-mysql-shell"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9LfWW-1rC","jetpack-related-posts":[{"id":3488,"url":"https:\/\/dasini.net\/blog\/2019\/12\/16\/webinar-migrating-from-mariadb-to-mysql\/","url_meta":{"origin":5556,"position":0},"title":"Webinar &#8211; Migrating from MariaDB to MySQL","author":"Olivier DASINI","date":"16 d\u00e9cembre 2019","format":false,"excerpt":"This webinar will cover the advantages and process for migrating from MariaDB\/Galera cluster to MySQL InnoDB Cluster.","rel":"","context":"Dans &quot;High Availability&quot;","block_context":{"text":"High Availability","link":"https:\/\/dasini.net\/blog\/category\/high-availability\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3831,"url":"https:\/\/dasini.net\/blog\/2020\/10\/21\/plan-your-mysql-upgrade\/","url_meta":{"origin":5556,"position":1},"title":"Plan your MySQL upgrade","author":"Olivier DASINI","date":"21 octobre 2020","format":false,"excerpt":"I've made a short video that will give you tips and tricks to successfully upgrade to MySQL 8","rel":"","context":"Dans &quot;Migration&quot;","block_context":{"text":"Migration","link":"https:\/\/dasini.net\/blog\/category\/migration\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/x0bxBsXk8mw\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":4662,"url":"https:\/\/dasini.net\/blog\/2021\/08\/03\/discovering-mysql-database-service-episode-1-introduction\/","url_meta":{"origin":5556,"position":2},"title":"Discovering MySQL Database Service &#8211; Episode 1 &#8211; Introduction","author":"Olivier DASINI","date":"3 ao\u00fbt 2021","format":false,"excerpt":"This is the first episode of \u201cDiscovering MySQL Database Service\u201c, a series of tutorials where I will show you, step by step, how to use MySQL Database Service and some other Oracle Cloud Infrastructure services. Like any series, in this episode I\u2019m going to give you some context and set\u2026","rel":"","context":"Dans &quot;Cloud&quot;","block_context":{"text":"Cloud","link":"https:\/\/dasini.net\/blog\/category\/cloud\/"},"img":{"alt_text":"MySQL Database Service","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":4188,"url":"https:\/\/dasini.net\/blog\/2021\/01\/26\/replicate-from-mysql-5-7-to-mysql-database-service\/","url_meta":{"origin":5556,"position":3},"title":"Replicate from MySQL 5.7 to MySQL Database Service","author":"Olivier DASINI","date":"26 janvier 2021","format":false,"excerpt":"MySQL Replication is a very common topology, widely used in various architecture. People use it, among others, for High Availability, Read Scalability or Geographic Redundancy. Another use case is to use MySQL Replication to seamlessly integrate a newer version of the server in your architecture. Let\u2019s say you are running\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql-en\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4151,"url":"https:\/\/dasini.net\/blog\/2020\/12\/17\/mysql-shell-the-new-era\/","url_meta":{"origin":5556,"position":4},"title":"MySQL SHELL &#8211; The new era","author":"Anastasia Papachristopoulou","date":"17 d\u00e9cembre 2020","format":false,"excerpt":"In one of our previous articles - Setting up Replication with various methods for MySQL 8 - we reviewed how to create a replica with multiple tools. Now, it is time to perform the same action but with MySQL Shell.","rel":"","context":"Dans &quot;Backup \/ Restore&quot;","block_context":{"text":"Backup \/ Restore","link":"https:\/\/dasini.net\/blog\/category\/backup-restore\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":5762,"url":"https:\/\/dasini.net\/blog\/2022\/06\/09\/explore-visualize-your-mysql-heatwave-data-with-superset\/","url_meta":{"origin":5556,"position":5},"title":"Explore &#038; visualize your MySQL HeatWave data with Superset","author":"Olivier DASINI","date":"9 juin 2022","format":false,"excerpt":"In this article I will show you how to properly configure Apache Superset in order to take advantage of a high performance, in-memory query accelerator: MySQL HeatWave.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql-en\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/06\/Configure-Heatwave-Cluster.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/06\/Configure-Heatwave-Cluster.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/06\/Configure-Heatwave-Cluster.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/06\/Configure-Heatwave-Cluster.png?resize=700%2C400 2x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2022\/06\/Configure-Heatwave-Cluster.png?resize=1050%2C600 3x"},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/5556","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=5556"}],"version-history":[{"count":155,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/5556\/revisions"}],"predecessor-version":[{"id":5715,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/5556\/revisions\/5715"}],"wp:attachment":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/media?parent=5556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/categories?post=5556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/tags?post=5556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}