如何高效地转储一个巨大的MySQL innodb数据库?

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

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

我在想:

  • 请求附加一个额外的驱动器到服务器,并在该驱动器转储。 [编辑:现在不可能]
  • 将转储转储到新的服务器,将其恢复并使现有服务器的新服务器从属服务器保持数据同步
  • 当需要迁移时,打破复制,更新从属configuration接受读/写请求,并使旧服务器只读,所以它不会招待任何写请求,并告诉应用程序开发人员更新那里configuration新的IP地址为db。

你有什么build议来改进这个任务或者更好的方法来完成这个任务?

如果您正在考虑使用完全相同版本的MySQL迁移到其他数据库服务器,则可能需要将旧服务器的数据datadir rsync datadir到新服务器。

无论InnoDB文件的布局,还是MyISAM表的存在,这都可以工作。

  1. 在ServerA上安装与ServerB相同版本的MySQL
  2. 在ServerA上,运行RESET MASTER; 擦除rsycn进程之前的所有二进制日志。 如果未启用二进制日志logging,则可以跳过此步骤。
  3. 在ServerA上,运行SET GLOBAL innodb_max_dirty_pages_pct = 0; 从MySQL和大约10分钟(这从InnoDB缓冲池清除脏页面,它也有助于执行一个MySQLclosures更快)如果你的数据库都是MyISAM,你可以跳过这一步。
  4. ServerB的rsync / var / lib / mysql到ServerB的/ var / lib / mysql
  5. 重复步骤3,直到rsyncless于1分钟
  6. ServerA上的service mysql stop
  7. 再执行一个rsync
  8. scp ServerA:/etc/my.cnf到ServerB:/ etc /。
  9. 在ServerB上service mysql start
  10. 在ServerA上service mysql start (可选)

本质上,这是一个这样的脚本会是这样的

 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 

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

我读了一遍,得知在一个FLUSH TABLES WITH READ LOCK;的中间select了InnoDB表FLUSH TABLES WITH READ LOCK; 仍然可以允许写入以某种方式发生。 正如Arlukin在评论中指出的那样 ,LVM将与InnoDB上的FLUSH TABLES WITH READ LOCK一起工作(对他的评论+1)。

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

转储和恢复数据库的大小将需要几个小时。 我会根据MySQL的版本,只要版本号增加,并没有在主版本号跳转。 您应该能够将/ var / lib / mysql中的原始数据库文件放到新服务器上,设置权限并使用–skip-grant-tables开关启动服务器。 为反映新IP地址的用户添加必要的授权,然后正常重启。

我会解决你的数据库的大小,因为它太大而不够高效。

你可以按照这些步骤迁移这个巨大的InnoDB数据库。

  • 安装SSHFS并在生产服务器上安装远程服务器的相关分区
  • 使用Percona XtraBackup获取InnoDB数据库的hotcopy,并直接将其保存到SSHFS挂载的目录中
  • 这个任务将需要几个小时。 为了最小化hotcopy脚本对活动服务器的影响,使用renice将其设置为低优先级

    $ renice -n 5 -p <SCRIPT-PID>

  • 确保两台服务器都运行相同版本的MySQL服务器。
  • 一旦hotcopy完成,您可以在新服务器中恢复它,启动复制过程

在这个过程中,您可能会遇到缓慢的情况,但绝对不会停机。 与mysqldump相比,Percona XtraBackup将创build一个更快,更省资源的hotcopy。 这对于一个巨大的InnoDB数据库是理想的。

根据使用模式和统计信息,当服务器上的stream量最小时,可以运行此过程。 也许在周末这样做是个好主意? 以上只是这个过程的一个概要。 您可能需要通过Percona XtraBackup和SSHFS文档。

您可以直接将数据库转储到远程服务器…

 $ mysqldump | ssh user@server 'cat - > dumpfile.sql.gz' 

… SQL应该压缩得很好,所以你应该用这些选项中的一个来更快地完成这个任务,尽pipe它也取决于你在盒子里的RAM数量。

 $ mysqldump | ssh -C user@server 'cat - > dumpfile.sql.gz' $ mysqldump | gzip -c | ssh user@server 'cat - > dumpfile.sql.gz'