Stay organized with collections Save and categorize content based on your preferences.
This page describes how to configure a Cloud SQL instance that replicates to one or more replicas external to Cloud SQL, and how to demote the primary instance in an external replica configuration to reverse the configuration.
For more information about replication, see About replication in Cloud SQL.
Set up the external replica configuration Before you beginBefore you start this task, you must have a Cloud SQL instance and an external MySQL instance that meets the requirements for external replicas.
Configure the primary instanceFor information about enabling IP access, see Configuring access for IP connections.
gcloud sql connect PRIMARY_INSTANCE_NAME \ --user=root
CREATE USER 'REPLICATION_USER'@'%' IDENTIFIED BY 'REPLICATION_USER_PASSWORD'; GRANT REPLICATION SLAVE ON *.* TO 'REPLICATION_USER'@'%';
CREATE DATABASE test; USE test; CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text); INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
Warning: This procedure overwrites any data hosted in a MySQL database on the replica, including users and passwords, with the settings and data from the primary instance.
For example, the following command loads an exported file named mydump.sql
:
mysql --user=root --password < mydump.sql
The server ID is a numeric value (for example, "3") that must be unique across the external replica configuration (each replica must have a unique server ID).
my.cnf
option file:
[mysqld] server-id=[SERVER_ID] gtid_mode=ON enforce_gtid_consistency=ON log_slave_updates=ON replicate-ignore-db=mysql binlog-format=ROW log_bin=mysql-bin expire_logs_days=1 read_only=ONNote: You must set
gtid_mode=ON
for all external replicas in a configuration that includes a Cloud SQL primary instance. Changing the default to gtid_mode=OFF
causes replication with the external server to fail.
For more information about MySQL replication options, see Replication and Binary Logging Options.
mysqld
process to cause the configuration file to be read.mysql
client on the replica, enter the following command:
CHANGE MASTER TO MASTER_HOST='MASTER_IP_ADDRESS', MASTER_USER='REPLICATION_USER', MASTER_PASSWORD='REPLICATION_PASSWORD', MASTER_AUTO_POSITION=1;
START SLAVE;
Confirm replication status:
SHOW SLAVE STATUS\G;
If you see "Waiting for master to send event", replication is working.
When you have a Cloud SQL instance with an external replica, you can reverse the configuration, which causes these changes to happen:
To reverse the external replica configuration:
Create a source representation instance.
This instance will represent the source database server to the Cloud SQL replica after the demotion operation completes.
gcloud auth login ACCESS_TOKEN="$(gcloud auth print-access-token)" curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \ --header 'Content-Type: application/json' \ --data '{ "name": "SOURCE_REPRESENTATION_NAME", "region": "REGION", "databaseVersion": "EXTERNAL_SERVER_DATABASE_VERSION", "onPremisesConfiguration": { "hostPort": "EXTERNAL_SERVER_IP:EXTERNAL_SERVER_PORT" } }' \ -X POST \ https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances
Use the region where you want your Cloud SQL replica to reside.
Start the demotion process.
Because this API call requires you to provide sensitive information, you should use a JSON file to provide your data to cURL, rather than providing it on the command line.
Create the data file:
{ "demoteMasterContext": { "replicaConfiguration": { "mysqlReplicaConfiguration": { "username": "REPLICATION_USERNAME", "password": "PASSWORD", "caCertificate": "EXTERNAL_SERVER_CA", "clientCertificate": "CLIENT_CERT", "clientKey": "PRIVATE_KEY" } }, "masterInstanceName": "SOURCE_REPRESENTATION_NAME", }, }
Then, call the API.
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \ --header 'Content-Type: application/json' \ --data @PATH_TO_DATA_FILE \ https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/INSTANCE_NAME/demoteMaster
For more information about your options for SSL/TLS, see SSL/TLS options. For more information about the properties used by the replicaConfiguration
object, see Replicating from an External Server.
Wait for the external replica to complete all pending transactions from the primary instance.
When the replica is caught up, the SHOW SLAVE STATUS
command will show Seconds Behind Master
as 0, and the Executed_Gtid_Set
value will be identical between the external replica and the Cloud SQL primary.
Use the mysql
client to stop replication on the external replica:
STOP SLAVE RESET SLAVE ALL
Wait for the Cloud SQL instance to start replicating from the external server, which is now the source database server.
Running the SHOW SLAVE STATUS
command on the Cloud SQL instance provides replication status.
read_only
flag on the source database server to off
and update your applications to point to the source database server.The slave is connecting ... master has purged binary logs containing GTIDs that the slave requires
. The primary Cloud SQL instance has automatic backups and binary logs and point-in-time recovery is enabled, so it should have enough logs for the replica to be able to catch up. However, in this case although the binary logs exist, the replica doesn't know which row to start reading from.
Create a new dump file using the correct flag settings, and configure the external replica using that file
--master-data=1
and --flush-privileges
flags.
Important: Do not include the --set-gtid-purged=OFF
flag.
SET @@GLOBAL.GTID_PURGED='...'
line.Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2025-08-14 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-14 UTC."],[],[]]
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4