我可以通过复制文件来复制MySQL数据库吗?这些文件到底包含什么?


13

我正在使用MySQL数据库和Ubuntu Linux计算机。

我指定的数据库db_test,我注意到,在道路/var/lib/mysql/db_test,有文件后缀.frm.MYD.MYI像下面:

/var/lib/mysql/db_test# ls

cars.frm 
cars.MYD 
cars.MYI

customers.frm
customers.MYD
customers.MYI

departments.frm
departments.MYD
departments.MYI

... 

似乎每一个.frm.MYD.MYI文件组数据库中的一个表的映射。

我有两个问题要问:

  1. 这三个文件到底在做什么?

  2. 如果我在/var/lib/mysql/say 路径下创建一个新目录db_test_2,并将每个文件从db_test_1目录复制到db_test_2,是否还会创建一个新数据库db_test_2,其内容(表)与完全相同db_test_1

此物理数据库文件移动操作是否与以下命令行操作产生相同的结果:

  1. 转储数据库db_test_1

  2. 创建一个新的数据库 db_test_2

  3. 然后将db_test_1数据库转储回新数据库db_test_2

如果是这样,那么移动文件似乎mysqldump比复制数据库(或将数据从一个数据库导入MySQL中的另一个数据库)要快得多。有什么意见吗?

Answers:


5
  1. AFAIR,.frm是描述文件(描述了数据库表结构),. MYD是带有数据的文件,.MYI是带有索引的文件。

  2. 是的,复制将更快。但这有一个问题:它不是原子的。在高负载下,复制的文件将不一致,甚至可能完全损坏。尤其是在使用诸如InnoDB之类的更多“智能”引擎时。

编辑: ps您可以安全地复制这些文件,但是在停止mysql服务器之前。


4

您有一个cmd-line工具可以执行以下操作: mysqlhotcopy

它可以在myisam表上正常工作,但不适用于InnoDb表。

如果您已经为服务器配置了lvm,并且将/ var / lib / mysql放在专用卷上,那么这是我建议非常快速且无阻塞地备份所有数据库的方法:

mysql -U root -p
  > flush tables with read lock;

这会将所有表刷新到磁盘并阻止任何读/写操作

  > system "lvcreate -s -L 1G -n lvMysql_snap /dev/vg_myserver/lv_mysql" ;

需要适应您的配置,这将创建数据库文件系统的快照。没时间

  > unlock tables;

完成此操作后,R / W操作将恢复。

现在,您可以挂载/ dev / vg_myserver / lvMysql_snap并创建数据库的tar存档!


这似乎是备份数据库的一种快速方法。但是,将快照切换回以使其再次成为我的实时数据库又如何呢?那是我真正关心的部分。我可以mysqldump在2秒内获得数据库。恢复它是很慢的部分,需要5到10分钟。
Buttle Butkus

在最近的发行版中,可以将lvm快照还原为原始快照,但这可能不是您想要用于管理数据库备份的快照。
奥利维尔·S

关于mysqlhotcopy:“此实用程序在MySQL 5.6.20中已弃用,而在MySQL 5.7中已删除”,来自:[
dev.mysql.com/doc/refman/5.6/en/mysqlhotcopy.html

0

这将适用于MyISAM,但不适用于InnoDB。参见https://serverfault.com/a/367321/57569

从这个答案中,关于InnoDB:

如果您只想复制.frm和.ibd文件,那么您很容易受到伤害。仅当您可以确保.ibd文件的表空间ID与ibdata1文件的metdata中的表空间ID条目完全匹配时,才复制InnoDB表的.frm和.ibd文件是好的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.