{"id":18514,"date":"2022-08-22T13:48:33","date_gmt":"2022-08-22T11:48:33","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=18514"},"modified":"2024-09-10T15:49:00","modified_gmt":"2024-09-10T13:49:00","slug":"mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/","title":{"rendered":"MySQL Server on Microsoft Azure 3rd part (backup and recovery)"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"293\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-001-2-1024x293.png\" alt=\"\" class=\"wp-image-18471\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-001-2-1024x293.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-001-2-300x86.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-001-2-768x220.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-001-2.png 1345w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Azure Database for MySQL<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>This blog is the third chapter related to deploying a MySQL infrastructure on the Azure cloud. In <a href=\"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-2nd-part-performance-tests\/\">addition to performance<\/a>,  we should indeed also consider backup and restore capabilities. The objective of this blog is to present the main backup and restore possibilities offered by Azure through a simple example and show a second backup\/restore possibility using MySQL Shell dump utilities. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Backup window and mechanism<\/h2>\n\n\n\n<p>Flexible Azure for MySQL generates by default a 7 days server backup retention period. This retention period can be extended up to 35 days or shorten to 1 day. In addition we can decide if you want to have a Geo Redundant backup storage. By default the backups are locally redundant. <\/p>\n\n\n\n<p>It\u2019s important to understand that Azure makes backup of the whole server, not only the MySQL Server through mysqldump, MySQL Enterprise Backup or any other solution. These backups can only be used to restore MySQL Server in another Azure Database for MySQL Server. It means that these backups cannot be exported to generate a new database on our on-premise server for instance. If we want to extract part of our database in order to export data, we can use <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/mysqldump.html\" target=\"_blank\" rel=\"noreferrer noopener\">mysqldump<\/a>, <a href=\"https:\/\/dev.mysql.com\/doc\/mysql-shell\/8.0\/en\/mysql-shell-utilities-dump-instance-schema.html\" target=\"_blank\" rel=\"noreferrer noopener\">MySQL Shell&#8217;s instance dump utility<\/a> or the set of tools provided by <a href=\"https:\/\/dev.mysql.com\/doc\/mysql-shell\/8.0\/en\/mysql-shell-utilities-dump-instance-schema.html\" target=\"_blank\" rel=\"noreferrer noopener\">MySQL Shell.<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"725\" height=\"182\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-031.png\" alt=\"\" class=\"wp-image-18515\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-031.png 725w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-031-300x75.png 300w\" sizes=\"auto, (max-width: 725px) 100vw, 725px\" \/><figcaption class=\"wp-element-caption\">Backup Retention period configuration and Redundancy options<\/figcaption><\/figure>\n\n\n\n<p>The backups provided by Azure can be used to make Point In Time Recovery of the Server with a granularity of 5 minutes since the system snapshots are done automatically every 5 minutes. As specified in the documentation, the backups are encrypted using AES 256-bit. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Backup and restore costs<\/h3>\n\n\n\n<p>As explained on Microsoft website<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong><em>&#8220;Backup storage is the storage associated with automated backups of your server.&nbsp;<\/em><strong>Increasing your backup retention period increases the backup storage that is consumed by your server<\/strong><em>. There is no additional charge for backup storage for up to 100% of your total provisioned server storage. Additional consumption of backup storage will be charged in GB\/month.&#8221;<\/em><\/strong>  &#8211; https:\/\/azure.microsoft.com\/en-us\/pricing\/details\/mysql\/flexible-server\/<\/p>\n<\/blockquote>\n\n\n\n<p>Increasing the retention of the backup, may have an impact on the pricing. We can have an idea of the global costs related to Azure Database for MySQL on the following URL: <a href=\"https:\/\/azure.microsoft.com\/en-us\/pricing\/details\/mysql\/flexible-server\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/azure.microsoft.com\/en-us\/pricing\/details\/mysql\/flexible-server\/<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recover a database from Azure Backup Restore interface<\/h2>\n\n\n\n<p>In this first test, we will simply use the recovery functionalities provided by Azure Database for MySQL flexible server. We will simulate a user error by deleting a table and we will restore the entire server (as it&#8217;s not possible to simply recover a database or a table using Azure features). <\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Dropping a table by mistake<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code> MySQL  albatroz.mysql.database.azure.com:3306 ssl  SQL &gt; SELECT CURRENT_TIMESTAMP ;\n+---------------------+\n| CURRENT_TIMESTAMP   |\n+---------------------+\n| 2022-08-18 20:48:44 |\n+---------------------+\n1 row in set (0.1002 sec)\n MySQL  albatroz.mysql.database.azure.com:3306 ssl  SQL &gt; drop table sysbench.sbtest1;\nQuery OK, 0 rows affected (0.1884 sec)<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Restoring the MySQL Server to a time before the mistake<\/strong><\/li>\n<\/ol>\n\n\n\n<p>We first have to go in the &#8220;backup\/restore&#8221; menu of our Azure Database for MySQL flexible server and select the backupset that we want to restore. As we can see a backupset is done everyday. In our current context, we want to use the most recent backupset (Automated backup #5)<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"914\" height=\"226\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-032.png\" alt=\"\" class=\"wp-image-18597\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-032.png 914w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-032-300x74.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-032-768x190.png 768w\" sizes=\"auto, (max-width: 914px) 100vw, 914px\" \/><figcaption class=\"wp-element-caption\">Azure Database for MySQL flexible server backupset<\/figcaption><\/figure>\n\n\n\n<p>Once the backupset selected a screen appears showing the restore server options. It provides us with the possibility to make a Point In Time Restore (PITR) of our server by choosing between 3 options: <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>Latest restore point (Now)<\/em><\/li>\n\n\n\n<li><em>Select a custom restore point<\/em><\/li>\n\n\n\n<li><em>Select fastest restore point (Restore using full backup)<\/em><\/li>\n<\/ul>\n\n\n\n<p>In our case we will use the &#8220;<em>Select a Custom Restore point<\/em>&#8221; option as shown in the screenshot below. We will define the custom restore time just before the mistake and specify a name for the restored Server. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"743\" height=\"523\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-033.png\" alt=\"\" class=\"wp-image-18598\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-033.png 743w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-033-300x211.png 300w\" sizes=\"auto, (max-width: 743px) 100vw, 743px\" \/><figcaption class=\"wp-element-caption\">Restore of a Server using a custom restore point<\/figcaption><\/figure>\n\n\n\n<p>Once the restore requested, it took approximately 5 minutes to deploy the new server. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"301\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-034.png\" alt=\"\" class=\"wp-image-18600\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-034.png 840w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-034-300x108.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-034-768x275.png 768w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong>Let&#8217;s check if my table is back on the new deployed server<\/strong><\/li>\n<\/ol>\n\n\n\n<p>Finally we simply have to connect to the new restored server and check if the dropped table is back. Of course we can also export this table from this restored server and import this same table on the original server using mysqldump. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MySQL  albatrozrestored.mysql.database.azure.com:3306 ssl  sysbench  SQL &gt; show tables from sysbench like '%1';\n+-------------------------+\n| Tables_in_sysbench (%1) |\n+-------------------------+\n| sbtest1                 |\n+-------------------------+\n1 row in set (0.1048 sec)<\/code><\/pre>\n\n\n\n<p><strong>4. Export\/Import table from the restored Server<\/strong><\/p>\n\n\n\n<p>Now that the server is restored, we can export the table that was deleted by mistake using <code><em>util.dumpTables()<\/em><\/code> and import it to the albatroz server using <code><em>util.loadDump()<\/em><\/code>. The process is rather simple as you can see below:<\/p>\n\n\n\n<p><strong>Export from the recovered server<\/strong> <strong>(albatrozrestored)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MySQL  albatrozrestored.mysql.database.azure.com:3306 ssl  sysbench  JS &gt; util.dumpTables(\"sysbench\", &#091; \"sbtest1\"], \"C:\/Users\/grs\/Albatroz-Sysbench-sbtest1\");\nNOTE: Backup lock is not available to the account 'grs'@'%' and DDL changes will not be blocked. The dump may fail with an error if schema changes are made while dumping.\nAcquiring global read lock\nGlobal read lock acquired\nInitializing - done\n...\n...\n109% (15.29K rows \/ ~13.98K rows), 0.00 rows\/s, 0.00 B\/s uncompressed, 0.00 B\/s compressed\nDump duration: 00:00:01s\nTotal duration: 00:00:06s\nSchemas dumped: 1\nTables dumped: 1\nUncompressed data size: 2.93 MB\nCompressed data size: 1.33 MB\nCompression ratio: 2.2\nRows written: 15294\nBytes written: 1.33 MB\nAverage uncompressed throughput: 2.35 MB\/s\nAverage compressed throughput: 1.07 MB\/s<\/code><\/pre>\n\n\n\n<p><strong>Import on Albatroz server<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MySQL  albatroz.mysql.database.azure.com:3306 ssl  JS &gt; util.loadDump(\"C:\/Users\/grs\/Albatroz-Sysbench-sbtest1\", {schema: \"sysbench\"});\nLoading DDL and Data from 'C:\/Users\/grs\/Albatroz-Sysbench-sbtest1' using 4 threads.\nOpening dump...\nTarget is MySQL 8.0.28. Dump was produced from MySQL 8.0.28\nScanning metadata - done\nChecking for pre-existing objects...\nExecuting common preamble SQL\nExecuting DDL - done\nExecuting view DDL - done\nStarting data load\n1 thds loading | 100% (2.93 MB \/ 2.93 MB), 1.94 MB\/s, 0 \/ 1 tables done\nExecuting common postamble SQL\nRecreating indexes - done\n1 chunks (15.29K rows, 2.93 MB) for 1 tables in 1 schemas were loaded in 6 sec (avg throughput 1.94 MB\/s)\n0 warnings were reported during the load.<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Recover a database from your own backup<\/strong>s<\/h2>\n\n\n\n<p>As stated in the introduction, I will present in this chapter a complementary solution of backup\/restore. Of course Azure does not prevent us from doing our own backups by connecting to the Azure Database for MySQL flexible server and using either mysqdump, MySQL Enterprise Backup or any other MySQL backup solution. I decided to use the opportunity of this blog to use the backup tools provided by MySQL Shell. Indeed MySQL Shell&#8217;s instance dump utility, such as <code><em>util.dumpInstance()<\/em><\/code>, <code><em>util.dumpSchemas()<\/em><\/code> or even <code><em>util.dumpTables()<\/em><\/code>, introduced in MySQL Shell 8.0.22, provide interesting functionalities. This export tools alone would deserve several blogs dedicated to them. <\/p>\n\n\n\n<p>Before starting let&#8217;s illustrate what will be demonstrated in the next few lines:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"331\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-035-1024x331.png\" alt=\"\" class=\"wp-image-18633\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-035-1024x331.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-035-300x97.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-035-768x249.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-035.png 1168w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Recovering a MySQL table after a human error<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The very first step consist in doing a dump of the MySQL Instance<\/li>\n\n\n\n<li>Secondly, we will insert a row in a table named sbtest1<\/li>\n\n\n\n<li>Thirdly, we will simulate a human error and drop a table<\/li>\n\n\n\n<li>Then we will restore the database to the state after the backup<\/li>\n\n\n\n<li>After having restored the backup, we will execute the binary to the state just before the human error<\/li>\n\n\n\n<li>Finally we will check that the last insert I did is stored into the sbtest2 <\/li>\n<\/ol>\n\n\n\n<p><br><\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"1\">\n<li><strong>Dump of MySQL Instance using util.dumpInstance()<\/strong><\/li>\n<\/ol>\n\n\n\n<p>As explained above, the very first step consist in doing a dump of the entire instance. Without this backup we won&#8217;t be able to restore the database. We will use <code><em>util.dumpInstance()<\/em><\/code> as presented below:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MySQL  albatroz.mysql.database.azure.com:3306 ssl  JS &gt; util.dumpInstance(\"C:\/Users\/grs\/AlbatrozDump\", {dryRun: false, showProgress: true, threads: 2})\nNOTE: Backup lock is not available to the account 'grs'@'%' and DDL changes will not be blocked. The dump may fail with an error if schema changes are made while dumping.\nAcquiring global read lock\nGlobal read lock acquired\nInitializing - done\n2 out of 6 schemas will be dumped and within them 9 tables, 0 views.\n4 out of 7 users will be dumped.\n...\n...\n107% (137.28K rows \/ ~128.10K rows), 14.42K rows\/s, 2.61 MB\/s uncompressed, 1.20 MB\/s compressed\nDump duration: 00:00:15s\nTotal duration: 00:00:21s\nSchemas dumped: 2\nTables dumped: 9\nUncompressed data size: 26.26 MB\nCompressed data size: 11.97 MB\nCompression ratio: 2.2\nRows written: 137284\nBytes written: 11.97 MB\nAverage uncompressed throughput: 1.72 MB\/s\nAverage compressed throughput: 784.25 KB\/s<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Inserting row in our table<\/strong><\/li>\n<\/ol>\n\n\n\n<p>Now we simulate some activity in the database by inserting a row into the table <em>sbtest1<\/em>. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MySQL  albatroz.mysql.database.azure.com:3306 ssl  sysbench  SQL &gt; insert into sbtest1 values(999999999,1,1,\"my row before drop table\");\nQuery OK, 1 row affected (0.1134 sec)\nMySQL  albatroz.mysql.database.azure.com:3306 ssl  sysbench  SQL &gt; SELECT CURRENT_TIMESTAMP ;\n+---------------------+\n| CURRENT_TIMESTAMP   |\n+---------------------+\n| 2022-08-19 16:42:12 |\n+---------------------+<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong>Dropping a table by mistake<\/strong><\/li>\n<\/ol>\n\n\n\n<p>Thirdly, we simulate the human error by dropping the table <em>sbtest1<\/em>. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MySQL  albatroz.mysql.database.azure.com:3306 ssl  sysbench  SQL &gt; SELECT CURRENT_TIMESTAMP ;\n+---------------------+\n| CURRENT_TIMESTAMP   |\n+---------------------+\n| 2022-08-19 16:46:47 |\n+---------------------+\n1 row in set (0.1095 sec)\n MySQL  albatroz.mysql.database.azure.com:3306 ssl  sysbench  SQL &gt; drop table sysbench.sbtest1;\nQuery OK, 0 rows affected (0.1823 sec)<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li><strong>Restoring the MySQL Server using the backup <\/strong><\/li>\n<\/ol>\n\n\n\n<p>Now, we have to restore the database using the last backup we have. We will use <em><code><em>util.loadDump()<\/em><\/code><\/em> in order to restore our table. To only recover the table we can simply use the option &#8220;<em>includeTables<\/em>&#8220;. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MySQL  albatroz.mysql.database.azure.com:3306 ssl  sysbench  JS &gt; util.loadDump(\"C:\/Users\/grs\/AlbatrozDump\", { includeTables: &#091;\"sysbench.sbtest1\"],loadDdl:true, LoadData:true, threads: 2})\nLoading DDL and Data from 'C:\/Users\/grs\/AlbatrozDump' using 2 threads.\nOpening dump...\nTarget is MySQL 8.0.28. Dump was produced from MySQL 8.0.28\nScanning metadata - done\nChecking for pre-existing objects...\nExecuting common preamble SQL\nExecuting DDL - done\nExecuting view DDL - done\nStarting data load\n1 thds loading \\ 100% (2.93 MB \/ 2.93 MB), 1.16 MB\/s, 0 \/ 1 tables done\nExecuting common postamble SQL\nRecreating indexes - done\n1 chunks (15.29K rows, 2.93 MB) for 1 tables in 1 schemas were loaded in 9 sec (avg throughput 1.16 MB\/s)\n0 warnings were reported during the load.<\/code><\/pre>\n\n\n\n<p>If the restore worked properly, the table <em>sbtest1<\/em> should be restored. We now have recovered the table <em>sbtest1<\/em> without the queries that have been executed afterwards (before the drop table).  <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MySQL  albatroz.mysql.database.azure.com:3306 ssl  sysbench  SQL &gt; show tables;\n+--------------------+\n| Tables_in_sysbench |\n+--------------------+\n| sbtest1            |\n| sbtest10           |\n| sbtest2            |\n| sbtest3            |\n| sbtest4            |\n| sbtest5            |\n| sbtest6            |\n| sbtest7            |\n| sbtest8            |\n| sbtest9            |\n+--------------------+\n10 rows in set (0.1169 sec)\n\nMySQL  albatroz.mysql.database.azure.com:3306 ssl  sysbench  SQL &gt; select * from sbtest1 where pad like 'my%';\nEmpty set (0.1284 sec)<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li><strong>Execution of the binary logs<\/strong><\/li>\n<\/ol>\n\n\n\n<p>Before executing the binary logs, we need to define what we call the &#8220;<em>start-position<\/em>&#8221; and the &#8220;<em>end-position<\/em>&#8220;. In order to find these two numbers, we have to find the log position after the backup and to find the log position of the &#8220;drop table&#8221;. The first (<em>start-position<\/em>) can be found into the metadata of the dump ( .json file). For the second we have to find the exact position using mysqlbinlog as demonstrated below (drop position at 14329648) <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysqlbinlog --verify-binlog-checksum --host=albatroz.mysql.database.azure.com --port=3306 --user=grs -p -                                                   -read-from-remote-server --verbose --start-datetime=\"2022-08-19 18:40:40\" --stop-datetime=\"2022-08-19 18:50:47\" mysql-bin.00                                                   0006 | grep -C 15 \"DROP TABLE\"\n\n# at 14329648\n#220819 18:47:12 server id 3691359094  end_log_pos 14329725 CRC32 0xa81066cf    Anonymous_GTID  last_committed=6652     sequence_number=6653r                                  br_only=no      original_committed_timestamp=1660927632152016   immediate_commit_timestamp=1660927632152016     transaction_length=217\n# original_commit_timestamp=1660927632152016 (2022-08-19 18:47:12.152016 CEST)\n# immediate_commit_timestamp=1660927632152016 (2022-08-19 18:47:12.152016 CEST)\n\/*!80001 SET @@session.original_commit_timestamp=1660927632152016*\/\/*!*\/;\n\/*!80014 SET @@session.original_server_version=80028*\/\/*!*\/;\n\/*!80014 SET @@session.immediate_server_version=80028*\/\/*!*\/;\nSET @@SESSION.GTID_NEXT= 'ANONYMOUS'\/*!*\/;\n# at 14329725\n#220819 18:47:12 server id 3691359094  end_log_pos 14329865 CRC32 0x9f7865b0    Query   thread_id=480   exec_time=0     error_code=0    Xid =                                   412469\nuse `sysbench`\/*!*\/;\nSET TIMESTAMP=1660927632\/*!*\/;\nDROP TABLE `sbtest1` \/* generated by server *\/\n\/*!*\/;\n\n<\/code><\/pre>\n\n\n\n<p>Now that we have the start and end position of the binary log, we can apply the events in binary log file to the server. For my part, I prefer to go through an intermediate step consisting in creating a file containing all the events. This way I can look at what is inside and then just run my file. This allows me, for example, to see if I have made an error. As shown below I&#8217;m for instance able to show my &#8220;<em>insert<\/em>&#8221; statement: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>osboxes@osboxes:~$  mysqlbinlog --verify-binlog-checksum --host=albatroz.mysql.database.azure.com --port=3306 --user=grs -p --read-from-remote-server --start-datetime=\"2022-08-19 16:40:40\" --stop-datetime=\"2022-08-19 16:46:47\" mysql-bin.000006 &gt;\/tmp\/restore.sql\nEnter password:\nosboxes@osboxes:~$ vi \/tmp\/restore.sql\n...\n# at 14329545\n#220819 18:41:18 server id 3691359094  end_log_pos 14329617 CRC32 0xd124e6a0    Write_rows: table id 913 flags: STMT_END_F\n\nBINLOG '\nLr3\/YhN2qwXcRQAAAMmm2gAAAJEDAAAAAAEACHN5c2JlbmNoAAdzYnRlc3QxAAQDA\/7+BO7g\/vAA\nAQEAAgP8\/wDqexN\/\nLr3\/Yh52qwXcSAAAABGn2gAAAJEDAAAAAAEAAgAE\/wD\/yZo7AQAAAAEAMRhteSByb3cgYmVmb3Jl\nIGRyb3AgdGFibGWg5iTR\n'\/*!*\/;\n### INSERT INTO `sysbench`.`sbtest1`\n### SET\n###   @1=999999999\n###   @2=1\n###   @3='1'\n###   @4='my row before drop table'\n# at 14329617\n...<\/code><\/pre>\n\n\n\n<p>Finally we can execute our restore script on the database.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>osboxes@osboxes:~$ mysql --host=albatroz.mysql.database.azure.com --port=3306 --user=grs -p &lt;\/tmp\/restore.sql\nEnter password:<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li><strong>Let&#8217;s check that our last insert has been executed<\/strong><\/li>\n<\/ol>\n\n\n\n<p>As we can see, the last record we inserted in the table is now present.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MySQL  albatroz.mysql.database.azure.com:3306 ssl  sysbench  SQL &gt; select * from sbtest1 where pad like 'my%';\n+-----------+---+---+--------------------------+\n| id        | k | c | pad                      |\n+-----------+---+---+--------------------------+\n| 999999999 | 1 | 1 | my row before drop table |\n+-----------+---+---+--------------------------+<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Azure Backup Restore interface provides an easy and interesting solution to backup and restore a MySQL Server going through the replication of the server. In addition in the tests I did, the deployment of the new server was rather fast. However, my server did not contain gigabytes of information. The 35 days of backup window could be seen as too small depending on your needs. <\/p>\n\n\n\n<p>Beside of this solution I strongly encourage Database Administrators to keep on backing up their MySQL Database using other tools such as the ones provided by MySQL Shell or any other backup solution in order to ensure that no transactions are lost when restoring data. Such solutions could offer more flexibility in the backup and restore process and longer retention.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Presentation of the Backup Recovery solution provided by Microsoft Azure for Azure Database for MySQL Server<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[3271,955,1316],"tags":[1920,2664,1702,1691],"type_dbi":[],"class_list":["post-18514","post","type-post","status-publish","format-standard","hentry","category-azure","category-cloud","category-mysql","tag-azure-backup","tag-mysql-3","tag-pitr","tag-recovery-process"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>MySQL Server on Microsoft Azure 3rd part (backup and recovery) - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MySQL Server on Microsoft Azure 3rd part (backup and recovery)\" \/>\n<meta property=\"og:description\" content=\"Presentation of the Backup Recovery solution provided by Microsoft Azure for Azure Database for MySQL Server\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-22T11:48:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-10T13:49:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-001-2-1024x293.png\" \/>\n<meta name=\"author\" content=\"Gr\u00e9gory Steulet\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gr\u00e9gory Steulet\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/\"},\"author\":{\"name\":\"Gr\u00e9gory Steulet\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/7609faada8e4d63e04a28ae29e227098\"},\"headline\":\"MySQL Server on Microsoft Azure 3rd part (backup and recovery)\",\"datePublished\":\"2022-08-22T11:48:33+00:00\",\"dateModified\":\"2024-09-10T13:49:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/\"},\"wordCount\":1424,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/08\\\/MySQLAzure-001-2-1024x293.png\",\"keywords\":[\"Azure backup\",\"MySQL\",\"PITR\",\"Recovery process\"],\"articleSection\":[\"Azure\",\"Cloud\",\"MySQL\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/\",\"name\":\"MySQL Server on Microsoft Azure 3rd part (backup and recovery) - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/08\\\/MySQLAzure-001-2-1024x293.png\",\"datePublished\":\"2022-08-22T11:48:33+00:00\",\"dateModified\":\"2024-09-10T13:49:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/7609faada8e4d63e04a28ae29e227098\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/08\\\/MySQLAzure-001-2.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/08\\\/MySQLAzure-001-2.png\",\"width\":1345,\"height\":385},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MySQL Server on Microsoft Azure 3rd part (backup and recovery)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/7609faada8e4d63e04a28ae29e227098\",\"name\":\"Gr\u00e9gory Steulet\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e1531483285469fe17ea7a769ce5d8a8a01847185e4245d9c4d22c575c7c6d3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e1531483285469fe17ea7a769ce5d8a8a01847185e4245d9c4d22c575c7c6d3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e1531483285469fe17ea7a769ce5d8a8a01847185e4245d9c4d22c575c7c6d3e?s=96&d=mm&r=g\",\"caption\":\"Gr\u00e9gory Steulet\"},\"description\":\"Gr\u00e9gory Steulet has more than ten years of experience in database and infrastructure management, engineering, and optimization. He is specialized in Oracle technologies and high availability solutions (Oracle DataGuard, Data Replication Block Device). His expertise also includes Avaloq banking applications, as well as the open source field (MySQL, Unix\\\/Linux, etc.). Gr\u00e9gory Steulet is \\\"Oracle Certified Professional 10g\\\", \\\"MySQL Cluster 5.1 Certified\\\", and \\\"Avaloq Certified Professional 2.6\\\". Prior to joining dbi services, Gr\u00e9gory Steulet was Senior Consultant at Trivadis in Lausanne. He also worked as IT Administrator at Box Telecom in Miami Beach, Florida (USA). Gr\u00e9gory Steulet has an Executive MBA from the International Institute of Management in Technology, Fribourg (CH). He also holds a Bachelor's Degree in Business Administration and Computer Science from the University of Applied Sciences Western Switzerland. His branch-related experience covers Telecommunications, Financial Services \\\/ Banking, Logistics, Pharma etc.\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/gregory-steulet\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"MySQL Server on Microsoft Azure 3rd part (backup and recovery) - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/","og_locale":"en_US","og_type":"article","og_title":"MySQL Server on Microsoft Azure 3rd part (backup and recovery)","og_description":"Presentation of the Backup Recovery solution provided by Microsoft Azure for Azure Database for MySQL Server","og_url":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/","og_site_name":"dbi Blog","article_published_time":"2022-08-22T11:48:33+00:00","article_modified_time":"2024-09-10T13:49:00+00:00","og_image":[{"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-001-2-1024x293.png","type":"","width":"","height":""}],"author":"Gr\u00e9gory Steulet","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Gr\u00e9gory Steulet","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/"},"author":{"name":"Gr\u00e9gory Steulet","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/7609faada8e4d63e04a28ae29e227098"},"headline":"MySQL Server on Microsoft Azure 3rd part (backup and recovery)","datePublished":"2022-08-22T11:48:33+00:00","dateModified":"2024-09-10T13:49:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/"},"wordCount":1424,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-001-2-1024x293.png","keywords":["Azure backup","MySQL","PITR","Recovery process"],"articleSection":["Azure","Cloud","MySQL"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/","url":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/","name":"MySQL Server on Microsoft Azure 3rd part (backup and recovery) - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-001-2-1024x293.png","datePublished":"2022-08-22T11:48:33+00:00","dateModified":"2024-09-10T13:49:00+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/7609faada8e4d63e04a28ae29e227098"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-001-2.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/08\/MySQLAzure-001-2.png","width":1345,"height":385},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/mysql-server-on-microsoft-azure-3rd-part-backup-and-recovery\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"MySQL Server on Microsoft Azure 3rd part (backup and recovery)"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/7609faada8e4d63e04a28ae29e227098","name":"Gr\u00e9gory Steulet","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/e1531483285469fe17ea7a769ce5d8a8a01847185e4245d9c4d22c575c7c6d3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e1531483285469fe17ea7a769ce5d8a8a01847185e4245d9c4d22c575c7c6d3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e1531483285469fe17ea7a769ce5d8a8a01847185e4245d9c4d22c575c7c6d3e?s=96&d=mm&r=g","caption":"Gr\u00e9gory Steulet"},"description":"Gr\u00e9gory Steulet has more than ten years of experience in database and infrastructure management, engineering, and optimization. He is specialized in Oracle technologies and high availability solutions (Oracle DataGuard, Data Replication Block Device). His expertise also includes Avaloq banking applications, as well as the open source field (MySQL, Unix\/Linux, etc.). Gr\u00e9gory Steulet is \"Oracle Certified Professional 10g\", \"MySQL Cluster 5.1 Certified\", and \"Avaloq Certified Professional 2.6\". Prior to joining dbi services, Gr\u00e9gory Steulet was Senior Consultant at Trivadis in Lausanne. He also worked as IT Administrator at Box Telecom in Miami Beach, Florida (USA). Gr\u00e9gory Steulet has an Executive MBA from the International Institute of Management in Technology, Fribourg (CH). He also holds a Bachelor's Degree in Business Administration and Computer Science from the University of Applied Sciences Western Switzerland. His branch-related experience covers Telecommunications, Financial Services \/ Banking, Logistics, Pharma etc.","url":"https:\/\/www.dbi-services.com\/blog\/author\/gregory-steulet\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/18514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=18514"}],"version-history":[{"count":13,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/18514\/revisions"}],"predecessor-version":[{"id":20590,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/18514\/revisions\/20590"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=18514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=18514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=18514"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=18514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}