首页 > 数据库 >INNODB数据库恢复方法

INNODB数据库恢复方法

时间:2023-09-22 17:56:14浏览次数:30  
标签:testtable 恢复 数据库 ibd INNODB mysql data sq

MYSQL数据库经常会出现重启数据库服务时卡住不动了,这时只能手动KILL进程,但很多情况下KILL后数据库服务就无法启动了,一般都是ibdata1这个文件损坏导致的,基本没有办法在原来的基础上恢复数据库。官方文档给出的解决办法是,新建一台数据库实例,版本要和原来的一样,前提是INNODB表必须是独立表空间,表的.ibd文件要有。具体处理方法如下:

比如需要恢复testtable这个表:
一、在新的服务器上创建表结构(和原来表结构要一样)
二、丢弃新创建的表的表空间:
ALTER TABLE testtable DISCARD TABLESPACE;
运行结果大概如下:
Query OK, 0 rows affected (0.02 sec)
三、拷贝原来表的.ibd文件到数据库目录下,如:
cp testtable.ibd /var/lib/mysql/sq_data/(确保.ibd文件具有必要的文件权限(chown mysql:mysql testtable.ibd)
四、导入孤立.ibd文件。会发出警告,表明InnoDB正试图在没有架构验证的情况下导入文件:
ALTER TABLE testtable IMPORT TABLESPACE; SHOW WARNINGS;
此命令根据数据库表大小不同运行时间不同,测试一个15G的表大概用了4分多钟。
运行结果大概如下:
Query OK, 0 rows affected, 1 warning (4 min 2.12 sec)
Warning | 1810 | InnoDB: IO Read error: (2, No such file or directory) Error opening './sq_data/testtable.cfg', will attempt to import without schema verification
五、查看数据是否正常:SELECT COUNT(*) testtable;

如果数据表比较多,手动一个个恢复确实太耗时了,所以写了一个脚本批量处理:

 1 import os,sys,logging
 2 from subprocess import Popen #pyton2.7里没有run只能用Popen
 3 LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s - line %(lineno)d"
 4 DATE_FORMAT = "%Y-%m-%d %H:%M:%S %p"
 5 logging.basicConfig(filename='restore_mysql.log', level=logging.DEBUG, format=LOG_FORMAT,datefmt=DATE_FORMAT)
 6 
 7 structure_file_dir = "/root/mysqldata/" #数据表结构文件所在目录
 8 ibd_file_dir = "/root/olddata/sq_date/" #原数据库.ibd文件所在目录
 9 mysql_root_passwd = "*****************" #数据库ROOT用户密码
10 new_mysql_data_dir = "/var/lib/mysql/sq_data/" #新数据库表数据所在目录
11 
12 exclude_table = [ #不需处理的表
13     "test1",
14     "test2"
15 ]
16 def create_table_structure(table_name,sql_file):
17     cmd = "mysql -uroot -p'%s' sq_data<%s%s" % (mysql_root_passwd,structure_file_dir,sql_file)
18     res = Popen(cmd,shell=True)
19     res.wait()
20     if res.returncode != 0:
21         logging.debug("%s structure import failed! exit program!",table_name)
22         sys.exit(0)
23     #print(cmd)
24 def discard_tablespace(table_name):
25     cmd = "mysql -uroot -p'%s' -e 'ALTER TABLE sq_data.%s DISCARD TABLESPACE;'" % (mysql_root_passwd,table_name)
26     res = Popen(cmd,shell=True)
27     res.wait()
28     if res.returncode != 0:
29         logging.debug("%s DISCARD TABLESPACE failed! exit program!",table_name)
30         sys.exit(0)
31     #print(cmd)
32 def copy_ibd_file(table_name):
33     table_path = "%s%s.ibd" % (ibd_file_dir,table_name)
34     if os.path.isfile(table_path):
35         cmd = "cp %s %s" % (table_path,new_mysql_data_dir)
36         cmd2 = "chown mysql:mysql %s%s.ibd" % (new_mysql_data_dir,table_name)
37         res1 = Popen(cmd,shell=True)
38         res1.wait()
39         res2 = Popen(cmd2,shell=True)
40         res2.wait()
41         if res1.returncode != 0:
42             logging.debug("Copy %s failed! exit program!",table_path)
43             sys.exit(0)
44         if res2.returncode != 0:
45             logging.debug("chown %s%s.ibd failed! exit program!",new_mysql_data_dir,table_name)
46             sys.exit(0)
47     else:
48         logging.debug("%s not exist!exit program!",table_path)
49         sys.exit(0)
50         #print(cmd)
51         #print(cmd2)
52 def import_tablespace(table_name):
53     cmd = 'mysql -uroot -p"%s" -e "ALTER TABLE sq_data.%s IMPORT TABLESPACE;"' % (mysql_root_passwd,table_name)
54     res = Popen(cmd,shell=True)
55     res.wait()
56     if res.returncode != 0:
57         logging.debug("%s IMPORT TABLESPACE failed! exit program!",table_name)
58         sys.exit(0)
59     else:
60         print("%s OK" % table_name)
61     #print(cmd)
62 
63 structure_file_list = os.listdir(structure_file_dir)
64 for structure_file_name in structure_file_list:
65     if "_structure." in structure_file_name:
66         table_name = structure_file_name.split("_structure.")[0]
67         if table_name in exclude_table:continue
68         create_table_structure(table_name,structure_file_name) #import table structure
69         discard_tablespace(table_name) #discard tablespace
70         copy_ibd_file(table_name) #copy table.ibd to new dir
71         import_tablespace(table_name) #import tablespace

 

参考网址:http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting-datadict.html

标签:testtable,恢复,数据库,ibd,INNODB,mysql,data,sq
From: https://www.cnblogs.com/donfag/p/17723041.html

相关文章

  • 【Java】JDBC 获取数据库表名、字段名、注释 Comment 等信息
    需求:给定数据库信息和表名,扫描表的字段名、字段类型和注释。要使用JavaJDBC获取数据库表名、字段名和注释信息,你需要连接到数据库并执行适当的SQL查询。以下是一些示例代码,展示如何获取这些信息。请注意,这些示例代码假定你已经建立了数据库连接。你需要根据你的数据库类型和连接......
  • 数据库考核2
    数据库考核文件要求:专业,班级,姓名。例如:计算111张三.md考核标准:格式及内容,请遵守markdown文件的语法。请填写正确的SQL语句,而不仅仅是结果。1统计出场率最高的三位英雄字段要求:英雄名称,出场次数SELECThero,COUNT(hero)frommatch_infoGROUPBYheroORDERBYCOUNT......
  • 使用JDBC插入数据时,数据库中文显示为?的解决方法
    问题描述:使用JDBC进行添加数据的操作,设置的参数为中文,运行成功后数据库显示插入的数据为??解决方法:配置url时加上?useUnicode=true&characterEncoding=UTF-8重新进行插入:结果显示正确。......
  • C#连接达梦数据库
    达梦数据库提供了很多驱动,包括.Net。在达梦数据的安装目录找到\dmdbms\bin\DmProvider.dll程序集,这就是.Net操作达梦数据库的驱动程序。我们用VS建个Demo引用这个dll。增删改查的演示代码如下:usingDm;///<summary>///获得数据库链接///</summary>///<returns></re......
  • HIVE数据分析-导入数据库
    首先,启动hadoop以及hive出现以上进程,显示成功将改名后的文件上传到虚拟机在hive里面的defaul数据库创建表格usedefault;showtables;loaddatalocalinpath'/export/server/apache-hive-3.1.2-bin'intotablesales;将表格数据导入到表格中createtablesales(d......
  • 将hive数据库中的数据导入到mysql数据库中时需要注意到的问题
    在hive中使用jdbc将hive与mysql连接起来时一定要注意到每个数据库不同的字段个数,在打算直接复制时,不能只是修改表的名称和字段名称,还要记得修改几个?那里,个数要与字段名称保持一致!!!不然就会报错(比如我);......
  • MySQL备份与恢复
    数据库备份的分类数据备份的重要性备份的主要目的是灾难恢复在生产环境中,数据的安全性至关重要任何数据的丢失都可能产生严重的后果任何数据丢失的原因程序错误人为操作错误运算错误磁盘故障灾难(如火宅、地震)个盗窃从物理与逻辑的角度,备份可分为物理备份:对......
  • MySQL数据库管理
    目录数据库的基本概念数据库的发展主流的数据库介绍MySQL安装方法操作MySQL查看数据库结构SQL语句创建及删除数据库和表修改表名和表结构数据表高级操作数据库用户管理数据库用户授权数据库的基本概念数据描述事物的符号记录包括数字,文字、图形、图像、声音、档案记录等以......
  • openGauss学习笔记-76 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT简介
    openGauss学习笔记-76openGauss数据库管理-内存优化表MOT管理-内存表特性-MOT简介本节介绍了openGauss内存优化表(Memory-OptimizedTable,MOT)的简介。76MOT简介openGauss引入了MOT存储引擎,它是一种事务性行存储,针对多核和大内存服务器进行了优化。MOT是openGauss数据库最先进......
  • Mysql数据库存储引擎
    1.存储引擎的概念1.1什么是存储引擎MySQL中的数据用各种不下同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。存储引擎是MySQL将数据存储在文件系统中的存储方式......