1.概况
为服务器重装了Ubuntu 16.04-server, 之前的一些数据丢失了, 好在硬盘并未格式化, 至少还有点希望能恢复Mysql的数据
2.现有条件
把旧的硬盘挂载到电脑上, 找到数据库目录下的文件: 默认的数据库目录为: /var/lib/mysql
硬盘挂载目录为: /media/user/f101a309-d55a-4a50-8e1c-d63534146b6f
$ ll /media/user/f101a309-d55a-4a50-8e1c-d63534146b6f/var/lib/mysql -rw-r----- 1 122 vboxusers 56 9月 6 2019 auto.cnf -rw------- 1 122 vboxusers 1680 11月 19 06:09 ca-key.pem -rw-r--r-- 1 122 vboxusers 1112 11月 19 06:09 ca.pem -rw-r--r-- 1 122 vboxusers 1112 11月 19 06:09 client-cert.pem -rw------- 1 122 vboxusers 1676 11月 19 06:09 client-key.pem -rw-r--r-- 1 122 vboxusers 0 2月 25 09:40 debian-5.7.flag drwxr-x--- 2 122 vboxusers 4096 9月 17 2019 FactoryTest/ -rw-r----- 1 122 vboxusers 750 4月 1 09:07 ib_buffer_pool -rw-r----- 1 122 vboxusers 79691776 4月 1 09:07 ibdata1 -rw-r----- 1 122 vboxusers 50331648 4月 1 09:07 ib_logfile0 -rw-r----- 1 122 vboxusers 50331648 9月 6 2019 ib_logfile1 drwxr-x--- 2 122 vboxusers 4096 10月 22 15:27 kanboard/ drwxr-x--- 2 122 vboxusers 4096 2月 25 09:41 mysql/ -rw-r--r-- 1 122 vboxusers 6 2月 25 09:41 mysql_upgrade_info drwxr-x--- 2 122 vboxusers 4096 2月 25 09:40 performance_schema/ -rw------- 1 122 vboxusers 1676 11月 19 06:09 private_key.pem -rw-r--r-- 1 122 vboxusers 452 11月 19 06:09 public_key.pem -rw-r--r-- 1 122 vboxusers 1112 11月 19 06:09 server-cert.pem -rw------- 1 122 vboxusers 1680 11月 19 06:09 server-key.pem drwxr-x--- 2 122 vboxusers 12288 11月 19 06:09 sys/ drwxr-x--- 2 122 vboxusers 12288 10月 22 10:18 zentao/
需要恢复的数据库 FactoryTest, 所以, 不管如何先将它压缩保存下来, 丢到服务器去试试先.
3.粗暴的尝试
停止mysql /etc/init.d/mysql stop
直接把上面找到的文件丢到服务器对应的mysql目录下, 并修改相应的文件权限
启动mysql /etc/init.d/mysql start
尝试访问读取数据失败…果然没那么简单.
停止数据库, 删除前面的暴力尝试拷贝进去的文件夹
4.Google 后, 见参考.1
4.1恢复表格
需要用到工具mysqlfrm
找不到, 就装一个sudo apt install mysql-utilities
命令执行的效果 mysqlfrm --diagnostic FactoryTest/Wifi.frm
# WARNING: Cannot generate character set or collation names without the --server option. # CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct. # Reading .frm file for FactoryTest/Wifi.frm: # The .frm file is a TABLE. # CREATE TABLE Statement: CREATE TABLE `FactoryTest`.`Wifi` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ssid` varchar(32) NOT NULL, `pwd` varchar(32) NOT NULL, PRIMARY KEY `PRIMARY` (`id`) ) ENGINE=InnoDB; #...done.
表格的query语句出来了, 接下来就简单了, 拷贝粘贴, 执行完, 表格都有了.
4.2恢复数据
进mysql执行下面的命令(所有的表格):
ALTER TABLE example_table DISCARD TABLESPACE;
执行完后, 数据库目录下的 .idb 文件都不见了
执行上面的暴力拷贝, 只拷贝 .idb 文件: sudo cp -rn . /var/lib/mysql/FactoryTest/
记得修改文件权限: sudo chown mysql:mysql -R /var/lib/mysql/FactoryTest
再进mysql为每个表格执行语句
ALTER TABLE example_table IMPORT TABLESPACE;
完成
5.参考
1. Restore table structure from frm and ibd files
2. Reset a MySQL root password