使用最高權(quán)限用戶執(zhí)行導(dǎo)出時遇到權(quán)限問題
(Got error:1356/1449均和此問題有關(guān))
這個庫本身是從別的地方通過Xtrabackup遷移過來的,在完成遷移之后原庫的很多用戶已經(jīng)丟失了欢唾,但是在某些視圖中卻是定義了definer的点把,這導(dǎo)致在執(zhí)行導(dǎo)出時,這些視圖根本無法去讀取幌衣,即使是最高權(quán)限的root也不行
對mysql.proc和information_schema.views進(jìn)行查詢矾削,可以發(fā)現(xiàn)這些不存在的用戶
①SELECT definer,type FROM mysql.proc GROUP BY definer,type;
②select TABLE_SCHEMA,table_name,definer,SECURITY_TYPE from information_schema.views;
由于沒有任何用戶可以對information_schema.views進(jìn)行直接修改,因此definer的修改需要采用下列語句
③select concat("alter DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW ",TABLE_SCHEMA,".",TABLE_NAME," as ",VIEW_DEFINITION,";") from information_schema.VIEWS where DEFINER not in ('root@localhost','mysql.sys@localhost');
將第③步找出的所有結(jié)果(下圖標(biāo)藍(lán)的alter語句)拷貝到新的查詢窗口中進(jìn)行執(zhí)行豁护,可以將所有除開mysql.sys以外的definer值修改成root@localhost從而解決該權(quán)限問題哼凯;
(還有一種很吃力而且不討好但可以解決問題的方法就是把這些對應(yīng)的definer全部創(chuàng)建出來并賦予權(quán)限)
注意:如果遇到執(zhí)行失敗,有可能導(dǎo)致不是所有語句都完成執(zhí)行楚里,所以完成執(zhí)行之后断部,一定要再次執(zhí)行第③條語句,確定無法查出任何不滿足的條件才OK(如下圖)班缎,否則的話蝴光,需要結(jié)合第②條語句的結(jié)果集,檢查沒有執(zhí)行成功的語句
通過information_schema.views可以看到修改已經(jīng)生效
You can't use locks with log tables. when using LOCK TABLES
(Got error : 1556)
網(wǎng)上對于這個錯誤的處理辦法是下圖這樣的
第4條在做主從的時候吝梅,是不可能采用這個參數(shù)的虱疏;
第3條和第2條的意義差不多,但并不一定能完全解決問題
打開general_log苏携,發(fā)現(xiàn)即使排除了general_log和slow_log后做瞪,在執(zhí)行到對mysql庫的導(dǎo)出時,仍然出現(xiàn)了1556的報錯,對mysql庫其他表進(jìn)行排查装蓬,發(fā)現(xiàn)slow_log_view也存在無法鎖定的問題
最后的導(dǎo)出語句如下:(注意ignore-table參數(shù)需要多次寫出)
mysqldump -uroot -p'密碼' -A --ignore-table=mysql.general_log --ignore-table=mysql.slow_log --ignore-table=mysql.slow_log_view > all.sql
綜合來說著拭,第1條解決方案較為合適,在做主從的時候牍帚,我們不希望對mysql和is庫進(jìn)行導(dǎo)出儡遮,對應(yīng)語句如下
mysql -e "show databases;" -uroot -p密碼| grep -Ev "Database|information_schema|mysql|test" | xargs mysqldump -uroot -p密碼 --databases --single-transaction --master-data=2 > all.sql