我们需要从Windows服务器上的MySql社区版复制并转储模式(大约70GB)到另一台机器。执行mysqldump
对我们来说并不理想,因为这是一个生产服务器而dump
会降低它的速度。
所以我们想到将数据文件复制到新机器,然后简单地启动MySql。但是......
部分实际数据显然位于ibdata1
文件中,而ibdata1
中包含数据的表格会产生Table doesn't exist in engine
错误。
所以我们认为我们也会将ibdata1
复制到新机器上。我们做到了。现在,新机器上的MySql无法启动。
我们尝试删除ib_logfile0
和ib_logfile1
并启动服务,但仍然没有运气。它没有开始。
知道如何解决这个问题吗?
答案 0 :(得分:0)
这对您的情况很有用:
https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
Percona XtraBackup是基于MySQL的服务器的开源热备份实用程序,在备份期间不会锁定您的数据库。
<强>更新强>
我花了很多时间(不久前)和你一样尝试同样的事情,我甚至在第二台服务器上看到my_table
和'SHOW TABLES',但是当我查询SELECT * FROM my_table
时,我得到了错误。 ERROR 1146 (42S02): Table my_table doesn't exist
(这让我发疯了)。请参阅我的旧问题:strange results when manually database copy to another server
我现在想到的另一个想法是使用cron
作业和mysqldump
使用WHERE
子句来处理备份,以避免生产速度变慢 < / p>
抱歉我的英文
答案 1 :(得分:0)
正如您所发现的,您不能只复制数据文件。各个表文件与中央ibdata1和ib_log文件之间存在依赖关系。 MySQL服务器进程中的RAM中也有一些数据。它们必须同步,否则您只会复制损坏的数据。
安全复制文件的唯一方法是关闭MySQL Server服务,因此在复制这些文件时会停止对这些文件的所有更改。显然,这比使数据库变慢更糟糕 - 应用程序在关闭时完全无法使用。
这就是存在备份工具的原因,可以安全地复制数据并在给定的时刻获得一致的数据快照。
您可以使用mysqldump --single-transaction,它应该在启动转储时获得一致的数据视图,而不会锁定数据库或减慢速度(不超过一个额外的线程运行SELECT * FROM <tablename>...
) 。这仅适用于所有表都是InnoDB,因此它们支持事务。并且在运行mysqldump时不得使用任何CREATE,ALTER,DROP,RENAME,TRUNCATE或GRANT / REVOKE命令。
另一个答案建议使用Percona XtraBackup,但该软件不提供Windows下载。最接近的选项是run XtraBackup in a Docker container on Windows(这是实验性的,对于新手来说不是推荐的解决方案)。
许多人使用的另一个选项是使用MySQL Replication设置复制MySQL实例,并将其用作备份源。然后,如果备份会降低副本实例的速度,则不会影响使用主实例的应用程序。