{"id":106531,"date":"2025-06-13T20:59:19","date_gmt":"2025-06-13T20:59:19","guid":{"rendered":"https:\/\/www.red-gate.com\/simple-talk\/?p=106531"},"modified":"2025-06-16T09:42:23","modified_gmt":"2025-06-16T09:42:23","slug":"replicating-mysql-databases-in-docker-containers","status":"publish","type":"post","link":"https:\/\/www.red-gate.com\/simple-talk\/databases\/mysql\/replicating-mysql-databases-in-docker-containers\/","title":{"rendered":"Replicating MySQL databases in Docker Containers"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\" id=\"h-\"><\/h1>\n\n\n\n<p>In my prior article, \u201c<a href=\"https:\/\/www.red-gate.com\/simple-talk\/databases\/mysql\/running-a-mysql-database-in-a-docker-container\/\">Running a relational database with Docker<\/a>\u201d, I showed how to spin up a Docker container with an instance of MySQL running in it. I also showed how you can persist data even when you blow away the container and recreate it by connecting to a Volume or Bind Mount.<\/p>\n\n\n\n<p>In this article I am going to extend this to show you how to use Replication with MySQL instances in Docker Containers.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-replication-basics\">Replication Basics<\/h2>\n\n\n\n<p>For a relational database like MySQL, <code>you<\/code> can achieve high availability even when using it inside of Docker containers. While this is mostly common in production environments like standalone servers and virtual machines, you can do the same with Docker, however with a different setup.<\/p>\n\n\n\n<p>For standalone servers or virtual machines you will typically set MySQL replication by manually configuring the <em>my.cnf<\/em> file; <a href=\"https:\/\/www.red-gate.com\/simple-talk\/blogs\/beginners-guide-to-mysql-replication-part-2-configuring-sources-and-replica-servers\/\">here\u2019s an article on the SimpleTalk blog that describes this in detail<\/a>. But MySQL replication for Docker is done using environment variables, Docker networks and volumes to persist data.<\/p>\n\n\n\n<p>Replication involves syncing data between a primary database which is also referred to as master and one or more secondary databases (replicas) also referred to as slaves. For the master and slave(s) to communicate, the master logs all changes to the <a href=\"https:\/\/stackoverflow.com\/questions\/1366184\/what-is-binlog-in-mysql\">binary log<\/a> and the slave(s) reads and applies those changes.<\/p>\n\n\n\n<p>This means that read operations are distributed across replicas while only the master handles all write operations. Each MySQL instance will have a unique identifier, <code>server-id=1<\/code><em> <\/em>and <code>server-id=2<\/code><em>, <\/em><code>server-id=3<\/code><em> <\/em> and the master must have binary logging enabled to allow all records or changes to the database in a binary format so that slaves read from these logs and apply the changes.<\/p>\n\n\n\n<p>In our use case we will spin up the master MySQL container first and then configure it for replication. After that, we\u2019ll start a slave MySQL container that will sync data from the master. Keep in mind that, the master and its replicas should communicate over the same Docker network and then use a shared replication user for authentication and secure data transfer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-configuring-replication-in-containers\">Configuring Replication in Containers<\/h2>\n\n\n\n<p>To begin, remove your already existing MySQL container:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">docker rm &lt;container-id&gt; -f<\/pre><\/div>\n\n\n\n<p>We already have a Docker network <code>mysql-net<\/code><em> <\/em>created; use it to start the MySQL master container:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">docker run -d --name mysql-master \\\n  --network=mysql-net \\\n  -e MYSQL_ROOT_PASSWORD=superadminuser \\\n  -e MYSQL_USER=admin \\\n  -e MYSQL_PASSWORD=admin123 \\\n  -e MYSQL_DATABASE=testdb \\\n  -v mysql-master-data:\/var\/lib\/mysql \\\n  mysql \\\n--server-id=1 \\\n--log-bin=mysql-bin \\\n--binlog-do-db=testdb \\\n--binlog-format=row<\/pre><\/div>\n\n\n\n<p>From the command above we are running the master container with the following configuration settings:<\/p>\n\n\n<div class=\"block-core-list\">\n<ul class=\"wp-block-list\">\n<li><strong>&#8211;network=mysql-net<\/strong>: Connect the master container to an already existing Docker network named <em>mysql-net<\/em>. <\/li>\n\n\n\n<li><strong>-e MYSQL_ROOT_PASSWORD=superadminuser<\/strong>: Set the root password for master to <em>superadminpassword<\/em>. <\/li>\n\n\n\n<li><strong>-e MYSQL_USER=admin<\/strong>: Create a new user named <em>admin<\/em>. <\/li>\n\n\n\n<li><strong>-e MYSQL_PASSWORD=admin123<\/strong>: Set the password for <em>admin <\/em>to <em>admin123<\/em>. <\/li>\n\n\n\n<li><strong>-e MYSQL_DATABASE=testdb<\/strong>: Initialize a database with the name <em>testdb<\/em> if the MySQL data directory is empty when it starts for the first time. <\/li>\n\n\n\n<li><strong>-v mysql-master-data:\/var\/lib\/mysql<\/strong>: Create and mount a Docker volume named <em>mysql-master-data<\/em> on the go to persist data. <\/li>\n\n\n\n<li><strong>mysql<\/strong>: Specify the MySQL image to use, which is the latest version in this case. <\/li>\n<\/ul>\n<\/div>\n\n\n<p>And then, pass several MySQL specific configuration options for replication:<\/p>\n\n\n<div class=\"block-core-list\">\n<ul class=\"wp-block-list\">\n<li><strong>&#8211;server-id=1<\/strong>: Assigns a unique server ID to the master. <\/li>\n\n\n\n<li><strong>&#8211;log-bin=mysql-bin<\/strong>: Enable binary logging which is necessary for replication. With binary logs enabled, changes to the specifiied databases can be recorded in binary logs which can be sent to replica containers. <\/li>\n\n\n\n<li><strong>&#8211;binlog-do-db=testdb<\/strong>: Configures the MySQL master container to only include changes to the <em>testdb <\/em>database in the binary logs, thus recording only changes made to the <em>testdb <\/em>by the replicated slave containers or servers. <\/li>\n\n\n\n<li><strong>&#8211;binlog-format=row<\/strong>: Sets the binary log to record changes at the<a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.4\/en\/binary-log-formats.html\"> row level rather than at the statement level<\/a>. This format is useful for reliable replication, especially when dealing with complex transactions. <\/li>\n<\/ul>\n<\/div>\n\n\n<p>Next, confirm that the MySQL container is running;<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">docker ps<\/pre><\/div>\n\n\n\n<p>Once it is running, we must create a replication user with <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/replication-howto-repuser.html\">REPLICATION SLAVE privileges<\/a> that the slave containers will use to connect and sync data from the master\u2019s binary logs.<\/p>\n\n\n\n<p>Connect to the MySQL shell inside the master container and sign in as root:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">docker exec -it mysql-master mysql -u root -p<\/pre><\/div>\n\n\n\n<p>Execute the following SQL commands one by one to create a replication user:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block lang:mysql\" highlight=\"true\" decode=\"true\">CREATE USER 'jane'@'%' IDENTIFIED BY  'jane123' REQUIRE SSL;\n\nGRANT REPLICATION SLAVE ON *.* TO 'jane'@'%';<\/pre><\/div>\n\n\n\n<p>From the above command, the replication user is <em>jane, <\/em>and \u2018%\u2019 allows connections from any host\/IP address, unlike a very restrictive user definition <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.4\/en\/replication-howto-repuser.html\"><em>jane\u2019@\u2019%.example.com<\/em><\/a><em> <\/em>which restricts access to hosts within the <em>example.com <\/em>domain. The follow up command <code>- IDENTIFIED BY  'jane123';<\/code><em> <\/em>means <code>jane123<\/code><em> <\/em>is the assigned password for the user <em>jane.<\/em><\/p>\n\n\n\n<p>For the other statement &#8211; <code>GRANT REPLICATION SLAVE ON *.* TO 'jane'@'%';<\/code> we are simply telling MySQL to grant the <code>REPLICATION SLAVE<\/code><em> <\/em>privilege to the user <code>jane<\/code>; which applies immediately.<\/p>\n\n\n\n<p>Display the status of the MySQL binary log with the below command:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block lang:mysql\" highlight=\"true\" decode=\"true\">SHOW BINARY LOG STATUS;<\/pre><\/div>\n\n\n\n<p>You should see the following output:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">+------------------+----------+--------------+------------------+-------------------+\n| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |\n+------------------+----------+--------------+------------------+-------------------+\n| mysql-bin.000003 |     3172 | testdb       |                  |                   |\n+------------------+----------+--------------+------------------+-------------------+\n1 row in set (0.00 sec)<\/pre><\/div>\n\n\n\n<p>From the output above the position is <code>3172<\/code> and the <code>Binary_Do_DB<\/code> is set to <code>testdb<\/code> which is what we want. The position <code>3172<\/code><em> <\/em>is a binary position within the binary log where the next event should be read by the slave(s). This implies that the slave containers should start reading the binary log file <code>mysql-bin.000003<\/code><em> <\/em>from position <code>3172<\/code><em>.<\/em><\/p>\n\n\n\n<p>The other parameters <code>Binlog_Ignore_DB <\/code>and <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.4\/en\/show-binary-log-status.html\"><em>Executed_Gtid_Set<\/em><\/a><em> <\/em>specifies which database should not be logged in the binary log and tracks the <code>GTID<\/code>s of executed transactions respectively. Since these parameters were not set, they are empty, no databases are explicitly ignored, and no <code>GTID<\/code> transactions have been recorded.<\/p>\n\n\n\n<p>Now start a MySQL slave container:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">docker run -d --name mysql-slave \\\n  --network=mysql-net \\\n  -e MYSQL_ROOT_PASSWORD=superadminuser \\\n  -e MYSQL_USER=john \\\n  -e MYSQL_PASSWORD=john123 \\\n  -e MYSQL_DATABASE=mydb \\\n  -v mysql-slave-data:\/var\/lib\/mysql \\\n  mysql \\\n  --server-id=2 \\\n  --relay-log=mysql-relay-bin<\/pre><\/div>\n\n\n\n<p>This will do the following:<\/p>\n\n\n<div class=\"block-core-list\">\n<ul class=\"wp-block-list\">\n<li> Create a MySQL container with the name <code>mysql-slave<\/code><em>.<\/em> <\/li>\n\n\n\n<li> Use the docker network <code>mysql-net<\/code><em>.<\/em> <\/li>\n\n\n\n<li> Use <code>superadminpassword<\/code><em> <\/em>as the <code>MYSQL_ROOT_PASSWORD<\/code>, this can be anything and doesn\u2019t need to be the same as the master. <\/li>\n\n\n\n<li> Create a user (<code>MYSQL_USER<\/code>), password (<code>MYSQL_PASSWORD<\/code>) and database (<code>MYSQL_DATABASE<\/code>) with the following values &#8211; <code>john, john123<\/code> and <code>mydb<\/code> respectively. Again, the values do not have to be the same as the master. <\/li>\n\n\n\n<li> Create a Docker volume on the go called <code>mysql-slave-data<\/code><em> <\/em>and mount it on <code>\/var\/lib\/mysql<\/code><em> <\/em>which is where database files are stored in MySQL. <\/li>\n\n\n\n<li> Assign the server ID of 2. <\/li>\n\n\n\n<li> Enable <em><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.4\/en\/replica-logs-relaylog.html\">relay logs<\/a><\/em> for storing changes received from the master in the file <code>mysql-relay-bin<\/code><em> <\/em> before applying them. <\/li>\n<\/ul>\n<\/div>\n\n\n<p>Confirm the slave container is running:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">docker ps<\/pre><\/div>\n\n\n\n<p>Open a shell in the slave container as the root user:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">docker exec -it mysql-slave mysql -u root -p<\/pre><\/div>\n\n\n\n<p>Configure the replica with the following command:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block lang:mysql\" highlight=\"true\" decode=\"true\">CHANGE REPLICATION SOURCE TO \n  SOURCE_HOST='mysql-master',\n  SOURCE_LOG_FILE='mysql-bin.000003',\n  SOURCE_LOG_POS=3172,<\/pre><\/div>\n\n\n\n<p>Here\u2019s what each part of the statement above does:<\/p>\n\n\n<div class=\"block-core-list\">\n<ul class=\"wp-block-list\">\n<li><code>CHANGE REPLICATION SOURCE<\/code> TO configures the replica with information about where to start the replication from, which master to connect to, which log file to use, and at which position it should begin reading the binary log events. <\/li>\n\n\n\n<li><code>SOURCE_HOST<\/code> specifies the MySQL master container using the container name <code>mysql-master<\/code><em>.<\/em> <\/li>\n\n\n\n<li><code>SOURCE_LOG_FILE<\/code> defines the binary log file on the master which the slave (replica) container should start reading from. <\/li>\n\n\n\n<li><code>SOURCE_LOG_POS<\/code> specifies the exact position within the master&#8217;s binary file where replication should begin. The byte offset `<code>3172<\/code>` is usually the starting point for replication. <\/li>\n<\/ul>\n<\/div>\n\n\n<p>Next, initiate the replication process by allowing the slave (replica) container to start reading and applying changes from the master\u2019s binary logs:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block lang:mysql\" highlight=\"true\" decode=\"true\">START REPLICA USER='jane' PASSWORD='jane123';<\/pre><\/div>\n\n\n\n<p>Verify that the replication is done successfully and that it is working correctly:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block lang:mysql\" highlight=\"true\" decode=\"true\">SHOW REPLICA STATUS\\G<\/pre><\/div>\n\n\n\n<p>If you have an output similar to the one below, the replication is set:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">*************************** 1. row ***************************\n             Replica_IO_State: Connecting to source\n                  Source_Host: mysql-master\n                  Source_User: jane\n                  Source_Port: 3306\n                Connect_Retry: 60\n              Source_Log_File: mysql-bin.000003\n          Read_Source_Log_Pos: 3172\n               Relay_Log_File: mysql-relay-bin.000001\n                Relay_Log_Pos: 4\n        Relay_Source_Log_File: mysql-bin.000003\n           Replica_IO_Running: Connecting\n          Replica_SQL_Running: Yes\n              Replicate_Do_DB:\n          Replicate_Ignore_DB:\n           Replicate_Do_Table:\n       Replicate_Ignore_Table:\n      Replicate_Wild_Do_Table:\n  Replicate_Wild_Ignore_Table:\n                   Last_Errno: 0\n                   Last_Error:\n                 Skip_Counter: 0\n          Exec_Source_Log_Pos: 3172\n              Relay_Log_Space: 158\n              Until_Condition: None\n               Until_Log_File:\n                Until_Log_Pos: 0\n           Source_SSL_Allowed: No\n           Source_SSL_CA_File:\n           Source_SSL_CA_Path:\n              Source_SSL_Cert:\n            Source_SSL_Cipher:\n               Source_SSL_Key:\n        Seconds_Behind_Source: NULL\nSource_SSL_Verify_Server_Cert: No\n                Last_IO_Errno: 2061\n                Last_IO_Error: Error connecting to source 'jane@mysql-master:3306'. This was attempt 2\/10, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.\n               Last_SQL_Errno: 0\n               Last_SQL_Error:\n  Replicate_Ignore_Server_Ids:\n             Source_Server_Id: 0\n                  Source_UUID:\n             Source_Info_File: mysql.slave_master_info\n                    SQL_Delay: 0\n          SQL_Remaining_Delay: NULL\n    Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates\n           Source_Retry_Count: 10\n                  Source_Bind:\n      Last_IO_Error_Timestamp: 250318 15:03:31\n     Last_SQL_Error_Timestamp:\n               Source_SSL_Crl:\n           Source_SSL_Crlpath:\n           Retrieved_Gtid_Set:\n            Executed_Gtid_Set:\n                Auto_Position: 0\n         Replicate_Rewrite_DB:\n                 Channel_Name:\n           Source_TLS_Version:\n       Source_public_key_path:\n        Get_Source_public_key: 0\n            Network_Namespace:\n1 row in set (0.00 sec)<\/pre><\/div>\n\n\n\n<p>From the above output:<\/p>\n\n\n<div class=\"block-core-list\">\n<ul class=\"wp-block-list\">\n<li><code>Replica_IO_State<\/code> means the replica is caught up with the master and is waiting to receive new changes. <\/li>\n\n\n\n<li><code>Replica_IO_Running<\/code> means the replica is successfully reading changes from the master. <\/li>\n\n\n\n<li><code>Seconds_Behind_Source<\/code> means there is no lagging and the replica is in sync fully with the master. <\/li>\n\n\n\n<li><code>Last_IO_Error<\/code> and <code>Last_SQL_Error<\/code> means there are no errors in the replication process. <\/li>\n<\/ul>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-testing-the-replication-configuration\"><a id=\"post-106531-_2grdhmh7zm7f\"><\/a>Testing the Replication Configuration<\/h2>\n\n\n\n<p>We have successfully set replication to apply changes from the master MySQL container. To test out our setup, we\u2019ll need to insert a test record into the <code>testdb<\/code><em> <\/em>database on the <code>mysql-master container<\/code>. We are using the <em>testdb<\/em> database because it is the one explicitly included in the master\u2019s binary logs via the <em>binlog-do-db <\/em>setting.<\/p>\n\n\n\n<p>Access the MySQL shell in the master container:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">docker exec -it mysql-master mysql -u root -p<\/pre><\/div>\n\n\n\n<p>Switch to the <code>testdb<\/code><em> <\/em>database:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">USE testdb;<\/pre><\/div>\n\n\n\n<p>Create a table <code>users<\/code><em> <\/em>and insert a record:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block lang:mysql\" highlight=\"true\" decode=\"true\">CREATE TABLE users (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(100) NOT NULL,\n    email VARCHAR(100) NOT NULL UNIQUE\n);<\/pre><\/div>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block lang:mysql\" highlight=\"true\" decode=\"true\">INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');<\/pre><\/div>\n\n\n\n<p>Now confirm that the data has been replicated on the <em>mysql-slave <\/em>container:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block lang:mysql\" highlight=\"true\" decode=\"true\">USE testdb;\n\nSELECT * FROM users;<\/pre><\/div>\n\n\n\n<p>If the replication is working correctly you should have the new row outputted to you like so:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"block\" highlight=\"false\" decode=\"true\">+----+-------+-------------------+\n| id | name  | email             |\n+----+-------+-------------------+\n|  1 | Alice | alice@example.com |\n+----+-------+-------------------+\n1 row in set (0.00 sec)<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conclusion\"><a id=\"post-106531-_qai97j7bjug2\"><\/a>Conclusion<\/h2>\n\n\n\n<p>Through this article, you now have an understanding of how you can configure MySQL replication between Docker containers. Whether you want to run MySQL using Docker for testing purposes or preparing for production you now have all the necessary configuration steps at your fingertips.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my prior article, \u201cRunning a relational database with Docker\u201d, I showed how to spin up a Docker container with an instance of MySQL running in it. I also showed how you can persist data even when you blow away the container and recreate it by connecting to a Volume or Bind Mount. In this&#8230;&hellip;<\/p>\n","protected":false},"author":341730,"featured_media":106532,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[143513,53,145792],"tags":[159078,5854],"coauthors":[158989],"class_list":["post-106531","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-containers-and-virtualization","category-featured","category-mysql","tag-docker","tag-mysql"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/106531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/users\/341730"}],"replies":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/comments?post=106531"}],"version-history":[{"count":2,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/106531\/revisions"}],"predecessor-version":[{"id":107140,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/106531\/revisions\/107140"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/media\/106532"}],"wp:attachment":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/media?parent=106531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/categories?post=106531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/tags?post=106531"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/coauthors?post=106531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}