데이터베이스 생성 및 관리

이 페이지에서는 Spanner 데이터베이스를 만들고 관리하는 방법을 설명합니다.

  • 데이터베이스를 만드는 다양한 방법
  • 데이터베이스 옵션 수정
  • 데이터베이스 삭제

이 페이지에는 GoogleSQL 언어 데이터베이스와 PostgreSQL 언어 데이터베이스에 대한 정보가 모두 있습니다. 데이터베이스 스키마를 업데이트하는 방법을 알아보려면 스키마 업데이트를 참조하세요. 인스턴스를 만드는 방법에 대한 자세한 내용은 인스턴스 만들기 및 관리를 참조하세요. 다음 방법으로 기존 인스턴스에 데이터베이스를 만들 수 있습니다.

  • 데이터베이스 만들기: SQL 언어를 선택하고 스키마를 정의하여 새 데이터베이스를 만들 수 있습니다.
  • 자체 데이터 가져오기: CSV, MySQL 덤프 또는 PostgreSQL 덤프 파일을 새로운 데이터베이스나 기존 데이터베이스로 가져올 수 있습니다.
  • 샘플 데이터로 데이터베이스 만들기: 사용 가능한 샘플 데이터 세트 중 하나를 사용하여 데이터베이스를 채워 Spanner 기능을 사용해 볼 수 있습니다.

데이터베이스 만들기

기존 인스턴스에 새 데이터베이스를 만들 수 있습니다. GoogleSQL 언어 데이터베이스의 경우 데이터베이스를 만들 때 또는 데이터베이스를 만든 후에 데이터베이스 스키마를 정의할 수 있습니다. PostgreSQL 언어 데이터베이스의 경우에는 만든 후에 스키마를 정의해야 합니다.

스키마는 GoogleSQLPostgreSQL에 문서화된 데이터베이스 정의 언어를 통해 정의됩니다. 스키마 생성 및 업데이트에 대한 자세한 내용은 다음 링크를 참조하세요.

데이터베이스를 만든 후 데이터베이스 삭제 방지를 사용 설정하여 애플리케이션과 서비스에 중요한 데이터베이스를 보호할 수 있습니다. 자세한 내용은 실수로 인한 데이터베이스 삭제 방지를 참조하세요.

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 또는 데이터베이스의 정규화된 식별자. 정규화된 식별자를 지정하는 경우 --instance 플래그를 생략할 수 있습니다.
--instance=INSTANCE
데이터베이스의 Cloud 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 또는 키의 정규화된 식별자입니다.

이 그룹의 다른 인수가 지정된 경우 이 플래그를 지정해야 합니다. 정규화된 식별자가 제공되면 다른 인수를 생략할 수 있습니다.

--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,"
                              + "  FirstName  STRING(1024),"