O MySQL 8.0 já está conosco há algum tempo e muitos usuários do MySQL já atualizaram para esta versão. Para quem ainda está usando versões mais antigas do MySQL, gostaríamos de apresentar este blog onde compartilharemos algumas dicas e informações que auxiliam no processo de atualização para o MySQL 8.0.
Lembre-se de sua versão
Versões de software são muito importantes no processo de atualização. Para iniciantes, apenas uma diferença de versão principal é suportada. Você precisa estar executando o MySQL 5.7 antes de atualizar para o MySQL 8.0. Isso é muito importante ter em mente, pois o MySQL 5.6 está chegando ao fim da vida útil e não será mais suportado. Para todos vocês que usam o MySQL 5.6, você deve certificar-se de atualizá-lo para o MySQL 5.7 primeiro e depois, eventualmente, para o MySQL 8.0.
O que é altamente recomendado é que você atualize para a versão mais recente disponível para MySQL 5.7. No momento em que escrevo este blog, era 5.7.31, mas isso eventualmente mudará, você sempre pode procurar no site do MySQL.
Observe também que não há suporte para atualizações de versões não GA (e para não GA). Não que faça sentido rodar versões não GA em produção, mas queríamos deixar isso claro também.
É uma passagem só de ida
Sempre que você decidir realizar a atualização, esteja ciente de que, uma vez concluída a atualização, não há como voltar atrás. As mudanças não são compatíveis e você simplesmente não pode usar o diretório de dados do MySQL 8.0 no MySQL 5.7. Certifique-se de fazer um backup dos dados do MySQL 5.7 diretamente antes da atualização - você poderá restaurá-los na instância do MySQL 5.7 caso precise reverter a alteração. Lembre-se também, pois pode ser uma surpresa, que a atualização do MySQL 8.0.x para o MySQL 8.0.x+1 também pode não ser compatível e, mesmo sendo uma atualização de versão menor, você não deve esperar esse downgrade seria possível. Este é o resultado do ciclo de implantação da Oracle - em vez de fazer o congelamento de recursos para o branch mais recente do GA, como era o caso das versões anteriores, novos recursos, às vezes incompatíveis, são enviados como novos lançamentos do branch 8.0.
O upgrade in-loco é uma opção
No passado, nem sempre era possível realizar uma atualização in-loco do MySQL. Em alguns casos, você foi forçado a despejar os dados no formato SQL e, em seguida, carregá-los de volta para a nova versão. Felizmente, o MySQL 8.0 é mais amigável ao administrador e a atualização no local é suportada. Tudo o que você precisa fazer é executar o apt upgrade ou yum update e está tudo pronto. A atualização é ainda mais conveniente - no passado, era preciso ter em mente executar mysql_upgrade para garantir que todas as tabelas do sistema fossem atualizadas adequadamente para o formato exigido pela nova versão do MySQL. No MySQL 8.0, a partir do MySQL 8.0.16, isso não é mais necessário - tudo o que você precisa fazer é iniciar o processo MySQL, mysqld, e, por padrão, a atualização será realizada sobre o dicionário de dados e outros esquemas do sistema sempre que for necessário determinado ser necessário. É possível alterar esse comportamento passando parâmetros diferentes para a opção de servidor --upgrade, mas na maioria dos casos você gostaria de se beneficiar dessa melhoria.
Estou seguro para atualizar?
É claro que existem pré-requisitos para a atualização segura. Vamos dar uma olhada em alguns métodos que devem ajudá-lo a garantir que você possa atualizar com segurança para o MySQL 8.0.
Verificações de integridade
Antes de tentar qualquer coisa, você deve verificar novamente se sua configuração existente do MySQL 5.7 marca todas as caixas na lista de verificação de sanidade antes de atualizar para o MySQL 8.0. A documentação do MySQL apresenta uma extensa lista de coisas para testar. Não faz sentido revisar a lista aqui, pois ela é abordada na documentação do MySQL, mas aqui estão alguns pontos que você pode querer manter em mente.
Primeiro, o particionamento agora é suportado apenas em mecanismos que o implementam, que são apenas NDB e InnoDB. Certifique-se de que todas as tabelas particionadas usem um desses mecanismos de armazenamento ou que você remova o particionamento antes da atualização.
Você pode querer executar
mysqlcheck -u root -p --all-databases --check-upgrade
para verificar se as tabelas estão no formato adequado.
Há também outras verificações que você deve realizar - quase toda nova versão do MySQL vem com uma lista atualizada de palavras reservadas e você deve verificar se não as usa em seu banco de dados. Você precisa verificar os nomes de restrição de chave estrangeira, eles não podem ter mais de 64 caracteres. Algumas opções para sql_mode foram removidas, portanto, certifique-se de não usá-las. Como mencionamos, há uma extensa lista de coisas para testar.
Resgate do MySQL Shell
Testar todas essas condições é bastante demorado, portanto, a Oracle criou uma opção no MySQL Shell que se destina a executar uma série de testes para verificar se sua instalação existente é segura para atualizar para o MySQL 8.0. Para começar, se você não tiver o MySQL Shell instalado, faça isso. Você pode encontrar downloads no site da Oracle. Depois de configurá-lo, você pode se conectar ao seu MySQL 5.7 e executar o teste. Vamos ver como pode ficar:
[email protected]:~# mysqlsh
MySQL Shell 8.0.21
Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.
Type '\help' or '\?' for help; '\quit' to exit.
MySQL JS > \c [email protected]
Creating a session to '[email protected]'
Please provide the password for '[email protected]': ****
Save password for '[email protected]'? [Y]es/[N]o/Ne[v]er (default No):
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 71 (X protocol)
Server version: 5.7.31-log MySQL Community Server (GPL)
No default schema selected; type \use <schema> to set one.
Conectamos à instância MySQL no host local usando o MySQL Shell. Agora podemos executar a verificação. Passaremos o caminho para o arquivo de configuração para testes mais extensos:
MySQL localhost:33060+ ssl JS > util.checkForServerUpgrade({"configPath":"/etc/mysql/my.cnf"})
Então temos uma saída longa.
The MySQL server at localhost:33060, version 5.7.31-log - MySQL Community
Server (GPL), will now be checked for compatibility issues for upgrade to MySQL
8.0.21...
1) Usage of old temporal type
No issues found
2) Usage of db objects with names conflicting with new reserved keywords
No issues found
3) Usage of utf8mb3 charset
No issues found
4) Table names in the mysql schema conflicting with new tables in 8.0
No issues found
5) Partitioned tables using engines with non native partitioning
No issues found
6) Foreign key constraint names longer than 64 characters
No issues found
7) Usage of obsolete MAXDB sql_mode flag
No issues found
8) Usage of obsolete sql_mode flags
No issues found
9) ENUM/SET column definitions containing elements longer than 255 characters
No issues found
10) Usage of partitioned tables in shared tablespaces
No issues found
11) Circular directory references in tablespace data file paths
No issues found
12) Usage of removed functions
No issues found
13) Usage of removed GROUP BY ASC/DESC syntax
No issues found
14) Removed system variables for error logging to the system log configuration
No issues found
15) Removed system variables
Error: Following system variables that were detected as being used will be
removed. Please update your system to not rely on them before the upgrade.
More information:
https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html#optvars-removed
log_warnings - is set and will be removed, consider using log_error_verbosity
instead
query_cache_size - is set and will be removed
query_cache_type - is set and will be removed
16) System variables with new default values
Warning: Following system variables that are not defined in your
configuration file will have new default values. Please review if you rely on
their current values and if so define them before performing upgrade.
More information:
https://mysqlserverteam.com/new-defaults-in-mysql-8-0/
back_log - default value will change
character_set_server - default value will change from latin1 to utf8mb4
collation_server - default value will change from latin1_swedish_ci to
utf8mb4_0900_ai_ci
event_scheduler - default value will change from OFF to ON
explicit_defaults_for_timestamp - default value will change from OFF to ON
innodb_flush_neighbors - default value will change from 1 (enable) to 0
(disable)
innodb_max_dirty_pages_pct - default value will change from 75 (%) 90 (%)
innodb_max_dirty_pages_pct_lwm - default value will change from_0 (%) to 10
(%)
innodb_undo_log_truncate - default value will change from OFF to ON
innodb_undo_tablespaces - default value will change from 0 to 2
log_error_verbosity - default value will change from 3 (Notes) to 2 (Warning)
max_error_count - default value will change from 64 to 1024
optimizer_trace_max_mem_size - default value will change from 16KB to 1MB
performance_schema_consumer_events_transactions_current - default value will
change from OFF to ON
performance_schema_consumer_events_transactions_history - default value will
change from OFF to ON
slave_rows_search_algorithms - default value will change from 'INDEX_SCAN,
TABLE_SCAN' to 'INDEX_SCAN, HASH_SCAN'
transaction_write_set_extraction - default value will change from OFF to
XXHASH64
17) Zero Date, Datetime, and Timestamp values
No issues found
18) Schema inconsistencies resulting from file removal or corruption
No issues found
19) Tables recognized by InnoDB that belong to a different engine
No issues found
20) Issues reported by 'check table x for upgrade' command
No issues found
21) New default authentication plugin considerations
Warning: The new default authentication plugin 'caching_sha2_password' offers
more secure password hashing than previously used 'mysql_native_password'
(and consequent improved client connection authentication). However, it also
has compatibility implications that may affect existing MySQL installations.
If your MySQL installation must serve pre-8.0 clients and you encounter
compatibility issues after upgrading, the simplest way to address those
issues is to reconfigure the server to revert to the previous default
authentication plugin (mysql_native_password). For example, use these lines
in the server option file:
[mysqld]
default_authentication_plugin=mysql_native_password
However, the setting should be viewed as temporary, not as a long term or
permanent solution, because it causes new accounts created with the setting
in effect to forego the improved authentication security.
If you are using replication please take time to understand how the
authentication plugin changes may impact you.
More information:
https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatibility-issues
https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-replication
Errors: 3
Warnings: 18
Notices: 0
3 errors were found. Please correct these issues before upgrading to avoid compatibility issues.
Como você pode ver, foram realizados 21 testes no total, a verificação encontrou 3 erros relacionados às opções de configuração que não existirão no MySQL 8.0.21. Os testes são bastante detalhados. Entre outras coisas, você aprenderá sobre alterações nos valores padrão para variáveis que você não configurou em sua configuração do MySQL (portanto, essas configurações serão alteradas quando você instalar o MySQL 8.0).
Reversão de uma atualização com falha
Como mencionamos antes, você não pode fazer downgrade do MySQL 8.0 uma vez que a atualização esteja completa. Felizmente, isso não significa que você não pode reverter a atualização se ela falhar no meio. Na verdade, isso acontece de forma semi-automática caso um dos problemas que discutimos na seção anterior seja detectado. A única ação manual necessária seria remover os logs de redo e iniciar o MySQL 5.7 para resolver os problemas detectados durante a atualização. Em seguida, você deve executar um desligamento lento (innodb_fast_shutdown=0) para garantir que tudo seja gravado nos espaços de tabela e, em seguida, você estará pronto para tentar o upgrade mais uma vez.
Dicas finais
Existem duas mudanças bastante importantes no comportamento padrão que vem com o MySQL 8.0 que gostaríamos de destacar.
Caching_sha2_password como padrão
Certifique-se de verificar novamente se seus aplicativos e proxies funcionarão corretamente com o plug-in de autenticação caching_sha2_password, pois ele se torna o padrão no MySQL 8.0. Aplicativos mais antigos podem ser afetados e não conseguir se conectar ao banco de dados. Claro, você pode alterar isso para qualquer plug-in de autenticação que desejar (como mysql_native_password, por exemplo, pois era o padrão nas versões anteriores do MySQL), portanto, não é um bloqueador de forma alguma. É apenas algo para se lembrar de testar antes da atualização para que você não acabe com o MySQL 8.0 e aplicativos que não podem se conectar a ele, a menos que você reconfigure seu banco de dados para usar um mecanismo de autenticação mais antigo.
UTF8mb4 como o conjunto de caracteres padrão
Isso não deve ser uma surpresa, considerando o quão amplamente alterado para UTF8 foi discutido na comunidade, mas esse é o fato - o MySQL 8.0 vem com o charset UTF8mb4 como padrão. Isso tem algum impacto adicional que você deve estar ciente. Primeiro, o tamanho do seu conjunto de dados pode aumentar se você usar o conjunto de caracteres UTF8mb4. Isso faz com que os buffers de memória sejam capazes de armazenar quantidades menores de dados do que os dados com o conjunto de caracteres latino1. Em segundo lugar, espera-se que o desempenho do MySQL seja reduzido. Claro, a Oracle fez um ótimo trabalho ao minimizar o impacto dessa mudança, mas você não pode esperar que não haja nenhum impacto no desempenho - haverá algum.
Esperamos que esta postagem do blog o ajude a passar pelo processo de atualização do MySQL 5.7 para o MySQL 8.0. Se você tiver seus pensamentos sobre o processo, nós o incentivamos a compartilhá-los nos comentários abaixo desta postagem.