大多数指南都推荐使用 mysqldump 和简单的 SQL 将一个表复制到另一个数据库。linux shell cp 怎么样?我可以简单地执行
cp /db1/mytable.frm /db2/mytable.frm
答案1
对于 MyISAM 来说,复制非常简单,但对于 InnoDB 来说,复制则完全是 100% 危险(近乎自杀)。
从你的问题中,你提到
cp /db1/mytable.frm /db2/mytable.frm
数据库管理系统
这样做没问题。但是,您不能只移动 .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 存储引擎,您可以关闭 mysql 并进行复制。如果您只是复制表并将其放在另一个数据库中,则应使用 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)。该文件包含什么?
- 表格数据页
- 表索引页
- 表元数据(表空间id管理列表)
- 脉动循环控制电路数据(支持事务隔离和符合 ACID 标准)
InnoDB(innodb_file_per_table 已禁用)
禁用 innodb_file_per_table 后,所有这些类型的 InnoDB 信息都存在于 ibdata1 中。ibdata1 之外的任何 InnoDB 表的唯一表现形式是 InnoDB 表的 .frm 文件。一次性复制所有 InnoDB 数据需要复制所有 /var/lib/mysql。
复制单个 InnoDB 表是完全不可能的。您必须使用 mysqldump 提取表的转储作为数据及其相应索引定义的逻辑表示。然后,您可以将该转储加载到同一服务器或另一台服务器上的另一个数据库。
InnoDB(已启用 innodb_file_per_table)
启用 innodb_file_per_table 后,表数据及其索引将位于 .frm 文件旁边的数据库文件夹中。例如,对于表 db1.mytable,ibdata1 之外的 InnoDB 表的表现形式将是:
- /var/lib/mysql/db1/mytable.frm
- /var/lib/mysql/db1/mytable.ibd
db1.mytable 的所有元数据仍然驻留在 ibdata1 中,并且绝对没有办法解决这个问题。重做日志和 MVCC 数据仍然与 ibdata1 共存。
警告(或危险《迷失太空》里的机器人会说)
如果您只想复制 .frm 和 .ibd 文件,那么您将面临巨大的麻烦。只有当您能保证 .ibd 文件的表空间 ID 与 ibdata1 文件的元数据中的表空间 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 表。如果要将其迁移到另一个 DB 服务器,请使用 mysqldump。
答案2
复制整个 MySQL datadir 是一种实用的技术,假设 MySQL 服务已停止并且您想要复制整个数据库服务器。
这是一种用于转移具有大索引的数据库的有用技术,mysql 转储不会包含索引,这些索引需要在导入时重新生成。我发现这种技术在设置 MySQL 从属服务器时很有用。
复制单个文件将取决于所使用的表模式,但在大多数情况下这不是一个合适的解决方案。
答案3
使用备份不使用 innobackupex 包装器,myisam 和 innodb 数据库都可以正常工作。请注意,即使使用 xtrabackup,恢复 innodb 数据库也不仅仅是复制文件。如果您需要更多信息,请告诉我们
答案4
不,您应该使用 mysqdump 进行备份并使用 mysql cli 实用程序进行恢复,复制 frm 文件时仅复制表结构而不是其中的数据,如果您在 innodb 上,则无法直接复制文件。
最好的方法是转储并恢复表。