在項目過程遇到一些因為數據庫版本原因發生的一些錯誤
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