Create instances

This page describes how to create a Cloud SQL for MySQL instance.

For detailed information about all instance settings, see Instance settings.

A newly-created instance has four system databases:

  • information_schema: Provides access to database metadata, information about the MySQL server.
  • mysql: The system schema. It contains tables that store information required by the MySQL server as it runs.
  • performance_schema: A feature for monitoring MySQL Server execution at a low level.
  • sys: Contains a set of objects that helps DBAs and developers interpret data collected by the performance schema.

Before you begin

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. Make sure you have the Cloud SQL Admin and Compute Viewer roles on your user account.

    Go to the IAM page

    Learn more about roles and permissions.

Create a MySQL instance

Console

  1. In the Google Cloud console, go to the Cloud SQL Instances page.

    Go to Cloud SQL Instances

  2. Click Create instance.
  3. On the Choose your database engine panel of the Create an instance page, click Choose MySQL.
  4. In the Instance ID field of the Instance info pane, enter an ID for your instance.

    You do not need to include the project ID in the instance name. This is done automatically where appropriate (for example, in the log files).

  5. Set a password for the root user.

    Although there's an option to set No password, this isn't recommended for security reasons.

  6. To see the password in clear text, click the Show password icon.

    You can either enter the password manually or click Generate to have Cloud SQL create a password for you automatically.
  7. Optional: Configure a password policy for the instance as follows:

    1. Select the Enable password policies checkbox.
    2. Click the Set password policy button, set one or more of the following options, and click Save.
      • Minimum length: Specifies the minimum number of characters that the password must have.
      • Password complexity: Checks if the password is a combination of lowercase, uppercase, numeric, and non-alphanumeric characters.
      • Restrict password reuse: Specifies the number of previous passwords that you can't reuse.

        Supported only on Cloud SQL for MySQL 8.0 and later.

      • Disallow username: Prevents the use of the username in the password.
  8. Select the database version for your instance: MySQL 8.4, MySQL 8.0 (default), MySQL 5.7, or MySQL 5.6.
  9. Optional: Select Show minor versions. Then choose a minor version other than the default minor version.
  10. The database version can't be edited after the instance has been created.

  11. Select the Cloud SQL edition for your instance: Enterprise or Enterprise plus. For more information about Cloud SQL editions, see Introduction to Cloud SQL editions.
  12. In the Choose region and zonal availability section, select the region and zone for your instance. Region availability might be different based on your Cloud SQL edition. For more information, see About instance settings.

    Place your instance in the same region as the resources that access it. The region you select can't be modified in the future. In most cases, you don't need to specify a zone.

    If you are configuring your instance for high availability, you can select both a primary and secondary zone.

    The following conditions apply when the secondary zone is used during instance creation:

    • The zones default to Any for the primary zone and Any (different from primary) for the secondary zone.
    • If both the primary and secondary zones are specified, they must be distinct zones.
  13. In the Customize your instance section, update settings for your instance. Begin by clicking SHOW CONFIGURATION OPTIONS to display the groups of settings. Then, expand desired groups to review and customize settings. A Summary of all the options you select is shown on the right. Customizing these instance settings is optional. Defaults are assigned in every case where no customizations are made.

    The following table is a quick reference to instance settings. For more details about each setting, see the instance settings page.

    Setting Notes
    Machine type
    Machine type Select from Shared core or Dedicated core. For Shared core, each machine type is classified by the number of CPUs (cores) and amount of memory for your instance.
    Cores The number of vCPUs for your instance. Learn more.
    Memory The amount of memory for your instance, in GBs. Learn more.
    Custom For the Dedicated core machine type, instead of selecting a predefined configuration, select the Custom button to create an instance with a custom configuration. When you select this option, you need to select the number of cores and amount of memory for your instance. Learn more.
    Storage
    Storage type Determines whether your instance uses SSD or HDD storage. Learn more.
    Storage capacity The amount of storage provisioned for the instance. Learn more.
    Enable automatic storage increases Determines whether Cloud SQL automatically provides more storage for your instance when free space runs low. Learn more.
    Encryption
    Google-managed encryptionThe default option.
    Customer key-managed encryption key (CMEK)Select to use your key with Google Cloud Key Management Service. Learn more.
    Connections
    Private IP Adds a private IP address for your instance. To enable connecting to the instance, additional configuration is required.
    Optionally, you can specify an allocated IP range for your instances to use for connections.
    1. Expand Show allocated IP range option.
    2. Select an IP range from the drop-down menu.

    Your instance can have both a public and a private IP address.

    Public IP Adds a public IP address for your instance. You can then add authorized networks to connect to the instance.

    Your instance can have both a public and a private IP address.

    Learn more about using public IP.

    Authorized networksAdd the name for the new network and the Network address. Learn more.
    Private path for Google Cloud services

    By selecting this check box, you allow other Google Cloud services, such as BigQuery, to access data in Cloud SQL and make queries against this data over a private connection.

    Data protection
    Automate backups The window of time when you would like backups to start. Learn more.
    Choose where to store your backupsSelect Multi-region for most use cases. If you need to store backups in a specific region, for example, if there are regulatory reasons to do so, select Region and select your region from the Location drop-down menu.
    Choose how many automated backups to storeThe number of automated backups you would like to retain (from 1 to 365 days). Learn more.
    Enable point-in-time recovery Enables point-in-time recovery and write-ahead logging. Learn more.
    Enable deletion protection Determines whether to protect an instance against accidental deletion. Learn more.
    Choose how many days of logs to retain Configure write-ahead log retention from 1 to 7 days. The default setting is 7 days. Learn more.
    Maintenance
    Preferred window Determines a one-hour window when Cloud SQL can perform disruptive maintenance on your instance. If you do not set the window, then disruptive maintenance can be done at any time. Learn more.
    Order of updates Your preferred timing for instance updates, relative to other instances in the same project. Learn more.
    Flags
    ADD FLAG You can use database flags to control settings and parameters for your instance. Learn more.
    Labels
    ADD LABELAdd a key and value for each label that you add. You use labels to help organize your instances.
    Data cache
    Enable data cache (optional) Enables data cache for Cloud SQL for MySQL Enterprise Plus edition instances. For more information about data cache, see data cache.
  14. Click Create Instance.

    Note: It might take a few minutes to create your instance. However, you can view information about the instance while it's being created.

gcloud

For information about installing and getting started with the gcloud CLI, see Installing gcloud CLI. For information about starting Cloud Shell, see the Cloud Shell documentation.

  1. Use the gcloud sql instances create command to create the instance:
  2. For Cloud SQL Enterprise Plus edition instances:

    gcloud sql instances create INSTANCE_NAME \
    --region=REGION \
    --tier=TIER \
    --database-version=DATABASE_VERSION \
    --edition=ENTERPRISE_PLUS
    

    For Cloud SQL Enterprise edition instances:

    gcloud sql instances create INSTANCE_NAME \
    --cpu=NUMBER_CPUS \
    --memory=MEMORY_SIZE \
    --region=REGION
    

    Or, alternatively, you can use the --tier flag if you choose db-f1-micro or db-g1-small as the machine type:
    gcloud sql instances create INSTANCE_NAME \
    --tier=API_TIER_STRING \
    --region=REGION
    

    There are restrictions on the values for vCPUs and memory size:

    • vCPUs must be either 1 or an even number between 2 and 96.
    • Memory must be:
      • 0.9 to 6.5 GB per vCPU
      • A multiple of 256 MB
      • At least 3.75 GB (3840 MB)

    For example, the following command creates a Cloud SQL Enterprise edition instance with two vCPUs and 7,680 MB of memory:

    gcloud sql instances create myinstance \
    --database-version=MYSQL_8_0 \
    --cpu=2 \
    --memory=7680MB \
    --region=us-central1
    

    The following command creates a Cloud SQL Enterprise Plus edition instance with four cores:

    gcloud sql instances create myinstance \
    --database-version=MYSQL_8_0_31 \
    --tier=db-perf-optimized-N-4 \
    --edition=ENTERPRISE_PLUS \
    --region=us-central1
    

    The default value for REGION is us-central1.

    Do not include sensitive or personally identifiable information in your instance name; it is externally visible.
    You do not need to include the project ID in the instance name. This is done automatically where appropriate (for example, in the log files).

    If you are creating an instance for high availability, you can specify both the primary and secondary zones, using the --zone and --secondary-zone parameters. The following conditions apply when the secondary zone is used during instance creation or edit:

    • The zones must be valid zones.
    • If the secondary zone is specified, the primary must also be specified.
    • If the primary and secondary zones are specified, they must be distinct zones.
    • If the primary and secondary zones are specified, they must belong to the same region.

    You can add more parameters to determine other instance settings:

    Setting Parameter Notes
    Required parameters
    Database version --database-version The database version, which is based on your Cloud SQL edition.
    Region --region See valid values.
    Set password policy
    Enable password policy --enable-password-policy Enables the password policy when used. By default, the password policy is disabled. When disabled using the --clear-password-policy parameter, the other password policy parameters are reset.
    Minimum length --password-policy-min-length Specifies the minimum number of characters that the password must have.
    Password complexity --password-policy-complexity Enables the password complexity check to ensure that the password contains one of each of these types of characters: lowercase, uppercase, numeric, and non-alphanumeric. Set the value to COMPLEXITY_DEFAULT.
    Restrict password reuse --password-policy-reuse-interval Specifies the number of previous passwords that you can't reuse. Supported only on Cloud SQL for MySQL 8.0 and later.
    Disallow username --password-policy-disallow-username-substring Prevents the use of the username in the password. Use the --no-password-policy-disallow-username-substring parameter to disable the check.
    Connectivity
    Private IP --network

    --no-assign-ip (optional)

    --allocated-ip-range-name (optional)

    --enable-google-private-path (optional)

    --network: Specifies the name of the VPC network you want to use for this instance. Private services access must already be configured for the network. Available only for the beta command (gcloud beta sql instances create).

    --no-assign-ip: Instance will only have a private IP address.

    --allocated-ip-range-name: If specified, sets a range name for which an IP range is allocated. For example, google-managed-services-default. The range name should comply with RFC-1035 and be within 1-63 characters. (gcloud alpha sql instances create).

    --enable-google-private-path: If you use this parameter, then you allow other Google Cloud services, such as BigQuery, to access data in Cloud SQL and make queries against this data over a private connection.

    This parameter is valid only if:

    • You use the --no-assign-ip parameter.
    • You use the --network parameter to specify the name of the VPC network that you want to use to create a private connection.

    Learn more about configuring private IP.

    Public IP --authorized-networks For public IP connections, only connections from authorized networks can connect to your instance. Learn more.
    SSL Enforcement

    --ssl-mode

    --require-ssl

    The ssl-mode parameter enforces the SSL/TLS enforcement for the connections. For more information, see Settings for Cloud SQL for MySQL.

    The require-ssl parameter determines whether SSL connections over IP are enforced or not. require-ssl is a legacy parameter. Use ssl-mode instead. For more information, see IpConfiguration.

    Server CA mode --server-ca-mode

    The --server-ca-mode flag configures the type of server certificate authority (CA) for an instance. You can select one of the following options:

    • GOOGLE_MANAGED_INTERNAL_CA: this is the default value. With this option, an internal CA dedicated to each Cloud SQL instance signs the server certificate for that instance.
    • GOOGLE_MANAGED_CAS_CA: with this option, a CA hierarchy consisting of a root CA and subordinate server CAs managed by Cloud SQL and hosted on Google Cloud Certificate Authority Service (CA Service) is used. The subordinate server CAs in a region sign the server certificates and are shared across instances in the region. This option is supported only on MySQL 8.0.30 and later.

    Using the --server-ca-mode flag is in Preview.

    Machine type and storage
    Machine type --tier Used to specify a shared-core instance (db-f1-micro or db-g1-small). For a custom instance configuration, use the --cpu or --memory parameters instead. See Custom instance configuration.
    Storage type --storage-type Determines whether your instance uses SSD or HDD storage. Learn more.
    Storage capacity --storage-size The amount of storage provisioned for the instance, in GB. Learn more.
    Automatic storage increase --storage-auto-increase Determines whether Cloud SQL automatically provides more storage for your instance when free space runs low. Learn more.
    Automatic storage increase limit --storage-auto-increase-limit Determines how large Cloud SQL can automatically grow storage. Available only for the beta command (gcloud beta sql instances create). Learn more.
    Data cache (optional) --enable-data-cache Enables or deactivates the data cache for instances. For more information, see data cache.
    Automatic backups and high availability
    High availability --availability-type For a highly-available instance, set to REGIONAL. Learn more.
    Secondary zone --secondary-zone If you're creating an instance for high availability, you can specify both the primary and secondary zones using the --zone and --secondary-zone parameters. The following restrictions apply when the secondary zone is used during instance creation or edit:
    • The zones must be valid zones.
    • If the secondary zone is specified, the primary must also be specified.
    • If the primary and secondary zones are specified, they must be distinct zones.

      If the primary and secondary zones are specified, they must belong to the same region.

    Automatic backups --backup-start-time The window of time when you would like backups to start. Learn more.
    Retention settings for automated backups --retained-backups-count The number of automated backups to retain. Learn more.
    Binary logging --enable-bin-log Binary logging enables replication and point-in-time recovery. Learn more.
    Retention settings for binary logging --retained-transaction-log-days The number of days to retain binary logs for point-in-time recovery.Learn more.
    Add database flags
    Database flags --database-flags You can use database flags to control settings and parameters for your instance. Learn more about database flags. Learn more about how to format this parameter.
    Maintenance schedule
    Maintenance window --maintenance-window-day,
    --maintenance-window-hour
    Determines a one-hour window when Cloud SQL can perform disruptive maintenance on your instance. If you do not set the window, then disruptive maintenance can be done at any time. Learn more.
    Maintenance timing --maintenance-release-channel Your preferred timing for instance updates, relative to other instances in the same project. Use preview for earlier updates, and production for later updates. Learn more.
  3. Note the automatically assigned IP address.

    If you are not using the Cloud SQL Auth Proxy, you will use this address as the host address that your applications or tools use to connect to the instance.

  4. Set the password for the "root@%" MySQL user:
    gcloud sql users set-password root \
    --host=% \
    --instance INSTANCE_NAME \
    --password PASSWORD
    

Terraform

To create an instance, use a Terraform resource.

resource "google_sql_database_instance" "mysql_pvp_instance_name" {
  name             = "mysql-pvp-instance-name"
  region           = "asia-northeast1"
  database_version = "MYSQL_8_0"
  root_password    = "abcABC123!"
  settings {
    tier = "db-f1-micro"
    password_validation_policy {
      min_length                  = 6
      complexity                  = "COMPLEXITY_DEFAULT"
      reuse_interval              = 2
      disallow_username_substring = true
      enable_password_policy      = true
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

Apply the changes

To apply your Terraform configuration in a Google Cloud project, complete the steps in the following sections.

Prepare Cloud Shell

  1. Launch Cloud Shell.
  2. Set the default Google Cloud project where you want to apply your Terraform configurations.

    You only need to run this command once per project, and you can run it in any directory.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Environment variables are overridden if you set explicit values in the Terraform configuration file.

Prepare the directory

Each Terraform configuration file must have its own directory (also called a root module).

  1. In Cloud Shell, create a directory and a new file within that directory. The filename must have the .tf extension—for example main.tf. In this tutorial, the file is referred to as main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. If you are following a tutorial, you can copy the sample code in each section or step.

    Copy the sample code into the newly created main.tf.

    Optionally, copy the code from GitHub. This is recommended when the Terraform snippet is part of an end-to-end solution.

  3. Review and modify the sample parameters to apply to your environment.
  4. Save your changes.
  5. Initialize Terraform. You only need to do this once per directory.
    terraform init

    Optionally, to use the latest Google provider version, include the -upgrade option:

    terraform init -upgrade

Apply the changes

  1. Review the configuration and verify that the resources that Terraform is going to create or update match your expectations:
    terraform plan

    Make corrections to the configuration as necessary.

  2. Apply the Terraform configuration by running the following command and entering yes at the prompt:
    terraform apply

    Wait until Terraform displays the "Apply complete!" message.

  3. Open your Google Cloud project to view the results. In the Google Cloud console, navigate to your resources in the UI to make sure that Terraform has created or updated them.

Delete the changes

To delete your changes, do the following:

  1. To disable deletion protection, in your Terraform configuration file set the deletion_protection argument to false.
    deletion_protection =  "false"
  2. Apply the updated Terraform configuration by running the following command and entering yes at the prompt:
    terraform apply
  1. Remove resources previously applied with your Terraform configuration by running the following command and entering yes at the prompt:

    terraform destroy

REST v1

Create the instance

This example creates an instance. Some optional parameters, such as backups and binary logging are also included. For a complete list of parameters for this call, see the Instances:insert page. For information about instance settings, including valid values for region, see Instance settings.

Do not include sensitive or personally identifiable information in your instance ID; it is externally visible.
You do not need to include the project ID in the instance name. This is done automatically where appropriate (for example, in the log files).

Before using any of the request data, make the following replacements:

  • PROJECT_ID: your project ID
  • INSTANCE_ID: your instance ID
  • DATABASE_VERSION: the database version. For example: MYSQL_8_4 or MYSQL_8_0_37. If you don't specify a database version, the default database version is MYSQL_8_0.
  • REGION: the region
  • MACHINE_TYPE: your machine type
  • EDITION_TYPE: your Cloud SQL edition
  • DATA_CACHE_ENABLED: (optional) set to true to enable data cache for your instance
  • PRIVATE_NETWORK: specify the name of the Virtual Private Cloud (VPC) network that you want to use for this instance. Private services access must already be configured for the network.
  • AUTHORIZED_NETWORKS: For public IP connections, specify the connections from authorized networks that can connect to your instance.
  • CA_MODE: specify a certificate authority hierarchy for the instance, either GOOGLE_MANAGED_INTERNAL_CA or GOOGLE_MANAGED_CAS_CA. If you don't specify serverCaMode, then the default configuration is GOOGLE_MANAGED_INTERNAL_CA. This feature is in Preview.

To set a password policy while creating an instance, include the passwordValidationPolicy object in the request. Set the following parameters, as required:

  • enablePasswordPolicy: Enables the password policy when set to true.

    To remove the password policy, you can use a PATCH request with null as the value for enablePasswordPolicy. In this case, the other password policy parameters are reset.

  • minLength: Specifies the minimum number of characters that the password must have.
  • complexity: Checks if the password is a combination of lowercase, uppercase, numeric, and non-alphanumeric characters. The default value is COMPLEXITY_DEFAULT.
  • reuseInterval: Specifies the number of previous passwords that you can't reuse.

    Supported only on Cloud SQL for MySQL 8.0 and later.

  • disallowUsernameSubstring: Prevents the use of the username in the password when set to true.

HTTP method and URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances

Request JSON body:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "settings": {
    "tier": "MACHINE_TYPE",
    "edition": "EDITION_TYPE",
    "dataCacheConfig" = {
      "dataCacheEnabled": DATA_CACHE_ENABLED
    },
    "backupConfiguration": {
      "binaryLogEnabled": true,
      "enabled": true
    },
    "passwordValidationPolicy": {
      "enablePasswordPolicy": true
      "minLength": "MIN_LENGTH",
      "complexity": COMPLEXITY_DEFAULT,
      "reuseInterval": "REUSE_INTERVAL",
      "disallowUsernameSubstring": "DISALLOW_USERNAME_SUBSTRING",
    }
    "ipConfiguration": {
      "privateNetwork": "PRIVATE_NETWORK",
      "authorizedNetworks": [AUTHORIZED_NETWORKS],
      "ipv4Enabled": false,
      "enablePrivatePathForGoogleCloudServices": true,
      "serverCaMode": "CA_MODE"
    }
  }
}

To send your request, expand one of these options:

You should receive a JSON response similar to the following:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2019-09-25T22:19:33.735Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

The response is a long-running operation, which might take a few minutes to complete.

Update the root password

When the instance finishes initializing, update the root password:

Before using any of the request data, make the following replacements:

  • project-id: your project ID
  • instance-id: instance ID created in prior step
  • root-password: desired root password

HTTP method and URL:

PUT https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users?host=%25&name=root

Request JSON body:

{
  "name": "root",
  "host": "%",
  "password": "root-password"
}

To send your request, expand one of these options:

You should receive a JSON response similar to the following:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2019-09-26T14:32:30.592Z",
  "startTime": "2019-09-26T14:32:30.594Z",
  "endTime": "2019-09-26T14:32:33.518Z",
  "operationType": "UPDATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Retrieve the IPv4 address

Retrieve the automatically assigned IPv4 address for the new instance:

Before using any of the request data, make the following replacements:

  • project-id: your project ID
  • instance-id: instance ID created in prior step

HTTP method and URL:

GET https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id

To send your request, expand one of these options:

You should receive a JSON response similar to the following:

{
  "kind": "sql#instance",
  "state": "RUNNABLE",
  "databaseVersion": "MYSQL_8_0_18",
  "settings": {
    "authorizedGaeApplications": [],
    "tier": "db-f1-micro",
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "SYNCHRONOUS",
    "activationPolicy": "ALWAYS",
    "ipConfiguration": {
      "authorizedNetworks": [],
      "ipv4Enabled": true
    },
    "locationPreference": {
      "zone": "us-west1-a",
      "kind": "sql#locationPreference"
    },
    "dataDiskType": "PD_SSD",
    "backupConfiguration": {
      "startTime": "18:00",
      "kind": "sql#backupConfiguration",
      "enabled": true,
      "binaryLogEnabled": true
    },
    "settingsVersion": "1",
    "storageAutoResizeLimit": "0",
    "storageAutoResize": true,
    "dataDiskSizeGb": "10"
  },
  "etag": "--redacted--",
  "ipAddresses": [
    {
      "type": "PRIMARY",
      "ipAddress": "10.0.0.1"
    }
  ],
  "serverCaCert": {
    ...
  },
  "instanceType": "CLOUD_SQL_INSTANCE",
  "project": "project-id",
  "serviceAccountEmailAddress": "redacted@gcp-sa-cloud-sql.iam.gserviceaccount.com",
  "backendType": "SECOND_GEN",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "connectionName": "project-id:region:instance-id",
  "name": "instance-id",
  "region": "us-west1",
  "gceZone": "us-west1-a"
}

Look for the ipAddress field in the response.

REST v1beta4

Create the instance

This example creates an instance. Some optional parameters, such as backups and binary logging are also included. For a complete list of parameters for this call, see the instances:insert page. For information about instance settings, including valid values for region, see Instance settings

Do not include sensitive or personally identifiable information in your instance ID; it is externally visible.
You do not need to include the project ID in the instance name. This is done automatically where appropriate (for example, in the log files).

Before using any of the request data, make the following replacements:

  • PROJECT_ID: your project ID
  • INSTANCE_ID: your instance ID
  • DATABASE_VERSION: the database version. For example: MYSQL_8_4 or MYSQL_8_0_37. If you don't specify a database version, then the default version is MYSQL_8_0.
  • REGION: the region
  • MACHINE_TYPE: your machine type
  • EDITION_TYPE: your Cloud SQL edition .
  • DATA_CACHE_ENABLED: (optional) set to true to enable data cache for your instance
  • PRIVATE_NETWORK: specify the name of the Virtual Private Cloud (VPC) network that you want to use for this instance. Private services access must already be configured for the network.
  • AUTHORIZED_NETWORKS: For public IP connections, specify the connections from authorized networks that can connect to your instance.
  • CA_MODE: specify a certificate authority hierarchy for the instance, either GOOGLE_MANAGED_INTERNAL_CA or GOOGLE_MANAGED_CAS_CA. If you don't specify serverCaMode, then the default configuration is GOOGLE_MANAGED_INTERNAL_CA. This feature is in Preview.

To set a password policy while creating an instance, include the passwordValidationPolicy object in the request. Set the following parameters, as required:

  • enablePasswordPolicy: Enables the password policy when set to true.

    To remove the password policy, you can use a PATCH request with null as the value for enablePasswordPolicy. In this case, the other password policy parameters are reset.

  • minLength: Specifies the minimum number of characters that the password must have.
  • complexity: Checks if the password is a combination of lowercase, uppercase, numeric, and non-alphanumeric characters. The default value is COMPLEXITY_DEFAULT.
  • reuseInterval: Specifies the number of previous passwords that you can't reuse.

    Supported only on Cloud SQL for MySQL 8.0 and later.

  • disallowUsernameSubstring: Prevents the use of the username in the password when set to true.

HTTP method and URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances

Request JSON body:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "settings": {
    "tier": "MACHINE_TYPE",
    "edition": "EDITION_TYPE",
    "dataCacheConfig" {
      "dataCacheEnabled": DATA_CACHE_ENABLED
    },
    "backupConfiguration": {
      "binaryLogEnabled": true,
      "enabled": true
    },
    "passwordValidationPolicy": {
      "enablePasswordPolicy": true
      "minLength": "MIN_LENGTH",
      "complexity": COMPLEXITY_DEFAULT,
      "reuseInterval": "REUSE_INTERVAL",
      "disallowUsernameSubstring": "DISALLOW_USERNAME_SUBSTRING",
    }
    "ipConfiguration": {
      "privateNetwork": "PRIVATE_NETWORK",
      "authorizedNetworks": [AUTHORIZED_NETWORKS],
      "ipv4Enabled": false,
      "enablePrivatePathForGoogleCloudServices": true,
      "serverCaMode": "CA_MODE"
  }
}

To send your request, expand one of these options:

You should receive a JSON response similar to the following:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2019-09-25T22:19:33.735Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

The response is a long-running operation, which might take a few minutes to complete.

Update the root password

When the instance finishes initializing, update the root password:

Before using any of the request data, make the following replacements:

  • project-id: your project ID
  • instance-id: instance ID created in prior step
  • root-password: desired root password

HTTP method and URL:

PUT https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users?host=%25&name=root

Request JSON body:

{
  "name": "root",
  "host": "%",
  "password": "root-password"
}

To send your request, expand one of these options:

You should receive a JSON response similar to the following:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2019-09-26T14:32:30.592Z",
  "startTime": "2019-09-26T14:32:30.594Z",
  "endTime": "2019-09-26T14:32:33.518Z",
  "operationType": "UPDATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

The response is a long-running operation, which might take a few minutes to complete.

Retrieve the IPv4 address

Retrieve the automatically assigned IPv4 address for the new instance:

Before using any of the request data, make the following replacements:

  • project-id: your project ID
  • instance-id: instance ID created in prior step

HTTP method and URL:

GET https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

To send your request, expand one of these options:

You should receive a JSON response similar to the following:

{
  "kind": "sql#instance",
  "state": "RUNNABLE",
  "databaseVersion": "MYSQL_8_0_18",
  "settings": {
    "authorizedGaeApplications": [],
    "tier": "db-f1-micro",
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "SYNCHRONOUS",
    "activationPolicy": "ALWAYS",
    "ipConfiguration": {
      "authorizedNetworks": [],
      "ipv4Enabled": true
    },
    "locationPreference": {
      "zone": "us-west1-a",
      "kind": "sql#locationPreference"
    },
    "dataDiskType": "PD_SSD",
    "backupConfiguration": {
      "startTime": "18:00",
      "kind": "sql#backupConfiguration",
      "enabled": true,
      "binaryLogEnabled": true
    },
    "settingsVersion": "1",
    "storageAutoResizeLimit": "0",
    "storageAutoResize": true,
    "dataDiskSizeGb": "10"
  },
  "etag": "--redacted--",
  "ipAddresses": [
    {
      "type": "PRIMARY",
      "ipAddress": "10.0.0.1"
    }
  ],
  "serverCaCert": {
    ...
  },
  "instanceType": "CLOUD_SQL_INSTANCE",
  "project": "project-id",
  "serviceAccountEmailAddress": "redacted@gcp-sa-cloud-sql.iam.gserviceaccount.com",
  "backendType": "SECOND_GEN",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "connectionName": "project-id:region:instance-id",
  "name": "instance-id",
  "region": "us-west1",
  "gceZone": "us-west1-a"
}

Look for the ipAddress field in the response.

To see how the underlying REST API request is constructed for this task, see the APIs Explorer on the instances:insert page.

Specify the database minor version for MySQL 8.0

You can specify the minor version of an existing MySQL 8.0 instance by using gcloud or the REST API.

gcloud

Use the gcloud sql instances create command with the --database-version flag.

Replace the following variables before running the command:

  • INSTANCE_NAME: The name of the instance.
  • DATABASE_VERSION: The database minor version of the instance: MYSQL_8_0_18, MYSQL_8_0_26, MYSQL_8_0_27, MYSQL_8_0_28, MYSQL_8_0_29, MYSQL_8_0_30, MYSQL_8_0_31 (default minor version for MySQL 8.0), MYSQL_8_0_32, MYSQL_8_0_33, MYSQL_8_0_34, MYSQL_8_0_35, MYSQL_8_0_36, or MYSQL_8_0_37. If you specify MYSQL_8_0, the default minor version is used.

    If you don't specify this flag, then the default major version, MYSQL_8_0, is used.

gcloud sql instances create INSTANCE_NAME \
--database-version=DATABASE_VERSION

For detailed information, see the documentation on creating an instance by using gcloud.

REST v1

Use a POST request with the instances:insert method and the databaseVersion flag.

    POST https://sqladmin.googleapis.com/v1/projects/project-id/instances
Before using any of the request data, replace these variables:
  • project_id: The ID of the project.
  • instance_id: The name of the instance.
  • databaseVersion: The database version of the instance: MYSQL_8_0_18, MYSQL_8_0_26, MYSQL_8_0_27, MYSQL_8_0_28, MYSQL_8_0_29, MYSQL_8_0_30, MYSQL_8_0_31 (default minor version for MySQL 8.0), MYSQL_8_0_32, MYSQL_8_0_33, MYSQL_8_0_34, MYSQL_8_0_35, MYSQL_8_0_36, or MYSQL_8_0_37. If you specify MYSQL_8_0, as the version, then the default minor version is used. If you don't specify the databaseVersion flag, then the default major version, MYSQL_8_0, is used.

For detailed information, see the documentation about creating an instance by using the REST v1 API.

REST v1beta4

Use a POST request with the instances:insert method and the databaseVersion flag.

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances

Before using any of the request data, replace these variables:

  • project_id: The ID of the project.
  • instance_id: The name of the instance.
  • databaseVersion: The database version of the instance: MYSQL_8_0_18, MYSQL_8_0_26, MYSQL_8_0_27, MYSQL_8_0_28, MYSQL_8_0_29, MYSQL_8_0_30, MYSQL_8_0_31 (default minor version for MySQL 8.0), MYSQL_8_0_32, MYSQL_8_0_33. MYSQL_8_0_34, MYSQL_8_0_35, MYSQL_8_0_36, or MYSQL_8_0_37. If you specify MYSQL_8_0, then the default minor version is used. If you don't specify the databaseVersion flag, then the default major version, MYSQL_8_0, is used.

For detailed information, see the documentation about creating an instance by using the REST v1beta4 API.

Database minor version for read replicas, clones, and PITR

When creating a read replica, you can specify the database minor version of the read replica. By default, new read replicas are created on the default minor version.

When cloning an instance, the newly created instance has that same minor version as that of the source.

When performing a point-in-time recovery, the newly created instance has the same database minor version as that of the source.

Custom instance configurations

Determines memory and virtual cores available to your Cloud SQL instance. Machine type availability is determined by your Cloud SQL edition.

For workloads that require real-time processing, such as online transaction processing (OLTP), make sure that your instance has enough memory to contain the entire working set. However, there are other factors that can impact memory requirements, such as number of active connections, and internal overhead processes. You should perform load testing to avoid performance issues in your production environment.

When you configure your instance, select enough memory and vCPUs to handle your workload, and upgrade as your workload increases. A machine configuration with insufficient vCPUs could lose its SLA coverage. For more information, see Operational guidelines.

Machine types for Cloud SQL Enterprise Plus edition instances

For Cloud SQL Enterprise Plus edition instances, machine types are predefined as follows:

Enterprise plus machine type vCPUs Memory (GB) Local SSD
db-perf-optimized-N-2 2 16 375
db-perf-optimized-N-4 4 32 375
db-perf-optimized-N-8 8 64 375
db-perf-optimized-N-16 16 128 750
db-perf-optimized-N-32 32 256 1500
db-perf-optimized-N-48 48 384 3000
db-perf-optimized-N-64 64 512 6000
db-perf-optimized-N-80 80 640 6000
db-perf-optimized-N-96 96 768 6000
db-perf-optimized-N-128 128 864 9000

Machine types for Cloud SQL Enterprise edition instances

For Cloud SQL Enterprise edition instances, you can also create custom instance configurations using the gcloud sql instances create command. Custom instance configurations let you select the amount of memory and CPUs that your instance needs. This flexibility lets you choose the appropriate VM shape for your workload.

Machine type names use the following format: db-custom-#-#

Replace the first # placeholder with the number of CPUs in the machine, and the second # placeholder with the amount of memory in the machine.

For example, if your machine name is db-custom, and your machine has 1 CPU and 3840 MB of RAM, then the format for the machine would be db-custom-1-3840.

When selecting the number of CPUs and amount of memory, there are some restrictions on the configuration you choose:

  • vCPUs must be either 1 or an even number between 2 and 96.
  • Memory must be:
    • 0.9 to 6.5 GB per vCPU
    • A multiple of 256 MB
    • At least 3.75 GB (3840 MB)

The following table lists the names of each legacy machine type, the number of CPUs and RAM for each machine type, and the resultant string for the machine type.

You can create the equivalent machine type by specifying the equivalent CPU and RAM in the Google Cloud console, by using the gcloud CLI, or by specifying db-custom-#-# in the API.

Legacy machine type vCPUs Memory (MBs) db-custom-CPU-RAM string (API tier string)
db-n1-standard-1 1 3840 db-custom-1-3840
db-n1-standard-2 2 7680 db-custom-2-7680
db-n1-standard-4 4 15360 db-custom-4-15360
db-n1-standard-8 8 30720 db-custom-8-30720
db-n1-standard-16 16 61440 db-custom-16-61440
db-n1-standard-32 32 122880 db-custom-32-122880
db-n1-standard-64 64 245760 db-custom-64-245760
db-n1-standard-96 96 368640 db-custom-96-368640
db-n1-highmem-2 2 13312 db-custom-2-13312
db-n1-highmem-4 4 26624 db-custom-4-26624
db-n1-highmem-8 8 53248 db-custom-8-53248
db-n1-highmem-16 16 106496 db-custom-16-106496
db-n1-highmem-32 32 212992 db-custom-32-212992
db-n1-highmem-64 64 425984 db-custom-64-425984
db-n1-highmem-96 96 638976 db-custom-96-638976

Troubleshoot

Issue Troubleshooting
Error message: Failed to create subnetwork. Couldn't find free blocks in allocated IP ranges. Please allocate new ranges for this service provider. There are no more available addresses in the allocated IP range. There can be several possible scenarios:

  • The size of the allocated IP range for the private service connection is smaller than /24.
  • The size of the allocated IP range for the private service connection is too small for the number of Cloud SQL instances.
  • The requirement on the size of allocated IP range will be larger if instances are created in multiple regions. See allocated range size

To resolve this issue, you can either expand the existing allocated IP range or allocate an additional IP range to the private service connection. For more information, see Allocate an IP address range.

If you used the --allocated-ip-range-name flag while creating the Cloud SQL instance, you may only expand the specified IP range.

If you're allocating a new range, take care that the allocation doesn't overlap with any existing allocations.

After creating a new IP range, update the vpc peering with the following command:

gcloud services vpc-peerings update \
--service=servicenetworking.googleapis.com \
--ranges=OLD_RESERVED_RANGE_NAME,NEW_RESERVED_RANGE_NAME \
--network=VPC_NETWORK \
--project=PROJECT_ID \
--force
    

If you're expanding an existing allocation, take care to increase only the allocation range and not decrease it. For example, if the original allocation was 10.0.10.0/24, then make the new allocation at least 10.0.10.0/23.

In general, if starting from a /24 allocation, decrementing the /mask by 1 for each condition (additional instance type group, additional region) is a good rule of thumb. For example, if trying to create both instance type groups on the same allocation, going from /24 to /23 is enough.

After expanding an existing IP range, update the vpc peering with following command:

gcloud services vpc-peerings update \
--service=servicenetworking.googleapis.com \
--ranges=RESERVED_RANGE_NAME \
--network=VPC_NETWORK \
--project=PROJECT_ID
    
Error message: Failed to create subnetwork. Router status is temporarily unavailable. Please try again later. Help Token: [token-ID]. Try to create the Cloud SQL instance again.
Error message: Failed to create subnetwork. Required 'compute.projects.get' permission for PROJECT_ID. When you create an instance using with a Private IP address, a service account is created just-in-time using the Service Networking API. If you have only recently enabled the Service Networking API, then the service account might not get created and the instance creation fails. In this case, you must wait for the service account to propagate throughout the system or manually add it with the required permissions.

What's next

  1. Create a MySQL database on the instance.
  2. Create MySQL users on the instance.
  3. Secure and control access to the instance.
  4. Connect to the instance with a MySQL client.
  5. Import data into the database.