我的服务器有非常大的 mysql 数据库(160GB)。
将此数据库移动到另一台服务器有多简单?
答案1
当您说“移动到另一台服务器”时,我们假设您想要移动到另一台运行 MySQL 的服务器,而不是移动到不同的 SQL 服务器(即 postrgres 或 MSSQL)。
大致有两种选择。将/var/lib/mysql
目录原封不动地传输到新服务器或执行导出和导入过程。
复制整个 mysql 目录意味着传输的数据更少,并且数据库从一台机器到另一台机器的复制完全相同。但是,MySQL 版本必须相同(我相信理论上小版本可以改变,但我不会指望这一点)。您可以停止 MySQL,将目录打包并使用scp
它复制到另一台机器。然后在另一台机器上解压目录并启动 MySQL。如果您想定期进行此复制,您可能需要考虑直接执行rsync
lib 目录,以便后续运行rsync
命令只会复制差异。
执行导出/导入过程将创建一个巨大的文本文件,其中包含所有保存为 SQL 插入语句的数据(并在开头使用表创建语句来设置数据库)。这应该可以导入到不同版本的 MySQL 数据库中,但是,如果数据库的版本存在巨大差异,那么可能会出错。通常最好保持 MySQL 版本相同。这样做的主要问题是,由于数据库中已经有 160GB 的数据,因此转储将非常大,因为 SQL 语句中会有额外的数据。您可以使用上面列出的某些管道命令将数据发送到远程计算机,或者您可以转储文件(通过 gzip 管道压缩它)并通过 scp 传输它(假设您有足够的磁盘空间)。
mysqldump -u<user> -p<password> <database name> | gzip > db_dump.sql.gz
您可以使用的另一种技术是将 mysqldump 命令通过 gzip 传输,然后通过 netcat(通过网络发送)传输到服务器上运行的另一个 netcat 进程,该进程将其传输到 gzip 中,最后传输到 mysql 中。这样做的好处是数据在传输过程中会压缩,并且不会创建临时文件。
在目标机器上:
nc -l 55555 | gzip -d -c | mysql <database name> -u<user> -p<password>
在源计算机上
mysqldump -u<user> -p<password> <database name> | gzip | nc <ip of target server> 55555
希望这有助于解释一些问题。如果您认为我在这里犯了错误,请发表评论。仔细检查手册页中的命令,因为我手边没有 MySQL 数据库来测试这个。
答案2
拥有如此大的数据库,我建议复制 MySQL 的数据目录,而不是进行转储:
- 关闭服务器A上的MySQL服务
- 压缩 MySQL 数据目录(可能位于 /var/lib/mysql 下),其中包含所有数据
- 复制您的 MySQL 配置(可能位于 /etc/mysql/my.cnf 下)
- 通过 SSH/SCP 将两者复制到服务器 B
- 提取数据,将配置文件放在同一目录中
- (重新)启动服务器 B 上的 MySQL 服务
您可以在 MySQL 配置文件 (my.cnf) 中找到 MySQL 数据目录的路径。
请注意,您应该使用两台服务器上的 MySQL 版本相同!如果没有,您应该使用 MySQL 转储导出和导入数据。
答案3
MySQL数据库的存储方法非常简单:
dir = 数据库名称 dir 中的文件是表和索引等。
因此找到你的数据库所在的位置 - 可能是这样的:
/var/lib/mysql
这里有你所有的数据库目录,以及在那些目录中的表。
现在您已经找到它们,请停止 MySQL 并仅 tar zip 目录结构。
tar -zcf mysqldatabases.tar.gz *
现在,您已将所有 MySQL 内容放在一个压缩文件中。将其复制到新服务器的数据目录并解压缩/解压。
答案4
使用此语法可以通过网络完成转储和恢复。
mysqldump db-name | mysql -h remote-server db-name
请记住在此操作过程中防止对数据库进行新的写入。