首頁 >資料庫 >mysql教程 >常見MySQL問題及解決方案

常見MySQL問題及解決方案

小云云
小云云原創
2017-11-21 09:43:102594瀏覽

身為程式設計師,MySQL必定時我們會運用到的東西,而且很重要,可是有時候在工作中MySQL資料庫難免會發生些問題,那我們要怎麼去處理呢?下面我們就談談平常工作中會遇到的MySQL常見的一些問題及解決方案。

一、忘記MySQL 的root 密碼

1. 登入資料庫所在的伺服器,手動 kill 掉mysql進程。

(1) 登入資料庫所在的伺服器,手動kill 掉MySQL 程序:

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

其中,mysql.pid 指的是MySQL 資料目錄下的pid 文件,它記錄了MySQL 服務的進程號。

(2) 使用--skip-grant-tables 選項重新啟動MySQL 服務:

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

--skip-grant-tables 選項意思是啟動MySQL 服務時跳過權限表認證。啟動後,連接到 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') 欄位後,更改密碼成功。刷新權限表,使權限認證重新生效。重新用 root 登入時,就可以使用剛剛修改後的口令了。

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

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

'table_name.frm' 被鎖定不能更改

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

檔案意外結束

記錄檔案被毀壞

從表格處理器得到錯誤nnn。

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

1. 使用myisamchk 工具

使用MySQL 自帶的myisamchk 工具來修正:

shell> myisamchk -r tablename

其中-r 參數的意思是recover,上面的方法幾乎能解決所有問題,如果不行,則使用指令:

shell> mysiamchk -o tablename

其中-o 參數的意思是--safe-recover,可以進行更安全的修復。

2. 使用 sql 指令

使用 MySQL 的 check table 和 repair table 指令一起進行修復,check table 用來檢查表是否有損壞;repair table 用來對壞表進行修復。

三、資料目錄磁碟空間不足的問題

系統上線後,隨著資料量的不斷增加,會發現資料目錄下的可用空間越來越小,從而給應用造成了安全隱患。

1. 對於myisam 儲存引擎的表

對於myisam 儲存引擎的表,在建表時可以用以下選項分別制定資料目錄和索引目錄儲存到不同的磁碟空間,而預設會同時放在資料目錄下:

data directory = 'absolute path to directory'index directory = 'absolute path to directory'

##如果表已經創建,只能先停機或將表鎖定,防止表的更改,然後將表的資料檔案和索引檔案mv 到磁碟充足的分割區上,然後在原始檔案處建立符號連結即可。

2. 對於 innodb 儲存引擎的表格

因為資料檔案和索引檔案是存放在一起的,所以無法將它們分開。當磁碟空間出現不足時,可以增加一個新的資料文件,這個文件放在充足空間的磁碟上。 
具體實作方法是在參數 innodb_data_file_path 中增加此文件,路徑寫為新磁碟的絕對路徑。
例如,如果/home 下空間不足,希望在/home1 下新增加一個可自動擴充資料的文件,那麼參數可以這麼寫:

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

參數修改後,必須重新啟動資料庫才可以生效。

四、DNS反向解析的問題(5.0 以後的版本預設跳過網域名稱反向解析)

在客戶端執行show processlist 指令,有時會出現很多進程,類似於:

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


##阿都有的這些流程,並且越來越多的進程#會消失,應用無法正常相應,導致系統癱瘓。

MySQL 在預設情況下對於遠端連接過來的IP 位址會進行域名的逆向解析,如果系統的hosts 檔案中沒有與之對應的域名,MySQL 就會將此連接認為是無效用戶,所以下進程中出現unauthenticated user 並導致進程阻塞。


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

五、mysql.sock 遺失後如何連接資料庫

在MySQL 伺服器本機連接資料庫時,常會出現mysql.sock 不存在,導致無法連接的問題。這是因為如果指定 localhost 作為主機名,則 mysqladmin 預設使用 Unix 套接字檔案連接,而不是 tcp/ip。而這個套接字檔案(一般命名為 mysql.sock)常常會因為各種原因而被刪除。透過 --protocol=TCP|SOCKET|PIPE|MEMORY 選項,使用者可以明確地指定連接協議,以下示範使用了 Unix 套接字失敗後使用 tcp 協議連接成功的範例。 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#########本文章分享了五個資料庫MySQL可能會遇到的問題及解決方案,希望能幫助大家,覺得有用的趕快收藏起來吧。 ######相關推薦:#########如何設定MySQL資料庫最安全? ############檢視MySQL資料表的索引方法#############關於MySQL觸發器的問題######

以上是常見MySQL問題及解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn