我有一个大型 Mysql 数据库(超过 10gb)。我正在从一个托管服务提供商转移到另一个托管服务提供商(均在 CentOS 中)。
我的想法是这样做:
旧服务器:
tar -cvf backup.tar backup.sql
新服务器:
wget oldserver.com/backup.tar
tar -xvf backup.tar
我的问题是,我怎样才能生成备份文件文件,以便可以通过 ssh 轻松地在新服务器上恢复它?
答案1
使用mysqldump。
mysqldump 客户端是一个备份程序,最初由 Igor Romanenko 编写。它可用于转储数据库或数据库集合以进行备份或传输到另一台 SQL 服务器(不一定是 MySQL 服务器)。转储通常包含用于创建表、填充表或两者的 SQL 语句。但是,mysqldump 也可用于生成 CSV、其他分隔文本或 XML 格式的文件。
答案2
如果所有表都是 MyISAM,则只需复制整个目录(通过rsync
或其他文件传输实用程序),而无需转储和 tar 任何内容。您可以使用 rsync 的压缩算法:
rsync -avz mysql_dir user@remotehost:~/
答案3
如果停机时间很短是一个问题,并且您的数据库非常活跃,您可能需要考虑设置新服务器来从属旧服务器。请按照MySQL 复制文档,将新服务器设置为从服务器。然后,当您准备好进行更改时,只需开始让您的应用程序访问新服务器而不是旧服务器 - 可能通过将一台服务器的 IP 地址关闭而将另一台服务器的 IP 地址打开,将您的应用程序重新配置为新服务器地址等...
但是,对于大多数网站来说,这通常有点过分了。通常,您可以花几分钟停机时间进行迁移,使用如下机制...
当 MySQL 在源服务器上运行时(并在目标服务器上运行),首先启动副本,如下所示:
rsync -avzP --delete /var/lib/mysql/ root@destination:/var/lib/mysql.source/
我将其运行到“mysql.source”的目标位置,这样我就可以确保如果我犯了错误,我不会用新服务器的数据覆盖活动服务器。根据网络速度,这可能需要很长时间(例如,如果您通过 1mbps 链接从一个提供商转移到另一个提供商)。
完成后,再次运行它以传输已更改的文件。这应该会快得多。
重新运行几次之后,它可能会减少到非常小的量,也许只有几秒钟。
此时,您已准备好进行最后的 rsync。具体操作如下:
ON OLD SERVER:
/etc/init.d/mysql stop
rsync -avzP --delete /var/lib/mysql/ root@destination:/var/lib/mysql.source/
ON NEW SERVER:
cd /var/lib
mv mysql mysql.orig
mv mysql.source mysql
/etc/init.d/mysql start
当然,这假设您已经复制了 my.cnf 并且如果系统比旧系统更大或更小(更改缓存大小等)则做出了适当的调整。
如果停机时间很短是一个问题,并且您的数据库非常活跃,您可能需要考虑设置新服务器来从属旧服务器。请按照MySQL 复制文档,将新服务器设置为从服务器。然后,当您准备好进行更改时,只需开始让您的应用程序访问新服务器而不是旧服务器 - 可能通过将一台服务器的 IP 地址关闭而将另一台服务器的 IP 地址打开,将您的应用程序重新配置为新服务器地址等...