如何通过mysql的data文件恢复数据库

如何通过mysql的data文件恢复数据库,第1张

mysql数据恢复过程

从另一台机上把mysql数据库的mysql文件夹拷贝到本地机上,目的是恢复本地机对数据的访问和 *** 作。经过如下几种情况的 *** 作。

1.

在本地重装mysql(安装目录d:\program

files\mysql\mysql

server

5.0),直接把mysql文件夹拷贝至d:\program

files\mysql\mysql

server

5.0\。结果,失败:数据库连接错误。

2.

卸载后重装mysql,将d:\program

files\mysql\mysql

server

5.0\下的数据备份,只把mysql\data文件夹全部内容拷贝到d:\program

files\mysql\mysql

server

5.0\data下。结果,失败:数据库连接错误。将备份的数据还完覆盖。结果,失败,还是连接不上数据库。

3.

卸载后重装mysql,将mysql\data文件夹里的cf1,last文件夹(这两个是原来mysql里的数据库)拷贝进d:\program

files\mysql\mysql

server

5.0\data。连接成功,在navicat

for

mysql里看到数据库cf1和last,但是不能访问,因为数据全为零。明白了原来data里以数据库命名的文件存储的是数据库的表结构,不是元数据。下一步,把data文件夹里的ibdata1文件(3.4g大,明显存储了元数据)拷贝到d:\program

files\mysql\mysql

server

5.0\data里,代替原来的ibdata1文件。重启电脑,打开navicat

for

mysql,连接成功,数据可以访问 *** 作。

至此, *** 作终于成功。其实当初在那台机上把数据导出来,而不是现在直接把文件夹mysql复制过来会更容易恢复。但那台机已经重装了系统,也就是说mysql失效了。

备份:

[sql] view plain copy

mysqldump -uroot -p -S /tmp/mysql3306.sock --single-transaction --add-drop-database --master-data=1 --database tms,test >test_backup.sql

--single-transaction : 一致性备份,在备份开始前, 先执行START TRANSACTION命令,以此来获得备份的一致性,当前该参数只对INNODB存储引擎有效。当启用该参数并进行备份时, 确保没有其他任何的DDL语句执行,因为一致性读并不能隔离DDL语句。

--add-drop-database: 备份里会有创建删除数据库的命令, 要和-DATABASE一起使用。

--master-data:通过该参数产生的备份转存文件主要用来建立一个SLAVE REPLICATION。 当VALUE的值为1时,转存文件中记录CHANGE MASTER语句,当VALUE的值为2时,CHANGE MASTER语句被写成SQL注释。默认情况下, VALUE的值为空。

停止原从库的SLAVE复制:

[sql] view plain copy

mysql>stop slave

Query OK, 0 rows affected (0.00 sec)

mysql>reset slave all

Query OK, 0 rows affected (0.08 sec)

mysql>show slave status\G

Empty set (0.00 sec)

在从库进行SOURCE:

[sql] view plain copy

source /apps/test_backup.sql

待恢复完成后,可以根据备份文件里提供的BINLOG POSTION来启动REP:

[sql] view plain copy

mysql>CHANGE MASTER TO MASTER_HOST='192.168.0.93',MASTER_PORT=3306,MASTER_USER='replication',MASTER_PASSWORD='replication',MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=69295895

Query OK, 0 rows affected (0.00 sec)

mysql>flush privileges

Query OK, 0 rows affected (0.04 sec)

数据都没有了,怎么重建表。

.frm 和.ibd可以用来批量恢复InnoDB的表。

创建已经丢失的表结构

先要安装 mysql-utilities。

// RedHatyum -y install mysql-server mysql-utilities// Debianapt install mysql-utilities

使用 mysqlfrm 从 .frm 文件里面找回建表语句。

// 分析一个 .frm 文件生成建表的语句mysqlfrm --diagnostic /var/lib/mysql/test/t1.frm// 分析一个目录下的全部.frm文件生成建表语句root@username:~# mysqlfrm --diagnostic /var/lib/mysql/my_db/bk/ >createtb.sqlroot@username:~# grep "^CREATE TABLE" createtb.sql |wc -l124

可以看到一共生成了 124 个建表语句。

有很多时候也可以从其它库里面生成建表语句,如同一个应用的其它数据库或不同的测试环境,采用下面的 mysqldump 生成建表语句:

mysqldump --no-data --compact my_db>createtb.sql

登录 MySQL 生成表。

mysql>create database my_dbmysql>use my_dbDatabase changedmysql>source createtb.sqlQuery OK, 0 rows affected (0.07 sec)......

导入旧的数据文件

将新建的没有包括数据的 .ibd 文件抛弃

root@username:/var/lib/mysql/my_db# ll *.ibd|wc12411167941root@username:/var/lib/mysql/my_db# mysql -e "show tables from my_db" \| grep -v  Tables_in_my_db  \| while read ado mysql -e "ALTER TABLE my_db.$a DISCARD TABLESPACE"doneroot@username:/var/lib/mysql/my_db# ll *.ibd|wcls: cannot access '*.ibd': No such file or directory000

可以看到所有的 .idb 文件都已经被抛弃了。然后把旧的有数据的 .ibd 文件拷贝到这个 my_db 目录下面,别忘了把属主改过来:chown mysql. *,再把这些数据文件 import 到数据库中。

root@username:/var/lib/mysql/my_db# mysql -e "show tables from my_db" \| grep -v  Tables_in_my_db  \| while read a\do mysql -e "ALTER TABLE my_db.$a import TABLESPACE"done

导入完成后检查表

使用 mysqlcheck 对数据库 my_db 下的所有表进行检查:

root@username:/var/lib/mysql/my_db# mysqlcheck -c my_dbmy_db.cdp_backup_point                             OK......

所有的表都导入成功。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8512227.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存