Mysql報錯合集
- 一.連結報錯
- 客戶端連線mysql出錯
- 連結客戶端出錯
- 互動登陸mysql出現warning警告Using a password
- 匯入資料到資料庫報錯ERROR 1050
- 登陸資料庫提示-bash: !@: event not found
- ACCess Denied for user(using password:YES)
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- Too many connections
- Starting MySQL... ERROR! The server quit without updating PID file (/ops/logs/mysql/mysql.pid).
- 遠端連線ERROR 2003 (HY000)
- 二.日誌報錯
- ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.
- ERROR 1197 (HY000): Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
- ERROR 1118 (42000): Row size too large (> 4030). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
- 三.其它報錯
一.連結報錯
客戶端連線mysql出錯
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
解答:
因為開啟了使用sock的登陸
mysql -u root --socket=/ops/data/mysql/mysqld.sock -p
連結客戶端出錯
ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: YES)
賬號密碼正確的,但是你用了localhost登陸,記錄中test沒有配置localhost的,所以要在mysql中建立一個 test@'localhost'的賬戶
ERROR 1045 (28000): Access denied for user 'maxscale'@'web1' (using password: YES)
這次是提示用web1登陸的,因為我加-h然後ip,就要在mysql中建立一個 test@'web1'的賬戶
互動登陸mysql出現warning警告Using a password
Warning: Using a password on the command line interface can be insecure.
解答:
使用
mysql_config_editor set --login-path=local --host=192.168.1.190 --user=zabbix --password
然後輸入zabbix使用者的密碼
登陸時使用:
mysql --login-path=local -e "show databases;"
有sockfang方式登陸使用:
mysql --login-path=local --socket=/ops/data/mysql/mysqld.sock -e "show databases;"
刪除
mysql_config_editor remove --login-path=remote
mysql_config_editor print --all
匯入資料到資料庫報錯ERROR 1050
ERROR 1050 (42S01) at line 1: Table 'users' already exists
解答:
匯入的資料在資料庫中存在了,有可能是重複匯入。
登陸資料庫提示-bash: !@: event not found
-bash: !@: event not found
解答:
密碼中帶 !@ 需要 -p'123!@' 就好了
ACCess Denied for user(using password:YES)
解答:
沒有你所輸入的賬戶,可以跳過密碼驗證後建立一個賬戶再登陸
5.登陸mysql
Access denied for user 'qpolar'@'localhost' (using password: YES)
解答:
1.可能沒這個使用者,還有可能這個使用者授權的是%,所以需要加 -h指定當前機器的ip
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
一種情況 mysql沒啟動
第二種 mysql連線預設為必須sock登陸,所以登陸需要新增--socket=xxx,或者更改/etc/my.cnf
Too many connections
這是因為mysql連結數太多了,使用mysql客戶端命令或者圖形化連結,一個就是一個連結數,如果有程式連結後沒有關閉連結(close),將會導致佔用一個連線數,大量的話將會沾滿。不過會保留1個連結用於root登陸
用root登陸mysql後用如下命令檢視,可以看到Command哪裡有大量sleep,並且翻到最後,可以看到連結數有200多,已經滿了。
show processlist
這種情況下,全是sleep(沒有任何操作,但是佔用一個連結),那就在my.cnf中新增如下,設定連結10秒沒有動作將清理掉。
wait_timeout=10
如果不是大量sleep,而是正常的Query,那就證明連線數不夠了
在my.cnf中新增如下,擴大連結數,不過最大也就1.6萬多
max_connections=10000
Starting MySQL... ERROR! The server quit without updating PID file (/ops/logs/mysql/mysql.pid).
問題:
描述是mysql在沒更新pid檔案的情況下異常退出。意思是mysql異常退出了,並沒有啟動程序
檢視日誌發現如下:
130216 16:11:33 [ERROR] Can't start server: Bind on TCP/IP port: Cannot assign requested address
130216 16:11:33 [ERROR] Do you already have another mysqld server running on port: 3306 ?
130216 16:11:33 [ERROR] Aborting
意思是3306埠被佔用,你可以netstat -unltp | grep :3306
檢視是否被佔用。
如果沒有唄佔用,可以netstat -anptu | grep :3306
,一把可以看到有程序還在使用3306埠連結中,這個應該是一個長連結,一直不釋放
可以看到後面顯示時一個java程式再連結3306埠。pid號為12461,那就ps -aux | grep 12461
,終止這個程式,不終止無法釋放
停止程式後,過一會再netstat -anptu | grep :3306
,就可以看到埠釋放了,再啟動mysql就行了
遠端連線ERROR 2003 (HY000)
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.xxx.xxx' (113)
解答:
1.需要開放mysql為0.0.0.0,然後建立可遠端賬號%
2.檢視/etc/my.cnf
註釋bind_address=127.0.0.1或者skip_networking
systemctl disable firewalld
開機不自啟
systemctl stop firewalld
關閉防火牆
二.日誌報錯
ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.
- 錯誤描述:MySQL開啟GTID後不支援此類語法,原因是弱事務,ddl和dml放一起了,無法保證事務的原子性。
- 解決辦法:(1)將gtid關閉。(2)create table select語句拆成create table t like t1;insert into t select * from t1;
ERROR 1197 (HY000): Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
- 問題描述:max_binlog_cache_size配置值太小,導致更新失敗。
- 解決辦法:加大max_binlog_cache_size的配置,或者將隔離級別改成rr且將binlog format改成mixed。
如果是rc模式,mixed的話也會記錄成row,原因是和gap lock有關,如果innodb_locks_unsafe_for_binlog引數設定為1就不會了(關閉gap lock,但是是read only屬性,即要重啟mysqld)
ERROR 1118 (42000): Row size too large (> 4030). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
- 問題描述:建立表異常,原因是char/varchar欄位的總長度超過4030。
- 解決辦法:關閉嚴謹的檢查機制。set global innodb_strict_mode=0;但是不建議這麼做,最好還是遵循提示建議,將char或者varchar改成text或者blog,或者將大欄位拆解成獨立表
從MySQL5.5.X版本開始,你可以開啟InnoDB嚴格檢查模式,尤其採用了頁資料壓縮功能後,最好是開啟該功能。開啟此功能後,當建立表(CREATE TABLE)、更改表(ALTER TABLE)和建立索引(CREATE INDEX)語句時,如果寫法有錯誤,不會有警告資訊,而是直接丟擲錯誤,這樣就可直接將問題扼殺在搖籃裡。
三.其它報錯
二.使用select * from 表名 group 欄位名時出現ERROR 1055
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'userdb.stu_info.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
修改/etc/my.cnf
新增一項程式碼
sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
重啟服務 systemctl restart mysqld
忘記了密碼怎麼做
vim /etc/my.cnf
新增
skip-grant-tables=1
重啟服務
systemctl restart mysqld
使用MySQL -uroot 回車登陸mysql。
匯入提示data too long for column ..
修改欄位型別大小(估計欄位超了,建議調大一點;例子vartchar(48)改成varchar(100))
格式:alter table 表 modify 欄位名 型別...
匯出報錯
可能沒有w許可權
chmod mysql /目錄/
mysql關閉後啟動失敗
檢視日誌,
2016-01-20T10:00:19.935795Z 0 [ERROR] Can't start server: can't create PID file: No such file or directory
160120 18:00:20 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
這說明mysql想建立pid檔案,但是沒有許可權 所以無法啟動
Mysql binlog 安全刪除
如果你的 Mysql 搭建了主從同步 , 或者資料庫開啟了 log-bin 日誌 , 那麼隨著時間的推移 , 你的資料庫 data 目錄下會產生大量的日誌檔案。
mysql-bin.000001、mysql- bin.000002等檔案是資料庫的操作日誌,例如UPDATE一個表,或者DELETE一些資料,即使該語句沒有匹配的資料,這個命令也會儲存到日誌 檔案中,還包括每個語句執行的時間,也會記錄進去的
下面來介紹幾種解決方法:
- 如果你的資料庫沒有搭建主從同步這樣的服務 , binlog 日誌也不用的情況下 , 你可以將 /etc/my.cnf 檔案下面行刪除或註釋掉
log-bin=mysql-bin
binlog_format=mixed
如果你需要這樣的檔案 , 那麼建議你在主配置檔案 /etc/my.cnf 中新增如下行 , 來限制 binlog 日誌檔案存在時間 , 過期自動刪除
expire_logs_days = 7
# 只保留 7 天的日誌檔案
- 如果你直接得到一臺伺服器 , 上面的 binlog 日誌已經影響到了磁碟空間 , 那麼你將使用下面命令清除(登入mysql上執行)
mysql> reset master;
# 清空所有 binlog 檔案
- 如果你的得到的伺服器 , mysql 還做了主從同步 , 那麼上面的命令就不適合你了 , 因為 binlog 檔案刪除過多的話 , 會導致資料不同步
mysql> show slave status;
# 你首先要來 slave 上檢視從庫讀 binlog 到 了哪裡
Master_Log_File: mysql-bin.000009 # 我們可以看到是 mysql-bin.000009
mysql> purge master logs to 'mysql-bin.000009';
# 我們可以在 master 中執行這條指令 , 將 binlog 檔案刪除至 mysql-bin.000009 前
mysql> purge master logs before '2014-11-18 00:00:00';
# 將 binlog 檔案刪除至此日期前