1.进入mysql mysql -u root -p 2.创建数据库 CREATE DATABASE 数据库名; 3.设置参数 set sql_log_bin=OFF; //关闭日志 set autocommit =0; //关闭autocommit自动提交模式 4.使用数据库 use 数据库名; 5.开启事务 START TRANSACTION; 6.引入SQL文件 source 文件的路径; 7.成功后事务提交
---- 背景 很多时候因为 MySQL 数据库不能启动而造成数据无法访问,但应用的数据通常没有丢失,只是系统表空间等其它文件损坏了,或者遇到 MySQL 的 bug。 这个时候如果没有备份,很多人就以为数据丢失了,但实际上大部分时候数据还是有救的。对于 MyISAM 引擎的表空间,直接把对应的数据文件拷贝到一个新的数据库就行了,数据就可以恢复了。 导入旧的数据文件 将新建的没有包括数据的 .ibd 文件抛弃 root@username: /var/ lib/mysql/my_db # ll *.ibd|wc 124 1116 7941 root 然后把旧的有数据的 .ibd 文件拷贝到这个 my_db 目录下面,别忘了把属主改过来:chown mysql. *,再把这些数据文件 import 到数据库中。 $a import TABLESPACE" ; done 导入完成后检查表 使用 mysqlcheck 对数据库 my_db 下的所有表进行检查: root@username: /var/ lib/mysql
一键领取预热专享618元代金券,1核1G云原生数据库TDSQL-C低至4.9元!云产品首单低0.8折起,企业用户购买域名1元起…
二、处理过程 2.1 查看当前的故障 进入MySQL datadir目录发现确实存在一个文件名叫#sql-ib334的文件。 过程当中,也咨询了我同学,说这种是临时表,系统默认会回收,但由于系统出现了问题,导致.frm 文件丢失了,所以通过MySQL查看此文件还是会存在。 2.2 发现问题所在 请教高手后,查看数据目录后查出了问题所在:我少了一个sql-ib334.frm文件,解决办法是通过重新创建一个表来进行恢复。 .frm /data/data/mysql_3306/langyage/ 注意文件权限,因为我这个数据权限都是一样的,所以不用修改 如果都可以了就可以执行下面的命令: mysql> DROP TABLE 通过这次故障让我知道,不要轻易直接在大表数据库上进行字段修改,因为很可能会造成数据库异常,而应该要深入了解INFORMATION_SCHEMA 这里面的东西,以便以后再发生类似的问题时,可以更好地处理。
进行操作,导致数据库异常,随后再执行这个SQL语句一直报错,报错提示如下: ? 二、处理过程 2.1 查看当前的故障 进入MySQL datadir目录发现确实存在一个文件名叫#sql-ib334的文件。 过程当中,也咨询了我同学,说这种是临时表,系统默认会回收,但由于系统出现了问题,导致.frm 文件丢失了,所以通过MySQL查看此文件还是会存在。 .frm /data/data/mysql_3306/langyage/ 注意文件权限,因为我这个数据权限都是一样的,所以不用修改 如果都可以了就可以执行下面的命令: mysql> DROP TABLE 通过这次故障让我知道,不要轻易直接在大表数据库上进行字段修改,因为很可能会造成数据库异常,而应该要深入了解INFORMATION_SCHEMA 这里面的东西,以便以后再发生类似的问题时,可以更好地处理。
VARCHAR(20)) ENGINE=InnoDB; 存储位置 frm文件保存在MySQL实例的data文件夹下的库名文件夹下(datadir/database_name) 可以通过下面的命令分别查看 `t_user` .ibd 文件 .ibd文件是InnoDB表的数据文件,最初InnoDB表的数据是保存在系统表空间中的,后来支持了每个表一个单独的文件存储,这个可以通过参数innodb_file_per_table .MYD MyISAM数据文件,文件名称为表名.MYD,文件位置在MySQL实例的data文件夹下的库名文件夹下。 .MYI MyISAM索引文件,文件名称为表名.MYI,文件位置在MySQL实例的data文件夹下的库名文件夹下。 db.opt 文本文件,保存数据库的默认字符集编码以及排序规则 文件位置同.frm文件为:datadir/database_name 示例文件如下: default-character-set=latin1
这是学习笔记的第 1901篇文章 MySQL里面对于表的默认的配置是每个表都有独立的文件.ibd和.frm文件对应,对于数据恢复来说,会提供很大的便利。 其中.frm文件存储了表结构定义信息,而.ibd文件存储了真正的数据。 如果某种特殊情况下,你只有.frm文件和.ibd文件,能不能单独恢复出来数据呢,答案是肯定的,当然这个过程不是一个命令搞定,而是需要一些方法和技巧。 所以在恢复.frm和.ibd文件的时候,难点在于如何解析得到建表的DDL语句。 在这里我们要做个小把戏,需要预创建一个同名的表,然后通过交换frm文件来变相得到DDL语句。 这个脚本为了支撑后续的灵活性,我是单独创建了一个数据库test_recover,可以作为你的一个专用恢复数据库,可以在上面做大量的恢复测试,来充分验证方案的可行性。
2.升级过程 因为数据量比较大,采用数据逻辑导出导入方式升级将会非常慢,不推荐,故采取 In-Place 方式升级,根据官方文档提供的升级路径,需要先从 5.6 升级到 5.7 ,然后再升级到 8.0 当前环境 zabbix 数据库目录下并不存在 #sql-ib104-715696445.ibd 文件,只有一个 #sql- 开头的 frm 文件 [root@GZ-DB-6CU552YR4V zabbix / 导入表空间,这一步也比较费时,因为需要修改 ibd 文件中页的 space id 和数据字典 space id 一致等操作 alter table xxxxxx import tablespace ; 导入表空间时,需要数据字典定义的 row format 和 ibd 文件中记录的 row format 一致,否则将报错: ERROR 1808 (HY000): Schema mismatch 通过 alter table xxxxxx row_format=compact 修改行格式,第5步 mv 过来的 ibd 文件会被删除,导致数据丢失,故要先 mv 走 ibd 文件再修改 row format
使用 InnoDB 引擎创建表,会生成 frm 文件和 idb 文件,frm 文件中存储表的定义,idb 文件中存储表的数据和索引。 ? 使用 MyISAM 引擎创建表,会生成 frm 文件、MYD文件和MYI文件,frm 文件中存储表的定义,MYD 文件中存储表的数据,MYI文件中存储表的索引。 ? 使用 MEG_MyISAM 引擎创建表,会生成 frm 文件和 MRG 文件,frm 文件中存储表的定义,MEG 文件存储表的数据。 CSV 引擎: 使用 CSV 引擎创建表,会生成 frm 文件,CSV 文件和CSM文件,frm 文件中存储表的定义,CSV 文件中存储表的数据,CSM 文件中存储表的元信息(如数据表现在的状态,数据表中的数据数量 使用 BLACKHOME 引擎创建表,只会生成 frm 文件,frm 文件中存储表的定义,因为写入任何数据都不会保存,所以也就没有存储表数据的文件。
1 恢复步骤概要 备份frm、ibd文件 如果mysql版本发生变化,安装回原本的mysql版本 创建和原本库名一致新库,字符集都要保持一样 通过frm获取到原先的表结构,通过的得到的表结构创建一个和原先结构一样的空表 /dbsake frmdump [frm-file-path] #将所有读取结果输入到文件中 ./dbsake frmdump [frm-file-path] > <文件名> 例如: . /dbsake frmdump student.frm teacher.frm > school.txt 恢复表结构 文件中存放的是frm对应表结构的sql,直接复制出来运行就行了,此时数据库中所有的结构都恢复了 DISCARD TABLESPACE; ALTER TABLE teacher DISCARD TABLESPACE; 6)拷贝原本的ibd,到新的库中 确定新数据库的数据存放位置 在mysql中执行命令 show variables like 'datadir'; 进入对应文件夹中,会有一个和需要恢复的数据库名完全一样的文件夹,进入文件夹 将ibd文件复制过来 cp命令直接复制过来就行了 7)命令恢复表空间
MySQL 数据库是具有持久化能力的。也就是说它的所有数据,其实最终都是存储在文件中的。如果你用的是 MyIsAM,则一张表数据文件有 3 个。 ? 进入到我的 /usr/local/var/mysql/ 目录后,可以看到我的 xttblog 和 test 数据库目录。 ? 根据列表文件中的后缀名都可以判断出,我使用的是 InnoDB 存储引擎。 里面插入一些测试数据,包含建立的索引等。然后,我们将 test_2019.ibd 和 test_2019.frm 两个文件复制到本地的其他目录。 直接复制表数据文件进行替换。结果就会导致上面的这个错误。 tail -n +12 表示跳过文件开头的前 12 行。因为前 12 行都是注释。 最后,我要提示的一点是,注意数据库的版本。如果版本不一致,也有可能导致恢复失败!
// 利用frm文件和ibd文件恢复表数据 // frm文件和ibd文件简介 在MySQL中,如果我们使用了默认的存储引擎innodb创建一张表,那么在文件夹下面就会出现表名.frm和表名.ibd ,而frm文件是innodb的表结构文件,mysiam存储引擎的表中,frm是表结构,MYI文件是索引文件,而MYD文件是数据文件,从这里也可以看出,innodb存储引擎的索引和数据是在一起的,而Myisam 考虑这样一种需求,数据库需要快速恢复一个表中的数据,而这个表所在的库的数据量非常大,恢复起来可能耗费的时间也比较长,那么全库恢复肯定不是最佳的选择。那这种情况下怎么办呢? 我们可以使用frm文件盒ibd文件来对数据进行恢复。下面我们分析分析这个过程。 ? frm文件恢复表结构 当然,表结构需要使用frm文件来恢复。 m 4、重新创建同名表,保证字段数量为m,与备份表保持一致,然后重新拷贝备份的frm文件到对应目录 5、修改实例的配置文件中的参数innodb_force_recovery=6,然后重启数据库,就可以看到对应的表结构创建语句
海外有一台服务器受到攻击,上面有自建的mysql数据库,要把数据库备份下来,要到地址账号密码登录上去看了一下mysql版本是5.1的 mysql> select version(); +-------- mysql> select * from dr_app; ERROR 1286 (42000): Unknown table engine 'InnoDB' mysql> 到后台数据库目录查看表 root [2015-02-15 10:53] draw_action_log.MYI 发现dr_app表的MYD和MYI文件被删除了 文件被删除了这台服务的mysql也没有备份(几年前的数据库),领导说被删除的只需要备份表结构就可以了 进一步发现被删除的表文件有几百个,需要把这些被删除的表找出来,然后通过frm文件恢复表结构 进到数据库目录下取表名,先把进行分组计数,正常情况下表名对应三个文件,我们只需要找出表名对应的文件只有1个( ,按照这种方式修复其他表就可以了 最后:表的数据是丢失了,所以数据库一定要备份,备份大于一切,进行数据库和服务器的安全加固很重要
Oracle保存数据时一般以DMP文件的形式进行保存 本博客记录,DMP文件的导入 先打开CMD sqlplus /nolog 以sysdba连接 conn /as sysdba 这里创建表空间,因为表空间进行存储的话 TABLESPACE DATA01 TEMPORARY TABLESPACE TEMP QUOTA UNLIMITED ON DATA01 授权 grant connect,dba to job; 复制dmp文件到 oracle安装目录里的app\admin\orce\dpdump里,然后用以下代码导入dmp文件,要顺便导入logfile的话,加上logfile=文件名 impdp job/job@orcl schemas
definition cache (之后我们简称为 TDC),TDC 是全局级别的表定义缓存 本期我们就来介绍一下 table definition cache 的作用 实验 我们的实验方法与 第12问 相同 构造一个数据库 ,我们先需要生成一个脚本: 我们从 information_schema 中,读取表名,并拼出相关的 SQL 现在就可以执行脚本了,我们将刚才生成的 SQL 通过管道符导入 MySQL client :MySQL 不再反复读取 frm 文件 这就是 TDC 的作用:在全局级别建立一个缓存,用于减少读取表定义的成本。 如果我们在MySQL 8.0中,重复以上实验,会发现 MySQL 也不再读取 frm 文件。 这是因为 MySQL 8.0 引入了 Data Dictionary ,将表定义放在了表中,不再需要访问 frm 文件。
例如,在对一张表(大表)添加索引时中途中断、磁盘不足导致异常或正在添加索引时实例被kill等等情况所致。 处理方法 3.1 同时存在.frm 和.ibd名称相同的文件 如果 #sql-*.ibd 和 #sql-*.frm两个文件都存在数据目录里的话,可以直接drop table。 5.1中引入的文件名安全编码。 的方式,即权限和原文件权限一致,属主及group均为mysql,因此可以直接在数据库里读取删除,如果权限不对,必须先修改文件权限。 3.3 修改frm文件名与ibd文件名一致 上一步中删除ibd文件时,其中一个frm也自动删除了。为此,尝试通过修改frm文件名和ibd文件名一致的方式处理。
二、运行(导入)数据库 SQL 文件 2.1、新建数据库 2.2、运行 SQL 文件 2.3、查看运行SQL文件界面 2.4、查看 SQL 运行文件(为什么我的表导入了没有?) 对于做一些个人辅助软件,选择 MySQL 数据库是个明智的选择,有一个好的工具更是事半功倍。下面我将向大家介绍如何使用 Navicat Premium 导出和导入 *.sql 数据文件。 ? ---- 一、转储(导出)数据库 SQL 文件 说明:转储即导出,运行即导入 SQL 文件,以下不另作说明。 二、运行(导入)数据库 SQL 文件 为了演示方便,我先去我的 Navicat Premium 将上面演示导出的数据库删掉。 ? ---- 总结 本文我们掌握了 MySQL 数据库如何使用 Navicat 导出和导入 *.sql 文件,其余的 IDE 操作都是类似的。
案例描述 某门户mysql innodb数据库实例损坏,数据库服务无法启动,使用文件系统上的数据库frm及bid文件恢复数据库内的业务数据。 相关知识点 Mysql innodb数据库将实例的基础字典信息存储在data目录下的ibdata1文件以及mysql实例中,可以将其理解为oracle数据库的system表空间以及数据字典,如果损坏数据实例将无法启动 在mysql实例无法启动的情况下使用这两个文件可以恢复数据库内的业务数据。 恢复过程中需要获得每个数据表的字段个数和每个表空间文件的table id(5.5版本),其中字段个数记录在frm文件中。 1、分析frm文件格式获得表字段个数 分析mysql源代码中位于table.cc文件中的open_binary_frm函数获得frm文件中记录字段数的位置: ? 4、使用原frm、ibd文件覆盖目标库同名文件 停止目标实例服务,将需要恢复的原数据库内的frm、ibd文件覆盖目标实例的同名文件,并import表空间: ?
(2)面这一部操作完成后,停止数据库,并进入到数据库数据文件所在目录,删除表面5个表所对应的idb文件,如下所示: [binghe@localhost] /data/mysqldata3/mydata/ slave_worker_info.ibd [binghe@localhost] /data/mysqldata3/mydata/mysql]rm -f *.ibd (3) 重新启动数据库,进入到 mysql库,重建上面被删除的表结构:数据库的建设表脚本在mysql软件的安装目录的share目录下,我的mysql软件的安装路径为/usr/test/mysql binghe@localhost : (1)登录数据库后,删除5张表,并重新导入脚本 use mysql; drop table slave_master_info; drop table slave_relay_log_info; drop /share/mysql_system_tables.sql; (2)重新启动数据库 注:这一步是必须的,否则无法正常配置双主架构。
目录 ---- 目录 导出数据库 导出数据和表结构 只导出表结构 导入数据库 首先建空数据库 导入数据库 ---- 导出数据库: 导出数据和表结构: 格式: mysqldump -u用户名 - p密码 数据库名 > 数据库名.sql 举例: /usr/local/mysql/bin/ mysqldump -uroot -p abc > abc.sql 敲回车后会提示输入密码 只导出表结构 注:/usr/local/mysql/bin/ —> mysql的data目录 导入数据库 首先建空数据库 mysql>create database abc; 导入数据库 方法一: 选择数据库 mysql>use abc; 设置数据库编码 mysql>set names utf8; 导入数据(注意sql文件的路径) mysql>source /home/abc/abc.sql; 方法二: mysql -u用户名 -p密码 数据库名 < 数据库名.sql mysql -uabc_f -p abc < abc.sql
腾讯云数据库MySQL是一种高性能、高可靠、高安全、可灵活伸缩的数据库托管服务,其不仅经济实惠,而且提供备份回档、监控、快速扩容、数据传输等数据库运维全套解决方案,为您简化 IT 运维工作,让您能更加专注于业务发展。
扫码关注云+社区
领取腾讯云代金券