![如何在两台服务器之间复制整个 MySQL 数据库?](https://linux22.com/image/29801/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%A4%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B9%8B%E9%97%B4%E5%A4%8D%E5%88%B6%E6%95%B4%E4%B8%AA%20MySQL%20%E6%95%B0%E6%8D%AE%E5%BA%93%EF%BC%9F.png)
两台机器之间有很好的连接(MySQL 5.5.28):
mysqldump -u root -p'password' --all-databases | ssh root@SERVERNAME mysql -u root -p'password' --all-databases
所以据我所知,这个 oneliner 就像在服务器#A 上获取 MySQL 转储,然后将转储复制到服务器#B,然后“将其导入服务器#B”。
Q1:数据库中没有其他内容?这是最快的方法吗? :) 或者还有更快的吗?当这一切进行时,会出现什么问题吗?
Q2:如何测试服务器#B 上的发送是否完全成功?如何检查两个数据库是否“逐位”相同?
答案1
首先,您应该意识到使用哪种存储引擎非常重要。
假设您的两个 mysql 服务器具有相同的版本。然后您可以对 MyISAM 表使用 mysqlhotcopy。这应该非常快,但这种方法仅限于 MyISAM 表。因为 mysqlhotcopy 直接复制文件,所以如果两个数据库“逐位”相同,那么借助diff
.
从5.5.5版本开始,INNODB是默认的存储引擎。如果你使用 INNODB 存储引擎,情况看起来会有所不同。在这种情况下,您将无法使用mysqlhotcopy
,只剩下mysqldump
.
如果您使用 . 则可能会出现一些问题mysqldump
。例如,如果 server#A 上的数据库有一个不存在的表的视图,则 mysql 会尝试在管道右侧创建一个不存在的表的视图,但会失败。在这种情况下,您可以使用该选项来避免中止--force
。
mysql --force ...
我已经复制了整个 mysql 数据库,mysqldump
并且比较了两台服务器的转储,发现转储仅在时间戳上有所不同。这可能是您的解决方案。
您还应该看看 的其他选项mysqldump
。例如我想到
--add-drop-database
--add-drop-table
--single-transaction ( for transactional tables only (like INNODB))