我有一个 Ubuntu 10.04 生产 MySQL 数据库服务器,其中数据库的总大小为 260 GB,而根分区的大小本身为 300 GB,其中存储了数据库,基本上意味着大约 96% 的 / 已满并且没有剩余空间用于存储转储/备份等。到目前为止,没有其他磁盘连接到服务器。
我的任务是将此数据库迁移到位于不同数据中心的其他服务器。问题是如何以最少的停机时间有效地做到这一点?
我在想:
- 请求将额外的驱动器附加到服务器并在该驱动器中进行转储。[编辑:现在不可能。]
- 将转储传输到新服务器,恢复它并使新服务器成为现有服务器的从属服务器以保持数据同步
- 当需要迁移时,中断复制,更新从属配置以接受读/写请求并将旧服务器设置为只读,这样它就不会接受任何写请求,并告诉应用程序开发人员使用新的 db IP 地址更新那里的配置。
你有什么建议来改进这个或任何其他更好的方法来完成这个任务?
如果您正在考虑迁移到另一个具有完全相同版本的 MySQL 的数据库服务器,您可能希望
rsync
从datadir
旧服务器迁移到新服务器。无论 InnoDB 文件布局如何,甚至是否存在 MyISAM 表,这都将起作用。
RESET MASTER;
在rsycn进程之前运行清除所有二进制日志。如果未启用二进制日志记录,则可以跳过此步骤。SET GLOBAL innodb_max_dirty_pages_pct = 0;
从 mysql 运行大约 10 分钟(这会从 InnoDB 缓冲池中清除脏页。它还有助于更快地执行 mysql 关闭)如果您的数据库都是 MyISAM,则可以跳过此步骤。service mysql stop
在服务器A上service mysql start
服务器B上service mysql start
在 ServerA 上(可选)本质上,这是这样的脚本想要的
DBA StackExchange 的一位成员说我应该远离
FLUSH TABLES WITH READ LOCK;
基于 mysqlperformanceblog.com 的东西我通读并了解到在 a 中间针对 InnoDB 表的 SELECT
FLUSH TABLES WITH READ LOCK;
仍然允许以某种方式进行写入。正如Arlukin在评论中指出的那样,LVM 可以FLUSH TABLES WITH READ LOCK
在 InnoDB 上正常工作(他的评论+1)。对于所有非 LVM 用户,您可以使用全 MyISAM 数据库与
FLUSH TABLES WITH READ LOCK;
. 对于 InnoDB,请坚持--single-tranaction
在 mysqldumps 中使用。转储和恢复这种大小的数据库需要数小时。我会,取决于 mysql 的版本,只要版本号增加并且主要修订号没有跳跃。您应该能够获取 /var/lib/mysql 中的原始数据库文件并将它们放在新服务器上,设置权限并使用 --skip-grant-tables 开关启动服务器。为反映新 IP 地址的用户添加必要的授权,然后正常重启。
我会解决您的数据库的大小,因为它太大而无法提高效率。
您可以按照以下步骤迁移这个庞大的 InnoDB 数据库。
此任务将需要几个小时。为了最小化热复制脚本对实时服务器的影响,使用 renice 将其设置为低优先级
$ renice -n 5 -p <SCRIPT-PID>
在此过程中您可能会遇到缓慢但绝对不会停机。与 mysqldump 相比,Percona XtraBackup 将创建一个更快且资源消耗更少的热拷贝。这对于一个巨大的 InnoDB 数据库来说是理想的。
根据使用模式和统计数据,您可以在服务器上的流量最少时运行此过程。也许在周末这样做是个好主意?以上只是大致的过程。您可能需要阅读 Percona XtraBackup 和 SSHFS 文档。
您可以直接将数据库转储到远程服务器......
... SQL 应该压缩得很好,因此您应该使用这些选项之一更快地完成此操作,尽管它也取决于您在框中的 RAM 量 ...