我们需要将模式(大约 70GB)从 Windows 服务器上的 MySql 社区版复制并转储到另一台计算机。执行
mysqldump
对我们来说并不理想,因为这是一个生产服务器,而 dump
会减慢速度。
所以我们想到将数据文件复制到新机器上,然后简单地启动MySql。但是...
一些实际数据显然位于
ibdata1
文件中,而在 ibdata1
中包含数据的表会生成 Table doesn't exist in engine
错误。
所以我们认为我们也应该将
ibdata1
复制到新机器上。我们做到了。现在,新机器上的MySql无法启动。
我们尝试删除
ib_logfile0
和 ib_logfile1
并启动服务,但仍然没有成功。没有开始。
知道如何解决这个问题吗?
这对您的情况很有用:
https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
Percona XtraBackup 是一款适用于基于 MySQL 的服务器的开源热备份实用程序,在备份期间不会锁定数据库。
更新: 我花了很多时间(前段时间)像你一样尝试,我什至在第二台服务器上看到带有“显示表”的
my_table
,但是当我进行查询时 SELECT * FROM my_table
我得到了错误。 ERROR 1146 (42S02): Table my_table doesn't exist
(这让我发疯)。请参阅我的老问题:手动将数据库复制到另一台服务器时出现奇怪的结果
我现在想到的另一个想法是通过
cron
作业和 mysqldump
使用 WHERE
子句来处理块备份,以避免生产速度变慢
对不起我的英语
正如您所发现的,您不能只复制数据文件。各个表文件、中央 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 版下载。最接近的选项是在 Windows 上的 Docker 容器中运行 XtraBackup(这是实验性的,不推荐给新手解决方案)。
许多人使用的另一个选项是使用 MySQL Replication 设置 MySQL 副本实例,并将其用作备份源。然后,如果备份减慢了副本实例的速度,也不会影响使用主实例的应用程序。