如何有效地转储巨大的 MySQL innodb 数据库?

Jag*_*bir 8 mysql innodb

我有一个 Ubuntu 10.04 生产 MySQL 数据库服务器,其中数据库的总大小为 260 GB,而根分区的大小本身为 300 GB,其中存储了 DB,基本上意味着大约 96% 的 / 已满并且没有剩余空间用于存储转储/备份等等。截至目前,没有其他磁盘连接到服务器。

我的任务是将此数据库迁移到位于不同数据中心的其他服务器。问题是如何以最少的停机时间有效地做到这一点?

我在想:

  • 请求将额外的驱动器附加到服务器并在该驱动器中进行转储。[编辑:现在不可能。]
  • 将转储转移到新服务器,恢复它并使新服务器成为现有服务器的从属服务器以保持数据同步
  • 当需要迁移时,中断复制,更新从属配置以接受读/写请求并使旧服务器只读,这样它就不会接受任何写请求并告诉应用程序开发人员使用数据库的新 IP 地址更新那里的配置。

您有什么建议可以改进此任务或任何其他更好的方法来完成此任务?

Rol*_*DBA 9

如果你正在考虑迁移到另一个数据库服务器使用完全相同的MySQL版本,你可能希望rsyncdatadir从旧服务器到新的服务器。

无论 InnoDB 文件布局如何,甚至 MyISAM 表是否存在,这都将起作用。

  1. 在 ServerB 上安装与 ServerA 相同版本的 mysql
  2. 在 ServerA 上,运行RESET MASTER;以清除 rsycn 进程之前的所有二进制日志。如果未启用二进制日志,则可以跳过此步骤。
  3. 在 ServerA 上,SET GLOBAL innodb_max_dirty_pages_pct = 0;从 mysql运行大约 10 分钟(这会从 InnoDB 缓冲池中清除脏页。它还有助于更快地执行 mysql 关闭)如果您的数据库都是 MyISAM,则可以跳过此步骤。
  4. 将 ServerA 的 /var/lib/mysql rsync 到 ServerB 上的 /var/lib/mysql
  5. 重复第 3 步,直到 rsync 花费的时间少于 1 分钟
  6. service mysql stop 在服务器 A 上
  7. 再执行一次 rsync
  8. scp ServerA:/etc/my.cnf 到 ServerB:/etc/。
  9. service mysql start 服务器B上
  10. service mysql start 在 ServerA 上(可选)

本质上,这是这样的脚本想要的

mysql -u... -p... -e"RESET MASTER;"
mysql -u... -p... -e"SET GLOBAL innodb_max_dirty_pages_pct = 0;"
RSYNCSTOTRY=10
cd /var/lib/mysql
X=0
while [ ${X} -lt ${RSYNCSTOTRY} ]
do
    X=`echo ${X}+1|bc`
    rsync -r * targetserver:/var/lib/mysql/.
    sleep 60
done
service mysql stop
rsync -r * targetserver:/var/lib/mysql/.
service mysql start
Run Code Online (Sandbox Code Playgroud)

DBA FLUSH TABLES WITH READ LOCK;StackExchange 的一位同事说我应该远离基于 mysqlperformanceblog.com 的一些东西

我通读并了解到在 a 中间针对 InnoDB 表的 SELECTFLUSH TABLES WITH READ LOCK;仍然允许以某种方式进行写入。正如Arlukin在评论中指出的那样,LVM 可以FLUSH TABLES WITH READ LOCK在 InnoDB 上正常工作(他的评论为 +1)。

对于所有非 LVM 用户,您可以使用全 MyISAM 数据库与FLUSH TABLES WITH READ LOCK;. 对于 InnoDB,请坚持--single-tranaction在 mysqldumps 中使用。

  • 当我们需要手动同步主从设置时,我们就是这样做的。效果很好。但是在我们最新的服务器上,我们使用的是 LVM 快照,因此我们不需要停止服务器。就在执行 LVM 快照之前,我们执行“FLUSH TABLES WITH READ LOCK”,因此可以复制文件。如果您想复制所有文件以进行备份,lvm-snapshot 也非常好。所以用 LVM 设置你的新服务器,并添加一些额外的空间来做快照。 (2认同)