MySQL常見問題解答及技巧
MySQL總是崩潰
首先你應(yīng)該試著找出問題mysqld守護(hù)進(jìn)程是否死掉或你的問題是否與你的客戶有關(guān)。你可以用mysqladmin version檢查你的mysqld服務(wù)器正常執(zhí)行了多長時間,如果mysqld死了,你可以在文件“mysql-data-directory/'hostname'.err”中找到其原因。
使用MySQL時的一些常見錯誤
MySQL server has gone away
常見的原因是服務(wù)器超時了并且關(guān)閉了連接。缺省地,如果沒有事情發(fā)生,服務(wù)器在 8個小時后關(guān)閉連接。你可在啟動mysqld時通過設(shè)置wait_timeout變量改變時間限制。
如果mysqld得到一個太大或不正常的包,它認(rèn)為客戶出錯了并關(guān)閉連接。
Can't connect to [local] MySQL server
通常意味著沒有一個MySQL服務(wù)器運(yùn)行在系統(tǒng)上或當(dāng)試圖連接mysqld服務(wù)器時,你正在使用一個錯誤的套接字文件或TCP/IP端口。
檢查(使用ps)服務(wù)器上是否有一個名為mysqld的進(jìn)程啟動
如果一個mysqld進(jìn)程正在運(yùn)行,可以通過嘗試這些不同的連接來檢查服務(wù)器
shell> mysqladmin version
shell> mysqladmin variables
shell> mysqladmin -h `hostname` version variables
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h 'ip for your host' version
shell> mysqladmin --socket=/tmp/mysql.sock version
注意hostname命令使用反引號“`”而非正引號“'”;這些導(dǎo)致hostname輸出(即,當(dāng)前主機(jī)名)被代替進(jìn)mysqladmin命令中。
Host '...' is blocked錯誤
Host 'hostname' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
這意味著,mysqld已經(jīng)得到了大量(max_connect_errors)的主機(jī)'hostname'的在中途被中斷了的連接請求。在max_connect_errors次失敗請求后,mysqld認(rèn)定出錯了(象來字一個黑客的攻擊),并且阻止該站點(diǎn)進(jìn)一步的連接,直到某人執(zhí)行命令mysqladmin flush-hosts。
缺省地,mysqld在10個連接錯誤后阻塞一臺主機(jī)。你可以通過象這樣啟動服務(wù)器很容易地調(diào)整它:
shell> safe_mysqld -O max_connect_errors=10000 &
Too many connections錯誤
意味著已經(jīng)有max_connections個客戶連接了mysqld服務(wù)器。
如果你需要比缺省(100)更多的連接,那么你應(yīng)該重啟mysqld,用更大的 max_connections 變量值。
Out of memory錯誤
mysql: Out of memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory
注意,錯誤指向了MySQL客戶mysql。這個錯誤的原因很簡單,客戶沒有足夠的內(nèi)存存儲全部結(jié)果。
首先檢查你的查詢是否正確
Packet too large錯誤
一個MySQL客戶或mysqld服務(wù)器得到一個比max_allowed_packet個字節(jié)長的包
可以通過用mysql --set-variable=max_allowed_packet=8M指定一個更大的緩沖區(qū)來啟動客戶程序。
The table is full錯誤
這個錯誤發(fā)生在內(nèi)存臨時表變得比tmp_table_size字節(jié)大時。
Commands out of sync in client錯誤
正在以錯誤的次序調(diào)用客戶函數(shù)!
Ignoring user錯誤
Found wrong password for user: 'some_user@some_host'; Ignoring user
這意味著在mysqld啟動時或在它再次裝載權(quán)限表時,它在user表中找到了一個有一個無效口令的條目。結(jié)果,條目簡單地被權(quán)限系統(tǒng)忽略。
Table 'xxx' doesn't exist錯誤
數(shù)據(jù)庫和表名件是區(qū)分大小寫的!可以用SHOW TABLES檢查你在當(dāng)前數(shù)據(jù)庫中有哪個表。
從一個文本文件運(yùn)行SQL命令
可以把SQL命令放在一個文件中并且告訴mysql從該文件讀取其輸入:創(chuàng)造一個文本文件“text_file”,它包含要執(zhí)行的命令。然后如下調(diào)用mysql:
shell> mysql database < text_file
或
shell> mysql < text_file
啟動有USE db_name語句的文本文件。
怎樣重新設(shè)置一個忘記的口令
如果忘記了MySQL的root用戶的口令,可以使用如下方法恢復(fù):
通過發(fā)送一個kill(不是kill -9)到mysqld服務(wù)器來關(guān)閉mysqld服務(wù)器。pid 被保存在一個.pid文件中,通常在MySQL數(shù)據(jù)庫目錄中:
kill `cat /mysql-data-directory/hostname.pid`
你必須是一個UNIX root用戶或運(yùn)行服務(wù)器的相同用戶做這個。
使用--skip-grant-tables選項(xiàng)重啟mysqld。
用mysql -h hostname mysql連接mysqld服務(wù)器并且用一條GRANT命令改變口令。見7.26 GRANT和REVOKE句法。也可以用mysqladmin -h hostname -u user password 'new password' 進(jìn)行。
用mysqladmin -h hostname flush-privileges或用SQL命令FLUSH PRIVILEGES來裝載權(quán)限表。
使用DATE列的問題
DATE值的格式是'YYYY-MM-DD'。
改變一張表中列的順序
在一個應(yīng)用程序中,應(yīng)該決不基于他們的位置使用SELECT * 檢索列,因?yàn)楸环祷氐牧械捻樞蛴肋h(yuǎn)不能保證;對數(shù)據(jù)庫的一個簡單改變可能導(dǎo)致應(yīng)用程序相當(dāng)有戲劇性地失敗。
可以使用如下方法改變:
以正確的列順序創(chuàng)建一張新表。
執(zhí)行INSERT INTO new_table SELECT fields-in-new_table-order FROM old_table.
刪除或改名old_table。
ALTER TABLE new_table RENAME old_table。
數(shù)據(jù)庫復(fù)制
MySQL(至今)沒有數(shù)據(jù)庫復(fù)制,但是有一些如何實(shí)現(xiàn)的信息。
復(fù)制一個數(shù)據(jù)庫最一般的方法是使用更新日志。
數(shù)據(jù)庫備份
為了得到一個一致的備份,在相關(guān)的表上做一個LOCK TABLES。你只需一個讀鎖定;當(dāng)你在數(shù)據(jù)庫目錄中做文件的一個拷貝時,這允許其他線程繼續(xù)查詢該表。如果你想要做一個SQL級的備份,你可以SELECT INTO OUTFILE。
備份一個數(shù)據(jù)庫的另一個方法是使用mysqldump程序:
為你的數(shù)據(jù)庫做一個完整的備份:
shell> mysqldump --tab=/path/to/some/dir --opt --full
你也可以簡單地拷貝所有的表文件(“*.frm”、“*.MYD”和“*.MYI”文件),只要服務(wù)器不在更新任何東西。
停止mysqld如果它正在運(yùn)行,然后以--log-update選項(xiàng)啟動它。你將得到一個名為“hostname.n”形式的日志文件, 這里n是隨著你每次執(zhí)行mysqladmin refresh或mysqladmin flush-logs、FLUSH LOGS語句、或重啟服務(wù)器而遞增的一個數(shù)字。這些日志文件向你提供了在你執(zhí)行mysqldump處后面進(jìn)行的復(fù)制數(shù)據(jù)庫改變的所需信息。
如果你必須恢復(fù)一些東西,嘗試首先用myisamchk -r恢復(fù)你的表。這應(yīng)該處理所有情況的99.9%。如果myisamchk失敗,嘗試下列過程:
恢復(fù)原來的mysqldump備份。
執(zhí)行下列命令以再次運(yùn)行更新日志中的更改:
shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
ls被用來以正確的順序得到所有的日志文件。
你也可以與SELECT * INTO OUTFILE 'file_name' FROM tbl_name做有選擇的備份并且用LOAD DATA INFILE 'file_name' REPLACE ...恢復(fù)。為了避免重復(fù)記錄,在表中你需要一個PRIMARY KEY或UNIQUE鍵。當(dāng)在唯一鍵值上一個新記錄與一個老記錄重復(fù)時,REPLACE關(guān)鍵詞使得老記錄用一個新記錄替代。
關(guān)鍵字:MySQL、mysqldump、服務(wù)器
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解