萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MySQL異常恢復恢復數據字典表的例子

MySQL異常恢復恢復數據字典表的例子

MySQL異常恢復是指在數據庫出現問題導致mysql不能正常啟動或數據庫數據丟失問題的恢復方法,下面一起來看一篇MySQL異常恢復恢復數據字典表的例子吧。

在以前的文章中說過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結構如下圖所示

 

Bplustree



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出現問題,或者誤操作之時提供恢復處理.

copyright © 萬盛學電腦網 all rights reserved