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

Dicas para atualizar do MySQL 5.7 para o MySQL 8

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.