常見MySQL問題及解決方案

作為程序員,mysql必定時我們會運用到的東西,而且很重要,可是有時候在工作中MySQL數(shù)據(jù)庫難免會發(fā)生些問題,那么我們怎么去處理呢?下面我們就談?wù)勂匠9ぷ髦袝龅降腗ySQL常見的一些問題及解決方案。

一、 忘記 MySQL 的 root 密碼

1. 登錄到數(shù)據(jù)庫所在的服務(wù)器,手工 kill 掉 mysql 進(jìn)程。

(1) 登錄到數(shù)據(jù)庫所在的服務(wù)器,手工 kill 掉 MySQL 進(jìn)程:

root@bogon:/data/mysql# kill `cat ./mysql.pid`

其中,mysql.pid 指的是 MySQL 數(shù)據(jù)目錄下的 pid 文件,它記錄了 MySQL 服務(wù)的進(jìn)程號。

(2) 使用 –skip-grant-tables 選項重啟 MySQL 服務(wù):

zj@bogon:/data/mysql$?sudo /usr/local/mysql/bin/mysqld –skip-grant-tables –user=root &

–skip-grant-tables 選項意思是啟動 MySQL 服務(wù)時跳過權(quán)限表認(rèn)證。啟動后,連接到 MySQL 的 root 將不需要口令。

(3) 用空密碼的 root 用戶連接到 mysql ,并且更改 root 口令:

zj@bogon:/usr/local/mysql/bin$?mysql?-uroot  Welcome?to?the?MySQL?monitor.??Commands?end?with?;?or?g.  Your?MySQL?connection?id?is?3Server?version:?5.7.18-log?Source?distribution  Copyright?(c)?2000,?2017,?Oracle?and/or?its?affiliates.?All?rights?reserved.  Oracle?is?a?registered?trademark?of?Oracle?Corporation?and/or?itsaffiliates.?Other?names?may?be?trademarks?of?their?respective  owners.  Type?'help;'?or?'h'?for?help.?Type?'c'?to?clear?the?current?input?statement.  MySQL?[(none)]>?set?password?=?password('123456');  ERROR?1290?(HY000):?The?MySQL?server?is?running?with?the?--skip-grant-tables?option?so?it?cannot?execute?this?statementMySQL?[(none)]>?use?mysql  Database?changed  MySQL?[mysql]>?update?user?set?authentication_string=password('123456')?where?user="root"?and?host="localhost";  Query?OK,?1?row?affected,?1?warning?(0.02?sec)  Rows?matched:?1??Changed:?1??Warnings:?1MySQL?[mysql]>?flush?privileges;  Query?OK,?0?rows?affected?(0.00?sec)  MySQL?[mysql]>?exit;  Bye  ****************************************************************  zj@bogon:/usr/local/mysql/bin$?mysql?-uroot?-p123456  mysql:?[Warning]?Using?a?password?on?the?command?line?interface?can?be?insecure.  Welcome?to?the?MySQL?monitor.??Commands?end?with?;?or?g.  Your?MySQL?connection?id?is?7Server?version:?5.7.18-log?Source?distribution  Copyright?(c)?2000,?2017,?Oracle?and/or?its?affiliates.?All?rights?reserved.  Oracle?is?a?registered?trademark?of?Oracle?Corporation?and/or?itsaffiliates.?Other?names?may?be?trademarks?of?their?respective  owners.  Type?'help;'?or?'h'?for?help.?Type?'c'?to?clear?the?current?input?statement.  MySQL?[(none)]>

由于使用了 –skip-grant-tables 選項啟動,使用 “set password” 命令更改密碼失敗,直接更新 user 表的 authentication_string(測試版本為5.7.18,有的版本密碼字段是 ‘password’) 字段后,更改密碼成功。刷新權(quán)限表,使權(quán)限認(rèn)證重新生效。重新用 root 登錄時,就可以使用剛剛修改后的口令了。

二、如何處理 myisam 存儲引擎的表損壞

有的時候可能會遇到 myisam 表損壞的情況。一張損壞的表的癥狀通常是查詢意外中斷,并且能看到下述錯誤:

‘table_name.frm’ 被鎖定不能更改

不能找到文件 ‘tbl_name.MYYI’ (errcode:nnn)

文件意外結(jié)束

記錄文件被毀壞

從表處理器得到錯誤 nnn。

通常有以下兩種解決方法:

1. 使用 myisamchk 工具

使用 MySQL 自帶的 myisamchk 工具進(jìn)行修復(fù):

shell> myisamchk -r tablename

其中 -r 參數(shù)的含義是 recover,上面的方法幾乎能解決所有問題,如果不行,則使用命令:

shell> mysiamchk -o tablename

其中 -o 參數(shù)的含義是 –safe-recover,可以進(jìn)行更安全的修復(fù)。

2. 使用 sql 命令

使用 MySQL 的 check table 和 repair table 命令一起進(jìn)行修復(fù),check table 用來檢查表是否有損壞;repair table 用來對壞表進(jìn)行修復(fù)。

三、 數(shù)據(jù)目錄磁盤空間不足的問題

系統(tǒng)上線后,隨著數(shù)據(jù)量的不斷增加,會發(fā)現(xiàn)數(shù)據(jù)目錄下的可用空間越來越小,從而給應(yīng)用造成了安全隱患。

1. 對于 myisam 存儲引擎的表

對于 myisam 存儲引擎的表,在建表時可以用如下選項分別制定數(shù)據(jù)目錄和索引目錄存儲到不同的磁盤空間,而默認(rèn)會同時放在數(shù)據(jù)目錄下:

data directory = ‘absolute path to directory’index directory = ‘absolute path to directory’

如果表已經(jīng)創(chuàng)建,只能先停機或者將表鎖定,防止表的更改,然后將表的數(shù)據(jù)文件和索引文件 mv 到磁盤充足的分區(qū)上,然后在原文件處創(chuàng)建符號鏈接即可。

2. 對于 innodb 存儲引擎的表

因為數(shù)據(jù)文件和索引文件是存放在一起的,所以無法將它們分離。當(dāng)磁盤空間出現(xiàn)不足時,可以增加一個新的數(shù)據(jù)文件,這個文件放在充足空間的磁盤上。?
具體實現(xiàn)方法是在參數(shù) innodb_data_file_path 中增加此文件,路徑寫為新磁盤的絕對路徑。?
例如,如果 /home 下空間不足,希望在 /home1 下新增加一個可自動擴充數(shù)據(jù)的文件,那么參數(shù)可以這么寫:

innodb_data_file_path =?/home/ibdata1:2000M;/home1/ibdata2:2000M:autoextend

參數(shù)修改后,必須重啟數(shù)據(jù)庫才可以生效。

四、DNS反向解析的問題 (5.0 以后的版本默認(rèn)跳過域名逆向解析)

在客戶端執(zhí)行 show processlist 命令,有時會出現(xiàn)很多進(jìn)程,類似于:

unauthenticated user |?192.168.10.10:55644?|?null?|?connect?|?null?|?login?|?null

這些進(jìn)程會累計的越來越多,并且不會消失,應(yīng)用無法正常相應(yīng),導(dǎo)致系統(tǒng)癱瘓。

MySQL 在默認(rèn)情況下對于遠(yuǎn)程連接過來的 IP 地址會進(jìn)行域名的逆向解析,如果系統(tǒng)的 hosts 文件中沒有與之對應(yīng)的域名,MySQL 就會將此連接認(rèn)為是無效用戶,所以下進(jìn)程中出現(xiàn) unauthenticated user 并導(dǎo)致進(jìn)程阻塞。

解決的方法很簡單,在啟動時加上 –skip-name-resolve 選項,則 MySQL 就可以跳過域名解析過程,避免上述問題。

五、mysql.sock 丟失后如何連接數(shù)據(jù)庫

在 MySQL 服務(wù)器本機上連接數(shù)據(jù)庫時,經(jīng)常會出現(xiàn) mysql.sock 不存在,導(dǎo)致無法連接的問題。這是因為如果指定 localhost 作為一個主機名,則 mysqladmin 默認(rèn)使用 Unix 套接字文件連接,而不是 tcp/ip。而這個套接字文件(一般命名為 mysql.sock)經(jīng)常會因為各種原因而被刪除。通過 –protocol=TCP|SOCKET|PIPE|MEMORY 選項,用戶可以顯式地指定連接協(xié)議,下面演示使用了 Unix 套接字失敗后使用 tcp 協(xié)議連接成功的例子。

1. Unix 套接字連接:

zj@bogon:~$ mysqlERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

2. tcp 連接

zj@bogon:~$?mysql –protocol=TCP

本篇文章分享了五個數(shù)據(jù)庫MySQL可能會遇到的問題及解決方案,希望能幫助到大家,覺得有用的趕緊收藏起來吧。

相關(guān)推薦:

如何設(shè)置MySQL數(shù)據(jù)庫最安全?

如何設(shè)置MySQL數(shù)據(jù)庫最安全?

如何設(shè)置MySQL數(shù)據(jù)庫最安全?

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊7 分享