Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mudando do MySQL 5.7 para o MySQL 8.0 - O que você deve saber

Abril de 2018 não é apenas uma data para o mundo MySQL. O MySQL 8.0 foi lançado lá e, mais de 1 ano depois, provavelmente é hora de considerar a migração para esta nova versão.

O MySQL 8.0 possui importantes melhorias de desempenho e segurança e, como em toda migração para uma nova versão de banco de dados, há várias coisas a serem consideradas antes de entrar em produção para evitar problemas difíceis como perda de dados, tempo de inatividade ou até mesmo uma reversão durante a tarefa de migração.

Neste blog, mencionaremos alguns dos novos recursos do MySQL 8.0, algumas coisas obsoletas e o que você precisa ter em mente antes de migrar.

O que há de novo no MySQL 8.0?

Vamos agora resumir alguns dos recursos mais importantes mencionados na documentação oficial desta nova versão do MySQL.

  • O MySQL incorpora um dicionário de dados transacionais que armazena informações sobre objetos de banco de dados.
  • Uma instrução DDL atômica combina as atualizações do dicionário de dados, as operações do mecanismo de armazenamento e as gravações de log binário associadas a uma operação DDL em uma única transação atômica.
  • O servidor MySQL executa automaticamente todas as tarefas de atualização necessárias na próxima inicialização para atualizar as tabelas do sistema no esquema mysql, bem como objetos em outros esquemas, como o esquema sys e os esquemas de usuário. Não é necessário que o DBA invoque mysql_upgrade.
  • Ele suporta a criação e o gerenciamento de grupos de recursos e permite atribuir threads em execução no servidor a grupos específicos para que os threads sejam executados de acordo com os recursos disponíveis para o grupo.
  • A criptografia de tabela agora pode ser gerenciada globalmente definindo e aplicando padrões de criptografia. A variável default_table_encryption define um padrão de criptografia para esquemas recém-criados e tablespace geral. Os padrões de criptografia são aplicados ativando a variável table_encryption_privilege_check.
  • O conjunto de caracteres padrão mudou de latin1 para utf8mb4.
  • Ele suporta o uso de expressões como valores padrão em especificações de tipo de dados. Isso inclui o uso de expressões como valores padrão para os tipos de dados BLOB, TEXT, GEOMETRY e JSON.
  • O registro de erros foi reescrito para usar a arquitetura de componentes do MySQL. O log de erros tradicional é implementado usando componentes integrados, e o log usando o log do sistema é implementado como um componente carregável.
  • Um novo tipo de bloqueio de backup permite DML durante um backup online, evitando operações que podem resultar em um instantâneo inconsistente. O novo bloqueio de backup é suportado pela sintaxe LOCK INSTANCE FOR BACKUP e UNLOCK INSTANCE. O privilégio BACKUP_ADMIN é necessário para usar essas instruções.
  • O MySQL Server agora permite que uma porta TCP/IP seja configurada especificamente para conexões administrativas. Isso fornece uma alternativa à conexão administrativa única permitida nas interfaces de rede usadas para conexões comuns, mesmo quando as conexões max_connections já estão estabelecidas.
  • Ele suporta índices invisíveis. Esse índice não é usado pelo otimizador e possibilita testar o efeito da remoção de um índice no desempenho da consulta, sem removê-lo.
  • Armazenamento de documentos para desenvolver aplicativos de documentos SQL e NoSQL usando um único banco de dados.
  • O MySQL 8.0 possibilita a persistência de variáveis ​​globais e dinâmicas do servidor usando o comando SET PERSIST em vez do comando SET GLOBAL usual.

Segurança do MySQL e gerenciamento de contas

Como há muitas melhorias relacionadas à segurança e gerenciamento de usuários, vamos listá-las em uma seção separada.

  • As tabelas de permissões no banco de dados do sistema mysql agora são tabelas InnoDB.
  • O novo plug-in de autenticação caching_sha2_password agora é o método de autenticação padrão no MySQL 8.0. Ele implementa o hash de senha SHA-256, mas usa o cache para resolver problemas de latência no momento da conexão. Ele fornece criptografia de senha mais segura do que o plug-in mysql_native_password e oferece melhor desempenho do que sha256_password.
  • O MySQL agora oferece suporte a funções, que são coleções nomeadas de privilégios. As funções podem ter privilégios concedidos e revogados, e podem ser concedidos e revogados de contas de usuário.
  • O MySQL agora mantém informações sobre o histórico de senhas, permitindo restrições à reutilização de senhas anteriores.
  • Permite que os administradores configurem contas de usuário de forma que muitas falhas consecutivas de login devido a senhas incorretas causem bloqueio temporário de conta.

Aprimoramentos do InnoDB

Assim como no ponto anterior, também existem muitas melhorias relacionadas a este tópico, então as listaremos em uma seção separada também.

  • O valor máximo atual do contador de incremento automático é gravado no log de redo sempre que o valor é alterado e salvo em uma tabela de sistema privada do mecanismo em cada ponto de verificação. Essas alterações tornam o valor do contador de incremento automático máximo atual persistente nas reinicializações do servidor
  • Ao encontrar corrupção na árvore de índice, o InnoDB grava um sinalizador de corrupção no redo log, o que torna o sinalizador de corrupção seguro contra falhas. O InnoDB também grava dados de sinalização de corrupção na memória em uma tabela de sistema privada do mecanismo em cada ponto de verificação. Durante a recuperação, o InnoDB lê os sinalizadores de corrupção de ambos os locais e mescla os resultados antes de marcar a tabela na memória e os objetos de índice como corrompidos.
  • Uma nova variável dinâmica, innodb_deadlock_detect, pode ser usada para desabilitar a detecção de deadlock. Em sistemas de alta simultaneidade, a detecção de deadlock pode causar uma lentidão quando vários threads aguardam o mesmo bloqueio. Às vezes, pode ser mais eficiente desabilitar a detecção de deadlock e confiar na configuração innodb_lock_wait_timeout para reversão de transação quando ocorre um deadlock.
  • As tabelas temporárias do InnoDB agora são criadas no tablespace temporário compartilhado, ibtmp1.
  • as tabelas do sistema mysql e as tabelas do dicionário de dados agora são criadas em um único arquivo de tablespace InnoDB chamado mysql.ibd no diretório de dados MySQL. Anteriormente, essas tabelas eram criadas em arquivos de tablespace individuais do InnoDB no diretório do banco de dados mysql.
  • Por padrão, os logs de undo agora residem em dois tablespaces de undo que são criados quando a instância do MySQL é inicializada. Os logs de desfazer não são mais criados no tablespace do sistema.
  • A nova variável innodb_dedicated_server, que está desabilitada por padrão, pode ser usada para que o InnoDB configure automaticamente as seguintes opções de acordo com a quantidade de memória detectada no servidor:innodb_buffer_pool_size, innodb_log_file_size e innodb_flush_method. Esta opção destina-se a instâncias do servidor MySQL que são executadas em um servidor dedicado.
  • Os arquivos de tablespace podem ser movidos ou restaurados para um novo local enquanto o servidor estiver offline usando a opção innodb_directories.

Agora, vamos dar uma olhada em alguns dos recursos que você não deve mais usar nesta nova versão do MySQL.

O que está obsoleto no MySQL 8.0?

Os seguintes recursos estão obsoletos e serão removidos em uma versão futura.

  • O conjunto de caracteres utf8mb3 está obsoleto. Em vez disso, use utf8mb4.
  • Como caching_sha2_password é o plug-in de autenticação padrão no MySQL 8.0 e fornece um superconjunto dos recursos do plug-in de autenticação sha256_password, o sha256_password está obsoleto.
  • O plug-in validate_password foi reimplementado para usar a infraestrutura do componente do servidor. O formulário de plug-in de validate_password ainda está disponível, mas está obsoleto.
  • A cláusula ENGINE para as instruções ALTER TABLESPACE e DROP TABLESPACE.
  • O modo SQL PAD_CHAR_TO_FULL_LENGTH.
  • O suporte para
  • AUTO_INCREMENT está obsoleto para colunas do tipo FLOAT e DOUBLE (e quaisquer sinônimos). Considere remover o atributo AUTO_INCREMENT dessas colunas ou convertê-los em um tipo inteiro.
  • O atributo UNSIGNED está obsoleto para colunas do tipo FLOAT, DOUBLE e DECIMAL (e quaisquer sinônimos). Considere usar uma restrição CHECK simples para essas colunas.
  • A sintaxe
  • FLOAT(M,D) e DOUBLE(M,D) para especificar o número de dígitos para colunas do tipo FLOAT e DOUBLE (e quaisquer sinônimos) é uma extensão não padrão do MySQL. Esta sintaxe está obsoleta.
  • O estilo C não padrão &&, || e ! os operadores que são sinônimos dos operadores SQL AND, OR e NOT padrão, respectivamente, estão obsoletos. Os aplicativos que usam os operadores não padrão devem ser ajustados para usar os operadores padrão.
  • O cliente mysql_upgrade está obsoleto porque seus recursos para atualizar as tabelas do sistema no esquema do sistema mysql e objetos em outros esquemas foram movidos para o servidor MySQL.
  • O arquivo mysql_upgrade_info, que é o diretório de dados criado e usado para armazenar o número da versão do MySQL.
  • A variável de sistema relay_log_info_file e a opção --master-info-file estão obsoletas. Anteriormente, eles eram usados ​​para especificar o nome do log de informações do log de retransmissão e do log de informações do mestre quando relay_log_info_repository=FILE e master_info_repository=FILE eram definidos, mas essas configurações foram preteridas. O uso de arquivos para o log de informações do log de retransmissão e o log de informações do mestre foi substituído por tabelas escravas à prova de colisão, que são o padrão no MySQL 8.0.
  • O uso da variável de ambiente MYSQL_PWD para especificar uma senha do MySQL está obsoleto.

E agora, vamos dar uma olhada em alguns dos recursos que você deve parar de usar nesta versão do MySQL.

O que foi removido no MySQL 8.0?

Os seguintes recursos foram removidos no MySQL 8.0.

  • A variável de sistema innodb_locks_unsafe_for_binlog foi removida. O nível de isolamento READ COMMITTED fornece funcionalidade semelhante.
  • Usando GRANT para criar usuários. Em vez disso, use CREATE USER. Seguir esta prática torna o modo SQL NO_AUTO_CREATE_USER irrelevante para instruções GRANT, então ele também é removido, e um erro agora é gravado no log do servidor quando a presença deste valor para a opção sql_mode no arquivo de opções impede o mysqld de iniciar.

    l>
  • Usando GRANT para modificar as propriedades da conta além das atribuições de privilégios. Isso inclui autenticação, SSL e propriedades de limite de recursos. Em vez disso, estabeleça essas propriedades no momento da criação da conta com CREATE USER ou modifique-as posteriormente com ALTER USER.
  • IDENTIFICADO POR SENHA Sintaxe 'auth_string' para CREATE USER e GRANT. Em vez disso, use IDENTIFIED WITH auth_plugin AS 'auth_string' para CREATE USER e ALTER USER, onde o valor de 'auth_string' está em um formato compatível com o plug-in nomeado.
  • A função SENHA(). Além disso, a remoção de PASSWORD() significa que a sintaxe SET PASSWORD ... =PASSWORD('auth_string') não está mais disponível.
  • A variável de sistema old_passwords.
  • As instruções FLUSH QUERY CACHE e RESET QUERY CACHE.
  • Estas variáveis ​​de sistema:query_cache_limit, query_cache_min_res_unit, query_cache_size, query_cache_type, query_cache_wlock_invalidate.
  • Estas variáveis ​​de status:Qcache_free_blocks, Qcache_free_memory, Qcache_hits, Qcache_inserts, Qcache_lowmem_prunes, Qcache_not_cached, Qcache_queries_in_cache, Qcache_total_blocks.
  • Esses threads indicam:verificando privilégios na consulta em cache, verificando o cache de consulta para uma consulta, invalidando entradas de cache de consulta, enviando resultados em cache para o cliente, armazenando resultado no cache de consulta, aguardando bloqueio de cache de consulta.
  • As variáveis ​​de sistema tx_isolation e tx_read_only foram removidas. Use transaction_isolation e transaction_read_only.
  • A variável de sistema sync_frm foi removida porque os arquivos .frm se tornaram obsoletos.
  • A variável de sistema secure_auth e a opção de cliente --secure-auth foram removidas. A opção MYSQL_SECURE_AUTH para a função da API C mysql_options() foi removida.
  • A variável de sistema log_warnings e a opção de servidor --log-warnings foram removidas. Em vez disso, use a variável de sistema log_error_verbosity.
  • O escopo global da variável de sistema sql_log_bin foi removido. sql_log_bin tem apenas escopo de sessão, e os aplicativos que dependem do acesso @@GLOBAL.sql_log_bin devem ser ajustados.
  • As variáveis ​​de sistema date_format, datetime_format, time_format e max_tmp_tables não utilizadas são removidas.
  • Os qualificadores ASC ou DESC obsoletos para cláusulas GROUP BY foram removidos. Consultas que anteriormente dependiam da classificação GROUP BY podem produzir resultados diferentes das versões anteriores do MySQL. Para produzir uma determinada ordem de classificação, forneça uma cláusula ORDER BY.
  • O analisador não trata mais \N como sinônimo de NULL em instruções SQL. Use NULL em vez disso. Essa alteração não afeta as operações de importação ou exportação de arquivos de texto executadas com LOAD DATA ou SELECT ... INTO OUTFILE, para as quais NULL continua sendo representado por \N.
  • As opções --ssl e --ssl-verify-server-cert do lado do cliente foram removidas. Use --ssl-mode=REQUIRED em vez de --ssl=1 ou --enable-ssl. Use --ssl-mode=DISABLED em vez de --ssl=0, --skip-ssl ou --disable-ssl. Use --ssl-mode=VERIFY_IDENTITY em vez das opções --ssl-verify-server-cert.
  • O programa mysql_install_db foi removido das distribuições MySQL. A inicialização do diretório de dados deve ser executada invocando o mysqld com a opção --initialize ou --initialize-insecure. Além disso, a opção --bootstrap para mysqld que era usada por mysql_install_db foi removida, e a opção INSTALL_SCRIPTDIR CMake que controlava o local de instalação para mysql_install_db foi removida.
  • O utilitário mysql_plugin foi removido. As alternativas incluem carregar plugins na inicialização do servidor usando a opção --plugin-load ou --plugin-load-add, ou em tempo de execução usando a instrução INSTALL PLUGIN.
  • O utilitário resolveip foi removido. nslookup, host ou dig podem ser usados ​​em vez disso.

Há muitos recursos novos, obsoletos e removidos. Você pode verificar o site oficial para obter informações mais detalhadas.

Considerações antes de migrar para o MySQL 8.0

Vamos mencionar agora algumas das coisas mais importantes a serem consideradas antes de migrar para esta versão do MySQL.

Método de autenticação

Como mencionamos, caching_sha2_password não é o método de autenticação padrão, portanto, você deve verificar se seu aplicativo/conector o suporta. Caso contrário, vamos ver como você pode alterar o método de autenticação padrão e o plugin de autenticação do usuário para ‘mysql_native_password’ novamente.

Para alterar o método de autenticação padrão, edite o arquivo de configuração my.cnf e adicione/edite a seguinte linha:

$ vi /etc/my.cnf

[mysqld]

default_authentication_plugin=mysql_native_password

Para alterar o plugin de autenticação do usuário, execute o seguinte comando com um usuário privilegiado:

$ mysql -p

ALTER USER ‘username’@’hostname’ IDENTIFIED WITH ‘mysql_native_password’ BY ‘password’;

De qualquer forma, essas alterações não são uma solução permanente, pois a autenticação antiga pode ser descontinuada em breve, portanto, você deve considerá-la para uma futura atualização do banco de dados.

Também as funções são um recurso importante aqui. Você pode reduzir os privilégios individuais atribuindo-o a uma função e adicionando os usuários correspondentes lá.

Por exemplo, você pode criar uma nova função para as equipes de marketing e desenvolvedores:

$ mysql -p

CREATE ROLE 'marketing', 'developers';

Atribua privilégios a estas novas funções:

GRANT SELECT ON *.* TO 'marketing';

GRANT ALL PRIVILEGES ON *.* TO 'developers';

E então, atribua a função aos usuários:

GRANT 'marketing' TO 'marketing1'@'%';

GRANT 'marketing' TO 'marketing2'@'%';

GRANT 'developers' TO 'developer1'@'%';

E é isso. Você terá os seguintes privilégios:

SHOW GRANTS FOR 'marketing1'@'%';

+-------------------------------------------+

| Grants for [email protected]%                   |

+-------------------------------------------+

| GRANT USAGE ON *.* TO `marketing1`@`%`    |

| GRANT `marketing`@`%` TO `marketing1`@`%` |

+-------------------------------------------+

2 rows in set (0.00 sec)

SHOW GRANTS FOR 'marketing';

+----------------------------------------+

| Grants for [email protected]%                 |

+----------------------------------------+

| GRANT SELECT ON *.* TO `marketing`@`%` |

+----------------------------------------+

1 row in set (0.00 sec)

Conjuntos de caracteres

Como o novo conjunto de caracteres padrão é utf8mb4, você deve se certificar de que não está usando o padrão, pois ele será alterado.

Para evitar alguns problemas, você deve especificar as variáveis ​​character_set_server e collation_server no arquivo de configuração my.cnf.

$ vi /etc/my.cnf

[mysqld]

character_set_server=latin1

collation_server=latin1_swedish_ci

Mecanismo MyISAM

As tabelas de privilégios do MySQL no esquema do MySQL são movidas para o InnoDB. Você pode criar uma tabela engine=MyISAM, e ela funcionará como antes, mas copiar uma tabela MyISAM em um servidor MySQL em execução não funcionará porque ela não será descoberta.

Particionamento

Não deve haver tabelas particionadas que usem um mecanismo de armazenamento que não tenha suporte de particionamento nativo. Você pode executar a consulta a seguir para verificar esse ponto.

$ mysql -p

SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';

Se você precisar alterar o mecanismo de uma tabela, você pode executar:

ALTER TABLE table_name ENGINE = INNODB;

Verificação de atualização

Como último passo, você pode executar o comando mysqlcheck usando o sinalizador check-upgrade para confirmar se está tudo bem.

$ mysqlcheck -uroot -p --all-databases --check-upgrade

Enter password:

mysql.columns_priv                                 OK

mysql.component                                    OK

mysql.db                                           OK

mysql.default_roles                                OK

mysql.engine_cost                                  OK

mysql.func                                         OK

mysql.general_log                                  OK

mysql.global_grants                                OK

mysql.gtid_executed                                OK

mysql.help_category                                OK

mysql.help_keyword                                 OK

mysql.help_relation                                OK

mysql.help_topic                                   OK

mysql.innodb_index_stats                           OK

mysql.innodb_table_stats                           OK

mysql.password_history                             OK

mysql.plugin                                       OK

mysql.procs_priv                                   OK

mysql.proxies_priv                                 OK

mysql.role_edges                                   OK

mysql.server_cost                                  OK

mysql.servers                                      OK

mysql.slave_master_info                            OK

mysql.slave_relay_log_info                         OK

mysql.slave_worker_info                            OK

mysql.slow_log                                     OK

mysql.tables_priv                                  OK

mysql.time_zone                                    OK

mysql.time_zone_leap_second                        OK

mysql.time_zone_name                               OK

mysql.time_zone_transition                         OK

mysql.time_zone_transition_type                    OK

mysql.user                                         OK

sys.sys_config                                     OK

world_x.city                                       OK

world_x.country                                    OK

world_x.countryinfo                                OK

world_x.countrylanguage                            OK

Há várias coisas a serem verificadas antes de realizar a atualização. Você pode verificar a documentação oficial do MySQL para obter informações mais detalhadas.

Métodos de atualização

Existem diferentes maneiras de atualizar o MySQL 5.7 para 8.0. Você pode usar a atualização in-loco ou até mesmo criar um escravo de replicação na nova versão, para poder promovê-la posteriormente.

Mas antes de atualizar, a etapa 0 deve fazer backup de seus dados. O backup deve incluir todos os bancos de dados, incluindo os bancos de dados do sistema. Portanto, se houver algum problema, você poderá reverter o mais rápido possível.

Outra opção, dependendo dos recursos disponíveis, pode ser criar uma replicação em cascata MySQL 5.7 -> MySQL 8.0 -> MySQL 5.7, então após promover a nova versão, caso algo dê errado, você pode promover a nó escravo com a versão antiga de volta. Mas pode ser perigoso se houver algum problema com os dados, portanto, o backup é obrigatório antes disso.

Para que qualquer método seja utilizado, é necessário um ambiente de teste para verificar se a aplicação está funcionando sem problemas usando a nova versão do MySQL 8.0.

Conclusão


Mais de 1 ano após o lançamento do MySQL 8.0, é hora de começar a pensar em migrar sua versão antiga do MySQL, mas felizmente, como o fim do suporte ao MySQL 5.7 é 2023, você tem tempo para criar um plano de migração e testar o comportamento da aplicação sem pressa. É necessário passar algum tempo nessa etapa de teste para evitar qualquer problema após a migração.