データベースの作成と管理

このページでは、Spanner データベースを作成して管理する方法について説明します。

  • データベースを作成するさまざまな方法
  • データベース オプションを変更する
  • データベースを削除する

このページには、GoogleSQL 言語データベースおよび PostgreSQL 言語データベースの情報が記載されています。データベース スキーマを更新する方法については、スキーマを更新するをご覧ください。インスタンスの作成の詳細については、インスタンスの作成と管理をご覧ください。既存のインスタンスにデータベースを作成するには、次のいずれかの方法を使用します。

  • データベースを作成する: SQL 言語を選択し、スキーマを定義して、新しいデータベースを作成できます。
  • 独自のデータをインポートする: CSV、MySQL ダンプ、PostgreSQL ダンプファイルを新しいデータベースまたは既存のデータベースにインポートできます。
  • サンプルデータでデータベースを作成する: 使用可能なサンプル データセットのいずれかを使用してデータベースにデータを入力し、Spanner の機能を試すことができます。

データベースを作成する

既存のインスタンスに新しいデータベースを作成できます。GoogleSQL 言語データベースの場合、データベース スキーマの定義は、データベースの作成時またはデータベースの作成後に行えます。PostgreSQL 言語データベースの場合は、作成後にスキーマを定義する必要があります。

スキーマはデータベース定義言語を使用して定義します。これは GoogleSQL 用と PostgreSQL 用にドキュメント化されています。スキーマの作成と更新の詳細については、次のリンク先をご覧ください。

データベースの作成後にデータベースの削除からの保護を有効にすれば、アプリケーションとサービスにとって重要なデータベースを保護できます。詳細については、データベースが誤って削除されることを防止をご覧ください。

Google Cloud コンソール

  1. Google Cloud コンソールで、[Spanner インスタンス] ページに移動します。

    [Spanner インスタンス] に移動

  2. データベースを作成するインスタンスを選択します。

  3. [データベースを作成] をクリックします。

  4. 次の値を入力します。

    • Google Cloud コンソールに表示するデータベース名
    • このデータベースで使用する言語
    • GoogleSQL 言語データベースの場合、スキーマを定義する一連の DDL ステートメントを必要に応じて指定します。DDL テンプレートを使用すると、一般的な要素を事前入力できます。DDL ステートメントにエラーがある場合、 Google Cloud コンソールでデータベースを作成しようとするとエラーが返されます。
    • 必要に応じて、このデータベースで使用する顧客管理の暗号鍵を選択します。
  5. [作成] をクリックしてデータベースを作成します。

gcloud

gcloud spanner databases create コマンドを使用します。

```sh
gcloud spanner databases create DATABASE \
  --instance=INSTANCE \
  [--async] \
  [--database-dialect=DATABASE_DIALECT] \
  [--ddl=DDL] \
  [--ddl-file=DDL_FILE] \
  [--kms-key=KMS_KEY : --kms-keyring=KMS_KEYRING --kms-location=KMS_LOCATION --kms-project=KMS_PROJECT] \
  [GCLOUD_WIDE_FLAG …]
```

次のオプションは必須です。

DATABASE
データベース ID またはデータベースの完全修飾 ID。完全修飾識別子を指定する場合は、--instance フラグを省略できます。
--instance=INSTANCE
データベースの Spanner インスタンス。

次のオプションは省略可能です。

--async
処理中のオペレーションの完了を待たずに、直ちにコマンドを終了します。
--database-dialect=DATABASE_DIALECT
Spanner データベースの SQL 言語。POSTGRESQL または GOOGLE_STANDARD_SQL にする必要があります。
--ddl=DDL
新しく作成されたデータベース内で実行するセミコロン区切りの DDL(データ定義言語)ステートメント。いずれかのステートメントにエラーがある場合、データベースは作成されません。--ddl_file が設定されていると、このフラグは無視されます。PostgreSQL 言語データベースではサポートされていません。
--ddl-file=DDL_FILE
新しく作成されたデータベース内で実行するセミコロン区切りの DDL(データ定義言語)ステートメントを含むファイルのパス。いずれかのステートメントにエラーがある場合、データベースは作成されません。--ddl_file が設定されていると、--ddl は無視されます。PostgreSQL 言語データベースではサポートされていません。

データベースの作成時に使用する Cloud Key Management Service 鍵を指定する場合は、次のオプションを含めます。

--kms-key=KMS_KEY
鍵の ID または鍵の完全修飾 ID。

このグループの他の引数を指定する場合は、このフラグを指定する必要があります。完全修飾 ID が指定されている場合は、他の引数を省略できます。

--kms-keyring=KMS_KEYRING
鍵の Cloud KMS キーリング ID。
--kms-location=KMS_LOCATION
Google Cloud 鍵のロケーション。
--kms-project=KMS_PROJECT
Google Cloud 鍵のプロジェクト ID。

クライアント(GoogleSQL)

C++

Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。

Spanner に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。 詳細については、ローカル開発環境の認証の設定をご覧ください。

void CreateDatabase(google::cloud::spanner_admin::DatabaseAdminClient client,
                    std::string const& project_id,
                    std::string const& instance_id,
                    std::string const& database_id) {
  google::cloud::spanner::Database database(project_id, instance_id,
                                            database_id);
  google::spanner::admin::database::v1::CreateDatabaseRequest request;
  request.set_parent(database.instance().FullName());
  request.set_create_statement("CREATE DATABASE `" + database.database_id() +
                               "`");
  request.add_extra_statements(R"""(
      CREATE TABLE Singers (
          SingerId   INT64 NOT NULL,
          FirstName  STRING(1024),
          LastName   STRING(1024),
          SingerInfo BYTES(MAX),
          FullName   STRING(2049)
              AS (ARRAY_TO_STRING([FirstName, LastName], " ")) STORED
      ) PRIMARY KEY (SingerId))""");
  request.add_extra_statements(R"""(
      CREATE TABLE Albums (
          SingerId     INT64 NOT NULL,
          AlbumId      INT64 NOT NULL,
          AlbumTitle   STRING(MAX)
      ) PRIMARY KEY (SingerId, AlbumId),
          INTERLEAVE IN PARENT Singers ON DELETE CASCADE)""");
  auto db = client.CreateDatabase(request).get();
  if (!db) throw std::move(db).status();
  std::cout << "Database " << db->name() << " created.\n";
}

Go

Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。

Spanner に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。 詳細については、ローカル開発環境の認証の設定をご覧ください。

import (
	"context"
	"fmt"
	"io"
	"regexp"

	database "cloud.google.com/go/spanner/admin/database/apiv1"
	adminpb "cloud.google.com/go/spanner/admin/database/apiv1/databasepb"
)

func createDatabase(ctx context.Context, w io.Writer, db string) error {
	matches := regexp.MustCompile("^(.*)/databases/(.*)$").FindStringSubmatch(db)
	if matches == nil || len(matches) != 3 {
		return fmt.Errorf("Invalid database id %s", db)
	}

	adminClient, err := database.NewDatabaseAdminClient(ctx)
	if err != nil {
		return err
	}
	defer adminClient.Close()

	op, err := adminClient.CreateDatabase(ctx, &adminpb.CreateDatabaseRequest{
		Parent:          matches[1],
		CreateStatement: "CREATE DATABASE `" + matches[2] + "`",
		ExtraStatements: []string{
			`CREATE TABLE Singers (
				SingerId   INT64 NOT NULL,
				FirstName  STRING(1024),
				LastName   STRING(1024),
				SingerInfo BYTES(MAX),
				FullName   STRING(2048) AS (
					ARRAY_TO_STRING([FirstName, LastName], " ")
				) STORED
			) PRIMARY KEY (SingerId)`,
			`CREATE TABLE Albums (
				SingerId     INT64 NOT NULL,
				AlbumId      INT64 NOT NULL,
				AlbumTitle   STRING(MAX)
			) PRIMARY KEY (SingerId, AlbumId),
			INTERLEAVE IN PARENT Singers ON DELETE CASCADE`,
		},
	})
	if err != nil {
		return err
	}
	if _, err := op.Wait(ctx); err != nil {
		return err
	}
	fmt.Fprintf(w, "Created database [%s]\n", db)
	return nil
}

Java

Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。

Spanner に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。 詳細については、ローカル開発環境の認証の設定をご覧ください。


import com.google.cloud.spanner.SpannerException;
import com.google.cloud.spanner.SpannerExceptionFactory;
import com.google.cloud.spanner.admin.database.v1.DatabaseAdminClient;
import com.google.common.collect.ImmutableList;
import com.google.spanner.admin.database.v1.CreateDatabaseRequest;
import com.google.spanner.admin.database.v1.Database;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class CreateDatabaseWithDefaultLeaderSample {

  static void createDatabaseWithDefaultLeader() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String instanceName = "projects/my-project/instances/my-instance-id";
    final String databaseId = "my-database-name";
    final String defaultLeader = "my-default-leader";
    createDatabaseWithDefaultLeader(instanceName, databaseId, defaultLeader);
  }

  static void createDatabaseWithDefaultLeader(String instanceName, String databaseId,
      String defaultLeader) throws IOException {
    try (DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.create()) {
      Database createdDatabase =
          databaseAdminClient.createDatabaseAsync(
              CreateDatabaseRequest.newBuilder()
                  .setParent(instanceName)
                  .setCreateStatement("CREATE DATABASE `" + databaseId + "`")
                  .addAllExtraStatements(
                      ImmutableList.of("CREATE TABLE Singers ("
                              + "  SingerId   INT64 NOT NULL,"