Linux / MySQL的:是否安全的复制MySQL数据库文件与cp命令从一个数据库到另一个?

大多数指南build议使用mysqldump和简单的SQL将一个表复制到anoter数据库。 怎么样的Linuxshell的CP? 我可以干脆吗?

cp /db1/mytable.frm /db2/mytable.frm

对于MyISAM来说,拷贝是非常简单的,并且与InnoDB完全一样的风险(接近自杀)。

从你的问题,你提出

cp /db1/mytable.frm /db2/mytable.frm 

MyISAM数据

这是可以做的。 但是,您不能移动.frm。 您必须移动所有组件。 从你的问题,让我们拿一个名为db1.mytable的表。 在正常安装中,该表位于/ var / lib / mysql / db1中。 将有三个文件组成表格。

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.MYD(表数据库)
  • /var/lib/mysql/db1/mytable.MYI(表索引)

您必须移动全部三个文件才能移动一个表格。 如果你所有的表都使用MyISAM存储引擎,你可以closuresmysql并拷贝。 如果您只是制作表的副本并将其放在另一个数据库中,则应该使用SQL来完成此操作。

例如,如果要将db1.mytable复制到数据库db2,请执行以下操作:

 CREATE TABLE db2.mytable LIKE db1.mytable; ALTER TABLE db2.mytable DISABLE KEYS; INSERT INTO db2.mytable SELECT * FROM db1.mytable; ALTER TABLE db2.mytable ENABLE KEYS; 

现在,如果您只是将表从db1移动到db2,您可以这样做:

 ALTER TABLE db1.mytable RENAME db2.mytable; 

InnoDB的

由于InnoDB的工作原理,复制是非常危险的。 有两个基本的基础设施:1)禁用innodb_file_per_table和2)启用innodb_file_per_table

InnoDB的致命弱点是系统表空间文件ibdata1(通常位于/ var / lib / mysql)。 该文件中包含什么

  • 表数据页面
  • 表索引页面
  • 表元数据(表空间idpipe理列表)
  • MVCC数据(支持事务隔离和ACID合规性

InnoDB(innodb_file_per_table已禁用)

在禁用innodb_file_per_table的情况下,所有这些types的InnoDB信息都位于ibdata1中。 InnoDB表之外的任何InnoDB表的唯一performance就是InnoDB表的.frm文件。 一次拷贝所有的InnoDB数据需要拷贝所有的/ var / lib / mysql。

拷贝一个独立的InnoDB表是完全不可能的。 您必须使用mysqldump将表的转储作为数据的逻辑表示及其相应的索引定义来提取。 然后,您可以将该转储装载到同一服务器或另一台服务器上的另一个数据库。

InnoDB(启用innodb_file_per_table)

启用innodb_file_per_table后,表数据及其索引将位于.frm文件旁边的数据库文件夹中。 例如,对于表db1.mytable,ibdata1之外的InnoDB表的performanceforms是:

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.ibd

所有db1.mytable的元数据仍驻留在ibdata1中, 绝对没有办法 。 重做日志和MVCC数据也依然存在于ibdata1中。

警告(或者机器人在失落的太空中会说的危险)

如果你正在考虑复制.frm和.ibd文件,那么你就是为了伤害世界。 如果可以保证.ibd文件的表空间id与ibdata1文件的metdata中的表空间id条目完全匹配,那么只复制InnoDB表的.frm和.ibd文件是很好的。

我在DBA StackExchange中写了关于这个表空间id概念的两篇文章

如果在表空间ID不匹配的情况下,这里是如何重新连接和.ibd文件到ibdata1的极好链接: http : //www.chriscalender.com/ ?tag=innodb-error-tablespace-id-in-file。 看完这个之后,你应该可以明白为什么我说自杀了。

对于InnoDB,你只需要这个

 CREATE TABLE db2.mytable LIKE db1.mytable; INSERT INTO db2.mytable SELECT * FROM db1.mytable; 

做一个InnoDB表的副本。 如果您将其迁移到另一个数据库服务器,请使用mysqldump。

复制整个MySQL datadir是一种实用的技术,假定MySQL服务已停止,并且希望复制整个数据库服务器。

这是一个非常有用的技术,用于转换带有大型索引的数据库,并且mysql转储将不包含索引,这些索引需要在导入时重新生成。 我发现这个技术在设置MySQL从站时很有用。

复制单个文件将取决于正在使用的表模式,但在大多数情况下不是一个合适的解决scheme。

使用xtrabackup w / ow w / o innobackupex包装,你会很好的myisam和innodb数据库。 请注意,即使使用xtrabackup,恢复innodb数据库也不只是复制文件。 告诉你是否需要更多的信息

不,你应该使用mysqdump进行备份,并用mysql cli工具恢复,复制你正在复制的表结构而不是数据里面的frm文件,如果你在innodb上直接复制文件是不可能的。

最好的方法是转储并恢复表。