Memperbarui himpunan karakter dan kolasi untuk database

Halaman ini menjelaskan cara memperbarui himpunan karakter dan pengumpulan di database Cloud SQL.

Ringkasan

Saat membuat database di Cloud SQL untuk MySQL, Anda dapat menentukan konfigurasi kumpulan karakter dan kolasi untuk database. Jika Anda tidak menentukan nilai kustom untuk setelan ini, database akan menggunakan nilai default. Di beberapa MySQL, Anda dapat menentukan nilai {i>custom <i}untuk himpunan karakter dan pemeriksaan di level objek yang berbeda, termasuk {i>database<i}, tabel, dan kolom. Untuk mengetahui informasi selengkapnya tentang cara menggunakan konfigurasi himpunan karakter dan kolasi di MySQL, lihat Kumpulan Karakter, Kolase, Unicode.

Jika Anda ingin mengubah himpunan karakter atau kolasi {i>database<i} Anda setelah Anda sudah membuat database dan beberapa objek dalam database, kemudian Anda dapat melakukannya dengan mengikuti prosedur dalam dokumen ini.

Prosedur ini terdiri dari langkah-langkah berikut:

  1. Periksa himpunan karakter dan nilai pemeriksaan saat ini.
  2. Tentukan tingkat update yang harus dilakukan.
  3. Ambil cadangan instance.
  4. Buat perintah build ulang untuk objek database yang tersimpan.
  5. Lakukan pembaruan pada database Anda, dan jika perlu, tabel dan kolom.
  6. Validasi update dan cari error.
  7. Membuat ulang objek database yang tersimpan.
  8. Ambil cadangan lain dari instance.

Memeriksa himpunan karakter dan nilai kolasi saat ini

Memeriksa nilai yang ada yang dikonfigurasi untuk himpunan karakter dan kolasi untuk objek database dan database Anda. Saat Anda memeriksa {i>database<i}, Anda juga perlu memeriksa konfigurasi tabel, kolom, dan objek yang disimpan. Anda dapat menggunakan pernyataan berikut untuk memeriksa {i>database<i} dan objek-objek {i>database-<i}nya.

Memeriksa konfigurasi instance

Untuk memeriksa nilai global default pada instance (server) mulai shell MySQL dan masukkan perintah berikut:

mysql> SELECT @@character_set_server,@@collation_server;

Contoh output:

+------------------------+--------------------+
| @@character_set_server | @@collation_server |
+------------------------+--------------------+
| utf8mb4                | utf8mb4_0900_ai_ci |
+------------------------+--------------------+
1 row in set (0.00 sec)

Anda dapat memeriksa apakah nilai global default berbeda dari nilai yang nantinya akan Anda berikan untuk {i>database<i}.

Memeriksa konfigurasi database Anda

Untuk memeriksa himpunan karakter dan nilai kolasi yang ada pada {i>database<i}, gunakan pernyataan berikut. Setelah Anda menjalankan setiap pernyataan, pastikan daftar semua database dan objek database yang perlu Anda perbarui himpunan karakter baru, atau nilai kolasi. Daftar tersebut tergantung pada {i>database<i} yang yang ingin diubah dan berapa banyak tabel, kolom, dan objek {i>database<i} yang pembaruan konfigurasi.

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
WHERE schema_name
NOT IN ('performance_schema', 'mysql', 'sys', 'information_schema');

Misalnya, Anda menerima output berikut:

+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| def          | test1       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
| def          | test2       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
| def          | test3       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
| def          | test4       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+

Namun, Anda ingin mengubah database ke himpunan karakter kustom berikut nilai-nilai:

+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| def          | test1       | ascii                      | ascii_general_ci       |     NULL | NO                 |
| def          | test2       | latin1                     | latin1_swedish_ci      |     NULL | NO                 |
| def          | test3       | utf16                      | utf16_general_ci       |     NULL | NO                 |
| def          | test4       | ucs2                       | ucs2_general_ci        |     NULL | NO                 |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+

Kemudian, dalam hal ini, untuk setiap {i>database<i} yang memiliki nilai yang ingin diubah, Anda perlu memperbarui setiap objek yang berada dalam database.

Memeriksa konfigurasi tabel

Untuk memeriksa nilai yang ada untuk tabel, gunakan perintah berikut pernyataan:

SELECT T.table_name, T.table_schema, CCSA.character_set_name, CCSA.collation_name
FROM information_schema.`tables` T,
  information_schema.`collation_character_set_applicability` CCSA
WHERE CCSA.collation_name = T.table_collation
AND T.table_schema
NOT IN ('performance_schema', 'mysql', 'sys','information_schema');

Contoh output:

+------------+--------------+--------------------+-------------------+
| TABLE_NAME | TABLE_SCHEMA | CHARACTER_SET_NAME | COLLATION_NAME    |
+------------+--------------+--------------------+-------------------+
| t1         | test1        | ascii              | ascii_general_ci  |
| t2         | test2        | latin1             | latin1_swedish_ci |
| t3         | test3        | utf16              | utf16_general_ci  |
| t4         | test4        | ucs2               | ucs2_general_ci   |
+------------+--------------+--------------------+-------------------+

Memeriksa konfigurasi kolom tabel

Untuk memeriksa nilai pada kolom, gunakan pernyataan berikut:

SELECT table_schema, table_name, column_name, character_set_name, collation_name
FROM information_schema.columns
WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'sys', 'mysql');

Contoh output:

+--------------+------------+-------------+--------------------+------------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME   |
+--------------+------------+-------------+--------------------+------------------+
| test1        | t1         | c           | ascii              | ascii_general_ci |
| test1        | t1         | i           | NULL               | NULL             |
| test2        | t2         | j           | NULL               | NULL             |
| test2        | t2         | v           | ascii              | ascii_general_ci |
| test3        | t3         | k           | NULL               | NULL             |
| test3        | t3         | summary     | utf16              | utf16_general_ci |
| test4        | t4         | col         | ucs2               | ucs2_general_ci  |
| test4        | t4         | p           | NULL               | NULL             |
+--------------+------------+-------------+--------------------+------------------+

Memeriksa skema atau database yang aktif

Untuk memeriksa detail tentang skema atau {i>database<i} aktif, gunakan pernyataan berikut.

SELECT TABLE_SCHEMA, TABLE_NAME, CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       COLUMN_NAME, COLUMN_TYPE, C.CHARACTER_SET_NAME
FROM information_schema.TABLES AS T
JOIN information_schema.COLUMNS AS C USING (TABLE_SCHEMA, TABLE_NAME)
JOIN information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS CCSA
ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
WHERE TABLE_SCHEMA=SCHEMA()
AND C.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext', 'set' )
ORDER BY TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME;

Contoh output:

+------------+
| DATABASE() |
+------------+
| test3      |
+------------+
+--------------+------------+------------------+-------------+-------------+--------------------+
| TABLE_SCHEMA | TABLE_NAME | DEFAULT_CHAR_SET | COLUMN_NAME | COLUMN_TYPE | CHARACTER_SET_NAME |
+--------------+------------+------------------+-------------+-------------+--------------------+
| test3        | t3         | utf16            | summary     | text        | utf16              |
+--------------+------------+------------------+-------------+-------------+--------------------+

Memeriksa konfigurasi prosedur yang tersimpan

Untuk memeriksa nilai pada prosedur yang tersimpan, gunakan metode pernyataan berikut:

SHOW PROCEDURE STATUS WHERE db = 'DB_NAME';

Ganti DB_NAME dengan nama database.

Contoh output:

+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db    | Name | Type      | Definer | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| test2 | p1   | PROCEDURE | root@%  | 2024-08-09 11:47:05 | 2024-08-09 11:47:05 | DEFINER       |         | utf8mb4              | utf8mb4_0900_ai_ci   | latin1_swedish_ci  |
| test2 | p2   | PROCEDURE | root@%  | 2024-08-09 11:48:36 | 2024-08-09 11:48:36 | DEFINER       |         | utf8mb4              | utf8mb4_0900_ai_ci   | latin1_swedish_ci  |
+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+

Untuk mendapatkan definisi prosedur tersimpan, gunakan pernyataan berikut:

SHOW CREATE PROCEDURE DB_NAME.SP_NAME;

Ganti kode berikut:

  • DB_NAME: nama database MySQL
  • SP_NAME: nama prosedur yang disimpan

Jika prosedur tersimpan tidak menggunakan himpunan karakter atau kolasi yang Anda inginkan nilai, Anda mungkin perlu menghapus dan membuatnya kembali dengan himpunan karakter atau kolasi baru.

Memeriksa pemetaan kolasi database

Pada contoh {i>output<i} sebelumnya, prosedur dibuat dengan latin1_swedish_ci sebagai kolasi default dan himpunan karakter yang sesuai adalah latin1. Ini berarti semua pemrosesan terjadi menggunakan himpunan karakter latin1 (kecuali jika ada parameter khusus dari prosedur tersebut diberi tag dengan himpunan karakter khusus.) Jika Anda hanya mengubah karakter level database dan pemeriksaan, pembaruan tingkat {i>database<i} tidak memperbarui prosedur otomatis. Prosedur tersebut terus berjalan dengan Himpunan karakter latin1 dan Kolasi terkait. Melepaskan dan membuat ulang prosedur yang telah disimpan memastikan bahwa prosedur dimulai untuk menggunakan himpunan karakter baru dan kolasi baru dari {i>database<i} yang baru saja Anda perbarui.

Anda dapat mengetahui pemetaan antara penggabungan {i>database<i} dan himpunan karakter dengan membuat kueri tabel information_schema.COLLATION_CHARACTER_SET_APPLICABILITY.

Gunakan pernyataan berikut sebagai contoh:

SELECT CHARACTER_SET_NAME
FROM information_schema.COLLATION_CHARACTER_SET_APPLICABILITY
WHERE COLLATION_NAME = (SELECT database_collation FROM information_schema.ROUTINES
                        WHERE ROUTINE_SCHEMA = "test2" and ROUTINE_NAME = "p1");

Contoh output:

+--------------------+
| CHARACTER_SET_NAME |
+--------------------+
| latin1             |
+--------------------+

Memeriksa konfigurasi pemicu Anda

Untuk memeriksa nilai pemicu, gunakan pernyataan berikut sebagai contoh.

SHOW TRIGGERS FROM DB_NAME;

Ganti DB_NAME dengan nama database MySQL.

Untuk mendapatkan definisi pemicu, gunakan contoh pernyataan berikut.

SHOW CREATE trigger DB_NAME.TRIGGER_NAME;

Ganti kode berikut:

  • DB_NAME: nama database MySQL
  • TRIGGER_NAME: nama pemicu

Jika pemicu tidak menggunakan himpunan karakter atau nilai kolasi yang Anda inginkan, maka Anda mungkin perlu menghapus dan membuatnya ulang dengan himpunan karakter, atau kolasi. Pastikan pemicu menggunakan pemetaan pemeriksaan database yang benar. Untuk informasi selengkapnya tentang pemeriksaan Collasi database, lihat Memeriksa pemetaan kompilasi database.

Memeriksa konfigurasi peristiwa

Untuk memeriksa nilai peristiwa, gunakan pernyataan berikut sebagai contoh.

SHOW EVENTS FROM DB_NAME;

Ganti DB_NAME dengan nama database.

Untuk mendapatkan definisi peristiwa, gunakan contoh pernyataan berikut.

SHOW CREATE EVENT DB_NAME.EVENT_NAME;

Ganti kode berikut:

  • DB_NAME: nama database
  • EVENT_NAME: nama peristiwa

Jika peristiwa tersebut tidak menggunakan himpunan karakter atau nilai kolasi yang Anda inginkan, maka Anda mungkin perlu menghapus dan membuatnya ulang dengan himpunan karakter baru atau kolasi. Periksa apakah peristiwa menggunakan pemetaan kolasi database yang benar. Untuk mengetahui informasi selengkapnya tentang cara memeriksa database kolasi, lihat Periksa pemetaan kompilasi database.

Memeriksa konfigurasi fungsi Anda

Untuk memeriksa nilai fungsi, gunakan pernyataan berikut sebagai contoh.

SHOW FUNCTION STATUS WHERE db = 'DB_NAME';

Ganti DB_NAME dengan nama database.

Untuk mendapatkan definisi suatu fungsi, gunakan contoh pernyataan berikut.

SHOW CREATE FUNCTION DB_NAME.FUNCTION_NAME;

Ganti kode berikut:

  • DB_NAME: nama database MySQL
  • FUNCTION_NAME: nama fungsi

Jika fungsi itu tidak menggunakan himpunan karakter atau nilai kolasi yang Anda inginkan, Anda mungkin perlu menghapus dan membuatnya ulang dengan himpunan karakter baru atau kolasi. Pastikan fungsi tersebut menggunakan pemetaan kolasi database yang benar. Untuk informasi selengkapnya tentang pemeriksaan pengumpulan database, lihat Periksa pemetaan kompilasi database.

I himpunan karakter atau kolasi. Pastikan fungsi tersebut menggunakan pemetaan kolasi database yang benar. Untuk informasi selengkapnya tentang pemeriksaan pengumpulan database, lihat Periksa pemetaan kompilasi database.

Menentukan tingkat update yang harus dilakukan

Setelah Anda memeriksa himpunan karakter dan konfigurasi kolasi dari {i>database<i}, Anda memiliki daftar {i>database<i} dan mungkin daftar objek {i>database<i} yang Anda perlu melakukan update.

Jumlah tugas yang harus Anda lakukan bergantung pada jenis objek database yang memerlukan perubahan konfigurasi.

Mengambil cadangan instance

Sebelum Anda melakukan pembaruan ini, cadangkan di instance Compute Engine. Untuk informasi selengkapnya, lihat Buat cadangan on demand. Sebaiknya Anda mengambil cadangan tanpa operasi DDL yang berjalan di di instance Compute Engine.

Membuat perintah build ulang untuk objek database yang tersimpan di database Anda

Jika Anda perlu menghapus dan membuat ulang objek database yang tersimpan dalam database dengan himpunan karakter dan kolasi baru, lalu gunakan alat mysqldump untuk membuat perintah tersebut sekarang. Setelah Anda memperbarui kolom {i>database<i} dan tabel Anda, Anda akan menggunakan file mysqldump yang dihasilkan untuk membangun ulang objek database yang tersimpan di di skrip untuk menyiapkan database. Perintah ini menghasilkan pernyataan untuk semua prosedur yang tersimpan, fungsi, pemicu, dan peristiwa.

Jalankan perintah berikut sehingga Anda dapat menggunakan output untuk membuat ulang semua file yang disimpan prosedur, fungsi, dan peristiwa dari {i>database<i} tertentu nanti (ketika Anda membuat ulang objek database yang tersimpan).

$ mysqldump -uDBAuser -p -h IP_ADDRESS \
   -P 3306 DB_NAME --no-data --no-create-db \
   --no-create-info --routines --triggers --events \
   --set-gtid-purged=OFF --events > dump_objects.sql

Ganti kode berikut:

  • IP_ADDRESS: Alamat IP instance Cloud SQL untuk MySQL
  • DB_NAME: nama database MySQL

Lakukan pembaruan pada {i>database<i} Anda, dan jika perlu, tabel dan kolom.

Pada langkah ini, Anda memperbarui himpunan karakter dan nilai kolasi {i>database<i}. Juga, Anda mungkin perlu membangun ulang tabel Anda dan seperti baris dan kolom.

Melakukan update tingkat database

Jika Anda hanya melakukan pembaruan tingkat {i>database<i}, maka jalankan pernyataan berikut untuk memperbarui database Anda:

ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

Ganti kode berikut:

  • DB_NAME: nama database yang akan diperbarui
  • NEW_CHARSET: himpunan karakter baru yang akan diterapkan ke database
  • NEW_COLLATION: kolasi baru yang akan diterapkan ke database

Melakukan update pada level database dan tabel

Jika Anda melakukan pembaruan tingkat {i>database<i} dan tingkat tabel, maka hal berikut:

  1. Jalankan pernyataan berikut untuk memperbarui database Anda:

    ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

    Ganti kode berikut:

    • DB_NAME: nama database yang akan diperbarui
    • NEW_CHARSET: himpunan karakter baru yang akan diterapkan ke database
    • NEW_COLLATION: kolasi baru yang akan diterapkan ke database
  2. Untuk setiap tabel yang ingin Anda perbarui, jalankan pernyataan berikut:

    ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

    Ganti kode berikut:

    • TABLE_NAME: nama tabel yang akan diperbarui
    • NEW_CHARSET: himpunan karakter baru yang akan diterapkan ke tabel
    • NEW_COLLATION: kolasi baru yang akan diterapkan ke tabel

Melakukan update tingkat database, tabel, dan kolom

Pada tingkat ini, Anda perlu mengenkode ulang data yang ada untuk mematuhi himpunan karakter, dan pengaturan kolasi. Jika Anda melakukan update tingkat database, tabel, dan kolom, lalu lakukan langkah berikut:

  1. Sebelum melanjutkan dengan pembaruan pada kolom tabel, tinjau pertimbangan berikut:

    • Himpunan karakter ALTER TABLE dan konversi kolasi menyebabkan tabel untuk membangun kembali dan mengunci tabel. Akibatnya, setiap kueri aktif yang mencoba akses ke tabel akan diblokir.
    • Kumpulan karakter ALTER TABLE dan konversi kolasi memerlukan waktu karena ia mengambil tabel lengkap dalam memori. Operasi ini mungkin meningkatkan latensi beban kerja yang berjalan secara paralel karena buffer halaman kumpulan digunakan untuk tabel yang diperbarui.
    • Jika ada kueri yang mengakses beberapa tabel dan beberapa tabel sedang diperbarui sementara yang lain belum diperbarui, maka kueri mungkin memberikan hasil yang tidak konsisten selama waktu transaksi ini.
    • Proses menjalankan himpunan karakter dan kolasi ALTER TABLE konversi akan menghasilkan tabel bayangan, jadi rencanakan penggunaan disk dengan tepat.
    • Himpunan karakter ALTER TABLE dan konversi kolasi juga menyebabkan indeks pada tabel untuk dibangun kembali.
    • Anda tidak perlu mengupdate instance replika secara terpisah. ALTER, DROP, dan Perintah CREATE direplikasi secara otomatis. Namun, menjalankan perintah DDL dapat menyebabkan waktu jeda replika bertambah selama operasi.
    • Jika Anda memulihkan salah satu {i>database<i} dari cadangan yang diambil sebelum Anda menerapkan pembaruan ini, maka Anda harus menerapkan kembali pembaruan ini.
  2. Periksa tabel Anda untuk menemukan tuple data apa pun yang mungkin tidak kompatibel dengan himpunan karakter baru. Jika ada inkompatibilitas, maka Anda harus memperbaiki sebelum Anda memperbarui himpunan karakter. Jika tidak, Anda akan menghadapi selama proses konversi. Anda dapat menggunakan Pernyataan SELECT CONVERT untuk memvalidasi data Anda dengan himpunan karakter baru.

    SELECT COLUMN_NAME,CONVERT(COLUMN_NAME USING NEW_CHARSET)
    FROM TABLE_NAME
    WHERE COLUMN_NAME != CONVERT(COLUMN_NAME USING NEW_CHARSET);
    SELECT c,CONVERT(c USING 'ascii')
    FROM t WHERE c != CONVERT(c USING ascii);
    

    Contoh output:

    +------+--------------------------+
    | c    | convert(c using 'ascii') |
    +------+--------------------------+
    | é    | ?                        |
    | é    | ?                        |
    | £    | ?                        |
    +------+--------------------------+
    

    Dalam contoh ini, karena {i>output<i} mengembalikan ketiga tuple ini, ada tiga nilai tidak konsisten yang perlu diperbaiki. Sebelum melanjutkan ke langkah berikutnya memeriksa {i>output<i} dari kueri Anda, dan memperbaiki data sampai kueri Anda mengembalikan nol tupel untuk semua kolom yang membutuhkan konversi. Anda juga dapat menggabungkan beberapa kolom di SELECT yang sama kueri.

  3. Pilih opsi untuk memperbarui himpunan karakter dan pengumpulan untuk tabel di tingkat kolom.

  4. Jika Anda ingin memperbarui himpunan karakter untuk kolom tabel yang sangat spesifik, kemudian ikuti langkah-langkah di tab {i>Column-level<i} di mana Anda hanya perlu melakukan kolom yang dipilih. Jika tidak, ikuti langkah-langkah di tab {i>Table-level<i} yang mengenkode ulang tabel lengkap.

    Tingkat tabel

    1. Jalankan pernyataan berikut untuk memperbarui database Anda:

      ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Ganti kode berikut:

      • DB_NAME: nama database yang akan diperbarui
      • NEW_CHARSET: himpunan karakter baru yang akan diterapkan ke database
      • NEW_COLLATION: kolasi baru yang akan diterapkan ke database
    2. Untuk setiap tabel yang terpengaruh, jalankan pernyataan berikut untuk memperbarui tabel Anda:

      ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Ganti kode berikut:

      • TABLE_NAME: nama tabel yang akan diperbarui
      • NEW_CHARSET: himpunan karakter baru yang akan diterapkan ke tabel
      • NEW_COLLATION: kolasi baru yang akan diterapkan ke tabel
    3. Perbarui pada tingkat tabel sehingga semua kolom yang merupakan bagian dari tabel diperbarui dengan himpunan karakter dan kolasi baru. Opsi ini membangun ulang dari tabel secara lengkap. Untuk menggunakan opsi ini, jalankan pernyataan berikut:

      ALTER TABLE DB_NAME.TABLE_NAME
      CONVERT TO CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Ganti kode berikut:

      • TABLE_NAME: nama tabel yang akan diperbarui
      • NEW_CHARSET: himpunan karakter baru yang akan diterapkan ke tabel
      • NEW_COLLATION: kolasi baru yang akan diterapkan ke tabel

    Tingkat kolom

    Pembaruan di tingkat kolom. Opsi ini juga membangun kembali tabel sepenuhnya. Jika beberapa kolom diupdate, opsi ini dapat menyebabkan beberapa build ulang.

    Untuk menggunakan opsi ini, jalankan pernyataan berikut:

    1. Jalankan pernyataan berikut untuk memperbarui database Anda:
    2. ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Ganti kode berikut:

      • DB_NAME: nama database yang akan diperbarui
      • NEW_CHARSET: himpunan karakter baru yang akan diterapkan ke database
      • NEW_COLLATION: kolasi baru yang akan diterapkan ke database
    3. Untuk setiap tabel yang terpengaruh, jalankan pernyataan berikut untuk memperbarui tabel Anda:
    4. ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
       

      Ganti kode berikut:

      • TABLE_NAME: nama tabel yang akan diperbarui
      • NEW_CHARSET: himpunan karakter baru yang akan diterapkan ke tabel
      • NEW_COLLATION: kolasi baru yang akan diterapkan ke tabel
    5. Jalankan pernyataan berikut untuk diperbarui di tingkat kolom:
    6. ALTER TABLE DB_NAME.TABLE_NAME
      MODIFY COLUMN_DEFINITION CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Ganti kode berikut:

      • DB_NAME: nama database yang akan diperbarui
      • TABLE_NAME: nama tabel yang akan diperbarui
      • COLUMN_DEFINITION: menentukan definisi kolom yang tepat yang menyertakan batasan-batasan. Definisi kolom mungkin membawa himpunan karakter dan nilai kolasi lama. Anda harus memperbarui definisi kolom dengan nilai-nilai baru.
      • NEW_CHARSET: himpunan karakter baru untuk diterapkan ke kolom tabel
      • NEW_COLLATION: kolasi baru yang akan diterapkan ke kolom tabel

      Ulangi pernyataan ini untuk semua kolom {i>string<i} yang ada dalam tabel yang membutuhkan himpunan karakter atau pembaruan kolasi.

Memvalidasi update dan mencari error

Selama operasi ALTER TABLE, cari error yang menunjukkan bahwa data yang ada di tabel tidak kompatibel dengan himpunan karakter baru. Misalnya:

ERROR 1366 (HY000): Incorrect string value: '\xC3\xA9' for column 'c' at row 1

Jika Anda mengalami error kompatibilitas data, sebaiknya periksa kembali tabel Anda untuk menemukan error kompatibilitas data dan perbaiki sebelum menjalankan ulang pernyataan ALTER TABLE untuk mengenkode ulang data.

Selain itu, selama operasi ALTER TABLE, tabel (foreign key) tabel dan tabel yang direferensikan), pemeriksaan {i>foreign key<i} mungkin gagal saat kolom mengalami pengkodean ulang. Jika ini terjadi, Anda dapat menonaktifkan {i>foreign key<i}, periksa (SET FOREIGN_KEY_CHECKS=0;) dan jalankan update lagi.

Membuat ulang objek database yang tersimpan

Setelah berhasil memperbarui database, Anda dapat menggunakan ID mysqldump file untuk membuat ulang file tersimpan objek database dengan himpunan karakter dan nilai kolasi.

Untuk membuat ulang objek database yang tersimpan, lakukan langkah berikut:

  1. Verifikasi bahwa objek database yang tersimpan ada di database.
  2. Pastikan tidak ada beban paralel yang mengharapkan objek database yang disimpan ada selama rilis ini dan waktu pembuatan ulang.
  3. File mysqldump yang Anda buat dengan alat mysqldump tidak termasuk pernyataan untuk melepaskan {i>trigger<i}. Jika Anda perlu meninggalkan {i>trigger<i}, lalu buka terminal MySQL untuk menghasilkan pernyataan DROP untuk pemicu.

    mysql> SELECT CONCAT('DROP TRIGGER ', TRIGGER_NAME, ';') AS
    drop_trigger_statements FROM information_schema.TRIGGERS
    WHERE TRIGGER_SCHEMA = DB_NAME;
  4. Salin output.

  5. Jalankan pernyataan untuk meletakkan pemicu untuk database Anda, baik dalam MySQL atau dalam skrip.

  6. Setelah melepaskan pemicu, terapkan file {i>dump<i} yang Anda yang dibuat dengan alat mysqldump. Untuk menerapkan file dump dan membuat ulang objek, masukkan hal berikut:

    $ mysql -uDBAuser -p -h IP_ADDRESS \
      -P 3306 DB_NAME < dump_objects.sql

    Ganti kode berikut:

    • IP_ADDRESS: Alamat IP instance Cloud SQL untuk MySQL
    • DB_NAME: nama database

Mengambil cadangan lain dari instance

Setelah Anda menyelesaikan update, ambil cadangan lain dari di instance Compute Engine. Untuk informasi selengkapnya, lihat Buat cadangan on demand.

Contoh skrip

Jika Anda perlu mengupdate database, tabel, dan kolom, bagian ini menyediakan contoh skrip untuk membantu mengenkode ulang data Anda.

Skrip untuk memperbarui beberapa tabel

Skrip berikut menghasilkan pernyataan untuk semua tabel dalam di skrip untuk menyiapkan database. Pernyataan ini memungkinkan Anda mengenkode ulang data yang ada untuk mematuhi aturan baru himpunan karakter, dan pengaturan kolasi.

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;  ",
"ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION; ")
AS alter_sql FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'DB_NAME' AND TABLE_TYPE='BASE TABLE';

Ganti kode berikut:

  • DB_NAME: nama database yang akan diperbarui
  • NEW_CHARSET: himpunan karakter baru yang akan diterapkan ke tabel
  • NEW_COLLATION: kolasi baru yang akan diterapkan ke tabel

Contoh output:

+--------------------------------------------------------------------------------------------+
|alter_sql
+--------------------------------------------------------------------------------------------+
| ALTER TABLE test1.t1 CHARACTER SET <new-charset> COLLATE <new-collation>;
  ALTER TABLE test1.t1 CONVERT TO CHARACTER SET <new-charset> COLLATE <new-collation>;       |
+--------------------------------------------------------------------------------------------+

Skrip untuk memperbarui beberapa kolom dalam tabel

Skrip berikut menghasilkan pernyataan untuk semua kolom dalam suatu tabel sementara. Pernyataan ini memungkinkan Anda mengenkode ulang data yang ada untuk mematuhi aturan baru himpunan karakter, dan pengaturan kolasi.

  1. Membuat pernyataan ALTER TABLE untuk semua tabel dalam database

    SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;  ")
    AS alter_table_statements
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'DB_NAME' AND TABLE_TYPE='BASE TABLE';

    Ganti kode berikut:

    • DB_NAME: nama database yang akan diperbarui
    • NEW_CHARSET: himpunan karakter baru yang akan diterapkan ke tabel
    • NEW_COLLATION: kolasi baru yang akan diterapkan ke tabel

    Contoh output:

    +------------------------------------------------------------------------------+
    | alter_table_statements                                                       |
    +------------------------------------------------------------------------------+
    | ALTER TABLE test1.t1 CHARACTER SET <new-charset> COLLATE <new-collation>;    |
    +------------------------------------------------------------------------------+
    
  2. Untuk setiap tabel, buat perintah ALTER TABLE MODIFY.

    SELECT CONCAT( "ALTER TABLE ", table_name, " MODIFY ", column_name, 'COLUMN_DEFINITION' , " CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION ")
    AS alter_table_column_statements FROM information_schema.columns
    WHERE table_schema = 'DB_NAME' AND table_name = 'TABLE_NAME'
    AND data_type IN ('char', 'varchar', 'tinytext', 'text', 'mediumtext', 'longtext','set','enum');

    Ganti kode berikut:

    • DB_NAME: nama database yang akan diperbarui
    • TABLE_NAME: nama tabel yang akan diperbarui
    • COLUMN_DEFINITION: setelah mendapatkan hasil dari setiap kueri, ganti dengan definisi kolom untuk setiap kolom (definisi kolom dapat berbeda di setiap kolom)
    • NEW_CHARSET: himpunan karakter baru untuk diterapkan ke kolom tabel
    • NEW_COLLATION: kolasi baru yang akan diterapkan ke kolom tabel

    Contoh output:

    +-------------------------------------------------------------------------------------------------------------------------------------+
    |alter_table_column_statements                                                                                                        |
    +-------------------------------------------------------------------------------------------------------------------------------------+
    | ALTER TABLE t1 MODIFY c <column-definition-replaced-after-obtaining-result-set> CHARACTER SET <new-charset> COLLATE <new-collation>  |
    +-------------------------------------------------------------------------------------------------------------------------------------+
    

Langkah selanjutnya