Membuat dan mengelola titik pemisahan

Halaman ini menjelaskan cara membuat dan mengelola titik pemisahan di database Anda. Anda dapat membuat titik pemisahan untuk memisahkan database terlebih dahulu guna membantu mempersiapkan peningkatan traffic yang diperkirakan. Untuk mengetahui informasi selengkapnya tentang pra-pemisahan, lihat Ringkasan pra-pemisahan.

Sebelum memulai

  • Untuk mendapatkan izin yang diperlukan untuk membuat dan mengelola titik pemisahan, minta administrator untuk memberi Anda peran IAM Cloud Spanner Database Admin (roles/spanner.databaseAdmin) di instance Anda. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

    Peran bawaan ini berisi izin spanner.databases.addSplitPoints, yang diperlukan untuk membuat dan mengelola titik pemisahan.

    Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

  • Contoh Google Cloud CLI di halaman ini membuat asumsi berikut:

  • Pastikan instance Spanner Anda memiliki cukup node untuk mendukung antisipasi peningkatan traffic. Untuk mengetahui informasi selengkapnya, lihat Ringkasan pra-pemisahan.

Membuat titik pemisahan

Anda dapat membuat titik pemisahan menggunakan gcloud CLI atau REST API.

gcloud

Jika ingin membuat titik pemisahan menggunakan gcloud CLI, Anda harus membuat file yang berisi semua pemisahan dan menyediakan jalur dalam perintah gcloud CLI. File tidak boleh melebihi batas API, yaitu 100 titik per permintaan API. Untuk mengetahui informasi selengkapnya, baca Kuota dan batas.

File harus menggunakan format berikut untuk menentukan titik pemisahan:

  ObjectType ObjectName (SplitValue1, SplitValue2, ...)
  ObjectType ObjectName (IndexSplitValue1, ...) TableKey (TableSplitValue1, ...)

Ganti variabel berikut saat membuat file:

  • ObjectType: jenis objek yang ingin Anda tambahkan pemisahan. Nilai yang valid adalah TABLE dan INDEX.
  • ObjectName: nama tabel atau indeks database.
  • SplitValue1..N: nilai kunci titik pemisahan tempat Anda ingin memperkenalkan pemisahan.
  • IndexSplitValue1..N: nilai kunci indeks untuk titik pemisahan indeks.
  • TableSplitValue1..N: nilai kunci tabel untuk titik pemisahan indeks.

Gunakan aturan berikut saat membuat nilai titik pemisahan dalam file:

  • Nilai string harus berada dalam tanda kutip tunggal. Contoh, 'splitKeyPart'
  • Nilai boolean harus berupa true atau false.
  • Nilai jenis data Spanner INT64 dan NUMERIC harus berada dalam tanda kutip tunggal. Misalnya, '123' atau '99.99'.
  • Semua nilai angka lainnya harus ditulis tanpa tanda petik tunggal. Misalnya, 1.287.
  • Nilai stempel waktu harus diberikan dalam format '2020-06-18T17:24:53Z' dalam tanda kutip tunggal.
  • Nilai pemisahan harus diapit tanda kurung.
  • Urutan nilai kunci pemisahan harus sama dengan urutan kunci utama.
  • Jika nilai pemisahan harus memiliki koma, Anda harus meng-escape koma menggunakan karakter `\`.
  • Untuk memisahkan indeks, Anda dapat memberikan kunci indeks atau seluruh indeks dan kunci tabel lengkap.
  • Anda harus selalu menggunakan kunci lengkap saat menentukan titik pemisahan.

Berikut adalah contoh file yang menunjukkan cara menentukan titik pemisahan:

  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')

Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

  • SPLITS_FILE: jalur ke file pemisahan.
  • INSTANCE_ID: ID instance.
  • DATABASE_ID: ID database.
  • EXPIRATION_DATE: (opsional) tanggal habis masa berlaku poin terpisah. Menerima stempel waktu dalam format '2020-06-18T17:24:53Z'.
  • INITIATOR: (opsional) inisiator titik pemisahan.

Jalankan perintah berikut:

Linux, macOS, atau 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

Anda dapat menggunakan metode projects.instances.databases.addSplitPoints untuk membuat titik pemisahan.

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • PROJECT_ID: project ID.
  • INSTANCE_ID: ID instance.
  • DATABASE_ID: ID database.

Metode HTTP dan URL:

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

Meminta isi 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
            ]
          }
        }
      ]
    }
  ]
}

Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

Anda akan menerima kode status berhasil (2xx) dan respons kosong.

Library klien

Go


import (
	"context"
	"fmt"
	"io"
	"time"

	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"
	"google.golang.org/protobuf/types/known/timestamppb"
)

// 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},
	}

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

	splitForTableWithExpire := databasepb.SplitPoints{
		Table: "Singers",
		Keys:  []*databasepb.SplitPoints_Key{&splitTableKeyWithExpire},
		// A timestamp in the past means immediate expiration.
		// The maximum value can be 30 days in the future.
		// Defaults to 10 days in the future if not specified.
		//
		// Setting the expiration time to next day
		ExpireTime: timestamppb.New(time.Now().Add(24 * time.Hour)),
	}

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

	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")
              .addKeys(
                  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")
              .addKeys(
                  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")
              .addKeys(
                  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()))
              .addKeys(
                  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.")

Kemungkinan skenario error

Skenario berikut dapat menyebabkan error saat membuat titik pemisahan:

  • Pemisahan tingkat indeks memiliki nama tabel yang salah dalam input.
  • Titik pemisahan tingkat tabel memiliki lebih dari satu kunci.
  • Titik pemisahan tingkat indeks memiliki lebih dari dua kunci.
  • Titik pemisahan ditentukan pada tabel atau indeks yang tidak ditentukan dalam skema database.
  • Permintaan berisi titik pemisahan duplikat.

Untuk mengetahui informasi tentang kuota dan batas, lihat Kuota dan batas.

Melihat titik pemisahan

Anda dapat melihat semua titik pemisahan yang dibuat di database menggunakan konsolGoogle Cloud atau gcloud CLI:

Konsol

Untuk mendapatkan jumlah titik pemisahan dengan mengkueri tampilan SPANNER_SYS.USER_SPLIT_POINTS di konsol Google Cloud , lakukan hal berikut:

  1. Buka halaman instance Spanner.

    Buka instance Spanner

  2. Pilih nama instance Spanner dan database yang ingin Anda buat kuerinya.

  3. Klik Spanner Studio di panel navigasi kiri.

  4. Ketik kueri berikut di kolom teks:

        SELECT * FROM SPANNER_SYS.USER_SPLIT_POINTS
    
  5. Klik Run query.

Hasil yang mirip dengan berikut ini akan muncul:

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 Index: T_IDX on T, Index Key: (10), Primary Table Key: (<begin>,<begin>,<begin>,<begin>,<begin>,<begin>,<begin>) 2025-03-08T07:33:23.861682Z
T T_IDX CloudAddSplitPointsAPI 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) 2025-03-08T07:35:25.990007Z

gcloud

Jalankan perintah gcloud CLI berikut untuk melihat titik pemisahan di database Anda:

  gcloud spanner databases splits list DATABASE_ID \
  --instance INSTANCE_ID

Ganti variabel berikut saat menjalankan perintah ini:

  • INSTANCE_ID: ID instance Spanner.
  • DATABASE_ID: ID database Spanner.

Respons yang mirip dengan berikut ini akan muncul:

  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

Cara mengakhiri masa berlaku titik pemisahan

Anda dapat menetapkan waktu habis masa berlaku untuk setiap titik pemisahan yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Masa berlaku titik pemisahan. Anda dapat mengakhiri masa berlaku titik pemisahan menggunakan gcloud CLI atau REST API.

gcloud

Jika ingin mengakhiri masa berlaku titik pemisahan gcloud CLI, Anda harus membuat file yang berisi semua pemisahan yang ingin diakhiri masa berlakunya dan menyediakan jalurnya menggunakan parameter splits-file dalam perintah gcloud CLI. File tidak boleh melebihi batas API, yaitu 100 titik per permintaan API. Untuk mengetahui informasi selengkapnya, lihat Kuota dan batas.

File harus menggunakan format berikut untuk menentukan titik pemisahan:

  ObjectType ObjectName (SplitValue1, SplitValue2, ...)
  ObjectType ObjectName (IndexSplitValue1, ...) TableKey (TableSplitValue1, ...)

Ganti variabel berikut saat membuat file:

  • ObjectType: jenis objek pemisahan yang ingin Anda hentikan masa berlakunya. Nilai yang valid adalah TABLE dan INDEX.
  • ObjectName: nama tabel atau indeks database.
  • SplitValue1..N: nilai kunci titik pemisahan yang ingin Anda hentikan masa berlakunya.
  • IndexSplitValue1..N: nilai kunci indeks untuk titik pemisahan indeks.
  • TableSplitValue1..N: nilai kunci tabel untuk titik pemisahan indeks.

Gunakan aturan berikut saat membuat nilai titik pemisahan dalam file:

  • Nilai string harus berada dalam tanda kutip tunggal. Contoh, 'splitKeyPart'
  • Nilai boolean dapat berupa true atau false.
  • Nilai jenis data Spanner INT64 dan NUMERIC harus berada dalam tanda kutip tunggal. Misalnya, '123' atau '99.99'.
  • Semua nilai angka lainnya harus ditulis tanpa tanda petik tunggal. Misalnya, 1.287.
  • Nilai stempel waktu harus diberikan dalam format '2020-06-18T17:24:53Z' dalam tanda kutip tunggal.
  • Nilai pemisahan harus diapit tanda kurung.
  • Urutan nilai kunci pemisahan harus sama dengan urutan kunci utama.
  • Jika nilai pemisahan harus memiliki koma, Anda harus meng-escape koma menggunakan karakter `\`.
  • Untuk memisahkan indeks, Anda dapat memberikan kunci indeks atau seluruh indeks dan kunci tabel lengkap.
  • Anda harus selalu menggunakan kunci lengkap saat menentukan titik pemisahan.

Berikut adalah contoh file yang menunjukkan cara menentukan titik pemisahan:

  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')

Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

  • SPLITS_FILE: jalur ke file pemisahan.
  • INSTANCE_ID: ID instance.
  • DATABASE_ID: ID database.
  • EXPIRATION_DATE: (opsional) tanggal habis masa berlaku poin terpisah. Menerima stempel waktu dalam format '2020-06-18T17:24:53Z'.
  • INITIATOR: (opsional) inisiator titik pemisahan.

Jalankan perintah berikut:

Linux, macOS, atau 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

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • PROJECT_ID: project ID.
  • INSTANCE_ID: ID instance.
  • DATABASE_ID: ID database.

Metode HTTP dan URL:

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

Meminta isi 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
            ]
          }
        }
      ]
    }
  ]
}

Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

Anda akan menerima kode status berhasil (2xx) dan respons kosong.

Apa langkah selanjutnya?