Atualizar o conjunto de caracteres e a ordenação de um banco de dados

Esta página descreve como atualizar o conjunto de caracteres e a ordenação de bancos de dados do Cloud SQL.

Visão geral

Ao criar um banco de dados no Cloud SQL para MySQL, é possível especificar a configuração de conjunto de caracteres e ordenação de um banco de dados. Se você não especificar valores personalizados para essas configurações, o banco de dados usará o valor padrão. No MySQL, é possível especificar valores personalizados para o conjunto de caracteres e a ordenação em diferentes níveis de objetos, como bancos de dados, tabelas e colunas. Para mais informações sobre o uso de configurações de conjunto de caracteres e ordenação no MySQL, consulte Conjuntos de caracteres, ordenações, Unicode.

Se você quiser alterar o conjunto de caracteres ou a ordenação do banco de dados depois de criar o banco de dados e alguns objetos nele, siga o procedimento descrito neste documento para fazer isso.

Esse procedimento consiste nas seguintes etapas:

  1. Conferir os valores atuais do conjunto de caracteres e da ordenação.
  2. Determinar o nível de atualização que será usado.
  3. Fazer um backup da instância.
  4. Gerar comandos de recriação para objetos de banco de dados armazenados.
  5. Executar atualizações nos bancos de dados e, se necessário, em tabelas e colunas.
  6. Validar as atualizações e procurar erros.
  7. Recriar os objetos de banco de dados armazenados.
  8. Fazer outro backup da instância.

Conferir os valores atuais do conjunto de caracteres e da ordenação

Verifique os valores existentes configurados para o conjunto de caracteres e a ordenação do banco de dados e dos objetos de banco de dados. Ao verificar o banco de dados, você também precisa verificar a configuração das respectivas tabelas, colunas e objetos armazenados. É possível usar as seguintes instruções para verificar o banco de dados e os objetos dele.

Verificar a configuração da instância

Para verificar os valores globais padrão no nível da instância (servidor), inicie um shell do MySQL e insira o seguinte comando:

mysql> SELECT @@character_set_server,@@collation_server;

Exemplo de saída:

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

É possível verificar se os valores globais padrão são diferentes dos valores personalizados que você fornecerá para o banco de dados mais tarde.

Verificar a configuração do banco de dados

Para verificar os valores existentes do conjunto de caracteres e da ordenação no nível do banco de dados, use a instrução a seguir. Depois de executar cada instrução, faça uma lista de todos os bancos de dados e objetos de banco de dados que você precisa atualizar com novos valores de conjuntos de caracteres ou ordenação. A lista depende dos bancos de dados que você quer mudar e da quantidade de tabelas, colunas e objetos de banco de dados que exigem atualizações de configuração.

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

Por exemplo, você recebe a seguinte saída:

+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| 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                 |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+

No entanto, você quer mudar os bancos de dados para os seguintes valores personalizados do conjunto de caracteres:

+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| 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                 |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+

Nesse caso, para cada banco de dados que tenha um valor que você quer mudar, é necessário atualizar cada objeto que está no banco de dados.

Verificar a configuração das tabelas

Para verificar os valores existentes das tabelas, use a seguinte instrução:

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

Exemplo de saída:

+------------+--------------+--------------------+-------------------+
| 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   |
+------------+--------------+--------------------+-------------------+

Verificar a configuração das colunas da tabela

Para verificar os valores das colunas, use a seguinte instrução:

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

Exemplo de saída:

+--------------+------------+-------------+--------------------+------------------+
| 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             |
+--------------+------------+-------------+--------------------+------------------+

Verificar o esquema ou banco de dados ativo

Para verificar os detalhes do esquema ativo ou banco de dados, use a seguinte instrução.

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;

Exemplo de saída:

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

Verificar a configuração dos seus procedimentos armazenados

Para verificar os valores dos procedimentos armazenados, use a seguinte instrução:

SHOW PROCEDURE STATUS WHERE db = 'DB_NAME';

Substitua DB_NAME pelo nome do banco de dados.

Exemplo de saída:

+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| 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  |
+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+

Para conferir a definição de um procedimento armazenado, use a seguinte instrução:

SHOW CREATE PROCEDURE DB_NAME.SP_NAME;

Substitua:

  • DB_NAME: o nome do banco de dados do MySQL
  • SP_NAME: o nome do procedimento armazenado

Se um procedimento armazenado não estiver usando o valor esperado do conjunto de caracteres ou da ordenação, talvez seja necessário remover e recriar o procedimento com o novo conjunto de caracteres ou ordenação.

Verificar o mapeamento da ordenação do banco de dados

Na saída do exemplo anterior, o procedimento armazenado é criado com latin1_swedish_ci como a ordenação padrão, e o conjunto de caracteres correspondente é latin1. Ou seja, todo o processamento ocorre com este conjunto de caracteres latin1 (a menos que parâmetros específicos do procedimento incluam tags de um conjunto de caracteres personalizado). Se você mudar apenas o conjunto de caracteres e a ordenação no nível do banco de dados, a atualização no nível do banco de dados não atualizará automaticamente o procedimento armazenado. O procedimento continua a funcionar com o conjunto de caracteres latin1 e a respectiva ordenação. Remover e recriar o procedimento armazenado garante que o ele seja iniciado para que use o novo conjunto de caracteres e a nova ordenação do banco de dados que você acabou de atualizar.

É possível consultar a tabela information_schema.COLLATION_CHARACTER_SET_APPLICABILITY para descobrir o mapeamento entre a ordenação e o conjunto de caracteres do banco de dados.

Use a instrução a seguir como exemplo:

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");

Exemplo de saída:

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

Verificar a configuração dos gatilhos

Para verificar os valores dos gatilhos, use a seguinte instrução como exemplo.

SHOW TRIGGERS FROM DB_NAME;

Substitua DB_NAME pelo nome do banco de dados do MySQL.

Para conferir a definição de um gatilho, use o exemplo de instrução a seguir.

SHOW CREATE trigger DB_NAME.TRIGGER_NAME;

Substitua:

  • DB_NAME: o nome do banco de dados do MySQL
  • TRIGGER_NAME: o nome do gatilho

Se o gatilho não estiver usando o valor esperado do conjunto de caracteres ou da ordenação, talvez seja necessário remover e recriar o gatilho com o novo de conjunto de caracteres ou ordenação. Verifique se o gatilho está usando o mapeamento de ordenação do banco de dados correto. Para mais informações sobre como verificar a ordenação do banco de dados, consulte Verificar o mapeamento de ordenação do banco de dados.

Verificar a configuração dos seus eventos

Para verificar os valores dos eventos, use a seguinte instrução como exemplo.

SHOW EVENTS FROM DB_NAME;

Substitua DB_NAME pelo nome do banco de dados.

Para conferir a definição de um evento, use a instrução de exemplo a seguir.

SHOW CREATE EVENT DB_NAME.EVENT_NAME;

Substitua:

  • DB_NAME: o nome do banco de dados
  • EVENT_NAME: o nome do evento

Se o evento não estiver usando o valor esperado do conjunto de caracteres ou da compilação, talvez seja necessário remover e recriar o evento com o novo conjunto de caracteres ou ordenação. Verifique se o evento está usando o mapeamento de ordenação do banco de dados correto. Para mais informações sobre como verificar a ordenação do banco de dados, consulte Verificar o mapeamento de ordenação do banco de dados.

Verificar a configuração das funções

Para verificar os valores das funções, use a seguinte instrução como exemplo.

SHOW FUNCTION STATUS WHERE db = 'DB_NAME';

Substitua DB_NAME pelo nome do banco de dados.

Para conferir a definição de uma função, use o exemplo de instrução a seguir.

SHOW CREATE FUNCTION DB_NAME.FUNCTION_NAME;

Substitua:

  • DB_NAME: o nome do banco de dados do MySQL
  • FUNCTION_NAME: o nome da função

Se a função não estiver usando o valor esperado do conjunto de caracteres ou da compilação, talvez seja necessário remover e recriar a função com o novo conjunto de caracteres ou ordenação. Verifique se a função está usando o mapeamento de ordenação do banco de dados correto. Para mais informações sobre como verificar a ordenação do banco de dados, consulte Verificar o mapeamento de ordenação do banco de dados.

I conjunto de caracteres ou ordenação. Verifique se a função está usando o mapeamento de ordenação do banco de dados correto. Para mais informações sobre como verificar a ordenação do banco de dados, consulte Verificar o mapeamento de ordenação do banco de dados.

Determinar o nível de atualizações que será usado

Depois de verificar a configuração do conjunto de caracteres e da ordenação do banco de dados, você terá uma lista de bancos de dados e possivelmente uma lista de objetos de banco de dados que precisam ser atualizadas.

O número de tarefas que você precisará executar depende do tipo dos objetos de banco de dados que exigem mudanças de configuração.

Fazer um backup da instância

Antes de fazer qualquer uma dessas atualizações, faça backup da sua instância. Para mais informações, consulte Criar um backup sob demanda. Recomendamos que você faça o backup sem operações DDL em execução na instância.

Gerar comandos de recriação para os objetos armazenados no banco de dados

Se você precisar excluir e recriar objetos de banco de dados armazenados com o novo conjunto de caracteres e ordenação, use a ferramenta mysqldump para gerar os comandos agora. Depois de atualizar o banco de dados e as colunas da tabela, use o arquivo mysqldump gerado para recriar os respectivos objetos armazenados no banco de dados. Esse comando gera instruções para todos os procedimentos, funções, gatilhos e eventos armazenados.

Execute o comando a seguir para usar a saída para recriar mais tarde todos os procedimentos, funções e eventos armazenados de um banco de dados específico (quando você recriar objetos de banco de dados armazenados).

$ 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

Substitua:

  • IP_ADDRESS: endereço IP da instância do Cloud SQL para MySQL
  • DB_NAME: o nome do banco de dados do MySQL

Executar atualizações nos bancos de dados e, se necessário, em tabelas e colunas

Nesta etapa, você atualizará os valores do conjunto de caracteres e da ordenação dos bancos de dados. Além disso, talvez seja necessário recriar as tabelas e colunas.

Executar atualizações no nível do banco de dados

Se você for realizar apenas atualizações no nível do banco de dados, execute a próxima instrução para atualizar o banco de dados:

ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

Substitua:

  • DB_NAME: o nome do banco de dados a ser atualizado
  • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado ao banco de dados
  • NEW_COLLATION: a nova ordenação a ser aplicada ao banco de dados

Realizar atualizações no banco de dados e no nível da tabela

Se você estiver executando atualizações no nível do banco de dados e da tabela, faça isto:

  1. Execute a instrução a seguir para atualizar o banco de dados:

    ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

    Substitua:

    • DB_NAME: o nome do banco de dados a ser atualizado
    • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado ao banco de dados
    • NEW_COLLATION: a nova ordenação a ser aplicada ao banco de dados
  2. Para cada tabela que você quer atualizar, execute a seguinte instrução:

    ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

    Substitua:

    • TABLE_NAME: o nome da tabela a ser atualizada
    • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
    • NEW_COLLATION: a nova ordenação a ser aplicada à tabela

Executar atualizações no nível do banco de dados, da tabela e da coluna

Nesse nível, é necessário codificar novamente os dados existentes para obedecer às novas configurações do conjunto de caracteres e da ordenação. Se você for executar atualizações no nível do banco de dados, da tabela e da coluna, faça isto:

  1. Antes de continuar com as atualizações nas colunas da tabela, analise as seguintes considerações:

    • A conversão do conjunto de caracteres e da ordenação ALTER TABLE faz com que a tabela seja recriada e bloqueada. Como resultado, qualquer consulta ativa que tente acesso à tabela será bloqueada.
    • A conversão do conjunto de caracteres e da ordenação ALTER TABLE leva tempo porque busca a tabela completa na memória. Essa operação pode aumentar a latência de qualquer carga de trabalho executada em paralelo porque as páginas de pool de buffers serão usadas na tabela atualizada.
    • Se houver consultas acessando várias tabelas e algumas delas forem atualizadas enquanto outras ainda não foram, as consultas poderão gerar resultados inconsistentes durante o período dessa operação.
    • O processo de execução de uma conversão do conjunto de caracteres e da ordenação ALTER TABLE cria uma tabela sombra. Portanto, planeje o uso do disco de acordo.
    • A conversão do conjunto de caracteres e da ordenação ALTER TABLE também faz com que todos os índices na tabela sejam recriados.
    • Não é necessário atualizar separadamente as instâncias de réplica. Os comandos ALTER, DROP e CREATE são replicados automaticamente. No entanto, a execução de comandos DDL pode aumentar o tempo de atraso da réplica durante a operação.
    • Se você restaurar qualquer um dos bancos de dados de um backup feito antes de ter aplicado essas atualizações, você precisará aplicá-las novamente.
  2. Verifique se há tuplas de dados na tabela que possam ser incompatíveis com o novo conjunto de caracteres. Se houver incompatibilidades, será necessário corrigi-las antes de atualizar o conjunto de caracteres. Caso contrário, você verá erros durante o processo de conversão. É possível usar as seguintes opções: instrução SELECT CONVERT para validar seus dados com novo conjunto de caracteres.

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

    Exemplo de saída:

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

    Neste exemplo, como a saída retorna essas três tuplas, há três valores inconsistentes que precisam ser corrigidos. Antes de avançar para a próxima etapa, examine a saída da consulta e corrija os dados até que a consulta retorne zero tupla para todas as colunas que precisam de conversão. Também é possível combinar várias colunas na mesma consulta SELECT.

  3. Escolha uma opção para atualizar o conjunto de caracteres e a ordenação das tabelas no nível da coluna.

  4. Para atualizar o conjunto de caracteres de uma coluna muito específica da tabela, siga as etapas na guia "Nível da coluna", em que você só precisa recodificar colunas selecionadas. Caso contrário, siga as etapas na guia "Nível da tabela", que recodifica a tabela completa.

    Tabela

    1. Execute a instrução a seguir para atualizar o banco de dados:

      ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Substitua:

      • DB_NAME: o nome do banco de dados a ser atualizado
      • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado ao banco de dados
      • NEW_COLLATION: a nova ordenação a ser aplicada ao banco de dados
    2. Para cada tabela afetada, execute a seguinte instrução para atualizar a tabela:

      ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Substitua:

      • TABLE_NAME: o nome da tabela a ser atualizada
      • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
      • NEW_COLLATION: a nova ordenação a ser aplicada à tabela
    3. Atualize no nível da tabela para que todas as colunas que fazem parte dela sejam atualizadas com o novo conjunto de caracteres e ordenação. Essa opção recria completamente a tabela. Para usar essa opção, execute a seguinte instrução:

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

      Substitua:

      • TABLE_NAME: o nome da tabela a ser atualizada
      • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
      • NEW_COLLATION: a nova ordenação a ser aplicada à tabela

    Coluna

    Atualize no nível da coluna. Essa opção também recria completamente a tabela. Se várias colunas forem atualizadas, essa opção poderá gerar várias recriações.

    Para usar essa opção, execute a seguinte instrução:

    1. Execute a instrução a seguir para atualizar o banco de dados:
    2. ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Substitua:

      • DB_NAME: o nome do banco de dados a ser atualizado
      • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado ao banco de dados
      • NEW_COLLATION: a nova ordenação a ser aplicada ao banco de dados
    3. Para cada tabela afetada, execute a seguinte instrução para atualizar a tabela:
    4. ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
       

      Substitua:

      • TABLE_NAME: o nome da tabela a ser atualizada
      • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
      • NEW_COLLATION: a nova ordenação a ser aplicada à tabela
    5. Execute a seguinte instrução para atualizar no nível da coluna:
    6. ALTER TABLE DB_NAME.TABLE_NAME
      MODIFY COLUMN_DEFINITION CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Substitua:

      • DB_NAME: o nome do banco de dados a ser atualizado
      • TABLE_NAME: o nome da tabela a ser atualizada
      • COLUMN_DEFINITION: especifique uma definição exata da coluna que inclui restrições. A definição da coluna pode conter os valores antigos do conjunto de caracteres e da ordenação. Atualize a definição da coluna com os novos valores.
      • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à coluna da tabela
      • NEW_COLLATION: a nova ordenação a ser aplicada à coluna da tabela

      Repita esta instrução para todas as colunas de string da tabela que precisam de uma atualização do conjunto de caracteres ou da ordenação.

Validar as atualizações e procurar erros

Durante a operação ALTER TABLE, procure erros que indiquem que os dados existentes na tabela não são compatíveis com o novo conjunto de caracteres. Exemplo:

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

Se você encontrar erros de compatibilidade de dados, recomendamos que verifique novamente se há erros de compatibilidade de dados nas tabelas e corrija-os antes de executar novamente as instruções ALTER TABLE para recodificar os dados.

Além disso, durante a operação ALTER TABLE, as tabelas (a tabela de chave externa e a tabela referenciada) podem falhar em uma verificação de chave externa enquanto a coluna é codificada novamente. Se isso acontecer, desative a verificação de chave externa (SET FOREIGN_KEY_CHECKS=0;) e execute a atualização novamente.

Recriar os objetos de banco de dados armazenados

Depois de atualizar o banco de dados, será possível usar o arquivo mysqldump gerado para recriar os objetos de banco de dados armazenados com os valores do conjunto de caracteres e da ordenação.

Para recriar os objetos de banco de dados armazenados, faça isto:

  1. Verifique se os respectivos objetos armazenados estão presentes no banco de dados.
  2. Verifique se não há uma carga paralela que espere que os objetos de banco de dados armazenados estejam presentes durante esse período de remoção e recriação.
  3. O arquivo mysqldump que você gerou com a ferramenta mysqldump não inclui a instrução para remover gatilhos. Se você precisar remover gatilhos, abra um terminal do MySQL para gerar a instrução DROP para gatilhos.

    mysql> SELECT CONCAT('DROP TRIGGER ', TRIGGER_NAME, ';') AS
    drop_trigger_statements FROM information_schema.TRIGGERS
    WHERE TRIGGER_SCHEMA = DB_NAME;
  4. Copie a saída.

  5. Execute a instrução para remover os gatilhos do banco de dados, seja em um shell do MySQL ou em um script.

  6. Depois de remover os gatilhos, aplique o arquivo dump que você gerou com a ferramenta mysqldump. Para aplicar o arquivo dump e recriar os objetos, digite isto:

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

    Substitua:

    • IP_ADDRESS: endereço IP da instância do Cloud SQL para MySQL
    • DB_NAME: o nome do banco de dados

Fazer outro backup da instância

Depois de concluir as atualizações, faça outro backup da instância. Para mais informações, consulte Criar um backup sob demanda.

Scripts de exemplo

Se você precisar atualizar bancos de dados, tabelas e colunas, use os scripts de exemplo nesta seção para ajudar a recodificar seus dados.

Script para atualizar várias tabelas

O script a seguir gera uma instrução para todas as tabelas no banco de dados especificado. Com a instrução, você codificar novamente os dados existentes para obedecer às novas configurações do conjunto de caracteres e da ordenação.

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

Substitua:

  • DB_NAME: o nome do banco de dados a ser atualizado
  • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
  • NEW_COLLATION: a nova ordenação a ser aplicada à tabela

Exemplo de saída:

+--------------------------------------------------------------------------------------------+
|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>;       |
+--------------------------------------------------------------------------------------------+

Script para atualizar várias colunas em uma tabela

O script a seguir gera uma instrução para todas as colunas em uma determinada tabela. Com a instrução, você codificar novamente os dados existentes para obedecer às novas configurações do conjunto de caracteres e da ordenação.

  1. Gerar instruções ALTER TABLE para todas as tabelas no banco de dados

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

    Substitua:

    • DB_NAME: o nome do banco de dados a ser atualizado
    • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
    • NEW_COLLATION: a nova ordenação a ser aplicada à tabela

    Exemplo de saída:

    +------------------------------------------------------------------------------+
    | alter_table_statements                                                       |
    +------------------------------------------------------------------------------+
    | ALTER TABLE test1.t1 CHARACTER SET <new-charset> COLLATE <new-collation>;    |
    +------------------------------------------------------------------------------+
    
  2. Para cada tabela, gere comandos 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');

    Substitua:

    • DB_NAME: o nome do banco de dados a ser atualizado
    • TABLE_NAME: o nome da tabela a ser atualizada
    • COLUMN_DEFINITION: depois de extrair os resultados de cada consulta, substitua pela definição da coluna para cada coluna (as definições das colunas podem variar entre as colunas)
    • NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à coluna da tabela
    • NEW_COLLATION: a nova ordenação a ser aplicada à coluna da tabela

    Exemplo de saída:

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

A seguir