寫(xiě)在最前
1356的錯(cuò)誤扯俱,在前幾天寫(xiě)的mysqldump問(wèn)題集合里面已經(jīng)寫(xiě)過(guò)了,然而本次按照常規(guī)的套路無(wú)法處理這次的1356錯(cuò)誤喇澡,所以單獨(dú)寫(xiě)出來(lái)
1356以及相關(guān)mysqldump錯(cuò)誤參閱這個(gè)問(wèn)題集合:mysqldump問(wèn)題處理集合
IP架構(gòu)
問(wèn)題數(shù)據(jù)庫(kù):172.17.100.106
參考庫(kù):172.17.100.107迅栅、172.17.100.100
106庫(kù)是一個(gè)多次實(shí)驗(yàn)之后,做過(guò)主庫(kù)也做過(guò)從庫(kù)的數(shù)據(jù)庫(kù)晴玖;107庫(kù)是一個(gè)剛剛初始化的新庫(kù)库继;
問(wèn)題描述
執(zhí)行全庫(kù)的mysqldump時(shí)導(dǎo)出報(bào)了一個(gè)1356的權(quán)限錯(cuò)誤
問(wèn)題排查
根據(jù)前面處理1356的經(jīng)驗(yàn)箩艺,對(duì)mysql.proc和information_schema.views進(jìn)行查詢(xún),然而并沒(méi)有發(fā)現(xiàn)任何異常宪萄!
特別是下圖(語(yǔ)句②的執(zhí)行結(jié)果圖)紅框中的host_summary這個(gè)在上圖中出現(xiàn)的報(bào)錯(cuò)視圖艺谆,type和definer可以說(shuō)都是再正常不過(guò)了。
①SELECT definer,type FROM mysql.proc GROUP BY definer,type;
②select TABLE_SCHEMA,table_name,definer,SECURITY_TYPE from information_schema.views;
對(duì)比參考數(shù)據(jù)庫(kù)拜英,發(fā)現(xiàn)106庫(kù)(問(wèn)題庫(kù))的第①個(gè)語(yǔ)句結(jié)果略微有一些不一樣静汤,下圖是107庫(kù)(參考庫(kù))的執(zhí)行結(jié)果
而在106庫(kù)的結(jié)果中,只有第一行
對(duì)106庫(kù)和107庫(kù)分別執(zhí)行mysql.proc的全庫(kù)查詢(xún)發(fā)現(xiàn):107庫(kù)有48行數(shù)據(jù)居凶,而106庫(kù)只有6行數(shù)據(jù)虫给;再參考100庫(kù),數(shù)據(jù)量也遠(yuǎn)遠(yuǎn)不止6條侠碧!
決定先對(duì)106庫(kù)的mysql.proc表進(jìn)行數(shù)據(jù)補(bǔ)全
處理問(wèn)題
思路是先對(duì)106庫(kù)的mysql.proc表進(jìn)行備份抹估,再將107庫(kù)的mysql.proc表數(shù)據(jù)導(dǎo)過(guò)來(lái)
create table qimo.proc select * from mysql.proc;
報(bào)錯(cuò):ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.
#需要關(guān)閉GTID,此處采用在線關(guān)閉
set global gtid_mode='ON_PERMISSIVE';
set global gtid_mode='OFF_PERMISSIVE';
set global gtid_mode='OFF';
set global?ENFORCE_GTID_CONSISTENCY='OFF'
#再次執(zhí)行
create table qimo.proc select * from mysql.proc;
報(bào)錯(cuò):ERROR 1067 (42000): Invalid default value for 'modified'
典型的sql_mode錯(cuò)誤弄兜,查詢(xún)mysql.proc表可以發(fā)現(xiàn)modified又沖突了药蜻,改sql_mode去
這里還不能帶global,如果是set global sql_mode的話替饿,不會(huì)在這個(gè)會(huì)話里生效
set sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
#解決這2個(gè)錯(cuò)誤后语泽,表的復(fù)制完成了
#關(guān)閉GTID,并將107庫(kù)的mysql.proc表進(jìn)行復(fù)制
create database qimo;
create table qimo.pr select * from mysql.proc;
#將107庫(kù)的qimo.proc表導(dǎo)出(僅導(dǎo)出結(jié)構(gòu)-d视卢,數(shù)據(jù)結(jié)構(gòu)都導(dǎo)出則不加-d)
mysqldump -uroot -p密碼 qimo proc > qimo.sql
#將sql拷貝到106庫(kù)踱卵,執(zhí)行單表的導(dǎo)入(導(dǎo)出的單表里面有數(shù)據(jù)和結(jié)構(gòu),但是不會(huì)寫(xiě)表的歸屬數(shù)據(jù)庫(kù)据过,所以在執(zhí)行單表導(dǎo)入的時(shí)候惋砂,需要寫(xiě)明庫(kù)名,比如下面的粗斜體qimo)
mysql -uroot -p密碼 qimo < qimo.sql
將106庫(kù)的2張表合并
use qimo;
insert into proc select * from pr;
#將106庫(kù)的qimo.proc表導(dǎo)出
mysqldump -uroot -p密碼 qimo proc > proc.sql
#查詢(xún)mysql.proc表的建表語(yǔ)句
use mysql;
show create table proc;
#將建表語(yǔ)句復(fù)制下來(lái)绳锅,編輯之前導(dǎo)出的proc.sql
#將建表語(yǔ)句進(jìn)行替換(mysql.proc是系統(tǒng)表西饵,他的建表語(yǔ)句和通過(guò)create table復(fù)制出去的qimo.proc是不同的)
#導(dǎo)入mysql.proc表
mysql -uroot -p密碼 mysql?< proc.sql
為什么不直接insert數(shù)據(jù)到mysql.proc表呢?
系統(tǒng)表是不能加寫(xiě)鎖的榨呆,我也嘗試了直接insert,然后就得到了下面的報(bào)錯(cuò)
insert into mysql.proc select * from qimo.proc;
ERROR 1428 (HY000): You can't combine write-locking of system tables with other tables or lock types
驗(yàn)證
sys庫(kù)下面所有的view已經(jīng)可以正常讀取
執(zhí)行106庫(kù)的全庫(kù)導(dǎo)出也順利完成
后話
測(cè)試庫(kù)只求解決問(wèn)題庸队,干起來(lái)倒是肆無(wú)忌憚积蜻,老實(shí)說(shuō)我也不知道正式庫(kù)到底能不能在生產(chǎn)時(shí)間這么直接去干掉mysql.proc再重建