MySQL異常恢復之恢復數據字典表講解

CarDashwood 8年前發布 | 7K 次閱讀 MySQL 數據庫服務器

來自: http://ourmysql.com/archives/1423

在以前的文章中說過mysql的數據字典的恢復( 使用工具直接抽取MySQL數據字典 ,缺少SYS_FIELDS表),主要的數據字典有一下幾個,在本文中主要對這些數據字典的意義進行一些講解,為大家更深一步了解mysql恢復處理思路

MySQL恢復字典表

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| SYS_COLUMNS    | 
| SYS_FIELDS     | 
| SYS_INDEXES    | 
| SYS_TABLES     | 
+----------------+
4 rows in set (0.00 sec)

SYS_TABLES

這個表是mysql恢復的最核心的表之一,主要是記錄數據庫在InnoDB中表的信息。它默認寫在InnoDB的index_ids為1的里面,它的根頁在8號page上,他的主要列結構為:

mysql> desc SYS_TABLES;
+--------------+---------------------+------+-----+---------+-------+
| Field        | Type                | Null | Key | Default | Extra |
+--------------+---------------------+------+-----+---------+-------+
| NAME         | varchar(255)        | NO   | PRI |         |       | 
| ID           | bigint(20) unsigned | NO   |     | 0       |       | 
| N_COLS       | int(10)             | YES  |     | NULL    |       | 
| TYPE         | int(10) unsigned    | YES  |     | NULL    |       | 
| MIX_ID       | bigint(20) unsigned | YES  |     | NULL    |       | 
| MIX_LEN      | int(10) unsigned    | YES  |     | NULL    |       | 
| CLUSTER_NAME | varchar(255)        | YES  |     | NULL    |       | 
| SPACE        | int(10) unsigned    | YES  |     | NULL    |       | 
+--------------+---------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)

NAME:顧名思義,就是表的名字,但是注意他記錄的格式是db/table,例如:xifenfei/zx_users,表示為xifenfei數據庫中的zx_users表

ID:表的編號

N_COLS:表一共包含的列的數量

TYPE, MIX_ID, MIX_LEN 和 CLUSTER_NAME列,對于數據庫恢復無任何意義不做描述

SPACE:表空間的標示列. 例如: ibdata1 是 SPACE 0, ibdata2 是 SPACE 1, 每一個 ibd 文件都有自己的表空間標示.

SYS_INDEXES

這個也是mysql恢復的最核心表之一,主要是記錄InnoDB的index信息,它默認InnoDB的index_ids為3的里面,他的主要結構為:

mysql> desc SYS_INDEXES;
+----------+---------------------+------+-----+---------+-------+
| Field    | Type                | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| TABLE_ID | bigint(20) unsigned | NO   | PRI | 0       |       | 
| ID       | bigint(20) unsigned | NO   | PRI | 0       |       | 
| NAME     | varchar(120)        | YES  |     | NULL    |       | 
| N_FIELDS | int(10) unsigned    | YES  |     | NULL    |       | 
| TYPE     | int(10) unsigned    | YES  |     | NULL    |       | 
| SPACE    | int(10) unsigned    | YES  |     | NULL    |       | 
| PAGE_NO  | int(10) unsigned    | YES  |     | NULL    |       | 
+----------+---------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

TABLE_ID:表標示列,為SYS_TABLES.ID

ID:為InnoDB中的index的編號,這個在恢復中非常重要,恢復之時需要根據這個去定位具體的文件

NAME:主要表的index的名字,有PRIMARY 和 普通列的index信息,一般恢復之時我們選擇PRIMARY

N_FIELDS:表名index包含列的數量,在mysql恢復中不重要

TYPE:恢復之中使用不到該列,不做說明

PAGE:用途等同SYS_TABLES.SPACE

PAGE_NO:標示為每個index的root page的page號,關于index中的page結構如下圖所示

SYS_COLUMNS

這個表主要記錄數據庫中表的列的情況,它存儲在index_id 2中.主要用它來確定需要恢復表的列的情況,如果你知道完全的列結構,該表不是MySQL恢復所必須的,它的主要結構為:

mysql> desc SYS_COLUMNS;
+----------+---------------------+------+-----+---------+-------+
| Field    | Type                | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| TABLE_ID | bigint(20) unsigned | NO   | PRI | NULL    |       | 
| POS      | int(10) unsigned    | NO   | PRI | NULL    |       | 
| NAME     | varchar(255)        | YES  |     | NULL    |       | 
| MTYPE    | int(10) unsigned    | YES  |     | NULL    |       | 
| PRTYPE   | int(10) unsigned    | YES  |     | NULL    |       | 
| LEN      | int(10) unsigned    | YES  |     | NULL    |       | 
| PREC     | int(10) unsigned    | YES  |     | NULL    |       | 
+----------+---------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

TABLE_ID:表標示列,為SYS_TABLES.ID

POS:該列所在表中的位置,該值從0開始

NAME:列的名字

MTYPE 和 PRTYPE:主要是為了記錄列的類型,出現此類問題主要是由于InnoDB最初并不是為MySQL而設計,到了后面為更好支持MySQL,因此出現了兩種情況.

LEN:列的長度.這個需要注意編碼,比如數據庫是utf8編碼,定義的varchar(10),實際該處長度顯示為30,因為每個除英文外的字符編碼為3個byte.

PREC:有些特殊類型中,列的精確度定義

SYS_FIELDS

記錄所有index的列的分布信息,它存儲在index_id 4中,該表不是MySQL恢復所必須的,它的主要結構為:

mysql> desc SYS_FIELDS;
+----------+---------------------+------+-----+---------+-------+
| Field    | Type                | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| INDEX_ID | bigint(20) unsigned | NO   | PRI | NULL    |       | 
| POS      | int(10) unsigned    | NO   | PRI | NULL    |       | 
| COL_NAME | varchar(255)        | YES  |     | NULL    |       | 
+----------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

INDEX_ID:index的標志,等同SYS_INDEXES.ID

POS:列在index中的位置,從0開始

COL_NAME:列的名稱

通過上述相關表和列,然后結合MySQL相關恢復工具,就可以從底層在InnoDB出現問題,或者誤操作之時提供恢復處理.

</div>

 本文由用戶 CarDashwood 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!