mysql通过idb文件,恢复数据库

原因: 由于一次未知原因,服务器停机后,导致数据库不能启动,由于刚接手项目,对此数据库的配置不是那么清晰,分析了很多,最后还是没发正常启动。由于发现数据idb文件还在,最后就采取了险招,重新安装mysql,通过mysql的idb文件来恢复数据。

解决:

第一步: 完全卸载mysql数据库

ubantu 彻底卸载mysql
sudo apt-get autoremove --purge mysql-server 
sudo apt-get remove mysql-common
sudo rm -rf /etc/mysql/  /var/lib/mysql
#清理残留数据
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P  
sudo apt autoremove
sudo apt autoclean

第二步: 重新安装mysql数据库

Ubantu下安装mysql8可自行百度;参考链接:https://www.linuxidc.com/Linux/2018-11/155408.htm

安装后可能出现:
mysql 数据库不允许远程连接: ‘Host’ is not allowed to connect to this mysql server

方法一:修改 host 表

进入mysql数据库,选择mysql 
mysql> use mysql;

选择 host 表
mysql> select host from user;

更新 host, 然后退出。
mysql> update user set host = '%' where user='root';

重启数据库, 完成。
service mysqld restart

如果报错:Access denied for user ‘XXX’@’XXX’ (using password: YES) 请参考我的另一篇博文:
https://blog.csdn.net/qq_23035335/article/details/100522054

第三步:恢复数据

通过idb文件 恢复mysql数据

  • 首先需要一个跟要恢复的表结构完全一致的表。
    (在建表语句末尾加上 ROW_FORMAT=compact 或 ROW_FORMAT=DYNAMIC(mysql8默认);(InnoDB的行记录格式有 Compact, Redundant, Compressed, Dynamic,具体要看自己的mysql用的是哪种)备份的表结构可以从备份库,测试库搞定表结构,可以删掉外键约束,后面执行会方便很多。)
  • 然后执行ALTER TABLE 表名 DISCARD TABLESPACE。(ALTER TABLE table_name DISCARD TABLESPACE)
    (这里一定不能手动删除ibd文件,如果删除了会导致mysql停止后无法重启)
  • 把要恢复的ibd文件复制到mysql的data文件夹下。
    (默认路径是/var/lib/mysql/数据库名,在执行恢复之前,就应该已经知道了数据存储目录,同时也把所有的idb文件已备份,用于恢复。copy到目标位置后得检查下权限,是不是mysql:mysql,不然执行下面的导入语句时会报错:找不到对应的idb,实际可能是对应的idb文件权限不足)
  • 然后执行ALTER TABLE 表名 IMPORT TABLESPACE。(ALTER TABLE table_name IMPORT TABLESPACE)

完成,数据恢复成功,表很多的话可以采取一些批量处理措施,不然工作量会有点大。

附:导出数据库到文件
/usr/bin/mysqldump -u root -密码 --default-character-set=utf8 数据库名> ./database_db.sql

你可能感兴趣的:(日常,Linux,mysql)