我想将数据库从 复制serverA
到serverB
。服务器可以直接相互通信。所以我可以做类似的事情:
ServerA
正在将数据库发送到ServerB
:
dbadm1@serverA:~$ mysqldump -C ... database | mysql -h serverB ... database
或:ServerB
正在从 ,,draining'' 数据库中ServerA
:
dbadm2@serverB:~$ mysqldump -C -h serverA ... database | mysql ... database
这两个命令的结果当然是相同的。
- 但是哪个更好/更快/等等?或者它们是一样的?
serverA
从或 从?开始应对serverB
?
我认为性能差异会很小。做什么比较方便。
如果一台机器更强大,就在那台机器上运行它——请注意,您将在该机器上有 3 个进程(mysqldump、mysql、mysqld),在另一台机器上有 1 个(mysqld)。
假设您用第一个示例解决了一个问题,差异应该可以忽略不计。
你在错误的地方有
-C
(--compress
) 选项,在这里。将其移动到远程机器:该
--compress
选项在实用程序和它所连接的主机之间的套接字上压缩数据。使用--compress
本地机器除了浪费 CPU 周期之外什么也做不了。|
该选项不压缩通过管道的数据。另请注意,这种方法对于大型数据库是有问题的,因为管道阻塞,这意味着
mysqldump
阻塞,这意味着它停止从网络读取,这意味着源服务器最终阻塞,而数据正在写入网络。如果这net_write_timeout
在一个连续的时间块内超过源服务器上的值,则源服务器将抛出错误并终止连接。在源服务器上增加net_write_timeout
是一个有点可行的解决方法,但要小心,因为服务器在写入网络时阻塞可能会导致其他线程在等待在某些情况下被阻塞的表时停止。我有一个内部工具可以消除这个超时问题,通过实现类似于由 gzip 临时文件组成的环形缓冲区的东西,允许源服务器尽可能快地写入,同时允许缓冲区尽可能快地排入目标服务器它可以(通常较慢),同时不需要比绝对必要更多的临时空间磁盘,只要它被发送到管道就释放每个临时“块”......它被调用
mysqldump | my-buffer-tool | mysql
......虽然我没有它一个可释放的状态。mysqldump
它对于在不占用服务器的情况下通过管道输出到压缩实用程序也很有用。