無備份mysql刪除表后恢復


mysql從5.6.17開始自動設置innodb_file_per_table為on,每個表設置單獨表空間,數據不是集中存放在ibdata1里。下面測試下無備份后drop表后的恢復。

前奏生成數據字典https://www.cnblogs.com/omsql/p/9253234.html

刪除表前的准備
mysql>  SHOW VARIABLES LIKE 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

mysql> show create table tb \G
*************************** 1. row ***************************
       Table: tb
Create Table: CREATE TABLE `tb` (
  `id` int(11) NOT NULL,
  `name` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

[root@redis01 tmp]# cd /data/mysql/ht/
[root@redis01 ht]# ls
db.opt  person.frm  person.ibd  shirt.frm  shirt.ibd  tb.frm  tb.ibd

mysql> select * from tb;
+----+-------+
| id | name  |
+----+-------+
|  1 | zhou  |
|  2 | 430   |
|  3 | YYF   |
|  4 | ChuaN |
|  5 | Faith |
|  6 | zhou  |
|  7 | 430   |
|  8 | YYF   |
|  9 | ChuaN |
| 10 | Faith |
| 11 | zhou  |
| 12 | 430   |
| 13 | YYF   |
| 14 | ChuaN |
| 15 | Faith |
+----+-------+
15 rows in set (0.00 sec)

mysql> checksum table tb;
+-------+------------+
| Table | Checksum   |
+-------+------------+
| ht.tb | 1499182360 |
+-------+------------+
1 row in set (0.00 sec)

mysql> drop table tb;
Query OK, 0 rows affected (0.11 sec)
刪除表后相對表的表空間文件也刪除
[root@redis01 ht]# ls
db.opt  person.frm  person.ibd  shirt.frm  shirt.ibd  tb.frm  tb.ibd
[root@redis01 ht]# ls
db.opt  person.frm  person.ibd  shirt.frm  shirt.ibd
失誤操作后建議關閉mysql,避免空間被占用
mysqladmin -u root -p shutdown

[root@redis01 data]# df -k
Filesystem           1K-blocks     Used Available Use% Mounted on
/dev/mapper/vg_redis01-lv_root
                      20830728 10397672   9459576  53% /
tmpfs                  2022820       72   2022748   1% /dev/shm
/dev/sda1               487652    85768    372188  19% /boot
/dev/mapper/vg_mysql-lv_mysql01
                        303788   114540    189248  38% /data
						
從磁盤里查找,分別得到每個頁文件
stream_parser
stream_parser 是分析 ibdata 文件(或者掛載的磁盤),得到每一個數據頁的
./stream_parser -f /dev/mapper/vg_mysql-lv_mysql01  -t 303788k
查看頁文件里的具體數據
c_parser 其實是按照 innodb 存儲數據的格式來分析哪些是我們需要的數據本身,所以頁上的數據可以分為兩類:1. 用戶數據 2. 元數據。而元數據的功能其實並不相同,有些損壞無傷大雅,有些損壞卻可能導致整個頁無法恢復。
./c_parser -6f pages-vg_mysql-lv_mysql01/FIL_PAGE_INDEX/0000000000000041.page -t tb.sql |  head -5
 
生成建表語句
 [root@redis01 undrop-for-innodb]# cat tb.sql 
CREATE TABLE `tb` (
  `id` int(11) NOT NULL,
  `name` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

查看恢復出來的數據
 [root@redis01 undrop-for-innodb]# ./c_parser -6f pages-vg_mysql-lv_mysql01/FIL_PAGE_INDEX/0000000000000041.page -t tb.sql |  head -6
-- Page id: 3, Format: COMPACT, Records list: Valid, Expected records: (5 5)
000000000507	A70000011B0110	tb	1	"zhou"
000000000507	A70000011B011C	tb	2	"430"
000000000507	A70000011B0128	tb	3	"YYF"
000000000507	A70000011B0134	tb	4	"ChuaN"
000000000507	A70000011B0140	tb	5	"Faith"

生成腳本
./c_parser -6f pages-vg_mysql-lv_mysql01/FIL_PAGE_INDEX/0000000000000041.page -t tb.sql  > dumps/default/tb 2> dumps/default/tb_TABLES.sql

先建表在導入恢復出來的數據
mysql -u root -p ht < tb.sql
mysql -u root -p ht < dumps/default/tb_TABLES.sql


mysql> select * from ht.tb;
Empty set (0.00 sec)

mysql> select * from ht.tb;
+----+-------+
| id | name  |
+----+-------+
|  1 | zhou  |
|  2 | 430   |
|  3 | YYF   |
|  4 | ChuaN |
|  5 | Faith |
|  6 | zhou  |
|  7 | 430   |
|  8 | YYF   |
|  9 | ChuaN |
| 10 | Faith |
| 11 | zhou  |
| 12 | 430   |
| 13 | YYF   |
| 14 | ChuaN |
| 15 | Faith |
+----+-------+
15 rows in set (0.00 sec)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM