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;