首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动InnoDb DB

移动InnoDb DB
EN

Stack Overflow用户
提问于 2013-11-27 08:14:24
回答 4查看 10.7K关注 0票数 4

我有DB InnoDb innodb_db_1。我打开了innodb_file_per_table。

如果我去var/lib/mysql/innodb_db_1/,我会找到table_name.ibd, table_name.frm, db.opt文件。

现在,我试图将这些文件复制到另一个DB,例如innodb_db_2(var/lib/mysql/innodb_db_2/),但什么也没有发生。

但是如果我的DB是MyIsam,我可以以这样的方式复制,一切都很好。

通过复制InnoDb DB的文件来移动DB有什么建议?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-04 07:19:05

即使在使用每个表的文件时,这些表仍将一些数据和元数据保存在/var/lib/mysql/ibdata1 1中。因此,您不能只将.ibd文件移动到一个新的MySQL实例。

您将不得不备份和恢复数据库。您可以使用:

  • mysqldump,包含在MySQL中,可靠但速度慢。
  • 翻地机是一个代替mysqldump的社区,它支持压缩和并行执行以及其他整洁的特性。
  • Percona XtraBackup,它是免费的,并执行InnoDB的高速物理备份(并且还支持其他存储引擎)。建议这样做可以最大限度地减少对活动操作的中断,如果数据库很大,也可以这样做。

关于你的评论:

不,不能只复制.ibd文件。不能关闭对ibdata1的要求。除其他外,这个文件还包括一个数据字典,您可以把它想象成一本书的目录。它告诉InnoDB您有哪些表,以及它们驻留在哪个物理文件中。

如果您只是将一个.ibd文件移动到另一个MySQL实例中,这并不会将其添加到该实例的数据字典中。因此,InnoDB不知道如何查看新文件,也不知道它使用哪个逻辑表。

如果您想找到解决办法,可以使用ALTER TABLE mytable ENGINE=MyISAM,将该文件及其.frm移动到另一个实例,然后ALTER TABLE mytable ENGINE=InnoDB将其更改回。在移动FLUSH TABLES WITH READ LOCK文件之前,请记住使用MyISAM。

但这些步骤并不适合初学者。除非您知道自己在做什么,否则使用备份和还原方法会安全得多。我在试着减轻你的悲伤。

票数 6
EN

Stack Overflow用户

发布于 2014-12-07 12:14:01

有一个简单的过程可以将整个Mysql InnoDB从pc A转移到pc B。

执行该程序的条件如下:

  1. 您需要设置innodb_file_per_table选项
  2. 您需要能够关闭数据库。

在我的例子中,我不得不移动整个150 my数据库(最大的表有aprox )。60)制作sqldumps并将其加载回不是一个选项(太慢)。

所以我做的是对mysql数据库(mysql文档)进行“冷备份”,然后简单地将文件移动到另一台计算机上。

移动数据库后要执行的步骤在这里描述,dba stackexchange

我编写这篇文章,是因为(假设您能够遵循所提到的条件)这是迄今为止移动(大型) MySql InnoDb的最快(也是最简单的)方法,而且还没有人提到它。

票数 5
EN

Stack Overflow用户

发布于 2014-01-04 07:24:42

您可以整天复制MyISAM表(只要这些表被刷新和锁定,或者服务器被停止),但是不能用InnoDB完成,因为两个存储引擎处理表和表空间的方式非常不同。

  • MyISAM通过迭代为数据库命名的目录中的文件来自动发现表。
  • InnoDB的内部数据字典存储在系统表空间(ibdata1)中。不仅表必须是一致的,.ibd文件中也有标识符,它们必须与数据字典内部存储的内容相匹配。

在MySQL 5.6之前,随着可传输表空间的引入,这并不是一个受支持的操作。如果您使用的是MySQL 5.6,该链接将为您提供有关此操作的信息。

备选办法:

  • 使用mysqldump [options] database_name > dumpfile.sql而不使用--databases选项,该选项将转储指定数据库中的表,但将省略任何DATABASE命令(DROP DATABASECREATE DATABASEUSE),根据指定选项的组合,这些命令中的一部分或全部通常添加到转储文件中。然后,您可以使用mysql [options] < dumpfile.sql导入它。
  • CREATE TABLE db2.t1 LIKE db1.t1; INSERT INTO db2.t1 SELECT * FROM db1.t1; (对于每个表,您必须重新添加任何外键约束)
  • 对每个表进行ALTER TABLE,将其更改为MyISAM,然后使用FLUSH TABLES WITH READ LOCK;刷新并锁定表,将它们复制到表上,然后将所有内容更改为InnoDB。这不是一个好主意,因为您将失去所有外键声明,必须将它们添加回原始表中,但这是另一种选择。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20237058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档