Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mẹo nâng cấp từ MySQL 5.7 lên MySQL 8

MySQL 8.0 đã có mặt với chúng tôi khá lâu và nhiều người dùng MySQL đã nâng cấp lên phiên bản này. Đối với những người vẫn đang sử dụng các phiên bản MySQL cũ hơn, chúng tôi muốn giới thiệu blog này, nơi chúng tôi sẽ chia sẻ một số mẹo và thông tin giúp ích trong quá trình nâng cấp cho MySQL 8.0.

Lưu ý đến phiên bản của bạn

Phiên bản phần mềm khá quan trọng trong quá trình nâng cấp. Đối với người mới bắt đầu, chỉ có một khác biệt phiên bản chính được hỗ trợ. Bạn phải chạy MySQL 5.7 trước khi có thể nâng cấp lên MySQL 8.0. Điều này khá quan trọng cần ghi nhớ vì MySQL 5.6 đang gần hết vòng đời và nó sẽ không được hỗ trợ nữa. Đối với tất cả các bạn sử dụng MySQL 5.6, trước tiên bạn phải đảm bảo rằng bạn nâng cấp nó lên MySQL 5.7 và sau đó, cuối cùng, lên MySQL 8.0.

Bạn nên nâng cấp lên phiên bản mới nhất có sẵn cho MySQL 5.7. Tại thời điểm viết blog này, nó là 5.7.31 nhưng điều này cuối cùng sẽ thay đổi, bạn luôn có thể tra cứu nó tại trang web MySQL.

Cũng xin lưu ý rằng các nâng cấp từ phiên bản không phải GA (và lên không phải GA) không được hỗ trợ. Việc chạy các phiên bản không phải GA trong phiên bản sản xuất không có ý nghĩa gì nhưng chúng tôi cũng muốn làm rõ điều này.

Đó là Vé Một chiều

Bất cứ khi nào bạn quyết định thực hiện nâng cấp, hãy lưu ý rằng sau khi nâng cấp hoàn tất, sẽ không có hoạt động trở lại nào. Các thay đổi không tương thích và bạn chỉ đơn giản là không thể sử dụng thư mục dữ liệu từ MySQL 8.0 trên MySQL 5.7. Đảm bảo rằng bạn sao lưu dữ liệu MySQL 5.7 trực tiếp trước khi nâng cấp - bạn sẽ có thể khôi phục nó trên phiên bản MySQL 5.7 nếu bạn cần hoàn nguyên thay đổi. Cũng xin lưu ý, vì nó có thể gây ngạc nhiên, nâng cấp từ MySQL 8.0.x lên MySQL 8.0.x + 1 cũng có thể không tương thích và mặc dù đó là một bản nâng cấp phiên bản nhỏ, bạn không nên mong đợi việc hạ cấp đó có khả năng lắm. Đây là kết quả của chu kỳ triển khai của Oracle - thay vì thực hiện đóng băng tính năng cho nhánh GA mới nhất, như trường hợp của các phiên bản trước, các tính năng mới, đôi khi không tương thích, được đẩy lên dưới dạng các bản phát hành mới của nhánh 8.0.

Nâng cấp Tại chỗ là một việc nên làm

Trước đây, không phải lúc nào bạn cũng có thể thực hiện nâng cấp tại chỗ MySQL. Trong một số trường hợp, bạn buộc phải kết xuất dữ liệu sang định dạng SQL và sau đó tải dữ liệu đó lên phiên bản mới. May mắn thay, MySQL 8.0 thân thiện với quản trị viên hơn và hỗ trợ nâng cấp tại chỗ. Tất cả những gì bạn cần làm là chạy nâng cấp apt hoặc cập nhật yum và bạn đã sẵn sàng. Việc nâng cấp thậm chí còn thuận tiện hơn - trước đây người ta phải nhớ chạy mysql_upgrade để đảm bảo tất cả các bảng hệ thống được nâng cấp đúng định dạng theo yêu cầu của phiên bản MySQL mới. Trong MySQL 8.0, bắt đầu từ MySQL 8.0.16, điều này không còn cần thiết nữa - tất cả những gì bạn phải làm là bắt đầu quy trình MySQL, mysqld và theo mặc định, nâng cấp sẽ được thực hiện qua từ điển dữ liệu và các lược đồ hệ thống khác bất cứ khi nào được xác định là bắt buộc. Có thể thay đổi hành vi này bằng cách chuyển các tham số khác nhau tới tùy chọn - nâng cấp máy chủ nhưng trong phần lớn các trường hợp, bạn muốn được hưởng lợi từ cải tiến này.

Tôi có An toàn để Nâng cấp không?

Tất nhiên, có những điều kiện tiên quyết để nâng cấp an toàn. Hãy cùng xem một số phương pháp sẽ giúp bạn đảm bảo bạn có thể nâng cấp lên MySQL 8.0 một cách an toàn.

Kiểm tra tình trạng

Trước khi thử bất cứ điều gì, bạn nên kiểm tra kỹ xem thiết lập MySQL 5.7 hiện có của bạn đánh dấu vào tất cả các ô trong danh sách kiểm tra sanity trước khi nâng cấp lên MySQL 8.0 hay chưa. Tài liệu MySQL trình bày một danh sách đầy đủ những thứ cần kiểm tra. Sẽ không hợp lý khi xem qua danh sách ở đây vì nó được đề cập trong tài liệu MySQL, nhưng đây là một số điểm bạn có thể muốn lưu ý.

Đầu tiên, phân vùng hiện chỉ được hỗ trợ trong các công cụ triển khai nó ở phần cuối của chúng, chỉ NDB và InnoDB. Hãy đảm bảo rằng tất cả các bảng được phân vùng sử dụng một trong những công cụ lưu trữ đó hoặc bạn xóa phân vùng trước khi nâng cấp.

Bạn Có thể Muốn Chạy

mysqlcheck -u root -p --all-databases --check-upgrade

để kiểm tra kỹ xem các bảng có ở định dạng thích hợp không.

Ngoài ra còn có các kiểm tra khác mà bạn nên thực hiện - hầu hết mọi phiên bản MySQL mới đều đi kèm với danh sách cập nhật các từ dành riêng và bạn nên kiểm tra để đảm bảo rằng bạn không sử dụng chúng trong cơ sở dữ liệu của mình. Bạn cần kiểm tra các tên ràng buộc khóa ngoại, chúng không được dài hơn 64 ký tự. Một số tùy chọn cho sql_mode đã bị loại bỏ, do đó bạn nên đảm bảo rằng mình không sử dụng chúng. Như chúng tôi đã đề cập, có một danh sách đầy đủ những thứ cần kiểm tra.

MySQL Shell để Giải cứu

Việc kiểm tra tất cả các điều kiện đó khá tốn thời gian, do đó Oracle đã tạo một tùy chọn trong MySQL Shell nhằm mục đích chạy một loạt các bài kiểm tra để xác minh xem cài đặt hiện tại của bạn có an toàn để nâng cấp lên MySQL 8.0 hay không. Đối với người mới bắt đầu, nếu bạn chưa cài đặt MySQL Shell, bạn nên làm điều đó. Bạn có thể tìm thấy các bản tải xuống trên trang web của Oracle. Sau khi thiết lập xong, bạn có thể kết nối với MySQL 5.7 của mình và chạy thử nghiệm. Hãy xem nó có thể trông như thế nào:

[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.

Chúng tôi đã kết nối với phiên bản MySQL trên máy chủ cục bộ bằng MySQL Shell. Bây giờ chúng ta có thể chạy kiểm tra. Chúng tôi sẽ chuyển đường dẫn đến tệp cấu hình cho các thử nghiệm mở rộng hơn:

MySQL  localhost:33060+ ssl  JS > util.checkForServerUpgrade({"configPath":"/etc/mysql/my.cnf"})

Sau đó, chúng tôi có một đầu ra dài.

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.

Như bạn thấy, tổng cộng 21 bài kiểm tra đã được thực hiện, quá trình kiểm tra đã phát hiện ra 3 lỗi liên quan đến các tùy chọn cấu hình sẽ không tồn tại trong MySQL 8.0.21. Các bài kiểm tra khá chi tiết. Trong số những điều khác, bạn sẽ tìm hiểu về những thay đổi trong giá trị mặc định cho các biến mà bạn chưa định cấu hình trong cấu hình MySQL của mình (vì vậy, những cài đặt đó sẽ thay đổi khi bạn cài đặt MySQL 8.0).

Hoàn trả bản nâng cấp không thành công

Như chúng tôi đã đề cập trước đây, bạn không thể hạ cấp từ MySQL 8.0 sau khi hoàn tất nâng cấp. May mắn thay, điều đó không có nghĩa là bạn không thể khôi phục nâng cấp nếu nó không thành công giữa chừng. Trên thực tế, nó diễn ra bán tự động nếu một trong những vấn đề chúng ta đã thảo luận trong phần trước được phát hiện. Thao tác thủ công duy nhất được yêu cầu là xóa các bản ghi làm lại và khởi động MySQL 5.7 để giải quyết các vấn đề được phát hiện trong quá trình nâng cấp. Sau đó, bạn nên thực hiện tắt máy chậm (innodb_fast_shutdown =0) để đảm bảo mọi thứ được ghi vào không gian bảng và sau đó bạn có thể thử nâng cấp một lần nữa.

Mẹo cuối cùng

Có hai thay đổi khá quan trọng trong hành vi mặc định đi kèm với MySQL 8.0 mà chúng tôi muốn làm nổi bật.

Caching_sha2_password làm mặc định

Hãy đảm bảo rằng bạn kiểm tra kỹ xem các ứng dụng và proxy của bạn có hoạt động bình thường hay không với plugin xác thực caching_sha2_password vì nó trở thành plugin mặc định trong MySQL 8.0. Các ứng dụng cũ hơn có thể bị ảnh hưởng và không thể kết nối với cơ sở dữ liệu. Tất nhiên, bạn có thể thay đổi điều này thành bất kỳ plugin xác thực nào bạn muốn (ví dụ như mysql_native_password, vì nó là mặc định trong các phiên bản MySQL trước đó) vì vậy nó không phải là một trình chặn. Đó chỉ là điều cần nhớ là kiểm tra trước khi nâng cấp để bạn sẽ không gặp phải MySQL 8.0 và các ứng dụng không thể kết nối với nó trừ khi bạn định cấu hình lại cơ sở dữ liệu của mình để sử dụng cơ chế xác thực cũ hơn.

UTF8mb4 làm bộ ký tự mặc định

Điều này sẽ không gây ngạc nhiên vì mức độ thay đổi rộng rãi thành UTF8 đã được thảo luận trong cộng đồng, nhưng thực tế là vậy - MySQL 8.0 đi kèm với bộ ký tự UTF8mb4 làm bộ ký tự mặc định. Điều này có một số tác động bổ sung mà bạn nên biết. Đầu tiên, kích thước tập dữ liệu của bạn có thể tăng lên nếu bạn sử dụng bộ ký tự UTF8mb4. Điều này dẫn đến bộ đệm bộ nhớ có thể lưu trữ lượng dữ liệu nhỏ hơn so với dữ liệu có bộ ký tự latin1. Thứ hai, hiệu suất của MySQL dự kiến ​​sẽ bị giảm. Chắc chắn, Oracle đã làm rất tốt trong việc giảm thiểu tác động của sự thay đổi này, nhưng bạn không thể mong đợi rằng sẽ không có bất kỳ tác động nào đến hiệu suất - nó sẽ là một số.

Chúng tôi hy vọng bài đăng trên blog này sẽ giúp bạn thực hiện quá trình nâng cấp từ MySQL 5.7 lên MySQL 8.0. Nếu bạn có suy nghĩ của mình về quá trình này, chúng tôi khuyến khích bạn chia sẻ chúng trong phần bình luận bên dưới bài đăng này.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chọn tập hợp các bản ghi ngày tháng gần đây nhất từ ​​bảng mysql

  2. MySQL:# 126 - Tệp khóa không chính xác cho bảng

  3. Xuất dữ liệu MySQL sang Excel bằng PHP

  4. Tổng số ổ khóa vượt quá kích thước bảng khóa

  5. Thay thế thành cú pháp truy vấn