首页 > 数据库 > MySQL > 正文

MySQL数据库无法启动实现数据恢复的例子

2024-07-24 12:39:51
字体:
来源:转载
供稿:网友

利用工具获取MySQL数据字典的例子这篇文章介绍的是有一些技巧,本文章是介绍在mysql未启动的情况利用dul或者其他三方工具直接读取数据文件中数据并进行恢复了,具体如下.

熟悉Oracle的朋友都知道,当Oracle数据库无法正常启动之时,可以通过dul或者其他三方工具直接读取数据文件中数据,从而来抢救数据,减少损失,在mysql中如果使用了innodb引擎也可以在mysql数据库不启动启动下抽取相关记录.本文为抽取数据字典篇章,后续将继续提供drop恢复,truncate 恢复,delete恢复等mysql非常规恢复篇章.

创建一张get_dict测试表:

  1. mysql> use xifenfei; 
  2. Reading table information for completion of table and column names 
  3. You can turn off this feature to get a quicker startup with -A 
  4. Database changed 
  5. mysql> show tables; 
  6. +--------------------+ 
  7. | Tables_in_xifenfei | 
  8. +--------------------+ 
  9. | t_delete           | 
  10. +--------------------+ 
  11. 1 row in set (0.00 sec) 
  12. mysql> create table get_dict(id int not null primary key,name varchar(100)); 
  13. Query OK, 0 rows affected (0.01 sec) 
  14. mysql> insert into get_dict value(1,'www.Vevb.com'); 
  15. Query OK, 1 row affected (0.00 sec) 
  16. mysql> insert into get_dict value(2,'www.Vevb.com-xifenfei'); 
  17. Query OK, 1 row affected (0.00 sec) 
  18. mysql> insert into get_dict value(3,'xifenfei-www.Vevb.com'); 
  19. Query OK, 1 row affected (0.00 sec)
  20. mysql> show tables; 
  21. +--------------------+ 
  22. | Tables_in_xifenfei | 
  23. +--------------------+ 
  24. | get_dict           | 
  25. | t_delete           | 
  26. +--------------------+ 
  27. rows in set (0.00 sec 
  28. mysql> select TABLE_NAME,TABLE_SCHEMA,TABLE_TYPE from information_schema.tables  
  29.     -> where table_name='get_dict'
  30. +------------+--------------+------------+ 
  31. | TABLE_NAME | TABLE_SCHEMA | TABLE_TYPE | 
  32. +------------+--------------+------------+ 
  33. | get_dict   | xifenfei     | BASE TABLE | 
  34. +------------+--------------+------------+ 
  35. 1 row in set (0.01 sec) 
  36. mysql> select TABLE_NAME,NON_UNIQUE,TABLE_SCHEMA,INDEX_SCHEMA,INDEX_NAME,COLUMN_NAME from  
  37.     -> INFORMATION_SCHEMA.STATISTICS where  TABLE_NAME='get_dict'
  38. +------------+------------+--------------+--------------+------------+-------------+ 
  39. | TABLE_NAME | NON_UNIQUE | TABLE_SCHEMA | INDEX_SCHEMA | INDEX_NAME | COLUMN_NAME | 
  40. +------------+------------+--------------+--------------+------------+-------------+ 
  41. | get_dict   |          0 | xifenfei     | xifenfei     | PRIMARY    | id          | 
  42. +------------+------------+--------------+--------------+------------+-------------+ 
  43. 1 row in set (0.00 sec) 
  44. mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,ORDINAL_POSITION from  
  45.     -> information_schema.COLUMNS  where table_name='get_dict'
  46. +--------------+------------+-------------+------------------+ 
  47. | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | ORDINAL_POSITION | 
  48. +--------------+------------+-------------+------------------+ 
  49. | xifenfei     | get_dict   | id          |                1 | 
  50. | xifenfei     | get_dict   | name        |                2 | 
  51. +--------------+------------+-------------+------------------+ 
  52. rows in set (0.01 sec) 

关闭mysql数据库:

  1. [root@localhost recovery_mysql]# service mysql stop 
  2. Shutting down MySQL..[  OK  ] 
  3. [root@localhost recovery_mysql]# ps -ef|grep mysql 
  4. root     18876 15827  0 18:05 pts/1    00:00:00 grep mysql 

使用工具解析innodb文件:

  1. [root@localhost recovery_mysql]# ./stream_parser -f /var/lib/mysql/ibdata1 
  2. Opening file: /var/lib/mysql/ibdata1 
  3. File information: 
  4. Opening file: /var/lib/mysql/ibdata1 
  5. File information: 
  6. ID of device containing file:         2054 
  7. inode number:                      1782889 
  8. ID of device containing file:         2054 
  9. protection:                         100660 inode number:                      1782889 
  10. (regular file) 
  11. protection:                         100660 number of hard links:                    1 
  12. (regular file) 
  13. user ID of owner:                      101 
  14. number of hard links:                    1 
  15. group ID of owner:                     102 
  16. user ID of owner:                      101 
  17. device ID (if special file):             0 
  18. group ID of owner:                     102 
  19. blocksize for filesystem I/O:         4096 
  20. device ID (if special file):             0 
  21. number of blocks allocated:          24616 
  22. blocksize for filesystem I/O:         4096 
  23. Opening file: /var/lib/mysql/ibdata1 
  24. number of blocks allocated:          24616 
  25. File information: 
  26. ……………… 
  27. user ID of owner:                      101 
  28. group ID of owner:                     102 
  29. device ID (if special file):             0 
  30. blocksize for filesystem I/O:         4096 
  31. ID of device containing file:         2054 
  32. number of blocks allocated:          24616 
  33. inode number:                      1782889 
  34. protection:                         100660 (regular file) 
  35. number of hard links:                    1 
  36. user ID of owner:                      101 
  37. group ID of owner:                     102 
  38. device ID (if special file):             0 
  39. blocksize for filesystem I/O:         4096 
  40. number of blocks allocated:          24616 
  41. time of last access:            1417922668 Sun Dec  7 11:24:28 2014 
  42. time of last modification:      1418294104 Thu Dec 11 18:35:04 2014 
  43. time of last status change:     1418294104 Thu Dec 11 18:35:04 2014 
  44. time of last access:            1417922668 Sun Dec  7 11:24:28 2014 
  45. total sizein bytes:             12582912 (12.000 MiB) 
  46. time of last modification:      1418294104 Thu Dec 11 18:35:04 2014 
  47. time of last status change:     1418294104 Thu Dec 11 18:35:04 2014 
  48. Size to process:                  12582912 (12.000 MiB) 
  49. total sizein bytes:             12582912 (12.000 MiB) 
  50. Size to process:                  12582912 (12.000 MiB) 
  51. All workers finished in 0 sec 

主要文件介绍:

  1. [root@localhost recovery_mysql]# ls -l  pages-ibdata1/FIL_PAGE_INDEX/ 
  2. total 1388 
  3. -rw-r--r-- 1 root root  16384 Dec 11 18:51 0000000000000001.page 
  4. -rw-r--r-- 1 root root  16384 Dec 11 18:51 0000000000000002.page 
  5. -rw-r--r-- 1 root root  49152 Dec 11 18:51 0000000000000003.page 
  6. -rw-r--r-- 1 root root  49152 Dec 11 18:51 0000000000000004.page 
  7. -rw-r--r-- 1 root root  16384 Dec 11 18:51 0000000000000005.page 
  8. -rw-r--r-- 1 root root 114688 Dec 11 18:51 0000000000000011.page 
  9. -rw-r--r-- 1 root root 114688 Dec 11 18:51 0000000000000012.page 
  10. -rw-r--r-- 1 root root 114688 Dec 11 18:51 0000000000000013.page 
  11. -rw-r--r-- 1 root root 114688 Dec 11 18:51 0000000000000014.page 
  12. -rw-r--r-- 1 root root 114688 Dec 11 18:51 0000000000000015.page 
  13. -rw-r--r-- 1 root root 147456 Dec 11 18:51 0000000000000016.page 
  14. -rw-r--r-- 1 root root  98304 Dec 11 18:51 0000000000000017.page 
  15. -rw-r--r-- 1 root root 114688 Dec 11 18:51 0000000000000018.page 
  16. -rw-r--r-- 1 root root  49152 Dec 11 18:51 0000000000000019.page 
  17. -rw-r--r-- 1 root root  49152 Dec 11 18:51 0000000000000020.page 
  18. -rw-r--r-- 1 root root  49152 Dec 11 18:51 0000000000000021.page 
  19. -rw-r--r-- 1 root root  65536 Dec 11 18:51 0000000000000025.page 
  20. -rw-r--r-- 1 root root  16384 Dec 11 18:51 18446744069414584320.page 

0000000000000001.page主要是记录mysql中表信息文件

0000000000000002.page主要是记录mysql中的表的列的信息文件

0000000000000003.page主要是记录mysql中表的index信息文件

抽取table数据:

  1. [root@localhost recovery_mysql]# ./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t  
  2. dictionary/SYS_TABLES.sql > dumps/default/SYS_TABLES 2> dumps/default/SYS_TABLES.sql 
  3. [root@localhost recovery_mysql]# grep get dumps/default/SYS_TABLES | head -5 
  4. 000000000D1D    95000001510110  SYS_TABLES      "xifenfei/get_dict"    23      2       1       0       80      ""      9 
  5. [root@localhost recovery_mysql]# cat dumps/default/SYS_TABLES.sql 
  6. SET FOREIGN_KEY_CHECKS=0; 
  7. LOAD DATA LOCAL INFILE '/tmp/recovery_mysql/dumps/default/SYS_TABLES' REPLACE INTO TABLE `SYS_TABLES`  
  8. FIELDS TERMINATED BY 't' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'SYS_TABLESt' 
  9.  (`NAME`, `ID`, `N_COLS`, `TYPE`, `MIX_ID`, `MIX_LEN`, `CLUSTER_NAME`, `SPACE`); 

抽取column数据:

  1. [root@localhost recovery_mysql]#  ./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000002.page  
  2.  -t dictionary/SYS_COLUMNS.sql > dumps/default/SYS_COLUMNS 2> dumps/default/SYS_COLUMNS.sql 
  3. [root@localhost recovery_mysql]# cat dumps/default/SYS_COLUMNS 
  4. -- Page id: 10, Format: REDUNDANT, Records list: Valid, Expected records: (115 115) 
  5. 000000000300    800000012D0123  SYS_COLUMNS     11      0       "ID"    1       4       0       0 
  6. 000000000300    800000012D0138  SYS_COLUMNS     11      1       "FOR_NAME"     1       4       0       0 
  7. ………… 
  8. 000000000D1D    95000001510129  SYS_COLUMNS     23      0       "id"    6       1283    4       0 
  9. 000000000D1D    9500000151013E  SYS_COLUMNS     23      1       "name"  1       524303  100     0 
  10. -- Page id: 10, Found records: 115, Lost records: NO, Leaf page: YES 
  11. [root@localhost recovery_mysql]# more dumps/default/SYS_COLUMNS.sql 
  12. SET FOREIGN_KEY_CHECKS=0; 
  13. LOAD DATA LOCAL INFILE '/tmp/recovery_mysql/dumps/default/SYS_COLUMNS' REPLACE INTO TABLE 
  14.  `SYS_COLUMNS` FIELDS TERMINATED BY 't' OPTIONALLY ENCLOSED BY  
  15. '"' LINES STARTING BY 'SYS_COLUMNSt' (`TABLE_ID`, `POS`, `NAME`, `MTYPE`, `PRTYPE`, `LEN`, `PREC`); 

抽取index数据:

  1. [root@localhost recovery_mysql]# ./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page 
  2.  -t dictionary/SYS_INDEXES.sql > dumps/default/SYS_INDEXES 2> dumps/default/SYS_INDEXES.sql 
  3. [root@localhost recovery_mysql]# more dumps/default/SYS_INDEXES.sql 
  4. SET FOREIGN_KEY_CHECKS=0; 
  5. LOAD DATA LOCAL INFILE '/tmp/recovery_mysql/dumps/default/SYS_INDEXES' REPLACE INTO TABLE 
  6.  `SYS_INDEXES` FIELDS TERMINATED BY 't' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'SYS_INDEXESt'  
  7. (`TABLE_ID`, `ID`, `NAME`, `N_FIELDS`, `TYPE`, `SPACE`, `PAGE_NO`); 
  8. [root@localhost recovery_mysql]# more dumps/default/SYS_INDEXES 
  9. -- Page id: 11, Format: REDUNDANT, Records list: Valid, Expected records: (13 13) 
  10. 000000000300    800000012D0177  SYS_INDEXES     11      11      "ID_IND"       1       3       0       302 
  11. ………… 
  12. 000000000B02    820000013504C8  SYS_INDEXES     20      22      "GEN_CLUST_INDEX"     0       1       6       3 
  13. 000000000D1D    9500000151016B  SYS_INDEXES     23      25      "PRIMARY"       1       3       9       3 

启动mysql数据库:

  1. [root@localhost recovery_mysql]# service mysql start 
  2. Starting MySQL..[  OK  ] 
  3. [root@localhost recovery_mysql]# ps -ef|grep mysql 
  4. root     18948     1  0 19:57 pts/1    00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql  
  5. --pid-file=/var/lib/mysql/localhost.localdomain.pid  
  6. mysql    19049 18948 14 19:57 pts/1    00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 
  7. --plugin-dir=/usr/lib64/mysql/plugin --user=mysql 
  8. --log-error=/var/lib/mysql/localhost.localdomain.err --pid-file=/var/lib/mysql/localhost.localdomain.pid 
  9. root     19078 15827  0 19:58 pts/1    00:00:00 grep mysql 

创建抽取数据字典表:

  1. mysql> source dictionary/SYS_TABLES.sql 
  2. Query OK, 0 rows affected (0.00 sec) 
  3. Query OK, 0 rows affected (0.00 sec) 
  4. ………… 
  5. mysql> source dictionary/SYS_INDEXES.sql 
  6. Query OK, 0 rows affected (0.00 sec) 
  7. Query OK, 0 rows affected (0.00 sec) 
  8. ………… 
  9. mysql> source  dictionary/SYS_COLUMNS.sql  
  10. Query OK, 0 rows affected (0.00 sec) 
  11. Query OK, 0 rows affected (0.00 sec) 
  12. ………… 
  13. mysql> show tables; 
  14. +----------------+ 
  15. | Tables_in_test | 
  16. +----------------+ 
  17. | SYS_COLUMNS    | 
  18. | SYS_INDEXES    | 
  19. | SYS_TABLES     | 
  20. +----------------+ 
  21. rows in set (0.00 sec) 

加载抽取数据字典数据:

  1. mysql> source dumps/default/SYS_TABLES.sql 
  2. Query OK, 0 rows affected (0.00 sec) 
  3. Query OK, 11 rows affected (0.03 sec) 
  4. Records: 11  Deleted: 0  Skipped: 0  Warnings: 0 
  5. mysql> source  dumps/default/SYS_INDEXES.sql 
  6. Query OK, 0 rows affected (0.00 sec) 
  7. Query OK, 39 rows affected (0.01 sec) 
  8. Records: 39  Deleted: 0  Skipped: 0  Warnings: 0 
  9. mysql> source dumps/default/SYS_COLUMNS.sql 
  10. Query OK, 0 rows affected (0.00 sec) 
  11. Query OK, 115 rows affected (0.00 sec) 
  12. Records: 115  Deleted: 0  Skipped: 0  Warnings: 0 

验证抽取数据字典数据:

  1. mysql> desc SYS_TABLES 
  2.     -> ; 
  3. +--------------+---------------------+------+-----+---------+-------+ 
  4. | Field        | Type                | Null | Key | Default | Extra | 
  5. +--------------+---------------------+------+-----+---------+-------+ 
  6. NAME         | varchar(255)        | NO   | PRI |         |       | 
  7. | ID           | bigint(20) unsigned | NO   |     | 0       |       | 
  8. | N_COLS       | int(10)             | YES  |     | NULL    |       | 
  9. | TYPE         | int(10) unsigned    | YES  |     | NULL    |       | 
  10. | MIX_ID       | bigint(20) unsigned | YES  |     | NULL    |       | 
  11. | MIX_LEN      | int(10) unsigned    | YES  |     | NULL    |       | 
  12. | CLUSTER_NAME | varchar(255)        | YES  |     | NULL    |       | 
  13. SPACE        | int(10) unsigned    | YES  |     | NULL    |       | 
  14. +--------------+---------------------+------+-----+---------+-------+ 
  15. rows in set (0.00 sec) 
  16.  
  17. mysql> SELECT NAME,ID from SYS_TABLES WHERE NAME='xifenfei/get_dict'
  18. +-------------------+----+ 
  19. NAME              | ID | 
  20. +-------------------+----+ 
  21. | xifenfei/get_dict | 23 | 
  22. +-------------------+----+ 
  23. 1 row in set (0.00 sec) 
  24. mysql> desc SYS_COLUMNS 
  25.     -> ; 
  26. +----------+---------------------+------+-----+---------+-------+ 
  27. | Field    | Type                | Null | Key | Default | Extra | 
  28. +----------+---------------------+------+-----+---------+-------+ 
  29. | TABLE_ID | bigint(20) unsigned | NO   | PRI | NULL    |       | 
  30. | POS      | int(10) unsigned    | NO   | PRI | NULL    |       | 
  31. NAME     | varchar(255)        | YES  |     | NULL    |       | 
  32. | MTYPE    | int(10) unsigned    | YES  |     | NULL    |       | 
  33. | PRTYPE   | int(10) unsigned    | YES  |     | NULL    |       | 
  34. | LEN      | int(10) unsigned    | YES  |     | NULL    |       | 
  35. | PREC     | int(10) unsigned    | YES  |     | NULL    |       | 
  36. +----------+---------------------+------+-----+---------+-------+ 
  37. rows in set (0.00 sec) 
  38. mysql> SELECT TABLE_ID,NAME,MTYPE FROM SYS_COLUMNS WHERE TABLE_ID=23; 
  39. +----------+------+-------+ 
  40. | TABLE_ID | NAME | MTYPE | 
  41. +----------+------+-------+ 
  42. |       23 | id   |     6 | 
  43. |       23 | name |     1 | 
  44. +----------+------+-------+ 
  45. rows in set (0.01 sec) 
  46. mysql> SELECT TABLE_ID,ID,NAME,TYPE FROM SYS_INDEXES WHERE TABLE_ID=23; 
  47. +----------+----+---------+------+ 
  48. | TABLE_ID | ID | NAME    | TYPE | 
  49. +----------+----+---------+------+ 
  50. |       23 | 25 | PRIMARY |    3 | 
  51. +----------+----+---------+------+ 
  52. 1 row in set (0.00 sec) 

这里基本上可以看出来,在mysql数据库未启动情况下,使用工具可以正常抽取mysql数据字典信息.

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表