1. 程式人生 > >mysql 資料庫問題整理

mysql 資料庫問題整理

1. 資料庫中出現亂碼

問題描述: 在html 頁面中設定了頁面的編碼,設定了後臺req.setCharacterEncoding("UTF-8"); 但是資料庫中還是有亂碼,檢視資料庫編碼和表編碼均設為UTF-8,

解決: 發現配置的 mysql url 中沒有帶編碼為UTF-8; 例如: jdbc:mysql://localhost:3306/httpclientcrawler?useUnicode=true&characterEncoding=UTF-8

參考: https://www.cnblogs.com/tom-plus/p/5701741.html

2. mysql Lock wait timeout exceeded; try restarting transaction (資料庫鎖超時等待)

問題描述: 後臺經常報鎖超時等待,是因為有執行緒拿住了鎖,其他執行緒拿不到鎖,超時等待的原因造成的,是當前事務在等待其它事務釋放鎖資源造成的。

解決: 在mysql查詢中執行以下指令
SELECT * FROM information_schema.innodb_trx

檢視沒有引數的執行緒,並殺死,

kill + mysql_thread_id  殺死多餘的執行緒
參考: https://blog.csdn.net/wanderlustLee/article/details/79235005

3.Could not retrieve transaction read-only status from server
Caused by: java.sql.SQLException: ResultSet is from UPDATE. No Data.

mysql 資料庫報只讀事務

問題描述:在select 操作時,事務時只讀事務,如果後面接著操作 delete 等事務,就會報這個問題,下面一行 No Data 可能是另外的錯

解決:

查詢資料隔離級別:SHOW VARIABLES LIKE '%iso%';
如果隔離級別: REPEATABLE-READ 則改成 READ-COMMITTED
sql :SET GLOBAL tx_isolation='READ-COMMITTED';  (記得java重啟應用)
                                           要永久生效的就改my.cnf。
分析:當資料庫隔離級別為REPEATABLE-READ時,釋出一個select語句也算是事物的開始,而且在hibernate裡會把以select語句開頭的事務標記為只讀事務,此時在這個事務裡再執行insert、update、delete等

參考: https://blog.csdn.net/zero_plus/article/details/47295507

4  1093 錯誤,你不能先根據某個表查詢,在刪除或更新某個表

1093

You can't specify target table 'user_friend' for update in FROM clause

例如: DELETE FROM user_friend WHERE account IN (SELECT friend_account FROM user_friend WHERE account = 'xxx' AND friend_group_id='2') AND friend_account = 'xxx'

如果in 後面跟的是正常的 id 或者是用其他表查出的則不會報錯,只限於mysql資料庫

參考: https://www.jb51.net/article/60926.htm

5 mybaties 一個delete 同時寫刪除多個表的多條sql 語句

要在jdbc.url 的後面加上 批量更新的語句 allowMultiQueries=true

可以同時update/delete 多條語句

6. mysql : ERROR 1813 (HY000): Tablespace '`db1`.`table1`' exists.

參考:https://blog.csdn.net/hero_hope/article/details/82256458?utm_source=blogxgwz0

mysql 某個表突然資料丟失,將表刪除後,無法繼續新建同名表,提示表不存在

  1. 表現:table1表被刪以後,想要重新建,結果新建不了
  2. 原因:table1表在對應的表空間依然存在
  3. 解決辦法:刪除對應的.ibd檔案即可,比如上面這個,找到mysql下,db1資料夾下的table1.ibd檔案,幹掉即可

7. MySQL資料庫表中有自增主鍵ID,當用SQL插入語句中插入語句帶有ID列值記錄的時候;如何表示該id列

1. 將該列表示為 0 或 null,mysql 會自動處理該AUTO_INCREMENT自增欄位

2. 手動指定需要插入的列,不插入這一個欄位的資料!

參考 : https://blog.csdn.net/qq_16143757/article/details/75303442

8. mysql 避免重複插入

參考: https://www.cnblogs.com/duanxiaojun/p/6855680.html?utm_source=itdadao&utm_medium=referral

1.insert ignore into 

出現相同列時,自動忽略新的列,但是有錯誤,也會自動忽略
2.on duplicate key update 

前提: 是需要將將主鍵列寫入insert 語句中,有錯誤不會忽略

3.insert … select … where not exist

根據select的條件判斷是否插入,可以不光通過primary 和unique來判斷,也可通過其它條件

例如: 

INSERT INTO public_message_status(列一,列二)   
 SELECT 值一,值二 FROM DUAL WHERE NOT EXISTS(SELECT public_message_status_id FROM public_message_status WHERE ...)

4.replace into 

如果存在相同紀錄,先刪除舊資料,在插入新資料