我有一个Ubuntu 10.04生产MySQL数据库服务器,其中数据库的总大小为260 GB,而根分区的大小本身是300 GB,其中数据库存储在本质上意味着大约96%的/已满,没有空间用于存储转储/备份等到现在没有其他磁盘连接到服务器。
我的任务是将此数据库迁移到位于不同数据中心的其他服务器。 问题是如何以最less的停机时间有效地做到这一点?
我在想:
你有什么build议来改进这个任务或者更好的方法来完成这个任务?
如果您正在考虑使用完全相同版本的MySQL迁移到其他数据库服务器,则可能需要将旧服务器的数据datadir rsync datadir到新服务器。
无论InnoDB文件的布局,还是MyISAM表的存在,这都可以工作。
RESET MASTER; 擦除rsycn进程之前的所有二进制日志。 如果未启用二进制日志logging,则可以跳过此步骤。 SET GLOBAL innodb_max_dirty_pages_pct = 0; 从MySQL和大约10分钟(这从InnoDB缓冲池清除脏页面,它也有助于执行一个MySQLclosures更快)如果你的数据库都是MyISAM,你可以跳过这一步。 service mysql stop service mysql start 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数据库。
这个任务将需要几个小时。 为了最小化hotcopy脚本对活动服务器的影响,使用renice将其设置为低优先级
$ renice -n 5 -p <SCRIPT-PID>
在这个过程中,您可能会遇到缓慢的情况,但绝对不会停机。 与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'