萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> 解決mysql版本升級導致的一些錯誤

解決mysql版本升級導致的一些錯誤

mysql版本升級之後總會碰到一些因升級或版本問題出現的一些問題了,對於這些問題我們就一起來看它的解決辦法,有興趣了解的朋友可和小編來看看吧。

在項目過程遇到一些因為數據庫版本原因發生的一些錯誤

mysql服務器升級數據還原後表結構不能顯示

mysql服務器升級後,數據庫數據還原後,在使用navicat進行desc表結構是出現了

“1558 – Column count of mysql.proc is wrong. Expected 20, found 16. Created with MySQL 50018, now running 50146. Please use mysql_upgrade to fix this error.”這樣的錯誤內容

我的mysql服務器是從5.1升級到了5.5版本,而原數據庫表的備份與恢復是直接copy mysql data目錄;數據都是完好的。搜索查明

解決方案就是:

mysql.proc
這個是5.1裡面的系統表來的,用來記錄存儲過程或函數的信息.你的數據庫肯定作過升級或用不同的版本進行備份遷移恢復.

使用命令:mysql_upgrade 就可以解決

mysql_upgrade -u root –datadir=/opt/mysql –basedir=/opt/mysql/data –password=123456

MySQL utility for upgrading databases to new MySQL versions.

5.6.10 mysqldump: Couldn’t execute ‘SELECT @@GTID_MODE’ 執行錯誤

mysqldump: Couldn’t execute ‘SELECT @@GTID_MODE': Unknown system variable ‘GTID_MODE’ (1193)

不知道系統變量GTID_MODE,google搜索在mysql官方找到一片bug報告

mysqldump –set-gtid-purged=AUTO does not detect if mysqld has GTIDs

5.6.5 introduced GTIDs. mysqldump 5.6 was made
compatible  to use GTIDs
2. In versions < 5.6, where GTIDs are not
even defined, mysqldump 5.6 fails as it cannot
execute ‘SELECT @@GTID_MODE’
3.  using –set-gtid-purged=AUTO, should detect whether
the server has GTIDs enabled or not.  However, this
option works only for 5.6 versions.

WORKAROUND: if you are using mysqldump 5.6 to backup mysql-5.5  and old database
versions, use –set-gtid-purged=OFF option.

Fix:  THe fix is to check for the server version before executing ‘select @@gtid_mode’

5.6.5版本引入GTIDs;如果mysql version 小於5.6,GTIDs是沒有定義的,mysqldump5.6不能執行’SELECT @@GTID_MODE’ ;應該使用–set-gtid-purged=AUTO用來檢測GTIDs是否啟用,但是這個選項只能在5.6版本mysql上工作

我要備份的遠程服務器是

原先按正常的mysqldump語法如下則會報錯


所以應該用mysqldump 5.6 對mysql server版本小於5.6版本或者是更老的版本進行數據備份時,會首先執行“SELECT @@GTID_MODE”這樣的語句(盡管select @@gtid_mode 得到的屬性值它是off)

則要有加上 –set-gtid-purged=OFF 屬性了,導出成功

 

但是對於這個gtid_mode屬性是什麼意思,我不是很明白,查閱了一下與事物數據同步有關想了解的請看16.1.4.5. Global Transaction ID Options and Variables

“這是因為在啟用GTID模式下,如果對非事務表更新時,無法保證事務一致性,因此設置 disable-gtid-unsafe-statements = 1 確保主從數據一致性。”

[MySQL FAQ]系列 — 啟用GTID & binlog新安裝完的MySQL提示無法登錄

[root@imysql mysql]# mysql mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
答:數據庫已經執行過 mysql_install_db 初始化了,按理說應該沒問題。經過排查,發現 $datadir 的 mysql 數據庫目錄的權限模式為:

drwx------ 2 mysql root        4096 Jan  9 20:22 mysql
看起來沒有問題。檢查錯誤日志,發現一行:

130109 21:04:23 [Warning] Bootstrap mode disables GTIDs. Bootstrap mode should only be used by mysql_install_db which initializes the MySQL data directory and creates system tables.
ERROR: 1785  Updates to non-transactional tables are forbidden when DISABLE_GTID_UNSAFE_STATEMENTS = 1.
130109 21:04:23 [ERROR] Aborting
同時,mysql庫下的user表空間文件顯示:

-rw-rw---- 1 mysql mysql 10684 Jan  9 20:22 user.frm
-rw-rw---- 1 mysql mysql     0 Jan  9 20:22 user.MYD
-rw-rw---- 1 mysql mysql  1024 Jan  9 20:22 user.MYI
可以看到,user表空間數據文件大小為0。
看起來應該是和啟用GTID模式有一定關系了。仔細檢查下,發現和GTID相關的選項有:

gtid_mode = ON
binlog_format = mixed
disable-gtid-unsafe-statements = 1
log-bin=binlog
這是因為在啟用GTID模式下,如果對非事務表更新時,無法保證事務一致性,因此設置 disable-gtid-unsafe-statements = 1 確保主從數據一致性。

解決方案:
這時候可以將選項 disable-gtid-unsafe-statements 的值修改為 0。也可以同時關閉 GTID 、 binlog 選項,初始化完畢後再打開。

#gtid_mode = ON
#log-bin=binlog

disable-gtid-unsafe-statements = 0

copyright © 萬盛學電腦網 all rights reserved