博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】很久没有更新博客了,因为前段时间我的域名重新进行了备案,中间有一段时间网站关闭了,所有歇了好长一段时间。今天正好没事儿,就打算写篇文章,写的是这段时间遇到的问题,一位朋友叫我帮他备份 MySQL 数据库,我贪图快就直接复制了 MySQL 的 data 目录下对应的数据库文件,本以为这样就将完整的数据都保存下来了,后来出现了问题,所以才有这篇文章。
出现的问题在于:需要备份数据库中有 MyISAM、InnoDB 两个类型的表,而所有 MyISAM 引擎的表结构和数据都保留下来了;而 InnoDB 引擎的表数据保存不够完善。报错如下图所示:
给出一个案例:一个数据库名称叫做:test4,数据库中有两个表,一张是 test(InnoDB),一张是 test1(MyISAM),都存有数据,然后在 MySQL 安装目录下的 data 目录将 test4 文件夹备份起来;新建一个 test5 数据库,创建之后把 test4 中所有的文件替换掉 data 文件夹下 test5 文件夹的文件,就会出现如上的问题。
表 test(InnoDB)数据文件是:test.frm、test.ibd(2 个)
表 test1(MyISAM)数据文件是:test1.frm、test1.MYD、test1.MYI(3 个)
如果侥幸我们备份的数据库 test4 中所有的表都是 MyISAM 存储引擎的,那么很幸运,我们备份 test4 成功。但是万一存在 InnoDB 的时候,就吃大亏了。因为我们在建表的时候没有特别指定一般都是创建 InnoDB 类型的表。所有采用直接复制 data 目录下对应数据库的数据文件是不够安全的。
通常拷贝 data 文件是可以完整备份 MySQL 服务器中的所有数据库的所有数据的,这种做法比较适合数据库的搬迁,但并不适合针对某一个数据库的备份。
搬迁数据库的做法是:拷贝 data 数据目录下的所有文件,包括 ibdata1 等文件一并复制过去,并删除 ib_logfile0 ,ib_logfile1 等如 ib_logfile* 这类的文件,当然一些 log 文件可以拷贝也可以不拷贝,拷贝到指定 MySQL 服务器的 data 目录下即可(需要先清空 data 目录,这样等于是完整的搬迁数据库,就连数据库账号密码都搬迁了)。
【总结】如下:
1、当需要备份的数据库中的所有表都是 MyISAM 类型的存储引擎时,可以直接复制 data 目录下对应的数据库数据文件。
2、当不知道表的引擎情况,或者是 InnoDB 引擎,或者是两者混合出现的时候,需要备份对应的数据库数据文件以及 data 目录下的 ibdata1 文件,并删除 ib_logfile0、ib_logfile1 可能不止两个(ib_logfile*)即可。
3、拷贝 data 目录方式准确的说并不是备份数据库,而是对数据库进行搬迁。
4、最后也是最重要的一点:最好的备份数据库的方式还是使用相关工具(如 Navicate for MySQL)导出对应数据库的数据和表结构。
版权归 马富天个人博客 所有
本文标题:《MySQL 直接复制 data 目录下文件备份数据库时需要注意的几点》
本文链接地址:http://www.mafutian.com/407.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶0
踩0
第 1 楼 丘八 2019-02-26 15:24:00 暂无分享
评论审核未开启 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||