程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql的死鎖等6個實戰問題解決

mysql的死鎖等6個實戰問題解決

編輯:MySQL綜合教程

mysql的死鎖等6個實戰問題解決


mysql的死鎖等6個實戰問題解決

目錄:

鎖表後的解鎖 mysql連接數不夠 mysql的root密碼修改 密碼正確卻登錄不進 datetime類型有0問題 查看表占用空間

鎖表後的解鎖

當對表做dml操作時卡住,很可能是表被鎖。
到數據庫主機,查看進程命令:
show processlist;
找到有鎖的進程id,殺掉:
kill id;

processlist是全部的進程,比較多,有時候,從processlist裡能看到哪個鎖住,但有時候它和其他進程看上去一樣。
這時需要查看數據表:

SELECT * FROM information_schema.INNODB_TRX;
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

看trx_mysql_thread_id字段,這個是死鎖的進程id,然後到主機那裡kill掉即可。

經驗提示:最好不要用客戶端界面修改表結構,有可能會鎖住。最好使用語句。(不過,其實我也經常貪圖方便,直接用SQLyog直接修改表結構,方便嘛。偶爾鎖住了kill掉即可,畢竟只是開發環境,生產環境必須不能如此)
增加字段:ALTER TABLE tf_b_depart ADD (PARENT_MAJOR VARCHAR(6));
修改字段:alter table tf_f_task_target modify VALUE decimal(16,2);
建表:CREATE TABLE td_s_salary_index (index_id VARCHAR(8));

mysql連接數不夠

陸續開發人員的eclipse裡突然報錯信息:

MySQLNonTransientConnectionException
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: “Too many connections”
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

原因:max_connections mysql 默認值為100,超過了就會報錯。重啟mysql即可。為了防止後面再出現,需要把max_connections改為1000或更多。

[mysql@paas03 ~]$more my.cnf
[mysqld_multi]
mysqld = /app/mysql/bin/mysqld_safe
mysqladmin = /app/mysql/bin/mysqladmin
user = mysql
password = a@Aug22
log=/app/log/mysqld_multi.log

[mysqld01]
port = 3010
socket = /tmp/mysql.sock01
pid-file = /app/data_paas/db-app.pid
basedir = /app/mysql
datadir = /app/data_paas
user = mysql
symbolic-links=0
character-set-server=utf8
lower_case_table_names=1
innodb_log_file_size=128M
innodb_log_buffer_size=4M
innodb_buffer_pool_size=1G
event_scheduler=1
explicit_defaults_for_timestamp
max_connections=1500
join_buffer_size = 128M
sort_buffer_size = 10M
read_rnd_buffer_size = 2M

參考:http://www.cnblogs.com/S-E-P/archive/2011/04/29/2045050.html

mysql的root密碼修改

SELECT * FROM mysql.user WHERE USER='root';
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('root123');
SET PASSWORD FOR 'root'@'paas03' = PASSWORD('root123');
SET PASSWORD FOR 'root'@'%' = PASSWORD('root123');

注:親測OK。

密碼正確卻登錄不進

Caused by: java.sql.SQLException: Access denied for user ‘zplat_cen1’@’aifs1’ (using password: YES)

其他機器可以登錄,就是安裝了這個數據庫的本機不能登錄。然後發現不需要密碼就可以登錄了(去掉-p),但是只有test庫。
http://www.jb51.net/article/19326.htm這裡裡面說的delete from user where user is NULL;是扯淡的。
真正的原因是dba沒創建本主機的用戶,mysql和oracle不太一樣,同一個用戶,需要在三台機器分別創建,包括localhost、本主機名、%(表示通配符)。應該CREATE USER 'zplat_cen1'@'aifs1' IDENTIFIED BY 'XXX';就可以了。

datetime類型有.0問題

mysql datetime類型,後面會有.0
2015-07-21 16:37:47.0
有兩種解決方法:
1. 寫sql時增加DATE_FORMAT(RECEIVE_TIME, '%Y-%m-%d %H:%i:%s'),這個非常麻煩,每個sql都得加
2. 修改你公司的框架代碼,統一處理一下

if (type == Types.TIMESTAMP) { // 增加對時間類型的支持,修復mysql顯示.0問題 2015.7.21
    Timestamp t = rs.getTimestamp(name);
    if (t == null)
        return null;
    SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = sDateFormat.format(t);
    return date;
}

參考:http://blog.csdn.net/zhanghaotian2011/article/details/7721551

同樣的decimal類型也有這個問題,前台顯示全部加.00

if (type == Types.DECIMAL) { // 增加對decimal類型的支持,修復mysql顯示.00問題 2015.7.22
    String decimal = rs.getString(name);
    if (decimal == null)
        return null;
    if(decimal.indexOf(".") > 0){  
        decimal = decimal.replaceAll("0+?$", "");//去掉多余的0
        decimal = decimal.replaceAll("[.]$", "");//如最後一位是.則去掉
    }
    return decimal;
}

PS:學好正則表達式是多麼的重要!否則去0的這個代碼你怎麼??

查看表占用空間

SELECT table_name,data_length/1024/1024 MB FROM  information_schema.tables 
WHERE table_schema='zplatdb' ORDER BY data_length DESC;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved