MySQL常見問題集錦解答及技巧

來源:互聯網
上載者:User

MySQL總是崩潰 

  首先你應該試著找出問題mysqld守護進程是否死掉或你的問題是否與你的客戶有關。你可以用mysqladmin version檢查你的mysqld伺服器正常執行了多長時間,如果mysqld死了,你可以在檔案“mysql-data-directory/'hostname'.err”中找到其原因。

  使用MySQL時的一些常見錯誤 

  MySQL server has gone away

  常見的原因是伺服器逾時了並且關閉了串連。預設地,如果沒有事情發生,伺服器在 8個小時後關閉串連。你可在啟動mysqld時通過設定wait_timeout變數改變時間限制。

  如果mysqld得到一個太大或不正常的包,它認為客戶出錯了並關閉串連。

  Can't connect to [local] MySQL server

  通常意味著沒有一個MySQL伺服器運行在系統上或當試圖串連mysqld伺服器時,你正在使用一個錯誤的通訊端檔案或TCP/IP連接埠。 

  檢查(使用ps)伺服器上是否有一個名為mysqld的進程啟動

  如果一個mysqld進程正在運行,可以通過嘗試這些不同的串連來檢查伺服器

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命令使用反引號“`”而非正引號“'”;這些導致hostname輸出(即,當前主機名稱)被代替進mysqladmin命令中。

  Host '...' is blocked錯誤

Host 'hostname' is blocked because of many connection errors.

Unblock with 'mysqladmin flush-hosts'

  這意味著,mysqld已經得到了大量(max_connect_errors)的主機'hostname'的在中途被中斷了的串連請求。在max_connect_errors次失敗請求後,mysqld認定出錯了(象來字一個駭客的攻擊),並且阻止該網站進一步的串連,直到某人執行命令mysqladmin flush-hosts。

預設地,mysqld在10個串連錯誤後阻塞一台主機。你可以通過象這樣啟動伺服器很容易地調整它:

shell> safe_mysqld -O max_connect_errors=10000 &

  Too many connections錯誤

  意味著已經有max_connections個客戶串連了mysqld伺服器。

  如果你需要比預設(100)更多的串連,那麼你應該重啟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。這個錯誤的原因很簡單,客戶沒有足夠的記憶體儲存全部結果。

  首先檢查你的查詢是否正確

  Packet too large錯誤 

  一個MySQL客戶或mysqld伺服器得到一個比max_allowed_packet個位元組長的包

  可以通過用mysql --set-variable=max_allowed_packet=8M指定一個更大的緩衝區來啟動客戶程式。

  The table is full錯誤

  這個錯誤發生在記憶體暫存資料表變得比tmp_table_size位元組大時。

  Commands out of sync in client錯誤

  正在以錯誤的次序調用客戶函數!

  Ignoring user錯誤

Found wrong password for user: _user@some_host'">'some_user@some_host'; Ignoring user

  這意味著在mysqld啟動時或在它再次裝載許可權表時,它在user表中找到了一個有一個無效口令的條目。結果,條目簡單地被許可權系統忽略。

  Table 'xxx' doesn't exist錯誤

  資料庫和表名件是區分大小寫!可以用SHOW TABLES檢查你在當前資料庫中有哪個表。

  從一個文字檔運行SQL命令 

  可以把SQL命令放在一個檔案中並且告訴mysql從該檔案讀取其輸入:創造一個文字檔“text_file”,它包含要執行的命令。然後如下調用mysql:

shell> mysql database < text_file

  或

shell> mysql < text_file

  啟動有USE db_name語句的文字檔。

  怎樣重新設定一個忘記的口令 

  如果忘記了MySQL的root使用者的口令,可以使用如下方法恢複: 

  通過發送一個kill(不是kill -9)到mysqld伺服器來關閉mysqld伺服器。pid 被儲存在一個.pid檔案中,通常在MySQL資料庫目錄中:

  kill `cat /mysql-data-directory/hostname.pid`

  你必須是一個UNIX root使用者或運行伺服器的相同使用者做這個。

  使用--skip-grant-tables選項重啟mysqld。 

  用mysql -h hostname mysql串連mysqld伺服器並且用一條GRANT命令改變口令。見7.26 GRANT和REVOKE句法。也可以用mysqladmin -h hostname -u user password 'new password' 進行。 

  用mysqladmin -h hostname flush-privileges或用SQL命令FLUSH PRIVILEGES來裝載許可權表。 

  使用DATE列的問題 

  DATE值的格式是'YYYY-MM-DD'。

  改變一張表中列的順序 

  在一個應用程式中,應該決不基於他們的位置使用SELECT * 檢索列,因為被返回的列的順序永遠不能保證;對資料庫的一個簡單改變可能導致應用程式相當有戲劇性地失敗。

  可以使用如下方法改變:

  以正確的列順序建立一張新表。 

  執行INSERT INTO new_table SELECT fields-in-new_table-order FROM old_table. 

  刪除或改名old_table。 

  ALTER TABLE new_table RENAME old_table。

  資料庫複寫

  MySQL(至今)沒有資料庫複寫,但是有一些如何?的資訊。

  複製一個資料庫最一般的方法是使用更新日誌。

  Database Backup

  為了得到一個一致的備份,在相關的表上做一個LOCK TABLES。你只需一個讀鎖定;當你在資料庫目錄中做檔案的一個拷貝時,這允許其他線程繼續查詢該表。如果你想要做一個SQL級的備份,你可以SELECT INTO OUTFILE。

  備份一個資料庫的另一個方法是使用mysqldump程式:

  為你的資料庫做一個完整的備份:

shell> mysqldump --tab=/path/to/some/dir --opt --full

 
  你也可以簡單地拷貝所有的表檔案(“*.frm”、“*.MYD”和“*.MYI”檔案),只要伺服器不在更新任何東西。

  停止mysqld如果它正在運行,然後以--log-update選項啟動它。你將得到一個名為“hostname.n”形式的記錄檔, 這裡n是隨著你每次執行mysqladmin refresh或mysqladmin flush-logs、FLUSH LOGS語句、或重啟伺服器而遞增的一個數字。這些記錄檔向你提供了在你執行mysqldump處後面進行的複製資料庫改變的所需資訊。

  如果你必須恢複一些東西,嘗試首先用myisamchk -r恢複你的表。這應該處理所有情況的99.9%。如果myisamchk失敗,嘗試下列過程:


  恢複原來的mysqldump備份。

  執行下列命令以再次運行更新日誌中的更改:

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 ...恢複。為了避免重複記錄,在表中你需要一個PRIMARY KEY或UNIQUE鍵。當在唯一索引值上一個新記錄與一個老記錄重複時,REPLACE關鍵詞使得老記錄用一個新記錄替代。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.