因為伺服器要過期了所以將資料庫裡的資料遷移到新的庫中,新庫的配置比老庫要高階好多,配置檔案沒有區別,唯一就是版本不同。
在那天,就是那一天,把服務上線的時候,照例測試時,發現所有的查詢速度非常慢,慢的令人髮指,並且無法插入表情,所以排查導致的原因,並且解決問題。
對相同的sql發現測試庫(還是5.5)和新庫的執行計畫發現索引引用和命中的情況是不一樣的,所以懷疑是不是遷移資料導致索引失效,於是在新庫上重新構建索引。構建完後重新執行,發現速度恢復正常。記錄下,資料庫遷移有可能導致索引失效。
因為使用者資料是放在session裡的,而session使用的是redishttpsession。在插入資料時會從session中獲取使用者名稱,發現如果使用者名稱帶著表情,插入資料後,表情會變成問號(?)。
排查第一步:redis存入資料時出錯
剛開始認為可能是存入redis時表情已經是變成問號了,懷疑redis解析時出了問題,於是替換了sessionredistemplate,將它的defaultserializer(預設解析器)替換成使用fastjson實現的解析器,如下:
public class fastjson2jsonredisserializerimplements redisserializer
/*** serialize the given object to binary data.
* * @param t object to serialize
* @return the equivalent binary data
*/@override
public byte serialize(t t) throws serializationexception
return json.tojsonstring(t, serializerfeature.writeclassname).getbytes(standardcharsets.utf_8);
} /**
* deserialize an object from the given binary data.
* * @param bytes object binary representation
* @return the equivalent object instance
*/@override
public t deserialize(byte bytes) throws serializationexception
return json.parseobject(new string(bytes, standardcharsets.utf_8), this.clazz);
}}
滿懷期待的執行,雖然,不是問號,但是卻直接報錯,無法插入資料。t.t
排查第二步:表字段編碼不是utf8mb4
檢視log,發現插入語句裡是帶上了表情,但是在插入後,資料庫不識別這個字元,導致報錯。
查詢新庫的表結構,發現對應欄位是utf8mb4沒錯。
自己構造了一條insert語句,使用了表情,發現插入是正常。
所以排除此原因。
排查第三步:資料庫連線問題
檢視log得知,在服務端生成的sql語句是正常的帶有表情,到資料庫插入的時候資料庫缺不識別,懷疑是不是資料傳輸過程中或者到資料庫時導致資料變化。
使用的是durid資料池連線,查詢durid連線池配置,發現了乙個配置 initconnectionsqls,將其設定為 set names 『utf8mb4』 後,資料插入成功。檢視資料也不再是?,而是對應的表情。找到問題了,就是這
排查第四步:認識 set names 『***』 命令
set names 『***』 命令會將資料庫連線的 character_set_client、character_set_connection、character_set_results 配置統一修改字符集為 ***。
character_set_client:客戶端使用的字符集。
character_set_connection:連線資料庫的字符集。
character_set_results:返回給客戶端時使用的字符集。
檢視老庫的字符集,使用 show variables like 『%char%』 :
發現三個引數都是utf8mb4。
檢視新庫的字符集:
發現都是utf8,這就解釋了為什麼插入表情不成功,因為字符集不匹配,導致插入失敗。
以後遷移資料庫,遷移雲啥的要多做些準備,面對隨時可能的問題。
遷移當天一直奮鬥到凌晨3點還是沒有全部解決。t.t
我愛遷移。我愛上線。嗯。
index merge導致MySql死鎖問題
index merge 導致線上死鎖問題 問題造成條件 兩個事務分別執行兩次update操作 每個用到了兩個及以上索引 由於兩邊索引順序不一致導致 造成原因 innodb使用索引來實現行級別的鎖,事務a 通過index1 對某個欄位加了鎖 事務b 通過index2 對另乙個欄位加了鎖 兩個事務都持有...
mysql主從同步切換導致資料經常丟失問題解決
mysql主庫設定了innodb flush log at trx commit 1andsync binlog 1引數保證了其一致性 切主從庫的時候,之前的從庫沒有如上的兩個引數導致現在的主從經常丟一部分資料。所以加上之後就恢復了。在使用innodb和事務的複製設定中獲得最大的永續性和一致性,需在...
MySQL的公升級遷移
遷移公升級 資料備份 資料遷移 歡迎來到來到大浪濤天的部落格!2.5.6資料庫的資料備份,並在5.7恢復資料 1 1.建立必須的目錄 mkdir data mysql data p mkdir data binlog p 1 2.建使用者,改許可權 useradd mysql 1 3.修改環境變數 ...