FAQ-MySQL Admin

    版本為 21:26, 20 Nov 2024

    到這個版本。

    返回到 版本存檔.

    查閱目前版本

    MySQL 資料庫管理問與答。

    求助指令

    mysql> \h
    mysql> help
    mysql> help <command>;
    
    shell> perror <ErrCode#>
    

    Q: 錯誤訊息:ERROR 2013 (HY000) at line 190: Lost connection to MySQL server during query

    Ans:資料庫在本機做匯入時,總是出現這個錯誤。原因可能是系統記憶體過小,解決方式:

    • 增加實體記憶體
    • 或者,建立 SWAP 虛擬記憶體檔

    Q: 分析 SQL statement

    Ans: explain 的使用範例

    mysql> create table t(a int, b int, c int);
    mysql> create index t_idx on  t (a,b,c);
    mysql> insert into t values (1, 1, 1);
    ... (load 10 more test rows like this) ...
    
    mysql> explain select * from t where a=1 or b=1;
    | table | type  | possible_keys | key   | key_len | ref  
    | t     | index | t_idx         | t_idx |      15 | NULL 

     

    Q: root 密碼遺失怎辦

    Ans: 以系統的 root 做強制重設密碼步驟

    // 切換到 root
    su -
    // 停止 MySQL 服務
    service mysqld stop
    // 以 --skip-grant-tables 啟動 MySQL
    mysqld_safe --skip-grant-tables --user=root &
    // 不用密碼進入 mysql,修改密碼為空
    mysql -u root
    mysql>UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';
    mysql>flush privileges;
    mysql>exit;
    // kill 目前的 mysql 服務
    ps -ef | grep mysql
    kill <mysql-pid>
    // 啟動正常模式的 MySQL 服務
    service mysqld start
    // 修改為新密碼
    mysqladmin -u root -p password 'newpass'
    

    Q: 錯誤訊息: [ERROR] /usr/libexec/mysqld: The table 'XXX' is full

    Ans: 需要調高 my.cnf 的 max_heap_table_size 的值(預設 16MB)

    檢查這個 Table 的狀態

    mysql> show table status like 'data_source_stats_hourly_cache' \G
    *************************** 1. row ***************************
               Name: data_source_stats_hourly_cache
             Engine: MEMORY
            Version: 10
         Row_format: Fixed
               Rows: 124417
     Avg_row_length: 73
        Data_length: 10244096
    Max_data_length: 9278300
       Index_length: 6654260
          Data_free: 191479
     Auto_increment: NULL
        Create_time: 2014-12-24 20:34:07
        Update_time: NULL
         Check_time: NULL
          Collation: utf8_general_ci
           Checksum: NULL
     Create_options:
            Comment:
    1 row in set (0.01 sec)
    

    結果顯示 Data_length 已經超過 Max_data_length,解決方法是:透過調整參數 max_heap_table_size,可以增加 Table 的Max_data_length 的長度。

    TIPs:

    以上的參數適用 MySQL 5.1,不同 MySQL 的版本,參數名稱可能不一樣,請參閱 http://dev.mysql.com/doc/refman/5.1/...on-tables.html

    編輯 /etc/my.cnf

    [mysqld]
    ...
    max_heap_table_size=64M
    ... 
    

    重啟 MySQL 服務

    #> service mysqld stop
    #> service mysqld start 

    再次檢查Table 狀態

    #> mysql -uroot -p
    mysql> use caati;
    mysql> show table status like 'data_source_stats_hourly_cache' \G
    *************************** 1. row ***************************
               Name: data_source_stats_hourly_cache
             Engine: MEMORY
            Version: 10
         Row_format: Fixed
               Rows: 5591
     Avg_row_length: 73
        Data_length: 511232
    Max_data_length: 37113200
       Index_length: 328268
          Data_free: 0
     Auto_increment: NULL
        Create_time: 2015-03-10 14:42:02
        Update_time: NULL
         Check_time: NULL
          Collation: utf8_general_ci
           Checksum: NULL
     Create_options:
            Comment:
    1 row in set (0.00 sec)
    

    結果顯示 Max_data_length 有變大,並且 mysql.log 的錯誤訊息不再發生。

    Q: 錯誤訊息 [ERROR] Column count of mysql.proc is wrong

    [ERROR] Column count of mysql.proc is wrong. Expected 20, found 16. Created with MySQL 50077, now running 50152. Please use mysql_upgrade to fix this error.

    Ans: 這是因為作過資料庫升級後,沒有執行 mysql_upgrade,解決方法

    # mysql_upgrade -u root -p
    

    Q: 錯誤訊息:Error: 1030 - Got error 28 from storage engine

    Ans:執行指令 perror 分析錯誤發生原因

    #perror 28
    OS error code  28:  No space left on device
    

    原來是資料庫的儲存空間不足所造成。

    // 列出目前資料庫所有連線

    #mysqladmin -u root -p processlist

    Q: 目錄 /var/lib/mysql 有大量的的mysql-bin.00001.....磁碟空間佔滿

    Ans: mysql-bin 是 transaction log,用於資料庫同步或資料回復時使用,預設是一個檔案約 1GB,解決方式如下:

    service mysqld stop
    vi /etc/my.cnf 
    

    /etc/my.cnf:找到 log-bin=mysql-bin 增加這兩行

    # added by alang
    expire_logs_days        = 10
    max_binlog_size         = 100M
    

    啟動 mysql

    service mysqld start
    

    另一種方法

    5.2 MySQL Server Logs :: 5.2.3 The Binary Log
    12.5.1 SQL Statements for Controlling Master Servers :: 12.5.1.1 PURGE BINARY LOGS Syntax

    系統目錄 /var/lib/mysql 底下有很多 mysql-bin.xxxxxxx 的檔案,這些是 MySQL 的 binary log,假設系統並沒有作 replication,而且確定不需要保留這些 transaction log,下列指示可以清除它們:

    // 檢查 log 功能開啟

    mysql> show variables like '%log%';
    名稱為 log_bin

    // 檢查 log 檔

    mysql> show binary logs;
    編號愈大的表示 log 愈新

    // 刪除編號 mysql-bin.000011 以前但不包含 mysql-bin.000011 的所有 binary log files

    mysql> purge binary logs to 'mysql-bin.000011';
    指令結束後,記得在執行一次 show binary logs 檢查看看。

    Q: mysqldump: Got error: 145: Table './.../wp_useronline' is marked as crashed and should be repaired when using LOCK TABLES

    Ans: 這是因為資料庫可能曾經意外中斷服務所造成,執行修復指令如下:

    mysqlcheck -u<db_username> -p --auto-repair --databases <db_name>
    

    NOTE:

    若有多個 Table 損壞,可能要執行多次,直到每一個 Table 顯示 ok。

    如果 ErrCode 是 144,可能必須使用其他修復的指令,例如 myisamchk,參閱教學:http://dev.mysql.com/doc/refman/5.1/...am-repair.html

    Powered by MindTouch Core