首页数据库mysql还原数据库,Mysql 如何还原数据库

mysql还原数据库,Mysql 如何还原数据库

编程之家2023-10-1974次浏览

这篇文章给大家聊聊关于mysql还原数据库,以及Mysql 如何还原数据库对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

mysql还原数据库,Mysql 如何还原数据库

Mysql 如何还原数据库

本文将详细阐述如何还MysqlWorkbench上还原mysql数据库。

首先,打开MysqlWorkbench

点击LocalinstanceMySql57进行登录,输入root密码

mysql还原数据库,Mysql 如何还原数据库

登录进去后,点击左边栏的administrationt选项卡

在里面找到“dataimport/restore”,点击进入。

这个地方需要选择importfromself-containedfile,从文件夹中选择备份的文件,然后在defaulttargetschema选项里选择要还原的数据库名称。右下角选择“dumpstructureanddata”

mysql还原数据库,Mysql 如何还原数据库

一切准备就绪后,点击右下角的“startimport”,开始还原数据库,最后进度条完成后,表示数据库还原完成。

mysql卸载后怎么找回原来建的数据库

每个 DBA是不是都有过删库的经历?删库了没有备份怎么办?备份恢复后无法启动服务什么情况?表定义损坏数据无法读取怎么办?

我曾遇到某初创互联网企业,因维护人员不规范的备份恢复操作,导致系统表空间文件被初始化,上万张表无法读取,花了数小时才抢救回来。

当你发现数据无法读取时,也许并非数据丢失了,可能是 DBMS找不到描述数据的信息。

背景

先来了解下几张关键的 InnoDB数据字典表,它们保存了部分表定义信息,在我们恢复表结构时需要用到。

SYS_TABLES描述 InnoDB表信息CREATE TABLE `SYS_TABLES`(`NAME` varchar(255) NOT NULL DEFAULT'',表名`ID` bigint(20) unsigned NOT NULL DEFAULT'0',表id`N_COLS` int(10) DEFAULT NULL,`TYPE` int(10) unsigned DEFAULT NULL,`MIX_ID` bigint(20) unsigned DEFAULT NULL,`MIX_LEN` int(10) unsigned DEFAULT NULL,`CLUSTER_NAME` varchar(255) DEFAULT NULL,`SPACE` int(10) unsigned DEFAULT NULL,表空间idPRIMARY KEY(`NAME`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_INDEXES描述 InnoDB索引信息CREATE TABLE `SYS_INDEXES`( `TABLE_ID` bigint(20) unsigned NOT NULL DEFAULT'0',与sys_tables的id对应 `ID` bigint(20) unsigned NOT NULL DEFAULT'0',索引id `NAME` varchar(120) DEFAULT NULL,索引名称 `N_FIELDS` int(10) unsigned DEFAULT NULL,索引包含字段的个数 `TYPE` int(10) unsigned DEFAULT NULL, `SPACE` int(10) unsigned DEFAULT NULL,存储索引的表空间id `PAGE_NO` int(10) unsigned DEFAULT NULL,索引的root page id PRIMARY KEY(`TABLE_ID`,`ID`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_COLUMNS描述 InnoDB表的字段信息CREATE TABLE `SYS_COLUMNS`( `TABLE_ID` bigint(20) unsigned NOT NULL,与sys_tables的id对应 `POS` int(10) unsigned NOT NULL,字段相对位置 `NAME` varchar(255) DEFAULT NULL,字段名称 `MTYPE` int(10) unsigned DEFAULT NULL,字段编码 `PRTYPE` int(10) unsigned DEFAULT NULL,字段校验类型 `LEN` int(10) unsigned DEFAULT NULL,字段字节长度 `PREC` int(10) unsigned DEFAULT NULL,字段精度 PRIMARY KEY(`TABLE_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_FIELDS描述全部索引的字段列CREATE TABLE `SYS_FIELDS`( `INDEX_ID` bigint(20) unsigned NOT NULL, `POS` int(10) unsigned NOT NULL, `COL_NAME` varchar(255) DEFAULT NULL, PRIMARY KEY(`INDEX_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;./storage/innobase/include/dict0boot.h文件定义了每个字典表的 index id,对应 id的 page中存储着字典表的数据。

这里我们需要借助 undrop-for-innodb工具恢复数据,它能读取表空间信息得到 page,将数据从 page中提取出来。

# wget https://github.com/chhabhaiya/undrop-for-innodb/archive/master.zip# yum install-y gcc flex bison# make# make sys_parser

#./sys_parser读取表结构信息

sys_parser [-h] [-u] [-p] [-d] databases/table

stream_parser读取 InnoDB page从 ibdata1或 ibd或分区表

#./stream_parserYou must specify file with-f optionUsage:./stream_parser-f<innodb_datafile> [-T N:M] [-s size] [-t size] [-V|-g] Where:-h- Print this help-V or-g- Print debug information-s size- Amount of memory used for disk cache(allowed examples 1G 10M). Default 100M-T- retrieves only pages with index id= NM(N- high word, M- low word of id)-t size- Size of InnoDB tablespace to scan. Use it only if the parser can't determine it by himself.

c_parser从 innodb page中读取记录保存到文件

#./c_parserError: Usage:./c_parser-4|-5|-6 [-dDV]-f<InnoDB page or dir>-t table.sql [-T N:M] [-b<external pages directory>] Where-f<InnoDB page(s)>-- InnoDB page or directory with pages(all pages should have same index_id)-t<table.sql>-- CREATE statement of a table-o<file>-- Save dump in this file. Otherwise print to stdout-l<file>-- Save SQL statements in this file. Otherwise print to stderr-h-- Print this help-d-- Process only those pages which potentially could have deleted records(default= NO)-D-- Recover deleted rows only(default= NO)-U-- Recover UNdeleted rows only(default= YES)-V-- Verbose mode(lots of debug information)-4-- innodb_datafile is in REDUNDANT format-5-- innodb_datafile is in COMPACT format-6-- innodb_datafile is in MySQL 5.6 format-T-- retrieves only pages with index id= NM(N- high word, M- low word of id)-b<dir>-- Directory where external pages can be found. Usually it is pages-XXX/FIL_PAGE_TYPE_BLOB/-i<file>-- Read external pages at their offsets from<file>.-p prefix-- Use prefix for a directory name in LOAD DATA INFILE command

接下来,我们演示场景的几种数据恢复场景。

场景1:drop table

是否启用了 innodb_file_per_table其恢复方法有所差异,当发生误删表时,应尽快停止MySQL服务,不要启动。若 innodb_file_per_table=ON,最好只读方式重新挂载文件系统,防止其他进程写入数据覆盖之前块设备的数据。

如果评估记录是否被覆盖,可以表中某些记录的作为关键字看是否能从 ibdata1中筛选出。

#grep WOODYHOFFMAN ibdata1

Binary file ibdata1 matches

也可以使用 bvi(适用于较小文件)或 hexdump-C(适用于较大文件)工具

以表 sakila.actor为例CREATE TABLE `actor`(`actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,`first_name` varchar(45) NOT NULL,`last_name` varchar(45) NOT NULL,`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY(`actor_id`),KEY `idx_actor_last_name`(`last_name`)) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8

首先恢复表结构信息1.解析系统表空间获取 page信息

./stream_parser-f/var/lib/mysql/ibdata1

2.新建一个 schema,把系统字典表的 DDL导入

cat dictionary/SYS_*| mysql recovered

3.创建恢复目录

mkdir-p dumps/default

4.解析系统表空间包含的字典表信息,

./c_parser-4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page-t dictionary/SYS_TABLES.sql> dumps/default/SYS_TABLES 2> dumps/default/SYS_TABLES.sql./c_parser-4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000002.page-t dictionary/SYS_COLUMNS.sql> dumps/default/SYS_COLUMNS 2> dumps/default/SYS_COLUMNS.sql./c_parser-4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page-t dictionary/SYS_INDEXES.sql> dumps/default/SYS_INDEXES 2> dumps/default/SYS_INDEXES.sql./c_parser-4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000004.page-t dictionary/SYS_FIELDS.sql> dumps/default/SYS_FIELDS 2> dumps/default/SYS_FIELDS.sql

5.导入恢复的数据字典

cat dumps/default/*.sql| mysql recovered

6.读取恢复后的表结构信息

./sys_parser-pmsandbox-d recovered sakila/actor

由于 5.x版本 innodb引擎并非完整记录表结构信息,会丢失 AUTO_INCREMENT属性、二级索引和外键约束, DECIMAL精度等信息。

若是 mysql 5.5版本 frm文件被从系统删除,在原目录下 touch与原表名相同的 frm文件,还能读取表结构信息和数据。若只有 frm文件,想要获得表结构信息,可使用 mysqlfrm--diagnostic/path/to/xxx.frm,连接 mysql会显示字符集信息。

innodb_file_per_table=OFF

因为是共享表空间模式,数据页都存储在 ibdata1,可以从 ibdata1文件中提取数据。

1.获取表的 table id,sys_table存有表的 table id,sys_table表 index id是1,所以从0000000000000001.page获取表 id./c_parser-4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page-t dictionary/SYS_TABLES.sql| grep sakila/actor000000000B28 2A000001430D4D SYS_TABLES"sakila/actor" 158 4 1 0 0"" 0000000000B28 2A000001430D4D SYS_TABLES"sakila/actor" 158 4 1 0 0"" 0

2.利用 table id获取表的主键 id,sys_indexes存有表索引信息,innodb索引组织表,找到主键 id即找到数据,sys_indexes的 index id是3,所以从0000000000000003.page获取主键 id

./c_parser-4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page-t dictionary/SYS_INDEXES.sql| grep 158000000000B28 2A000001430BCA SYS_INDEXES 158 376"PRIMARY" 1 3 0 4294967295000000000B28 2A000001430C3C SYS_INDEXES 158 377"idx_actor_last_name" 1 0 0 4294967295000000000B28 2A000001430BCA SYS_INDEXES 158 376"PRIMARY" 1 3 0 4294967295000000000B28 2A000001430C3C SYS_INDEXES 158 377"idx_actor_last_name" 1 0 0 4294967295

3.知道了主键 id,就可以从对应 page中提取表数据,并生成 sql文件。

./c_parser-4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page-t sakila/actor.sql> dumps/default/actor 2> dumps/default/actor_load.sql

4.最后导入恢复的数据

cat dumps/default/*.sql| mysql sakila

更多详细情况点击

网页链接

请点击输入图片描述

怎么备份和还原mysql数据库

MySQL数据库备份与还原

备份和恢复数据

生成SQL脚本

在控制台使用mysqldump命令可以用来生成指定数据库的脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创建数据库的语句!所以在恢复数据时,还需要自已手动创建一个数据库之后再去恢复数据。

mysqldump–u用户名–p密码数据库名>生成的脚本文件路径

现在可以在C盘下找到mydb1.sql文件了!

注意,mysqldump命令是在Windows控制台下执行,无需登录mysql!!!

执行SQL脚本

执行SQL脚本需要登录mysql,然后进入指定数据库,才可以执行SQL脚本!!!

执行SQL脚本不只是用来恢复数据库,也可以在平时编写SQL脚本,然后使用执行SQL脚本来操作数据库!大家都知道,在黑屏下编写SQL语句时,就算发现了错误,可能也不能修改了。所以我建议大家使用脚本文件来编写SQL代码,然后执行之!

SOURCE C:\mydb1.sql

注意,在执行脚本时需要先行核查当前数据库中的表是否与脚本文件中的语句有冲突!例如在脚本文件中存在create table a的语句,而当前数据库中已经存在了a表,那么就会出错!

还可以通过下面的方式来执行脚本文件:

mysql-uroot-p123 mydb1<c:\mydb1.sql

mysql–u用户名–p密码数据库<要执行脚本文件路径

这种方式无需登录mysql!

关于mysql还原数据库和Mysql 如何还原数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

linux 数据库?linux下的 数据库 有哪些数据库不等于怎么写 db2中sql语句的where从句 不等于怎么写