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

Mel*_*lon 16 mysql database

我正在使用 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

... 
Run Code Online (Sandbox Code Playgroud)

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

我有以下两个问题要问:

  1. 这三个文件究竟在做什么?

  2. 如果我在路径/var/lib/mysql/say下创建一个新目录db_test_2,并将db_test_1目录中的每个文件复制到db_test_2,它还会创建一个db_test_2db_test_1's具有完全相同内容(表)的新数据库吗?

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

  1. 转储数据库db_test_1

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

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

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

rvs*_*rvs 7

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

  2. 是的,复制会快得多。但是有一个问题:它不是原子的。在高负载下,复制的文件将不一致,甚至可能完全损坏。特别是如果您使用一些更“智能”的引擎,如 InnoDB。

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


小智 5

你有一个 cmd-line 工具,它可以做到这一点: mysqlhotcopy

它适用于 myisam 表,但不适用于 InnoDb 表。

如果您已经使用 lvm 配置了您的服务器,并将您的 /var/lib/mysql 放在一个专用卷上,那么我建议您以非常快的方式以非阻塞方式备份所有数据库:

mysql -U root -p
  > flush tables with read lock;
Run Code Online (Sandbox Code Playgroud)

这会将您的所有表刷新到磁盘并阻止任何 r/w 操作

  > system "lvcreate -s -L 1G -n lvMysql_snap /dev/vg_myserver/lv_mysql" ;
Run Code Online (Sandbox Code Playgroud)

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

  > unlock tables;
Run Code Online (Sandbox Code Playgroud)

完成后,重新开始 R/W 操作。

现在您可以挂载 /dev/vg_myserver/lvMysql_snap 并为您的数据库制作 tar 存档!