目前未在生產環境中升級過資料庫版本,倒是在測試環境跟開發環境升級過。 可以通過mysqldump sql文件進行升級,也可以通過mysql_upgrade升級,前者耗時較長,且需要足夠量的磁碟空間,本文暫不討論,升級使用mysql_upgrade方式。 如果轉載,請註明博文來源: www.cnblo ...
目前未在生產環境中升級過資料庫版本,倒是在測試環境跟開發環境升級過。 可以通過mysqldump sql文件進行升級,也可以通過mysql_upgrade升級,前者耗時較長,且需要足夠量的磁碟空間,本文暫不討論,升級使用mysql_upgrade方式。
如果轉載,請註明博文來源: www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇家小蘿蔔 所有。望各位支持!
如果是線上環境升級,常規來說分為以下幾個步驟:
- 從庫先升級
- 業務遷移,從庫上若有隻讀業務或者其他,遷移到其他DB實例
- 從庫備份
- 從庫停止複製
- 升級
- 從庫恢複復制(升級後主庫仍是5.6版本,從庫是5.7版本,註意是否有異常)
- 主從恢復正常
- 主從切換
- 新從庫升級
- 新從庫停止複製
- 新從庫備份
- 升級
- 新從庫恢複復制
- 主從恢復正常
- 恢復相關業務
1 MySQL5.6升級到5.7版本
升級步驟簡要如下:- 安裝新版本mysql,從庫伺服器安裝5.7版本mysql
- 修改安裝目錄配置參數,修改從庫的mysql配置文件,把 mysql 安裝目錄修改為 5.7版本的安裝目錄
- 關閉從庫mysql服務
- 新版本mysql啟動實例,使用5.7版本mysql啟動待升級實例
- 升級字典,使用mysql_upgrade升級字典
- 檢查,查看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
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語法問題
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