数据库mysql innodb ibdata1文件损坏恢复记录

数据库mysql innodb ibdata1文件损-数据坏恢复记录


目录

一、数据库环境:

二、导致数据库无法正常启动原因:

三、数据库数据恢复记录如下:

1、使用innodb_force_recovery

2、通过.ibd和.frm恢复数据

4、修改数据库数据目录

5、获取表结构

6、数据恢复操作

7、查询数据


一、数据库环境:

操作系统:CentOS Linux release 7.6.1810

Mysql版本:mysql-5.7.20

Mysql数据目录:/data/mysql

二、导致数据库无法正常启动原因:

由于数据库服务器断电,导致ibdata1文件损坏,mysql数据库服务无法启动。

2020-12-17T03:54:32.995013Z 0 [Warning] The syntax '--log_warnings/-W' is deprecated and will be removed in a future release. Please use '--log_error_verbosity' instead.
2020-12-17T03:54:32.995406Z 0 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
2020-12-17T03:54:32.995511Z 0 [Note] /usr/local/mysql/bin/mysqld (mysqld 5.7.20-log) starting as process 37098 ...
2020-12-17T03:54:33.097469Z 0 [Note] InnoDB: PUNCH HOLE support available
2020-12-17T03:54:33.097541Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2020-12-17T03:54:33.097549Z 0 [Note] InnoDB: Uses event mutexes
2020-12-17T03:54:33.097556Z 0 [Note] InnoDB: GCC builtin __sync_synchronize() is used for memory barrier
2020-12-17T03:54:33.097562Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
2020-12-17T03:54:33.097568Z 0 [Note] InnoDB: Using Linux native AIO
2020-12-17T03:54:33.102011Z 0 [Note] InnoDB: Number of pools: 1
2020-12-17T03:54:33.102313Z 0 [Note] InnoDB: Using CPU crc32 instructions
2020-12-17T03:54:33.113942Z 0 [Note] InnoDB: Initializing buffer pool, total size = 10G, instances = 40, chunk size = 128M
2020-12-17T03:54:34.648987Z 0 [Note] InnoDB: Completed initialization of buffer pool
2020-12-17T03:54:34.878594Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2020-12-17T03:54:34.893776Z 0 [ERROR] InnoDB: Database page corruption on disk or a failed file read of page [page id: space=0, page number=5]. You may have to recover from a backup.
2020-12-17T03:54:34.893811Z 0 [Note] InnoDB: Page dump in ascii and hex (16384 bytes):

三、数据库数据恢复记录如下:

在执行如下操作前,需备份数据库的整个数据目录,binlog日志目录

1、使用innodb_force_recovery

修改 vim /etc/my.cnf

[mysqld]
innodb_force_recovery = 1

如果使用innodb_force_recovery = 0(1-6参数),数据库服务未正常启动,继续往下看

innodb_force_recovery 参数说明:MySQL :: MySQL 5.7 Reference Manual :: 14.22.2 Forcing InnoDB Recovery

2、通过.ibd和.frm恢复数据

.ibd文件(内部数据字典)
.frm文件(数据库结构信息)
.ibd和ibdata1之间的关系类似于父级和子级,
.ibd文件将通过.frm文件引用ibdata1中的数据。

innodb-2

4、修改数据库数据目录

如果在本服务器,执行如下操作

#重命名数据库数据目录
mv /data/mysql /data/mysql-bak
#创建新的数据库数据目录
mkdir /data/mysql
#修改数据库目录所属权限
chown mysql.mysql /data/mysql
#复制源mysql库performance_schemay库到新建数据目录下
cp -ra /data/mysql-bak/mysql /data/mysql/
cp -ra /data/mysql-bak/performance_schema /data/mysql/
#启动数据库服务
service mysqld start

5、获取表结构

如果原有备份,这一步可以不操作

通过mysqlfrm命令,获取表结构

mysqlfrm下载地址: https://pan.baidu.com/s/1eSoLgB7AdAUX4Csqspp-tg?pwd=jcxh

# 不要使用yum安装,会报错
rpm -ivh mysql-connector-python-2.1.8-1.el7.x86_64.rpm
rpm -ivh mysql-utilities-1.6.5-1.el7.noarch.rpm
# 获取oadb库下所有表结构
mysqlfrm --diagnostic /data/mysql-bak/oadb/ > oadb-restore.sql
# 导入数据库
mysql -uroot -p
create database oadb;

#通过mysql客户端导入oadb-restore.sql文件

6、数据恢复操作

# 单表执行
mysql -u root -p
use oadb;
ALTER TABLE `user` DISCARD TABLESPACE;

# 批量操作
mysql -uroot -pSVNS2020 -A testdb -e 'ALTER TABLE `user` DISCARD TABLESPACE;'

# 执行完成后,复制源目录.ibd文件到恢复库中
cp -a /data/mysql-bak/oadb/*.ibd /data/mysql/oadb/
#
ALTER TABLE `user` IMPORT TABLESPACE;
# 批量操作
mysql -uroot -pSVNS2020 -A testdb -e 'ALTER TABLE `user` IMPORT TABLESPACE;'

7、查询数据

登录mysql客户端,查询数据库数据

ibdata1是MySQL数据库中的一个文件,它包含了InnoDB存储引擎的表空间数据。如果ibdata1文件损坏了,我们可以尝试以下几种方法来恢复数据。 首先,备份是非常重要的。如果你有完整的备份,你可以简单地将备份文件恢复到一个新的MySQL实例中,从而解决损坏的问题。 如果没有备份,可以尝试使用MySQL自带的工具来修复损坏ibdata1文件。 首先,关闭MySQL服务器,确保没有任何对数据库文件的写操作。然后备份整个数据目录,以防万一。 然后,使用innodb_force_recovery选项将数据库启动到恢复模式。这将尝试修复损坏的数据,并尽可能多地恢复数据。 如果恢复模式无法修复数据库,我们可以尝试使用InnoDB启动选项来创建一个新的ibdata1文件,然后重新导入数据。首先,在MySQL配置文件中设置innodb_force_recovery选项的值为最高值(一般是6),然后启动MySQL服务器。这将尝试最大程度地恢复数据库。然后使用mysqldump命令将所有数据导出到一个文件中。接下来,停止MySQL服务器,将innodb_force_recovery选项设回默认值,删除原来的数据目录,创建一个新的数据目录,并将从备份导出的数据放入新的数据目录下。最后,重新启动MySQL服务器,数据将被导入到新的数据库中。 尽管这些方法可能能够恢复部分数据,但它们并不是100%可靠的。在尝试修复损坏数据库之前,最好先与专业的数据库管理员咨询,以获取更确切和个性化的建议。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值