經常見MySQL問題及處理方案
發表時間:2023-07-18 來源:明輝站整理相關軟件相關文章人氣:
[摘要]作為程序員,MySQL必定時我們會運用到的東西,而且很重要,可是有時候在工作中MySQL數據庫難免會發生些問題,那么我們怎么去處理呢?下面我們就談談平常工作中會遇到的MySQL常見的一些問題及解決方...
作為程序員,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中文網其它相關文章!
學習教程快速掌握從入門到精通的SQL知識。