분할 지점 만들기 및 관리

이 페이지에서는 데이터베이스에서 분할 지점을 만들고 관리하는 방법을 설명합니다. 예상되는 트래픽 증가에 대비하기 위해 데이터베이스를 사전 분할하는 분할 지점을 만들 수 있습니다. 사전 분할에 관한 자세한 내용은 사전 분할 개요를 참고하세요.

시작하기 전에

  • 분할 지점을 만들고 관리하는 데 필요한 권한을 얻으려면 관리자에게 인스턴스에 대한 Cloud Spanner 데이터베이스 관리자(roles/spanner.databaseAdmin) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

    이 사전 정의된 역할에는 분할 지점을 만들고 관리하는 데 필요한 spanner.databases.addSplitPoints 권한이 포함되어 있습니다.

    커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.

  • 이 페이지의 gcloud CLI 예시에서는 다음 가정이 사용됩니다.

  • 예상되는 트래픽 증가를 지원하기에 충분한 노드가 Spanner 인스턴스에 있는지 확인합니다. 자세한 내용은 사전 분할 개요를 참조하세요.

분할 지점 만들기

Google Cloud CLI 또는 REST API를 사용하여 분할 지점을 만들 수 있습니다.

gcloud

Google Cloud CLI를 사용하여 분할 지점을 만들려면 모든 분할이 포함된 파일을 만들고 gcloud CLI 명령어에 경로를 제공해야 합니다. 파일은 API 요청당 100개 지점의 API 한도를 초과해서는 안 됩니다. 자세한 내용은 할당량 및 한도를 참조하세요.

파일은 다음 형식을 사용하여 분할 지점을 지정해야 합니다.

  ObjectType ObjectName (SplitValue)
  ObjectType ObjectName (SplitValue)
  ObjectType ObjectName (SplitValue)

파일을 만들 때 다음 변수를 바꿉니다.

  • ObjectType: 분할을 추가할 객체 유형입니다. 유효한 값은 TABLE, INDEX입니다.
  • ObjectName: 데이터베이스 테이블 또는 색인의 이름입니다.
  • SplitValue: 분할을 도입할 분할 지점 값입니다.

파일에서 분할 지점 값을 만들 때 다음 규칙을 따르세요.

  • 문자열 값은 작은따옴표로 묶어야 합니다. 예를 들면 'splitKeyPart'입니다.
  • 불리언 값은 true 또는 false여야 합니다.
  • INT64NUMERIC Spanner 데이터 유형 값은 작은따옴표로 묶어야 합니다. 예를 들면 '123' 또는 '99.99'입니다.
  • 다른 모든 숫자 값은 작은따옴표 없이 작성해야 합니다. 예를 들면 1.287입니다.
  • 타임스탬프 값은 작은따옴표로 묶인 '2020-06-18T17:24:53Z' 형식으로 제공해야 합니다.
  • 분할 값은 괄호로 묶어야 합니다.
  • 분할 키 값 순서는 기본 키 순서와 동일해야 합니다.
  • 분할 값에 쉼표가 있어야 하는 경우 `\` 문자를 사용하여 쉼표를 이스케이프 처리해야 합니다.
  • 색인을 분할하는 경우 색인 키 또는 전체 색인과 전체 테이블 키를 제공할 수 있습니다.
  • 분할 지점을 지정할 때는 항상 전체 키를 사용해야 합니다.

다음은 분할 지점이 지정되는 방식을 보여주는 샘플 파일입니다.

  TABLE Singers ('c32ca57a-786c-2268-09d4-95182a9930be')
  TABLE Singers ('bb98c7e2-8240-b780-346d-c5d63886594a')
  INDEX Order ('5b8bac71-0cb2-95e9-e1b0-89a027525460')
  TABLE Payment ('6cf41f21-2d77-318f-c504-816f0068db8b')
  INDEX Indx_A (2152120141932780000)
  TABLE TableD  (0,'7ef9d̦b22-d0e5-6041-8937-4bc6a7ef9db2')
  INDEX IndexXYZ ('8762203435012030000',NULL,NULL)
  INDEX IndexABC  (0, '2020-06-18T17:24:53Z', '2020-06-18T17:24:53Z') TableKey
  (123,'ab\,c')

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • SPLITS_FILE: 분할 파일의 경로입니다.
  • INSTANCE_ID: 인스턴스 ID
  • DATABASE_ID: 데이터베이스 ID
  • EXPIRATION_DATE: (선택사항) 분할 지점의 만료일입니다. '2020-06-18T17:24:53Z' 형식의 타임스탬프를 허용합니다.
  • INITIATOR: (선택사항) 분할 지점의 개시자입니다.

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud spanner databases splits add DATABASE_ID \
--splits-file=SPLITS_FILE \
--instance=INSTANCE_ID\
--split-expiration-date=EXPIRATION_DATE\
--initiator=INITIATOR\

Windows(PowerShell)

gcloud spanner databases splits add DATABASE_ID `
--splits-file=SPLITS_FILE `
--instance=INSTANCE_ID`
--split-expiration-date=EXPIRATION_DATE`
--initiator=INITIATOR`

Windows(cmd.exe)

gcloud spanner databases splits add DATABASE_ID ^
--splits-file=SPLITS_FILE ^
--instance=INSTANCE_ID^
--split-expiration-date=EXPIRATION_DATE^
--initiator=INITIATOR^

REST v1

projects.instances.databases.addSplitPoints 메서드를 사용하여 분할 지점을 만들 수 있습니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID
  • INSTANCE_ID: 인스턴스 ID
  • DATABASE_ID: 데이터베이스 ID

HTTP 메서드 및 URL:

POST https://spanner.googleapis.com/v1/projects//instances//databases/:addSplitPoints

JSON 요청 본문:

{
  "split_points": [
    {
      "table": "T1",
      "index": "T1_IDX",
      "expire_time": "2023-04-22T10:00:20.021Z",
      "keys": [
        {
          "key_parts": {
            "values": [
              3
            ]
          }
        },
        {
          "key_parts": {
            "values": [
              10
            ]
          }
        }
      ]
    },
    {
      "table": "T2",
      "expire_time": "2023-04-22T10:00:20.021Z",
      "keys": [
        {
          "key_parts": {
            "values": [
              50
            ]
          }
        }
      ]
    }
  ]
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

성공 상태 코드(2xx)와 빈 응답을 받게 됩니다.

클라이언트 라이브러리

Go


import (
	"context"
	"fmt"
	"io"

	database "cloud.google.com/go/spanner/admin/database/apiv1"
	"cloud.google.com/go/spanner/admin/database/apiv1/databasepb"
	adminpb "cloud.google.com/go/spanner/admin/database/apiv1/databasepb"
	"google.golang.org/protobuf/types/known/structpb"
)

// Adds split points to table and index
// AddSplitPoins API - https://pkg.go.dev/cloud.google.com/go/spanner/admin/database/apiv1#DatabaseAdminClient.AddSplitPoints
func addSplitpoints(w io.Writer, dbName string) error {
	ctx := context.Background()

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

	// Database is assumed to exist - https://cloud.google.com/spanner/docs/getting-started/go#create_a_database
	// Singers table is assumed to be present
	ddl := []string{
		"CREATE INDEX IF NOT EXISTS SingersByFirstLastName ON Singers(FirstName, LastName)",
	}
	op, err := dbAdminClient.UpdateDatabaseDdl(ctx, &adminpb.UpdateDatabaseDdlRequest{
		Database:   dbName,
		Statements: ddl,
	})

	if err != nil {
		return fmt.Errorf("addSplitPoints: waiting for UpdateDatabaseDdlRequest failed: %w", err)
	}

	// Wait for the UpdateDatabaseDdl operation to finish.
	if err := op.Wait(ctx); err != nil {
		return fmt.Errorf("addSplitPoints: waiting for UpdateDatabaseDdlRequest to finish failed: %w", err)
	}
	fmt.Fprintf(w, "Added indexes for Split testing\n")

	splitTableKey := databasepb.SplitPoints_Key{
		KeyParts: &structpb.ListValue{
			Values: []*structpb.Value{
				structpb.NewStringValue("42"),
			},
		},
	}

	splitForTable := databasepb.SplitPoints{
		Table: "Singers",
		Keys:  []*databasepb.SplitPoints_Key{&splitTableKey},
	}

	splitIndexKey := databasepb.SplitPoints_Key{
		KeyParts: &structpb.ListValue{
			Values: []*structpb.Value{
				structpb.NewStringValue("John"),
				structpb.NewStringValue("Doe"),
			},
		},
	}

	splitForindex := databasepb.SplitPoints{
		Index: "SingersByFirstLastName",
		Keys:  []*databasepb.SplitPoints_Key{&splitIndexKey},
	}

	splitIndexKeyWithTableKeyPart := databasepb.SplitPoints_Key{
		KeyParts: &structpb.ListValue{
			Values: []*structpb.Value{
				structpb.NewStringValue("38"),
			},
		},
	}

	splitIndexKeyWithIndexKeyPart := databasepb.SplitPoints_Key{
		KeyParts: &structpb.ListValue{
			Values: []*structpb.Value{
				structpb.NewStringValue("Jane"),
				structpb.NewStringValue("Doe"),
			},
		},
	}

	// the index key part is first and table keypart is second in the split definition
	splitForindexWithTableKey := databasepb.SplitPoints{
		Index: "SingersByFirstLastName",
		Keys:  []*databasepb.SplitPoints_Key{&splitIndexKeyWithIndexKeyPart, &splitIndexKeyWithTableKeyPart},
	}

	// Add split points to table and index
	req := databasepb.AddSplitPointsRequest{
		Database:    dbName,
		SplitPoints: []*databasepb.SplitPoints{&splitForTable, &splitForindex, &splitForindexWithTableKey},
	}

	res, err := dbAdminClient.AddSplitPoints(ctx, &req)
	if err != nil {
		return fmt.Errorf("addSplitpoints: failed to add split points: %w", err)
	}

	fmt.Fprintf(w, "Added split points %s", res)
	return nil
}

Java


import com.google.cloud.spanner.Spanner;
import com.google.cloud.spanner.SpannerException;
import com.google.cloud.spanner.SpannerOptions;
import com.google.cloud.spanner.admin.database.v1.DatabaseAdminClient;
import com.google.protobuf.ListValue;
import com.google.protobuf.Value;
import com.google.spanner.admin.database.v1.DatabaseName;
import com.google.spanner.admin.database.v1.SplitPoints;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class DatabaseAddSplitPointsSample {

  /***
   * Assume DDL for the underlying database:
   * <pre>{@code
   * CREATE TABLE Singers (
   * SingerId INT64 NOT NULL,
   * FirstName STRING(1024),
   * LastName STRING(1024),
   *  SingerInfo BYTES(MAX),
   * ) PRIMARY KEY(SingerId);
   *
   *
   * CREATE INDEX SingersByFirstLastName ON Singers(FirstName, LastName);
   * }</pre>
   */

  static void addSplitPoints() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "my-project";
    String instanceId = "my-instance";
    String databaseId = "my-database";
    addSplitPoints(projectId, instanceId, databaseId);
  }

  static void addSplitPoints(String projectId, String instanceId, String databaseId)
      throws IOException {
    try (Spanner spanner =
            SpannerOptions.newBuilder().setProjectId(projectId).build().getService();
        DatabaseAdminClient databaseAdminClient = spanner.createDatabaseAdminClient()) {
      List<com.google.spanner.admin.database.v1.SplitPoints> splitPoints = new ArrayList<>();

      // table key
      com.google.spanner.admin.database.v1.SplitPoints splitPointForTable =
          SplitPoints.newBuilder()
              .setTable("Singers")
              .setKeys(
                  0,
                  com.google.spanner.admin.database.v1.SplitPoints.Key.newBuilder()
                      .setKeyParts(
                          ListValue.newBuilder()
                              .addValues(Value.newBuilder().setStringValue("42").build())
                              .build()))
              .build();

      // index key without table key part
      com.google.spanner.admin.database.v1.SplitPoints splitPointForIndex =
          SplitPoints.newBuilder()
              .setIndex("SingersByFirstLastName")
              .setKeys(
                  0,
                  com.google.spanner.admin.database.v1.SplitPoints.Key.newBuilder()
                      .setKeyParts(
                          ListValue.newBuilder()
                              .addValues(Value.newBuilder().setStringValue("John").build())
                              .addValues(Value.newBuilder().setStringValue("Doe").build())
                              .build()))
              .build();

      // index key with table key part, first key is the index key and second is the table key
      com.google.spanner.admin.database.v1.SplitPoints splitPointForIndexWitTableKey =
          SplitPoints.newBuilder()
              .setIndex("SingersByFirstLastName")
              .setKeys(
                  0,
                  com.google.spanner.admin.database.v1.SplitPoints.Key.newBuilder()
                      .setKeyParts(
                          ListValue.newBuilder()
                              .addValues(Value.newBuilder().setStringValue("Jane").build())
                              .addValues(Value.newBuilder().setStringValue("Doe").build())
                              .build()))
              .setKeys(
                  1,
                  com.google.spanner.admin.database.v1.SplitPoints.Key.newBuilder()
                      .setKeyParts(
                          ListValue.newBuilder()
                              .addValues(Value.newBuilder().setStringValue("38").build())
                              .build()))
              .build();

      splitPoints.add(splitPointForTable);
      splitPoints.add(splitPointForIndex);
      splitPoints.add(splitPointForIndexWitTableKey);
      databaseAdminClient.addSplitPoints(
          DatabaseName.of(projectId, instanceId, databaseId), splitPoints);

    } catch (Exception e) {
      // If the operation failed during execution, expose the cause.
      throw (SpannerException) e.getCause();
    }
  }
}

Node.js

// Import the Google Cloud client library for Spanner.
const {Spanner} = require('@google-cloud/spanner');

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const projectId = 'my-project-id';
// const instanceId = 'my-instance-id';
// const databaseId = 'my-database-id';

// Create a Spanner database admin client.
const spanner = new Spanner({projectId});
const databaseAdminClient = spanner.getDatabaseAdminClient();

try {
  // Add split points to table and index
  // first is a table level split that takes table primary key value
  // second is index level split with index key parts
  // third is index level split having index key part and table key part
  // Assume the following table and index structure
  // CREATE TABLE Singers (
  // SingerId INT64 NOT NULL,
  // FirstName STRING(1024),
  // LastName STRING(1024),
  // SingerInfo BYTES(MAX),
  // ) PRIMARY KEY(SingerId);
  //
  // CREATE INDEX SingersByFirstLastName ON Singers(FirstName, LastName);
  const request = [
    'CREATE INDEX IF NOT EXISTS SingersByFirstLastName ON Singers(FirstName, LastName)',
  ];

  const [operation] = await databaseAdminClient.updateDatabaseDdl({
    database: databaseAdminClient.databasePath(
      projectId,
      instanceId,
      databaseId,
    ),
    statements: request,
  });

  console.log('Waiting for operation to complete...');
  await operation.promise();

  console.log('Added the SingersByFirstLastName index.');

  databaseAdminClient.addSplitPoints({
    database: databaseAdminClient.databasePath(
      projectId,
      instanceId,
      databaseId,
    ),
    splitPoints: [
      {
        table: 'Singers',
        keys: [{keyParts: {values: [{stringValue: '42'}]}}],
      },
      {
        index: 'SingersByFirstLastName',
        keys: [
          {
            keyParts: {
              values: [{stringValue: 'John'}, {stringValue: 'Doe'}],
            },
          },
        ],
      },
      {
        index: 'SingersByFirstLastName',
        keys: [
          {
            keyParts: {
              values: [{stringValue: 'Jane'}, {stringValue: 'Doe'}],
            },
          },
          {keyParts: {values: [{stringValue: '38'}]}},
        ],
      },
    ],
  });
  console.log('Added Split Points');
} catch (err) {
  console.error('ERROR:', err);
}

Python

def add_split_points(instance_id, database_id):
    """Adds split points to table and index."""

    from google.cloud.spanner_admin_database_v1.types import spanner_database_admin

    spanner_client = spanner.Client()
    database_admin_api = spanner_client.database_admin_api

    request = spanner_database_admin.UpdateDatabaseDdlRequest(
        database=database_admin_api.database_path(
            spanner_client.project, instance_id, database_id
        ),
        statements=["CREATE INDEX IF NOT EXISTS SingersByFirstLastName ON Singers(FirstName, LastName)"],
    )

    operation = database_admin_api.update_database_ddl(request)

    print("Waiting for operation to complete...")
    operation.result(OPERATION_TIMEOUT_SECONDS)

    print("Added the SingersByFirstLastName index.")

    addSplitPointRequest = spanner_database_admin.AddSplitPointsRequest(
        database=database_admin_api.database_path(
            spanner_client.project, instance_id, database_id
        ),
        # Table split
        # Index split without table key part
        # Index split with table key part: first key is the index key and second the table key
        split_points=[
            spanner_database_admin.SplitPoints(
                table="Singers",
                keys=[
                    spanner_database_admin.SplitPoints.Key(
                        key_parts=struct_pb2.ListValue(
                            values=[struct_pb2.Value(string_value="42")]
                        )
                    )
                ],
            ),
            spanner_database_admin.SplitPoints(
                index="SingersByFirstLastName",
                keys=[
                    spanner_database_admin.SplitPoints.Key(
                        key_parts=struct_pb2.ListValue(
                            values=[
                                struct_pb2.Value(string_value="John"),
                                struct_pb2.Value(string_value="Doe"),
                            ]
                        )
                    )
                ],
            ),
            spanner_database_admin.SplitPoints(
                index="SingersByFirstLastName",
                keys=[
                    spanner_database_admin.SplitPoints.Key(
                        key_parts=struct_pb2.ListValue(
                            values=[
                                struct_pb2.Value(string_value="Jane"),
                                struct_pb2.Value(string_value="Doe"),
                            ]
                        )
                    ),
                    spanner_database_admin.SplitPoints.Key(
                        key_parts=struct_pb2.ListValue(
                            values=[struct_pb2.Value(string_value="38")]
                        )
                    ),

                ],
            ),
        ],
    )

    operation = database_admin_api.add_split_points(addSplitPointRequest)

    print("Added split points.")

발생 가능한 오류 시나리오

다음 시나리오에서는 분할 지점을 만들 때 오류가 발생할 수 있습니다.

  • 색인 수준 분할의 입력에 잘못된 테이블 이름이 있습니다.
  • 테이블 수준 분할 지점에 2개 이상의 키가 있습니다.
  • 색인 수준 분할 지점에 3개 이상의 키가 있습니다.
  • 분할 지점은 데이터베이스 스키마에 정의되지 않은 테이블 또는 색인에 정의됩니다.
  • 요청에 중복 분할 지점이 포함되어 있습니다.

할당량 및 한도에 대한 자세한 내용은 할당량 및 한도를 참조하세요.

분할 지점 보기

Google Cloud 콘솔 또는 gcloud CLI를 사용하여 데이터베이스에서 생성된 모든 분할 지점을 볼 수 있습니다.

콘솔

Google Cloud 콘솔에서 SPANNER_SYS.USER_SPLIT_POINTS 뷰를 쿼리하여 분할 지점 수를 가져오려면 다음 단계를 따르세요.

  1. Spanner 인스턴스 페이지를 엽니다.

    Spanner 인스턴스로 이동

  2. Spanner 인스턴스의 이름과 쿼리할 데이터베이스를 선택합니다.

  3. 왼쪽 탐색 패널에서 Spanner 스튜디오를 클릭합니다.

  4. 텍스트 필드에 다음 쿼리를 입력합니다.

        SELECT * FROM SPANNER_SYS.USER_SPLIT_POINTS
    
  5. 쿼리 실행을 클릭합니다.

다음과 유사한 결과가 표시됩니다.

TABLE_NAME INDEX_NAME INITIATOR SPLIT_KEY EXPIRE_TIME
T CloudAddSplitPointsAPI T(90,153,4,2024-04-30T17:00:00-07:00,1,2024-05-01,a) 2025-03-06T09:58:58.007201Z
T T_IDX CloudAddSplitPointsAPI 색인: T의 T_IDX, 색인 키: (10), 기본 테이블 키: (<begin>,<begin>,<begin>,<begin>,<begin>,<begin>,<begin>) 2025-03-08T07:33:23.861682Z
T T_IDX CloudAddSplitPointsAPI 색인: T의 T_IDX, 색인 키: (9091), 기본 테이블 키: (4567,123,4.2,2024-04-30T17:00:00-07:00,1,2024-05-01,a) 2025-03-08T07:35:25.990007Z

gcloud

다음 gcloud CLI 명령어를 실행하여 데이터베이스의 분할 지점을 확인합니다.

  gcloud spanner databases splits list DATABASE_ID \
  --instance INSTANCE_ID

이 명령어를 실행할 때 다음 변수를 바꿉니다.

  • INSTANCE_ID: Spanner 인스턴스 ID입니다.
  • DATABASE_ID: Spanner 데이터베이스 ID입니다.

다음과 유사한 응답이 표시됩니다.

  TABLE_NAME: T
  INDEX_NAME:
  INITIATOR: CloudAddSplitPointsAPI
  SPLIT_KEY: T(90,153,4,2024-04-30T17:00:00-07:00,1,2024-05-01,a)
  EXPIRE_TIME: 2025-03-06T09:58:58.007201Z

  TABLE_NAME: T
  INDEX_NAME: T_IDX
  INITIATOR: CloudAddSplitPointsAPI
  SPLIT_KEY: Index: T_IDX on T, Index Key: (10), Primary Table Key: (<begin>,<begin>,<begin>,<begin>,<begin>,<begin>,<begin>)
  EXPIRE_TIME: 2025-03-08T07:33:23.861682Z

  TABLE_NAME: T
  INDEX_NAME: T_IDX
  INITIATOR: CloudAddSplitPointsAPI
  SPLIT_KEY: Index: T_IDX on T, Index Key: (9091), Primary Table Key: (4567,123,4.2,2024-04-30T17:00:00-07:00,1,2024-05-01,a)
  EXPIRE_TIME: 2025-03-08T07:35:25.990007Z

분할 지점을 만료하는 방법

만드는 각 분할 지점에 만료 시간을 설정할 수 있습니다. 자세한 내용은 분할 지점 만료를 참고하세요. Google Cloud CLI 또는 REST API를 사용하여 분할 지점을 만료할 수 있습니다.

gcloud

Google Cloud CLI에서 분할 지점을 만료하려면 만료하려는 모든 분할이 포함된 파일을 만들고 gcloud CLI 명령어에서 splits-file 파라미터를 사용하여 경로를 제공해야 합니다. 파일은 API 요청당 100개 지점의 API 한도를 초과해서는 안 됩니다. 자세한 내용은 할당량 및 한도를 참조하세요.

파일은 다음 형식을 사용하여 분할 지점을 지정해야 합니다.

  ObjectType ObjectName (SplitValue)
  ObjectType ObjectName (SplitValue)
  ObjectType ObjectName (SplitValue)

파일을 만들 때 다음 변수를 바꿉니다.

  • ObjectType: 만료하려는 분할의 객체 유형입니다. 유효한 값은 TABLE, INDEX입니다.
  • ObjectName: 데이터베이스 테이블 또는 색인의 이름입니다.
  • SplitValue: 만료하려는 분할 지점 값입니다.

파일에서 분할 지점 값을 만들 때 다음 규칙을 따르세요.

  • 문자열 값은 작은따옴표로 묶어야 합니다. 예를 들면 'splitKeyPart'입니다.
  • 불리언 값은 true 또는 false일 수 있습니다.
  • INT64NUMERIC Spanner 데이터 유형 값은 작은따옴표로 묶어야 합니다. 예를 들면 '123' 또는 '99.99'입니다.
  • 다른 모든 숫자 값은 작은따옴표 없이 작성해야 합니다. 예를 들면 1.287입니다.
  • 타임스탬프 값은 작은따옴표로 묶인 '2020-06-18T17:24:53Z' 형식으로 제공해야 합니다.
  • 분할 값은 괄호로 묶어야 합니다.
  • 분할 키 값 순서는 기본 키 순서와 동일해야 합니다.
  • 분할 값에 쉼표가 있어야 하는 경우 `\` 문자를 사용하여 쉼표를 이스케이프 처리해야 합니다.
  • 색인을 분할하는 경우 색인 키 또는 전체 색인과 전체 테이블 키를 제공할 수 있습니다.
  • 분할 지점을 지정할 때는 항상 전체 키를 사용해야 합니다.

다음은 분할 지점이 지정되는 방식을 보여주는 샘플 파일입니다.

  TABLE Singers ('c32ca57a-786c-2268-09d4-95182a9930be')
  TABLE Singers ('bb98c7e2-8240-b780-346d-c5d63886594a')
  INDEX Order ('5b8bac71-0cb2-95e9-e1b0-89a027525460')
  TABLE Payment ('6cf41f21-2d77-318f-c504-816f0068db8b')
  INDEX Indx_A (2152120141932780000)
  TABLE TableD  (0,'7ef9db22-d0e5-6041-8937-4bc6a7ef9db2')
  INDEX IndexXYZ ('8762203435012030000',NULL,NULL)
  INDEX IndexABC  (0, '2020-06-18T17:24:53Z', '2020-06-18T17:24:53Z') TableKey
  (123,'ab\,c')

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • SPLITS_FILE: 분할 파일의 경로입니다.
  • INSTANCE_ID: 인스턴스 ID
  • DATABASE_ID: 데이터베이스 ID
  • EXPIRATION_DATE: (선택사항) 분할 지점의 만료일입니다. '2020-06-18T17:24:53Z' 형식의 타임스탬프를 허용합니다.
  • INITIATOR: (선택사항) 분할 지점의 개시자입니다.

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud spanner databases splits add DATABASE_ID \
--splits-file=SPLITS_FILE \
--instance=INSTANCE_ID\
--split-expiration-date=EXPIRATION_DATE\
--initiator=INITIATOR\

Windows(PowerShell)

gcloud spanner databases splits add DATABASE_ID `
--splits-file=SPLITS_FILE `
--instance=INSTANCE_ID`
--split-expiration-date=EXPIRATION_DATE`
--initiator=INITIATOR`

Windows(cmd.exe)

gcloud spanner databases splits add DATABASE_ID ^
--splits-file=SPLITS_FILE ^
--instance=INSTANCE_ID^
--split-expiration-date=EXPIRATION_DATE^
--initiator=INITIATOR^

REST v1

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID
  • INSTANCE_ID: 인스턴스 ID
  • DATABASE_ID: 데이터베이스 ID

HTTP 메서드 및 URL:

POST https://spanner.googleapis.com/v1/projects//instances//databases/:addSplitPoints

JSON 요청 본문:

{
  "split_points": [
    {
      "table": "T1",
      "index": "T1_IDX",
      "expire_time": "2023-04-22T10:00:20.021Z",
      "keys": [
        {
          "key_parts": {
            "values": [
              3
            ]
          }
        },
        {
          "key_parts": {
            "values": [
              10
            ]
          }
        }
      ]
    },
    {
      "table": "T2",
      "expire_time": "2023-04-22T10:00:20.021Z",
      "keys": [
        {
          "key_parts": {
            "values": [
              50
            ]
          }
        }
      ]
    }
  ]
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

성공 상태 코드(2xx)와 빈 응답을 받게 됩니다.

다음 단계