All Products
Search
Document Center

PolarDB:Penggunaan

Last Updated:Aug 27, 2026

Fitur PolarDB for MySQL Multi-master Cluster (Limitless) mengubah arsitektur klaster dari single-writer, multi-reader menjadi multi-writer, multi-reader. Fitur ini memungkinkan penulisan data secara konkuren ke database atau objek data yang berbeda pada node komputasi yang berbeda, serta mendukung penjadwalan dinamis database dan objek data di seluruh node dengan pergantian yang selesai dalam hitungan detik, sehingga secara signifikan meningkatkan kemampuan baca-tulis konkuren keseluruhan klaster. Objek data mencakup tabel, view, trigger, event, stored procedure, dan fungsi. Topik ini menjelaskan cara menggunakan Multi-master Cluster (Limitless).

Prasyarat

Batasan

  • Data untuk setiap database atau objek data hanya dapat ditulis melalui satu node primary. Node yang tidak memiliki database atau objek data yang ditetapkan tidak dapat melakukan operasi baca atau tulis. Secara default, operasi dilakukan pada level database. Untuk melakukan operasi pada level objek data, Anda harus menggunakan sintaks khusus untuk mengganti mode.

  • Kueri lintas node primary tidak didukung. Jika suatu kueri melibatkan database atau objek data yang berada di node primary berbeda, sistem akan melaporkan error. Kami menyarankan untuk memindahkan titik akhir semua database atau objek data yang terlibat ke satu node primary sebelum menjalankan kueri tersebut.

  • Hanya disediakan titik akhir klaster, . Titik akhir primary tidak didukung.

  • Pergantian titik akhir tunduk pada kondisi berikut:

    • Jika Anda menggunakan level isolasi database, Anda harus mengganti titik akhir database.

    • Jika Anda menggunakan level isolasi objek data, Anda harus mengganti titik akhir objek data.

  • Operasi DDL lintas node primary tidak didukung. Jika Anda mengeksekusi pernyataan DDL pada database atau objek data saat koneksi saat ini berada di node primary yang bukan pemilik database atau objek data tersebut, sistem akan melaporkan error Failed to get global lock for table 'xxx' on master N. Untuk mengatasi masalah ini, lakukan langkah-langkah berikut:

    1. Jalankan perintah berikut untuk menanyakan node primary yang memiliki tabel target:

      SELECT * FROM INFORMATION_SCHEMA.INNODB_CC_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';

      Temukan master_id yang sesuai dengan tabel target dalam hasil kueri.

    2. Jalankan perintah berikut untuk mengganti sesi saat ini ke node primary yang memiliki tabel target:

      ALTER SESSION POLARDB_WRITE_NODE <master_id>;

      Ganti <master_id> dengan nomor node primary aktual yang diperoleh pada langkah sebelumnya.

    3. Setelah pergantian selesai, eksekusi ulang pernyataan DDL tersebut.

Tentukan node primary untuk database

Buat database pada node primary tertentu. Sintaksnya adalah sebagai berikut:

CREATE DATABASE name [POLARDB_WRITE_NODE master_id];
Catatan
  • Saat menggunakan level isolasi database, data untuk setiap database hanya dapat ditulis melalui satu node primary.

  • Jika Anda menghilangkan [POLARDB_WRITE_NODE master_id] dalam sintaks, sistem akan menggunakan nilai parameter loose_innodb_mm_default_master_id untuk menentukan node primary tempat membuat database. Ketika nilai parameter loose_innodb_mm_default_master_id adalah 0, sistem akan memilih node primary secara acak untuk membuat database. Anda dapat membuka PolarDB console dan navigasi ke halaman Settings and Management > Parameters untuk melihat dan mengubah parameter klaster atau node.

  • Untuk melihat distribusi database di seluruh node, lihat Query the database distribution.

Contoh: Buat database bernama db1 pada node primary 1.

CREATE DATABASE db1 POLARDB_WRITE_NODE 1;

Untuk membuat database db1 pada node primary 2, ubah angka 1 menjadi 2 pada pernyataan di atas.

Hapus database

Untuk menghapus database yang dibuat pada node primary tertentu, gunakan sintaks berikut:

DROP DATABASE name;

Contoh: Hapus database db1 yang dibuat pada node primary 1.

DROP DATABASE db1;

Anda tidak perlu menentukan node primary saat menghapus database.

Ganti titik akhir database

Untuk mengganti titik akhir database ke node primary lain, gunakan sintaks berikut:

ALTER DATABASE name POLARDB_WRITE_NODE master_id;

Contoh: Ganti titik akhir database db1 ke node primary 2.

ALTER DATABASE db1 POLARDB_WRITE_NODE 2;
Catatan

Pergantian titik akhir bisa menjadi operasi yang memakan waktu. Waktu eksekusi bergantung pada faktor-faktor berikut:

  • Semakin banyak tabel yang dimiliki database, semakin lambat pergantiannya.

  • Semakin berat beban kerja DML pada database selama pergantian, semakin lambat operasinya.

Ganti ke isolasi objek data

Secara default, level isolasi untuk klaster multi-primary adalah level database. Artinya, semua objek data dalam database yang sama hanya dapat diakses pada satu node primary. Jika Anda ingin semua objek data dalam database yang sama dapat diakses melalui beberapa node primary, Anda perlu mengubah level isolasi database menjadi level isolasi objek data. Sintaksnya adalah sebagai berikut:

ALTER DATABASE name TO TABLE_LOCK POLARDB_WRITE_NODE master_id;

Dalam pernyataan ini, name menentukan nama database, dan master_id menentukan titik akhir objek data.

Contoh: Ubah level isolasi untuk database db1 menjadi level isolasi objek data dan atur titik akhirnya ke node primary 2.

ALTER DATABASE db1 TO TABLE_LOCK POLARDB_WRITE_NODE 2;
Catatan

Pergantian level isolasi bisa menjadi operasi yang memakan waktu. Waktu eksekusi bergantung pada faktor-faktor berikut:

  • Semakin banyak objek yang dimiliki database, semakin lambat pergantiannya.

  • Semakin berat beban kerja DML pada database selama pergantian, semakin lambat operasinya.

Ganti ke isolasi database

Jika database diatur ke level isolasi objek data, Anda dapat mengembalikannya ke level isolasi database agar lebih mudah dikelola. Gunakan pernyataan berikut:

ALTER DATABASE name TO DB_LOCK POLARDB_WRITE_NODE master_id;

Dalam pernyataan ini, name menentukan nama database, dan master_id menentukan titik akhir database.

Contoh: Ubah kembali level isolasi untuk database db1 ke level isolasi database dan atur titik akhirnya ke node primary 1.

ALTER DATABASE db1 TO DB_LOCK POLARDB_WRITE_NODE 1;
Catatan

Pergantian level isolasi bisa menjadi operasi yang memakan waktu. Waktu eksekusi bergantung pada faktor-faktor berikut:

  • Semakin banyak objek yang dimiliki database, semakin lambat pergantiannya.

  • Semakin berat beban kerja DML pada database selama pergantian, semakin lambat operasinya.

Ganti titik akhir objek data

Saat klaster berada pada level isolasi objek data, sebuah database dapat berisi berbagai jenis objek, termasuk tabel, view, trigger, fungsi, stored procedure, dan event. Untuk mengganti titik akhir objek-objek tersebut, gunakan sintaks berikut:

ALTER obj_type name POLARDB_WRITE_NODE master_id;

Dalam pernyataan ini, obj_type dapat berupa TABLE, VIEW, TRIGGER, FUNCTION, PROCEDURE, atau EVENT. name adalah nama objek data.

Contoh 1: Ganti titik akhir tabel t1 dalam database db1 ke node primary 3.

ALTER TABLE db1.t1 POLARDB_WRITE_NODE 3;

Contoh 2: Ganti titik akhir view t2 dalam database saat ini ke node primary 2.

ALTER VIEW t2 POLARDB_WRITE_NODE 2;

Contoh 3: Ganti titik akhir fungsi f1 dan f2 dalam database db2 ke node primary 1.

ALTER FUNCTION db2.f1, db2.f2 POLARDB_WRITE_NODE 1;
Catatan

Pergantian titik akhir bisa menjadi operasi yang memakan waktu. Waktu eksekusi bergantung pada faktor-faktor berikut:

  • Semakin berat beban kerja DML pada objek data selama pergantian, semakin lambat operasinya.

  • Objek yang memiliki dependensi dapat menjadi tidak valid jika tidak berada pada node primary yang sama.

    Misalnya, view bernama VIEW1 bergantung pada tabel bernama t1. Jika titik akhir VIEW1 berada di node primary 1 dan titik akhir t1 berada di node primary 2, error akan terjadi saat Anda menanyakan VIEW1 di node primary 1. Demikian pula, pemanggilan fungsi, stored procedure, atau event akan gagal jika objek yang dirujuknya berada di node primary berbeda. Trigger juga gagal memodifikasi tabel jika titik akhirnya berada di node berbeda.

  • Jika kendala kunci asing ada antara dua tabel, seperti t1 dan t2, mengubah titik akhir salah satu tabel secara otomatis akan mengubah titik akhir tabel lainnya.

Tentukan node primary untuk SQL

Penting

Fitur ini hanya berlaku untuk kueri metadata, seperti kueri pada information_schema atau variabel status. Jika Anda perlu menanyakan data, misalnya dengan menjalankan SELECT * FROM table1, Anda tidak perlu menentukan node primary karena proksi database secara otomatis mengarahkan kueri ke node primary yang tepat.

Untuk mengirim pernyataan SQL ke node primary tertentu, jalankan pernyataan SQL berikut untuk mengunci sesi ke node tersebut:

ALTER SESSION POLARDB_WRITE_NODE master_id;

Contoh: Tanyakan nilai variabel innodb_buffer_pool_size pada node primary 1.

ALTER SESSION POLARDB_WRITE_NODE 1;   # Kirim pernyataan SQL ke node primary 1.
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';  # Tanyakan nilai innodb_buffer_pool_size pada node primary 1.
Catatan

Jika Anda tidak menentukan node primary saat menjalankan pernyataan SQL, proksi database akan memilih node primary secara acak untuk mengeksekusi pernyataan tersebut.

Jalankan perintah berikut untuk membuka kunci sesi dari node primary yang ditentukan:

RESET SESSION POLARDB_WRITE_NODE;

Tanyakan distribusi database

  • Di PolarDB console, buka halaman Settings and Management > Database Management untuk melihat distribusi semua database di seluruh klaster. Kolom MasterID menampilkan nomor node RW tempat setiap database berada (misalnya, MasterID 1 menunjukkan database berada di node RW1, dan MasterID 2 menunjukkan berada di node RW2).

  • Jalankan perintah berikut untuk menanyakan distribusi database pada node primary tertentu:

    ALTER SESSION POLARDB_WRITE_NODE master_id;
    SELECT * FROM INFORMATION_SCHEMA.INNODB_MASTER_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';

    Contoh: Tanyakan distribusi database pada node primary 1.

    ALTER SESSION POLARDB_WRITE_NODE 1;
    SELECT * FROM INFORMATION_SCHEMA.INNODB_MASTER_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';

    Output berikut dikembalikan:

     SELECT * FROM INFORMATION_SCHEMA.INNODB_MASTER_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';
    
    +------------+---------------------+----------+--------------+-----------+----------+-------------+-------------+---------------------+-----------------+
    | table_name | table_id            | space_id | s_lock_count | lock_mode | object   | current_lsn | hold_thread | hold_start_time     | hold_total_time |
    +------------+---------------------+----------+--------------+-----------+----------+-------------+-------------+---------------------+-----------------+
    | test3/f1   | 9149389368458135753 |        0 |            0 | SLS_X     | function |    28076635 |          17 | 2024-07-10 21:35:20 |             214 |
    | test3/e1   | 9149389368458332874 |        0 |            0 | SLS_X     | event    |    28077248 |          17 | 2024-07-10 21:35:30 |             204 |
    | test3/v1   | 9149389368457234649 |        0 |            0 | SLS_X     | view     |    28075972 |          17 | 2024-07-10 21:35:08 |             226 |
    | sbtest     | 2107518311328629409 |        0 |            0 | SLS_X     | db       |    28034927 |  4294967295 | 2024-07-07 23:04:41 |          254053 |
    | test       | 7190879906290573778 |        0 |            0 | SLS_X     | db       |    28034927 |  4294967295 | 2024-07-10 11:20:57 |           37077 |
    | test2      | 3381728963524265351 |        0 |            0 | SLS_X     | db       |    28034927 |  4294967295 | 2024-07-10 11:13:09 |           37545 |
    +------------+---------------------+----------+--------------+-----------+----------+-------------+-------------+---------------------+-----------------+
    
    6 rows in set (0.00 sec)

    Meskipun kolom tersebut bernama table_name, setiap baris dalam hasil berisi informasi tentang database atau objek data. Dalam contoh ini, sbtest, test, dan test2 menggunakan level isolasi database. Objek `test3/f1` (fungsi), `test3/e1` (event), dan `test3/v1` (view) menggunakan level isolasi objek data. Hasilnya juga mungkin berisi objek bernama mysql/global_ddl_lock dengan tipe objek tabel. Ini digunakan secara internal dan dapat diabaikan.

  • Jalankan perintah berikut untuk menanyakan distribusi semua database dalam klaster:

    Catatan

    Kueri ini hanya dapat dijalankan menggunakan akun istimewa.

    SELECT * FROM INFORMATION_SCHEMA.INNODB_CC_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';

    Output berikut dikembalikan:

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_CC_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';
    +-----------+------------+---------------------+-----------+-----------+-------------+---------------------+-----------------+
    | master_id | table_name | table_id            | lock_mode | object    | current_lsn | hold_start_time     | hold_total_time |
    +-----------+------------+---------------------+-----------+-----------+-------------+---------------------+-----------------+
    |         1 | test3/v1   | 9149389368457234649 | SLS_X     | view      |    28075972 | 2024-07-10 21:35:08 |             754 |
    |         2 | test5/t1   | 9149389447232697561 | SLS_X     | table     |     7256175 | 2024-07-10 21:46:36 |              66 |
    |         1 | test2      | 3381728963524265351 | SLS_X     | db        |    28034927 | 2024-07-10 11:13:09 |           38073 |
    |         2 | test4      | 3381728963524272009 | SLS_X     | db        |     7255352 | 2024-07-10 21:46:27 |              75 |
    |         1 | test3/f1   | 9149389368458135753 | SLS_X     | function  |    28076635 | 2024-07-10 21:35:20 |             742 |
    |         1 | test3/e1   | 9149389368458332874 | SLS_X     | event     |    28077248 | 2024-07-10 21:35:30 |             732 |
    |         1 | test       | 7190879906290573778 | SLS_X     | db        |    28034927 | 2024-07-10 11:20:57 |           37605 |
    |         2 | test5/p1   | 9149389447233473757 | SLS_X     | procedure |     7257051 | 2024-07-10 21:46:45 |              57 |
    |         1 | sbtest     | 2107518311328629409 | SLS_X     | db        |    28034927 | 2024-07-07 23:04:41 |          254581 |
    +-----------+------------+---------------------+-----------+-----------+-------------+---------------------+-----------------+
    
    9 rows in set (0.00 sec)

    Meskipun kolom tersebut bernama table_name, setiap baris dalam hasil berisi informasi tentang database atau objek data beserta node primary yang sesuai. Hasilnya juga mungkin berisi objek bernama mysql/global_ddl_lock dengan tipe objek tabel. Ini digunakan secara internal dan dapat diabaikan.

Konfigurasikan log biner

Multi-master Cluster (Limitless) sepenuhnya kompatibel dengan log biner MySQL. Fitur ini mengonsolidasikan log operasi dari semua node primary dalam klaster untuk menghasilkan log biner yang terpadu secara global dan tersusun secara logis.

Anda dapat menggunakan loose_polar_log_bin untuk mengaktifkan fitur log biner untuk Multi-master Cluster (Limitless) dan binlog_expire_logs_seconds untuk mengatur periode retensi log biner Multi-master Cluster (Limitless). Untuk informasi lebih lanjut, lihat Enable binary logs.

Catatan

Multi-master Cluster (Limitless) dapat digunakan sebagai sumber dan tujuan Layanan Transmisi Data (DTS) untuk melakukan sinkronisasi data satu arah atau dua arah.