1. 程式人生 > 其它 >Mysql報錯合集

Mysql報錯合集

目錄

一.連結報錯

客戶端連線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一些資料,即使該語句沒有匹配的資料,這個命令也會儲存到日誌 檔案中,還包括每個語句執行的時間,也會記錄進去的

下面來介紹幾種解決方法:

  1. 如果你的資料庫沒有搭建主從同步這樣的服務 , binlog 日誌也不用的情況下 , 你可以將 /etc/my.cnf 檔案下面行刪除或註釋掉

log-bin=mysql-bin

binlog_format=mixed

如果你需要這樣的檔案 , 那麼建議你在主配置檔案 /etc/my.cnf 中新增如下行 , 來限制 binlog 日誌檔案存在時間 , 過期自動刪除

expire_logs_days = 7 # 只保留 7 天的日誌檔案

  1. 如果你直接得到一臺伺服器 , 上面的 binlog 日誌已經影響到了磁碟空間 , 那麼你將使用下面命令清除(登入mysql上執行)

mysql> reset master; # 清空所有 binlog 檔案

  1. 如果你的得到的伺服器 , 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 檔案刪除至此日期前

本文版權歸作者所有,歡迎轉載,請務必新增原文連結。