mysql5.1.7升级到5.6_1 MySQL5.6 升级到 5.7 版本
1 MySQL5.6 升級(jí)到 5.7 版本
目前未在生產(chǎn)環(huán)境中升級(jí)過(guò)數(shù)據(jù)庫(kù)版本, 倒是在測(cè)試環(huán)境跟開(kāi)發(fā)環(huán)境升級(jí)過(guò)
可以通過(guò) mysqldump sql 文件進(jìn)行升級(jí), 也可以通過(guò) mysql_upgrade 升級(jí), 前者耗時(shí)較長(zhǎng), 且需要足夠量的磁盤空間, 本文暫不討論, 升級(jí)使用 mysql_upgrade 方式
如果是線上環(huán)境升級(jí), 常規(guī)來(lái)說(shuō)分為以下幾個(gè)步驟:
從庫(kù)先升級(jí)
業(yè)務(wù)遷移, 從庫(kù)上若有只讀業(yè)務(wù)或者其他, 遷移到其他 DB 實(shí)例
從庫(kù)備份
從庫(kù)停止復(fù)制
升級(jí)
從庫(kù)恢復(fù)復(fù)制 (升級(jí)后主庫(kù)仍是 5.6 版本, 從庫(kù)是 5.7 版本, 注意是否有異常)
主從恢復(fù)正常
主從切換
新從庫(kù)升級(jí)
新從庫(kù)停止復(fù)制
新從庫(kù)備份
升級(jí)
新從庫(kù)恢復(fù)復(fù)制
主從恢復(fù)正常
恢復(fù)相關(guān)業(yè)務(wù)
本文主要記錄升級(jí)的詳細(xì)步驟主庫(kù) 5.6 從庫(kù) 5.7 有哪些問(wèn)題以及如何從傳統(tǒng)模式轉(zhuǎn)變?yōu)?GTID 模式
升級(jí)步驟簡(jiǎn)要如下:
安裝新版本 mysql, 從庫(kù)服務(wù)器安裝 5.7 版本 mysql
修改安裝目錄配置參數(shù), 修改從庫(kù)的 mysql 配置文件, 把 mysql 安裝目錄修改為 5.7 版本的安裝目錄
關(guān)閉從庫(kù) mysql 服務(wù)
新版本 mysql 啟動(dòng)實(shí)例, 使用 5.7 版本 mysql 啟動(dòng)待升級(jí)實(shí)例
升級(jí)字典, 使用 mysql_upgrade 升級(jí)字典
檢查, 查看 mysql log 日志#1 安裝新版本 mysql
## 下載 mysql5.7.17, 拷貝到 server 下的 / opt 文件目錄下
## 解壓, 創(chuàng)建軟連接, 授權(quán)
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 修改配置參數(shù)
## 檢查配置文件中那些配置是使用到了 安裝目錄, 把使用到底都修改
舊:basedir=/usr/local/mysql56
plugin-dir=/usr/local/mysql56/lib/plugin/
新:basedir=/usr/local/mysql
plugin-dir=/usr/local/mysql/lib/plugin/
#3 關(guān)閉 mysql
[root@sutest244 mysqlup]#/usr/local/mysql56/bin/mysqladmin--socket=/tmp/mysql3399.sock-uroot-p shutdown
Enterpassword:
[root@sutest244 mysqlup]#ps axu|grep mysql3399|grep mysqld
[root@sutest244 mysqlup]#
#4 新版本啟動(dòng) 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
mysql1547737.126.7119316721037520pts/4Sl03:340: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 檢查
檢查啟動(dòng)后的錯(cuò)誤日志, 看下是否有配置參數(shù)報(bào)錯(cuò), 如果有, 修改
錯(cuò)誤日志會(huì)有大量的字典信息報(bào)錯(cuò), 這個(gè)暫不處理, 下個(gè)步驟修復(fù)#5 升級(jí)字典
[root@sutest244 bin]#/usr/local/mysql/bin/mysql_upgrade--socket=/tmp/mysql3399.sock-uroot-p
Enterpassword:
Checkingifupdateisneeded.
Checkingserver version.
Runningqueries to upgradeMySQLserver.
Checkingsystem database.
mysql.columns_priv OK
mysql.db OK
mysql.engine_cost OK
mysql.eventOK
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
Upgradingthe sys schema.
Checkingdatabases.
sys.sys_config OK
省略...
檢查用戶數(shù)據(jù)庫(kù)及表格
省略...Upgradeprocess completed successfully.
Checkingifupdateisneeded.
#6 檢查日志
查看 log 日志正常
2 主庫(kù) 5.6 從庫(kù) 5.7 存在問(wèn)題
由于從庫(kù)是 5.7 版本, mysqlperformancesys 等一些系統(tǒng)數(shù)據(jù)庫(kù)對(duì)象有發(fā)生變化, 同時(shí)一些 SQL 也有所變動(dòng)
2.1 修改用戶密碼失敗
1).?問(wèn)題
主庫(kù)修改用戶密碼, update mysql.user set password=password('newpasswd') where ...2018-03-29T01:22:45.058927Z12[ERROR]SlaveSQLforchannel'':Column1of table'mysql.user'cannot be convertedfromtype'char(16)'to type'char(32)',Error_code:1677
2018-03-29T01:22:45.059066Z12[ERROR]Errorrunning query,slave SQL thread aborted.Fixthe problem,andrestart the slave SQL threadwith"SLAVE START".Westopped at log'bin_log.000003'position3208
2). 分析
修改導(dǎo)致從庫(kù)復(fù)制異常停止, 因?yàn)?5.6 版本 mysql.user 表格的 password 字段, 在 5.7 沒(méi)有該字段, 修改為 authentication_string
3). 處理
方案 1: 事先處理, 執(zhí)行 update password 的前, 配置會(huì)話不記錄 binlog:set session sql_log_bin=off, 然后單獨(dú)到主從執(zhí)行該 SQL
方案 2: 事后處理, 如果已經(jīng)出現(xiàn)這個(gè)錯(cuò)誤, 則在從庫(kù)跳過(guò)該 sql 然后再開(kāi)啟復(fù)制同步, 最后從庫(kù)修改密碼setglobalsql_slave_skip_counter=1;
start slave sql_thread;
show slave status;
setsession sql_log_bin=off;
alter user suuser@'%'identifiedby'newpassword';
flush privileges;
setsession sql_log_bin=on;
2.2 SQL 語(yǔ)法問(wèn)題
1). 問(wèn)題
SELECT 字段超過(guò) GROUP BY 字段報(bào)錯(cuò)
select id,name,age,count(*) from tbuser group by name;
其他一些 SQL 語(yǔ)法問(wèn)題
2). 分析
5.7 跟 5.6 默認(rèn)的 sql_mode 配置不一樣, 如果 mysql 配置文件中沒(méi)有說(shuō)明 sql_mode, 升級(jí)后 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, 該模式下會(huì)導(dǎo)致部分在 5.6 支持的 SQL 在 5.7 報(bào)語(yǔ)法錯(cuò)誤
3). 處理
方案 1: 事先處理, 在測(cè)試環(huán)境中, 詳細(xì)測(cè)試程序代碼在新版本數(shù)據(jù)庫(kù)上的兼容性, 若有異常, 則修復(fù)程序代碼中的 SQL 操作邏輯
方案 2: 事先處理, mysql 配置文件中, 指定 sql_mode 與 5.6 版本一致
方案 3: 事后處理, 如果已經(jīng)在出現(xiàn)這個(gè)錯(cuò)誤, 有需要快速響應(yīng)處理, 可以把 sql_mode 修改為跟 5.6 版本默認(rèn)的 sql_mode 一致即可
3 切換 GTID 模式
3.1 何為 GTID
Global Transaction ID, 全局唯一標(biāo)識(shí), 簡(jiǎn)稱 GTID, 一個(gè) GTID 代表在 某個(gè)實(shí)例上發(fā)生的一個(gè)事務(wù)
GTID = source_id:transaction_id, 其中 source_id 代表執(zhí)行該事務(wù)的實(shí)例的 server_uuid,transaction_id 是自增值, 從 1 開(kāi)始, 故 GTID 實(shí)際表示為: 在 source_id 實(shí)例上面發(fā)生的 第 transaction_id 個(gè)事務(wù)
3.2 GTID 相關(guān)配置參數(shù)ENFORCE_GTID_CONSISTENCY
warn
如果出現(xiàn) GTID 不兼容的語(yǔ)句用法, 在錯(cuò)誤日志會(huì)記錄相關(guān)信息, 那么需要調(diào)整應(yīng)該程序避免不兼容的寫(xiě)法, 直到完全沒(méi)有產(chǎn)生不兼容的語(yǔ)句, 可以通過(guò)應(yīng)該程序去排查所有的 sql, 也可以設(shè)置后觀察錯(cuò)誤日志一段時(shí)間, 這一步非常重要
on
啟動(dòng)強(qiáng)制 GTID 一致性
GTID_MODE
說(shuō)明
OFF
新事務(wù)是非 GTID, Slave 只接受不帶 GTID 的事務(wù), 傳送來(lái) GTID 的事務(wù)會(huì)報(bào)錯(cuò)
OFF_PERMISSIVE
新事務(wù)是非 GTID, Slave 只接受不帶 GTID 的事務(wù)也接受帶 GTID 的事務(wù)
ON_PERMISSIVE
新事務(wù)是 GTID, Slave 只接受不帶 GTID 的事務(wù)也接受帶 GTID 的事務(wù)
ON
新事務(wù)是 GTID, Slave 只接受帶 GTID 的事務(wù)
切換順序
需要嚴(yán)格按照以下順序, 不可跳躍
OFF <= =>?OFF_PERMISSIVE <= =>?ON_PERMISSIVE <= => ON
3.3?傳統(tǒng)復(fù)制切換 GTID 復(fù)制#step 1
# 修改 ENFORCE_GTID_CONSISTENCY 為 warn , 運(yùn)行一段時(shí)間, 檢查錯(cuò)誤日志里邊是否存在于 GTID 不兼容的語(yǔ)句用法, 并盡快修復(fù)
# 主從都執(zhí)行, 先后順序不要求
set@@global.enforce_gtid_consistency=warn;
#step 2
# 修改 ENFORCE_GTID_CONSISTENCY 為 on , 確定沒(méi)有不兼容語(yǔ)法后, 可以修改為 ON
# 主從都執(zhí)行, 先后順序不要求
set@@global.enforce_gtid_consistency=on;
#step 3
# 設(shè)置 GTID_MODE 為 off_permissiv
# 主從都執(zhí)行, 先后順序不要求
SET@@GLOBAL.GTID_MODE=OFF_PERMISSIVE;
#step 4
# 設(shè)置 GTID_MODE 為 off_permissiv=on_permissiv
# 主從都執(zhí)行, 先后順序不要求
SET@@GLOBAL.GTID_MODE=ON_PERMISSIVE;
#step 5
# 檢查全部實(shí)例 正在進(jìn)行的匿名交易數(shù)目, 也就是非 GTID 事務(wù)有沒(méi)有都傳送到從庫(kù)上了, 需要等到這個(gè)變量為 0 才是可以進(jìn)行下面操作
# 主從都執(zhí)行, 先后順序不要求
SHOW STATUS LIKE'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
#step 6
# 檢查所有實(shí)例上面的 slave 的非 GTID 是否都執(zhí)行完了
show master status;#取file跟pos到從庫(kù)去執(zhí)行查看
SELECT MASTER_POS_WAIT('bin_log.000003',88748605);#返回結(jié)果大于等于 0 則說(shuō)明事務(wù)已經(jīng)完全復(fù)制完成
#step 7
# 清理 binlog, 切換到新的 binlog 上面
# 主從都執(zhí)行, 先后順序不要求
flush logs;
#step8
# 啟動(dòng) GTID
# 主從都執(zhí)行, 先后順序不要求
SET@@GLOBAL.GTID_MODE=ON;
#step 9
# 修改 cnf 文件
# 主從都執(zhí)行, 先后順序不要求
gtid_mode=on
enforce-gtid-consistency=on
binlog_gtid_simple_recovery=1
3.4?GTID 復(fù)制切換傳統(tǒng)復(fù)制#step 1
# 停止從庫(kù)
# 所有從庫(kù)都執(zhí)行, 先后順序不要求
stop slave;
#step 2
# 重置 chanage master to 語(yǔ)句, 關(guān)閉 master_auto_position
# 所有從庫(kù)都執(zhí)行, 先后順序不要求
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
# 測(cè)試同步是否正常
# 主庫(kù)對(duì)數(shù)據(jù)進(jìn)行操作, 看從庫(kù)的 position 有沒(méi)有變化, 同時(shí)看數(shù)據(jù)是否變更
#step 4
# 修改 GTID_MODE 為 ON_PERMISSIVE
# 主從都執(zhí)行
SET@@GLOBAL.GTID_MODE=ON_PERMISSIVE;
#step 5
# 修改 GTID_MODE 為 OFF_PERMISSIVE
# 主從都執(zhí)行
SET@@GLOBAL.GTID_MODE=OFF_PERMISSIVE;
#step 6
# 修改 GTID_MODE 為 OFF
# 主從都執(zhí)行
SET@@GLOBAL.GTID_MODE=OFF;
#step 7
# 清理 binlog, 切換到新的 binlog 上面
# 主從都執(zhí)行, 先后順序不要求
flush logs;
#step8
# 禁用 GTID, 其中 enforce-gtid-consistency 可以不關(guān)閉, 還是進(jìn)行 GTID 的一致性檢查
# 主從都執(zhí)行, 先后順序不要求
SET@@GLOBAL.GTID_MODE=OFF;
#step9
# 檢驗(yàn)同步情況
#10
# 修改 cnf 文件, 注釋 GTID 的參數(shù)
# 主從都執(zhí)行, 先后順序不要求
#gtid_mode=on
#enforce-gtid-consistency=on
#binlog_gtid_simple_recovery=1
來(lái)源: https://www.cnblogs.com/xinysu/p/8675286.html
總結(jié)
以上是生活随笔為你收集整理的mysql5.1.7升级到5.6_1 MySQL5.6 升级到 5.7 版本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信息学奥赛一本通 1229:电池的寿命
- 下一篇: java属性错误_在java中读取属性文