MySQL升級-5.6升級到5.7版本&切換GTID模式

来源:https://www.cnblogs.com/xinysu/archive/2018/03/30/8675286.html
-Advertisement-
Play Games

目前未在生產環境中升級過資料庫版本,倒是在測試環境跟開發環境升級過。 可以通過mysqldump sql文件進行升級,也可以通過mysql_upgrade升級,前者耗時較長,且需要足夠量的磁碟空間,本文暫不討論,升級使用mysql_upgrade方式。 如果轉載,請註明博文來源: www.cnblo ...


      目前未在生產環境中升級過資料庫版本,倒是在測試環境跟開發環境升級過。       可以通過mysqldump sql文件進行升級,也可以通過mysql_upgrade升級,前者耗時較長,且需要足夠量的磁碟空間,本文暫不討論,升級使用mysql_upgrade方式。     

      如果轉載,請註明博文來源: www.cnblogs.com/xinysu/   ,版權歸 博客園 蘇家小蘿蔔 所有。望各位支持!  

      如果是線上環境升級,常規來說分為以下幾個步驟:
  1. 從庫先升級
    1. 業務遷移,從庫上若有隻讀業務或者其他,遷移到其他DB實例
    2. 從庫備份
    3. 從庫停止複製
    4. 升級
    5. 從庫恢複復制(升級後主庫仍是5.6版本,從庫是5.7版本,註意是否有異常)
    6. 主從恢復正常
  2. 主從切換
  3. 新從庫升級
    1. 新從庫停止複製
    2. 新從庫備份
    3. 升級
    4. 新從庫恢複復制
    5. 主從恢復正常
    6. 恢復相關業務
    本文主要記錄升級的詳細步驟、主庫5.6從庫5.7有哪些問題以及如何從傳統模式轉變為GTID模式。

1 MySQL5.6升級到5.7版本

升級步驟簡要如下:
  1. 安裝新版本mysql,從庫伺服器安裝5.7版本mysql
  2. 修改安裝目錄配置參數,修改從庫的mysql配置文件,把 mysql 安裝目錄修改為 5.7版本的安裝目錄
  3. 關閉從庫mysql服務
  4. 新版本mysql啟動實例,使用5.7版本mysql啟動待升級實例
  5. 升級字典,使用mysql_upgrade升級字典
  6. 檢查,查看mysql log日誌
 
#1 安裝新版本mysql
## 下載mysql5.7.17,拷貝到server下的/opt文件目錄下
## 解壓,創建軟連接,授權
tar zvxf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
ln -s /opt/mysql-5.7.17-linux-glibc2.5-x86_64 /usr/local/mysql57
chown -R mysql:mysql /usr/data/mysql57
 
#2 修改配置參數
## 檢查配置文件中那些配置是使用到了 安裝目錄,把使用到底都修改
舊:
basedir = /usr/local/mysql56
plugin-dir = /usr/local/mysql56/lib/plugin/
 
新:
basedir = /usr/local/mysql
plugin-dir = /usr/local/mysql/lib/plugin/
 
#3 關閉mysql
[root@sutest244 mysqlup]# /usr/local/mysql56/bin/mysqladmin --socket=/tmp/mysql3399.sock -uroot -p shutdown
Enter password:
[root@sutest244 mysqlup]# ps axu | grep mysql3399 | grep mysqld
[root@sutest244 mysqlup]#
 
#4 新版本啟動mysql
[root@sutest244 mysqlup]# /usr/local/mysql/bin/mysqld --defaults-file=/data/mysqlup/mysql3399.cnf &
[1] 15477
[root@sutest244 mysqlup]# ps axu | grep mysql3399 | grep mysqld
mysql    15477 37.1 26.7 11931672 1037520 pts/4 Sl  03:34   0:05 /usr/local/mysql/bin/mysqld --defaults-file=/data/mysqlup/mysql3399.cnf
[root@sutest244 mysqlup]#
[root@sutest244 mysqlup]# vim /data/mysqlup/data/error.log
 
#4.1 檢查
檢查啟動後的錯誤日誌,看下是否有配置參數報錯,如果有,修改
錯誤日誌會有大量的字典信息報錯,這個暫不處理,下個步驟修複
 
#5 升級字典
[root@sutest244 bin]# /usr/local/mysql/bin/mysql_upgrade --socket=/tmp/mysql3399.sock -uroot -p
Enter password:
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.engine_cost                                  OK
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  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.ndb_binlog_index                             OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 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
Upgrading the sys schema.
Checking databases.
sys.sys_config                                     OK
省略...
檢查用戶資料庫及表格
省略...
Upgrade process completed successfully.
Checking if update is needed.
 
#6 檢查日誌
查看log日誌正常。

2 主庫5.6從庫5.7存在問題

由於從庫是5.7版本,mysql、performance、sys等一些系統資料庫對象有發生變化,同時一些SQL也有所變動。

2.1 修改用戶密碼失敗

1). 問題 主庫修改用戶密碼,update mysql.user set password=password('newpasswd') where ...
  • 2018-03-29T01:22:45.058927Z 12 [ERROR] Slave SQL for channel '': Column 1 of table 'mysql.user' cannot be converted from type 'char(16)' to type 'char(32)', Error_code: 1677
  • 2018-03-29T01:22:45.059066Z 12 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'bin_log.000003' position 3208
  2). 分析 修改導致從庫複製異常停止,因為 5.6版本mysql.user表格的password欄位,在5.7沒有該欄位,修改為 authentication_string 

3). 處理 方案1:事先處理,執行update password 的前,配置會話不記錄binlog:set session sql_log_bin=off,然後單獨到主從執行該SQL 方案2:事後處理,如果已經出現這個錯誤,則在從庫跳過該sql然後再開啟複製同步,最後從庫修改密碼
  • set global sql_slave_skip_counter=1;
  • start slave sql_thread;
  • show slave status;
  • set session sql_log_bin=off;
  • alter user suuser@'%' identified by 'newpassword';
  • flush privileges;
  • set session sql_log_bin=on;

2.2 SQL語法問題

1). 問題
  • SELECT欄位超過GROUP BY欄位報錯
    • select id,name,age,count(*) from tbuser group by name;
  • 其他一些SQL語法問題
2).分析 5.7跟5.6預設的sql_mode配置不一樣,如果mysql配置文件中沒有說明sql_mode,升級後sql_mode將從NO_ENGINE_SUBSTITUTION修改為ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,該模式下會導致部分在5.6支持的SQL在5.7報語法錯誤。   3). 處理 方案1:事先處理,在測試環境中,詳細測試程式代碼在新版本資料庫上的相容性,若有異常,則修複程式代碼中的SQL操作邏輯。 方案2:事先處理,mysql配置文件中,指定sql_mode與5.6版本一致。 方案3:事後處理,如果已經在出現這個錯誤,有需要快速響應處理,可以把sql_mode修改為跟5.6版本預設的sql_mode一致即可。

3 切換GTID模式

3.1 何為GTID

Global Transaction ID,全局唯一標識,簡稱GTID,一個GTID 代表在 某個實例上發生的一個事務。   GTID = source_id:transaction_id,其中source_id代表執行該事務的實例的server_uuid,transaction_id是自增值,從1開始,故GTID實際表示為:在 source_id 實例上面發生的 第 transaction_id 個事務。

3.2 GTID相關配置參數

  • ENFORCE_GTID_CONSISTENCY
    • warn
      • 如果出現GTID不相容的語句用法,在錯誤日誌會記錄相關信息,那麼需要調整應該程式避免不相容的寫法,直到完全沒有產生不相容的語句,可以通過應該程式去排查所有的sql,也可以設置後觀察錯誤日誌一段時間,這一步非常重要。
    • on
      • 啟動強制GTID一致性
  • GTID_MODE
    • 說明
      • OFF
        • 新事務是非GTID, Slave只接受不帶GTID的事務,傳送來GTID的事務會報錯
      • OFF_PERMISSIVE
        • 新事務是非GTID, Slave只接受不帶GTID的事務也接受帶GTID的事務
      • ON_PERMISSIVE
        • 新事務是GTID, Slave只接受不帶GTID的事務也接受帶GTID的事務
      • ON
        • 新事務是GTID, Slave只接受帶GTID的事務
    • 切換順序
      • 需要嚴格按照以下順序,不可跳躍
      • OFF <= => OFF_PERMISSIVE <= => ON_PERMISSIVE <= => ON

3.3 傳統複製切換GTID複製

 

#step 1 
#修改 ENFORCE_GTID_CONSISTENCY 為 warn ,運行一段時間,檢查錯誤日誌裡邊是否存在於GTID不相容的語句用法,並儘快修複
#主從都執行,先後順序不要求
set @@global.enforce_gtid_consistency=warn;
 
#step 2
#修改 ENFORCE_GTID_CONSISTENCY 為 on ,確定沒有不相容語法後,可以修改為ON
#主從都執行,先後順序不要求
set @@global.enforce_gtid_consistency=on;
 
#step 3
#設置GTID_MODE為off_permissiv
#主從都執行,先後順序不要求
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
 
#step 4
#設置GTID_MODE為off_permissiv=on_permissiv
#主從都執行,先後順序不要求
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
 
#step 5
# 檢查全部實例 正在進行的匿名交易數目,也就是非GTID事務有沒有都傳送到從庫上了,需要等到這個變數為 0 才是可以進行下麵操作
#主從都執行,先後順序不要求
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
 
#step 6
#檢查所有實例上面的slave的非GTID是否都執行完了
show master status;#取file跟pos到從庫去執行查看
SELECT MASTER_POS_WAIT('bin_log.000003', 88748605); #返回結果大於等於0則說明事務已經完全複製完成
 
 
#step 7
#清理binlog,切換到新的binlog上面
#主從都執行,先後順序不要求
flush logs;
 
#step8
#啟動GTID
#主從都執行,先後順序不要求
SET @@GLOBAL.GTID_MODE = ON;
 
#step 9
#修改cnf文件
#主從都執行,先後順序不要求
gtid_mode=on
enforce-gtid-consistency=on
binlog_gtid_simple_recovery=1

 

 

 

3.4 GTID複製切換傳統複製

#step 1
#停止從庫
#所有從庫都執行,先後順序不要求
stop slave;
 
#step 2
#重置chanage master to語句,關閉 master_auto_position
#所有從庫都執行,先後順序不要求
show slave status \G; #取sql_thread的file跟position位置,Relay_Master_Log_File  Exec_Master_Log_Pos
change master to master_log_file='mysql-bin.000003',master_log_pos=4563,master_auto_position=0;
 
#step 3
#測試同步是否正常
#主庫對數據進行操作,看從庫的position有沒有變化,同時看數據是否變更
 
#step 4
#修改GTID_MODE 為 ON_PERMISSIVE
#主從都執行
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
 
#step 5
#修改GTID_MODE 為 OFF_PERMISSIVE
#主從都執行
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
 
#step 6
#修改GTID_MODE 為 OFF
#主從都執行
SET @@GLOBAL.GTID_MODE = OFF;
 
#step 7
#清理binlog,切換到新的binlog上面
#主從都執行,先後順序不要求
flush logs;
 
#step8
#禁用GTID,其中enforce-gtid-consistency可以不關閉,還是進行 GTID的一致性檢查
#主從都執行,先後順序不要求
SET @@GLOBAL.GTID_MODE = OFF;
 
#step9
#檢驗同步情況
 
#10
#修改cnf文件,註釋GTID的參數
#主從都執行,先後順序不要求
#gtid_mode=on
#enforce-gtid-consistency=on
#binlog_gtid_simple_recovery=1

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近從在學習MySQL資料庫,遇到一些問題,有些解決了,有些還未找到答案,本篇作為學習筆記,未解決的問題等後續有答案再補充,也請走過路過的大牛們指點一二; 問題一:Java程式查詢MySQL表數據,由於MySQL預設將查詢結果全部載入到記憶體中,數據量比較大時,會報OOM,以下是解決這個問題過程中在網 ...
  • MySQL 一種關係型資料庫 database 資料庫,簡稱DB databases 資料庫的複數,代表多個資料庫 net 網路/服務 start 啟動 stop 停止 root MySQL資料庫中的超級管理員 password 密碼 localhost 本地伺服器/本地主機 prompt 改變DO ...
  • 10053事件:Event 10053 is an internal event that externalises some of the decisions made by the optimizer in to a trace file. 對於10053更多的介紹,這裡不再重覆 註:使用100 ...
  • HDFS Federation HDFS Federation. 1 1 Background. 1 2.多個namenode/namespace. 1 2.1 關鍵好處... 1 3 聯合配置... 1 3.1 配置... 1 3.2 格式化namenode. 1 3.3 更新老的release並 ...
  • 生活不止眼前的苟且,還有詩和遠方。 請根據給出的資料庫表結構來回答相應問題: DEPT (DEPTNO INT, DNAME VARCHAR(14),LOC VARCHAR(13)); EMP (EMPNO INT,ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT ...
  • 寫在開篇: 這個mysql得配置文件my.cnf,是我現在環境里常用得,包含基礎配置及一些優化,本來一直在我得有道筆記里記錄著,之前一直沒有寫博客的習慣,最近剛開始註冊博客,就將這些東西貼出來,供需要得朋友拿來使用及學習。 [client]port=3306socket =/data/mysqlda ...
  • HBase完全分散式集群搭建 hbase和hadoop一樣也分為單機版,偽分散式版和完全分散式集群版,此文介紹如何搭建完全分散式集群環境搭建。hbase依賴於hadoop環境,搭建habase之前首先需要搭建好hadoop的完全集群環境。本文中採用獨立的zookeeper,不使用hbase自帶的zo ...
  • 1.兩種方式 1.1:row_number() over()函數 1.2:OFFSET ....FETCH OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS } 指定在從查詢表達式中開始返回行之前,將跳過的行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...