1. 程式人生 > 資料庫 >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 3
Server 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 its
affiliates. 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 statement
MySQL [(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: 1

MySQL [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 7
Server version: 5.7.18-log Source distribution

Copyright (c) 2000,Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. 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:~$ mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

2. tcp 連線

zj@bogon:~$ mysql --protocol=TCP

六、MyISAM表過大,無法訪問問題

首先我們可以通過myisamchk命令來檢視MyISAM表的情況。如下圖,我檢視admin表


  • datefile length代表當前檔案大小
  • keyfile length代表索引檔案大小
  • max datefile length 最大檔案大小
  • max keyfile length 最大索引大小

可以通過如下命令來進行擴充套件資料檔案大小

alter table table_name MAX_ROWS=88888888 AVG_ROW_LE=66666

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

針對MyISAM儲存引擎

可以將資料目錄和索引目錄儲存到不同的磁碟空間。

針對InnoDB儲存引擎

對於InnoDB儲存引擎的表,因為資料檔案和索引檔案時存放在一起的。所以無法將他們分離。當磁碟空間出現不足時候,可以增加一個新的資料檔案,這個檔案放在有充足空間的磁碟上。具體實現是通過InnoDB_data_file_path中增加此檔案。

innodb_data_file_path=/home/mysql/data:10000M;/user/mysql/data:10000M:autoextend 

引數修改之後,需要重啟伺服器,才可以生效。

八、同一臺主機上安裝多個Mysql

除了每個Mysql安裝目錄不能相同外,還需要的是port和socket不能一樣。

mysql.sock就是客戶端連線與mysql間通訊用的。socket檔案,只能本機使用,遠端連線要通過tcp/ip了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。