欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從MySQL5.7平滑升級到MySQL8.0數據庫的最佳實踐教程

 更新時間:2024年07月02日 09:04:12   作者:only°夏至besos  
這篇文章主要給大家介紹了關于從MySQL5.7平滑升級到MySQL8.0數據庫的最佳實踐,升級MySQL版本需要進行一系列操作,文中通過圖文介紹的非常詳細,需要的朋友可以參考下

一、前言

升級需求:將5.7.35升級到8.0.27, 升級方式 in-place升級【關閉現有版本MySQL,將二進制或包替換成新版本并在現有數據目錄上啟動MySQL并執(zhí)行升級任務的方式,稱為in-place升級】

原版本 5.7.35 CentOS Linux release 7.9.2009

新版本 8.0.27 CentOS Linux release 7.9.2009

二、Mysql 生命周期

以下Mysql 生命周期-內容來自于互聯網

關于數據庫版本升級,一直都是熱議話題,對于升級的緣由各家也有所不同,有業(yè)務驅動的,有DBA自發(fā)驅動的,有規(guī)劃導向也有方向指引的……拋開各種原因,當升級這個決定落下來的時候,對于DBA手頭的幾百幾千套數據庫來說,就好比是一場動物大遷徙,滿滿的畫面感。

從Oracle發(fā)布的版本生命周期規(guī)劃可以看到,Mysql5.7已經走到了生命周期的終點,意味著后續(xù)將不再為Mysql5.7提供官方更新、錯誤修復或安全補丁。

阿里云和AWS都在官方公布了版本支持計劃,Mysql5.7版本已經開始了倒計時。

圖片

三、MySQL8.0的新特性

圖片

默認字符集由latin1變?yōu)閡tf8mb4。

MyISAM系統表全部換成InnoDB表。

JSON特性增強。

支持不可見索引,支持直方圖。

sql_mode參數默認值變化。

默認密碼策略變更。

新增角色管理。

支持窗口函數,支持Hash join。

四、升級建議

支持從MySQL5.7升級到MySQL8.0,注意僅支持GA版本之間的升級。

不支持跨大版本的升級,如從5.6升級到8.0是不支持的。

建議升級大版本前先升級到當前版本的最近小版本,如5.7先升級到5.7.35后再升級到8.0。

做好充足的備份!數據無價?。?

五、升級前準備

5.1 Mysql-shell 檢查工具兼容性

在執(zhí)行升級操作前需要做一些檢查工作,確認準備工作是否就緒,避免升級過程中出現異常??梢允褂肕ySQL Shell使用util.checkForServerUpgrade進行檢查,返回內容包括不符合遷移要求的問題,error的問題需要遷移前修改。

Mysql-shell 下載地址:https://dev.mysql.com/downloads/shell/

這里我們選擇8027版本

圖片

然后上傳文件至5.7.35的機器/root目錄下

[root@localhost ~]# tar -xf mysql-shell-8.0.27-linux-glibc2.12-x86-64bit.tar.gz
[root@localhost ~]# cd mysql-shell-8.0.27-linux-glibc2.12-x86-64bit/bin/
[root@localhost bin]# ./mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade()" > util.checkForServerUpgrade.log

從輸出報告可以看出,升級檢查器在23個方面進行了檢查,最終得出4個警告信息和1個提示。

消除警告:

Usage of utf8mb3 charset 在MySQL 8.0版本之前,默認字符集為latin1 ,utf8字符集指向的是utf8mb3 。從MySQL8.0開始,數據庫的默認編碼將改為utf8mb4 ;為了避免新舊對象字符集不一致的情況,可以在配置文件將字符集和校驗規(guī)則設置為舊版本的字符集和比較規(guī)則。

New default authentication plugin considerations,密碼認證插件變更。為了避免連接問題,可以仍采用5.7的mysql_native_password認證插件。

消除提示:

Usage of obsolete sql_mode flags:Mysq8.0 版本sql_mode不支持NO_AUTO_CREATE_USER,要避免配置的sql_mode中帶有NO_AUTO_CREATE_USER。

通過以上的例子,可以發(fā)現,MySQL Shell提供的升級檢查工具能夠幫助我們檢測版本兼容性,減輕升級工作負擔。

5.2 邏輯備份Mysql數據

[root@localhost opt]#which mysqldump
[root@localhost opt]#/usr/local/mysql/bin/mysqldump
# --routines 備份存儲過程和函數;--set-gtid-purged=OFF: 禁用GTID(全局事務標識);xxx1,XXX2 表示庫名,備份多個庫 用空格做為間隔
[root@localhost opt]#/usr/local/mysql/bin/mysqldump -uroot -p --routines --set-gtid-purged=OFF -A > /root/all-database-20231115.sql

5.3 優(yōu)雅的停止數據庫

select version();
show variables like 'innodb_fast_shutdown';

# 確保數據都刷到硬盤上,更改成0InnoDB關閉模式。如果值為0,InnoDB會在關閉前進行緩慢關閉、完全清除和更改緩沖區(qū)合并。如果值為1(默認值),InnoDB會在關閉時跳過這些操作,這個過程稱為快速關閉。如果值為2,InnoDB刷新其日志并冷關機,就好像MySQL崩潰了;沒有提交的事務丟失,但崩潰恢復操作使下一次啟動需要更長的時間。在仍然緩沖大量數據的極端情況下,緩慢關閉可能需要幾分鐘甚至幾小時。

set global innodb_fast_shutdown=0;
shut down;
exit
[root@localhost opt]# ps -ef|grep mysql

圖片

5.4 備份Mysql 數據目錄,安裝目錄 和配置文件

--確認數據庫狀態(tài)為關閉狀態(tài)
[root@localhost opt]# service mysql status
--數據目錄備份
[root@localhost opt]# cp -r /data/mysql /data/mysql_bak_`date +%F`
--安裝目錄備份
[root@localhost opt]# cp -r /usr/local/mysql/ /usr/local/mysql_bak_`date +%F`
--配置文件備份
[root@localhost local]# cp /etc/my.cnf /etc/my.cnf_`date +%F`

圖片

5.5 下載并解壓MySQL8

安裝包上傳至原安裝包目錄下 我的是/usr/local/mysql

[root@localhost local]# tar -xf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz
# 文件夾重命名為mysql8
[root@localhost local]# mv mysql-8.0.27-linux-glibc2.12-x86_64 mysql8
# 更改文件夾所屬
[root@localhost local]# chown -Rf mysql:mysql /usr/local/mysql8
# 刪除安裝包
[root@localhost local]# rm -rf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz

六、升級

6.1 修改my.cnf 配置文件

因5.7版本與8.0版本參數有所不同,為了能順利升級,我們需要更改部分配置參數。主要注意sql_mode、basedir、密碼認證插件及字符集設置,其他參數最好還是按照原5.7的來,不需要做調整。下面展示5.7和8.0的配置文件,注意備份原來配置文件。

6.1.1 Mysql5.7_my.cnf 配置文件

相比5.7,8多了以下配置

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
basedir=/home/application/mysql/mysql8
datadir=/home/application/mysql/data
character_set_server=utf8
collation-server=utf8_general_ci
# 默認使用"mysql_native_password"插件認證
default_authentication_plugin=mysql_native_password
# 創(chuàng)建新表時將使用的默認存儲引擎
default-storage-engine=INNODB

6.2 執(zhí)行升級程序

在mysql5.7升級的時候,MySQL啟動后還需執(zhí)行mysql_upgrade后重啟MySQL。MySQL8.0.16開始,MySQL 不推薦使用mysql_upgrade;直接使用 mysqld_safe 直接啟動。關于--upgrade=的一些參數。

--upgrade=AUTO MySQL升級所有過時的內容

  • --upgrade=NONE MySQL跳過升級步驟,可能會導致報錯
  • --upgrade=MINIMAL MySQL在必要時升級數據字典表,information_schema和information_schema。這可能會導致部分功能不能正常使用,例如MGR
  • --upgrade=FORCE MySQL會升級所有的內容,這會檢查所有schema的所有對象,導致MySQL需要更長的時間啟動。此模式下MySQL會重新創(chuàng)建系統表if they are missing。
[root@localhost local]# /usr/local/mysql8/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --upgrade=FORCE

圖片

新開一個窗口,可觀察下錯誤日志看是否報錯

tailf /data/mysql/mysql-error.log 然后登錄數據庫測試

圖片

重新登錄
[root@localhost bin]# mysql -uroot -proot
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.27    |
+-----------+
1 row in set (0.00 sec)

圖片

6.3 修改Mysql環(huán)境變量

由于basedir 從/usr/local/mysql 變成了 /usr/local/mysql8,需要修改下環(huán)境變量信息:

[root@localhost bin]# vi /etc/profile
export PATH=$PATH:/usr/local/mysql8/bin:/usr/local/mysql8/lib
[root@localhost bin]# source /etc/profile
[root@localhost ~]# which mysql
/usr/local/mysql8/bin/mysql
[root@localhost ~]# mysql -V
mysql  Ver 8.0.27 for Linux on x86_64 (MySQL Community Server - GPL)

圖片

6.4驗證恢復過來的數據是否正常

圖片

七、問題及經驗總結

7.1 問題一

在升級Mysql8.0后,關于JDBC中SSL連接的一些報錯信息,如下圖:

圖片

經排查發(fā)現,Mysql8.0 數據庫默認開啟了SSL認證,且之前Mysql5.7.39 也是默認開啟了SSL認證,代碼和JDBC驅動版本都沒有變化,那很有可能就是Mysql8.0 中對于SSL的一個變化,咨詢了DBA 朋友,專業(yè)的解釋是,在5.7.31的時候SSL在源碼中貌似沒有真正的起作用,后面版本完善了這塊的內容。倘若,不使用SSL去連接,就 需要按照如下的方法去處理:

方法一:從數據庫成面,直接在my.cnf 中 添加skip_ssl 參數,從源頭上關閉SSL 認證的方式

方法二:從代碼層面,在JDBC 連接中,使用 &useSSL=false 參數,表示不使用SSL 認證

7.2 問題二

Mysql 報錯unblock with ‘mysqladmin flush-hosts’,報錯如下:

JDBC連接報錯,報錯內容 ERROR 1129 (HY000): Host ‘192.168.59.202’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’

原因:同一個ip在短時間內產生太多,中斷的數據庫連接而導致的阻塞;而中斷的因為有些業(yè)務使用SSL去連接數據庫,導致登錄失敗,登錄被鎖;

臨時解決方法,使用mysqladmin flush-hosts 命令清理一下hosts文件,mysqladmin -u xxx -p flush-hosts,根本上去解決,就需要排查什么異常的連接導致阻塞,登錄被鎖,比如上面提到的SSL認證的問題。

7.1 問題三

MySQL--使用innodb_force_recovery修復數據庫異常

當MySQL服務異常重啟失敗后,可以通過配置參數innodb_force_recovery來對MySQL服務進行修復啟動。

參數innodb_force_recovery選項:

1 (SRV_FORCE_IGNORE_CORRUPT): 忽略檢查到的 corrupt 頁。盡管檢測到了損壞的 page 仍強制服務運行。一般設置為該值即可,然后 dump 出庫表進行重建。

2 (SRV_FORCE_NO_BACKGROUND): 阻止主線程的運行,如主線程需要執(zhí)行 full purge 操作,會導致 crash。阻止 master thread 和任何 purge thread 運行。若 crash 發(fā)生在 purge 環(huán)節(jié)則使用該值。

3 (SRV_FORCE_NO_TRX_UNDO): 不執(zhí)行事務回滾操作。

4 (SRV_FORCE_NO_IBUF_MERGE): 不執(zhí)行插入緩沖的合并操作。如果可能導致崩潰則不要做這些操作。不要進行統計操作。該值可能永久損壞數據文件。若使用了該值,則將來要刪除和重建輔助索引。

5 (SRV_FORCE_NO_UNDO_LOG_SCAN): 不查看重做日志,InnoDB 存儲引擎會將未提交的事務視為已提交。此時 InnoDB 甚至把未完成的事務按照提交處理。該值可能永久性的損壞數據文件。

6 (SRV_FORCE_NO_LOG_REDO): 不執(zhí)行前滾的操作?;謴蜁r不做 redo log roll-forward。使數據庫頁處于廢止狀態(tài),繼而可能引起 B 樹或者其他數據庫結構更多的損壞。

參數innodb_force_recovery設置:

在配置文件中的mysqld模塊添加參數innodb_force_recovery。

[mysqld]
innodb_force_recovery    =    N

相同參數innodb_force_recovery在不同MySQL版本允許的操作可能不同,所有版本中innodb_force_recovery>0時都允許對表進行SELECT操作。

使用參數innodb_force_recovery建議:

1、如果MySQL服務故障重啟后,因為事務回滾導致異常,可以將參數innodb_force_recovery設置為3跳過回滾階段

2、如果因為MySQL數據頁損壞導致異常,可以使用SELECT+WHERE查找出未損壞數據并將其通過mysqldump導出。

3、將innodb_force_recovery參數設置大于0啟動服務后,應通過修改端口或域名(VIP)指向來屏蔽應用訪問。

4、將innodb_force_recovery參數設置大于0啟動服務后,可以通過mysqlcheck命令來對表進行檢查/分析/優(yōu)化/修復。

5、使用force_recovery重啟服務前,建議對數據庫所有文件進行備份,避免修復過程中對數據進行二次損害。

在日常運維中,應將使用innodb_force_recovery參數進行數據恢復作為最后手段,做好完善的備份恢復機制,避免對數據庫做高危操作。

總結

到此這篇關于從MySQL5.7平滑升級到MySQL8.0數據庫的文章就介紹到這了,更多相關MySQL5.7平滑升級到MySQL8.0內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 有關mysql中ROW_COUNT()的小例子

    有關mysql中ROW_COUNT()的小例子

    mysql中的ROW_COUNT()可以返回前一個SQL進行UPDATE,DELETE,INSERT操作所影響的行數
    2013-02-02
  • 教你如何通過日志文件恢復MySQL數據

    教你如何通過日志文件恢復MySQL數據

    Binlog日志是二進制日志文件,有兩個作用,一個是增量備份,另一個是主從復制,即主節(jié)點維護一個binlog日志文件,從節(jié)點從binlog中同步數據,也可以通過binlog日志來恢復數據,這篇文章主要給大家介紹了關于如何通過日志文件恢復MySQL數據的相關資料,需要的朋友可以參考下
    2022-02-02
  • 搭建Mysql視圖可視化操作(保姆級)

    搭建Mysql視圖可視化操作(保姆級)

    本文主要介紹了搭建Mysql視圖可視化操作,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-10-10
  • linux下改良版本mysqldump來備份MYSQL數據庫

    linux下改良版本mysqldump來備份MYSQL數據庫

    我的備份腳本都是在凌晨執(zhí)行的,經常在慢查詢日志里面看到這樣的信息:select * from table1; 之前一直很納悶,最后才了解到原來是MYSQLDUMP搞的鬼。
    2008-07-07
  • PHP版Mysql爆破小腳本

    PHP版Mysql爆破小腳本

    本文給大家分享的是使用php實現暴力破解mysql的小腳本代碼,非常的好用,有需要的小伙伴可以參考下
    2016-10-10
  • mysql數據庫和oracle數據庫之間互相導入備份

    mysql數據庫和oracle數據庫之間互相導入備份

    今天小編就為大家分享一篇關于mysql數據庫和oracle數據庫之間互相導入備份,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 詳解記錄MySQL中l(wèi)ower_case_table_names的坑

    詳解記錄MySQL中l(wèi)ower_case_table_names的坑

    這篇文章主要介紹了詳解記錄MySQL中l(wèi)ower_case_table_names的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 不使用MySQL數據庫的五個給力理由解析

    不使用MySQL數據庫的五個給力理由解析

    眾所周知,MySQL數據庫雖然功能未必很強大,但因為它的開源、廣泛傳播,導致很多人都了解到這個數據庫。
    2011-03-03
  • 一次SQL如何查重及去重的實戰(zhàn)記錄

    一次SQL如何查重及去重的實戰(zhàn)記錄

    sql去重這可以說算是比較經典的面試題了,這篇文章主要給大家介紹了一次SQL如何查重及去重的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • MySql 8.0.11 安裝過程及 Navicat 鏈接時遇到的問題小結

    MySql 8.0.11 安裝過程及 Navicat 鏈接時遇到的問題小結

    這篇文章主要介紹了MySql 8.0.11 安裝過程及 Navicat 鏈接時遇到的問題,需要的朋友可以參考下
    2018-06-06

最新評論