The table is fullの経験

3245 ワード

質問:
ユーザーは正常にウェブサイトにログインできず、正しいユーザー名とパスワードを入力しても正常にジャンプできず、エラーメッセージもありません.ただし、誤ったユーザー名とパスワードを入力すると、ユーザー名またはパスワードが正しくないことを示す必要があります.
調査プロセス:
1、nginxログをすべて正常に表示し、エラーログがない.
2、phpにもエラーログはありません.
3、データベースのエラーログを見て、次のエラーを報告し続けることを発見します.
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full

以上のデータベースエラーログから見ると、最初の直感はディスク領域がいっぱいであるため、df-hはディスク領域の使用状況を調べ、ディスク領域に余裕があることを発見した.
ディスク領域の問題ではない以上、データベースに入ってみましょう.
セッションテーブルのレコードがどれだけあるかを確認すると、レコードが1つもありません.
mysql> select count(*) from  session;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

表のデータを見ても、何のデータもありません.その空間はどこですか??
mysql> select * from  session;
Empty set (0.02 sec)

テーブル構造を確認すると、このテーブルはメモリテーブルであることがわかります.
mysql> show create table session;
session | CREATE TABLE `session` (
  `session_id` varchar(255) NOT NULL,
  `session_expire` int(11) NOT NULL,
  `session_data` blob,
  `session_time` int(10) NOT NULL DEFAULT '0' COMMENT '    ',
  UNIQUE KEY `session_id` (`session_id`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8 KEY_BLOCK_SIZE=784

データベース・メモリ・テーブルの値を128 Mで表示
show global variables like 'max_heap_table_size';
+---------------------+-----------+
| Variable_name       | Value     |
+---------------------+-----------+
| max_heap_table_size | 134217728 |
+---------------------+-----------+

sessionテーブルのメモリ領域の使用状況を確認します(当時の数値は記録されていません.ここで意味します.ははは)
show table status from userDB where name ='session'\G;
*************************** 56. row ***************************
           Name: session
         Engine: MEMORY
        Version: 10
     Row_format: Dynamic
           Rows: 12169
Avg_row_length: 1033
    Data_length: 134124544
Max_data_length: 333285054
   Index_length: 1584128
      Data_free: 129903616
Auto_increment: NULL
    Create_time: 2016-01-30 16:55:19
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
Create_options: KEY_BLOCK_SIZE=800
        Comment:

データがわかるfree:129903616ここにはすでに割り当てられているが未使用の空間(浪費されている)があり、問題点を見つければやりやすい.
処理方法:
このテーブルはMEMORYテーブルであるため、OPTIMIZE TABLEで最適化することはできず、テーブルスペースを再構築するしかないALTER TABLEセッションENGINE=MEMORY
まとめ:
計画タスクがあるため、期限切れのセッションレコードを定期的に削除し、テーブルを最適化していないため、破片が多くなり、最後にテーブル128 M全体のスペースを占めています.メモリテーブルサイズはmax_heap_table_sizeパラメータはメモリ表領域のサイズを調整します.パラメータは動的に変更できるはずですが、既存の表には無効で、表領域ALTER TABLEを再構築して有効にすることができます.
もっとtable is full問題、みんなは葉先生のこの文章を見ることができます
http://imysql.com/2014/08/21/mysql-faq-howto-deal-with-table-full.shtml