calvinf Asked: 2009-06-24 11:33:24 +0800 CST2009-06-24 11:33:24 +0800 CST 2009-06-24 11:33:24 +0800 CST MySQL 数据库网络备份 772 服务器 #1 是在 Debian 上运行的 MySQL 数据库服务器,它包含许多表和一个超过 100GB 的特定表。 服务器 #2 用作 MySQL 从属服务器进行复制,但由于出现问题,现在需要重置它并重新初始化复制。 目前在服务器#1 的硬盘驱动器上没有足够的空间来执行完整的数据库转储(即,少于 100GB 的可用空间)。除了升级需要停机的硬件之外,将数据库转储从服务器#1 完好无损地传输到服务器#2 的最佳方法是什么,没有损坏,并且在此过程中不填满服务器#1 上的硬盘驱动器? backup mysql database 7 个回答 Voted Sekenre 2009-06-24T11:55:59+08:002009-06-24T11:55:59+08:00 快速而肮脏的方式(从服务器#1开始): mysqldump -u root -p bigdb | bzip2 -c | ssh -T user@server2 "cat > backup.sql.bz2" Best Answer Dave Cheney 2009-06-24T19:08:56+08:002009-06-24T19:08:56+08:00 您可以在没有中间文件的情况下执行此操作,也可以在此过程中重置复制指针,这样您就不会错过任何更新(并且必须再次重新同步) 停止复制从属 slave> mysql '从站停止;' --master-data=1使用标志将主设备转储到从设备 主> mysqldump -e --master-data=1 --single-transaction $DATABASE | ssh -C user@slave 'mysql $DATABASE' 在从属设备上开始复制 从机> mysql '从机启动' --master-data=1导致 mysqldumpCHANGE MASTER TO ...在转储顶部发出设置以将复制 binlog 和偏移量设置为进行转储时主 binlog 中的确切点 -e使用扩展输出格式,基本上每个插入语句多组值,这在线路上和应用于从站时都更有效。 --single-transation告诉 mysql 在整个转储上打开一个事务,而不是使用LOCK TABLES. David Pashley 2009-06-24T12:53:31+08:002009-06-24T12:53:31+08:00 您可以从远程主机转储 mysql 数据库,只需将 --host 或 -h 参数与 mysqldump 一起使用 server2# mysqldump -h server1 -u root -p --opt | gzip > database.sql.gz server2# zcat database.sql.gz | mysql -u root -p 您显然可以跳过转储到磁盘,但导入往往比转储慢。如果您在 server2 上的 CPU 是一个瓶颈并且您的磁盘速度很快,那么您可能希望跳过 gzip 步骤,以便最大限度地减少主服务器上的停机时间。 显然,我的回答跳过了与记录复制细节有关的细节,并确保你有一个一致的复制转储,因为这些在 MySQL 手册中都有处理。 kubanczyk 2009-06-24T11:48:09+08:002009-06-24T11:48:09+08:00 显然NFS,如果服务器之间没有防火墙。如果您有防火墙,您可能需要重新配置它以允许 NFS 工作的一些额外流量。 类似的解决方案,稍微复杂一点,是在 server1 上使用 smbmount,在 server2 上使用 smbd。 如果您不想弄乱防火墙(或者您不想在服务器之间发送未加密的数据),我会推荐 sshfs。 cs168 2009-06-24T11:52:28+08:002009-06-24T11:52:28+08:00 如果您使用严格的 myisam 表,请关闭 mysql 并将数据文件从 server1 cp 到 server2。您还可以保持 mysql 启动并使用全局读取锁定将其置于只读状态,然后将表 cp 结束。 为清晰起见进行编辑并添加: 您还可以将 server1 上的表 mysqldump 到 stdout 并通过管道连接到连接到 server2 的 mysql。但是对于 100gb 表,这可能需要一些时间并且如果您想要任何一致性,仍然需要您将其设置为只读。 Moo 2009-06-24T11:53:27+08:002009-06-24T11:53:27+08:00 如果复制不是一个选项并且本地服务器没有足够的磁盘空间,那么最好的选择是忍受停机时间并从实时数据库文件进行完全同步。 优雅地关闭 MySQL 将 MySQL 分区重新挂载为只读分区(如果您启动任何内容,这会有所帮助) 使用 rsync、wget 或类似的东西来获取数据集的整个副本并将其传输到您的第二个服务器 将 MySQL 分区重新挂载为读写 重启 MySQL 根据网络连接的速度,这可能会导致比安装新磁盘更少的停机时间。 或者,考虑将临时 USB 大容量存储设备添加到服务器并使用它来获取完整的数据库转储。这应该导致零停机时间。 Kjetil Joergensen 2009-06-24T11:55:03+08:002009-06-24T11:55:03+08:00 如果这些盒子彼此之间的物理距离在合理的范围内,您可以连接一个 USB 驱动器并在那里进行数据库转储。 如果它在 nix-box 上运行,另一种选择可能是 ssh/pipes,尽管取决于您用于存储的后端,如果试图让 mysqlprocess 运行,表锁对于大表可能会很痛苦。 从 mysqlbox2,类似: ssh mysqlbox1 "mysqldump <options for username/pw/tables-to-dump>" > /path/to/spacious/fs/dbdump
快速而肮脏的方式(从服务器#1开始):
您可以在没有中间文件的情况下执行此操作,也可以在此过程中重置复制指针,这样您就不会错过任何更新(并且必须再次重新同步)
停止复制从属
slave> mysql '从站停止;'
--master-data=1
使用标志将主设备转储到从设备主> mysqldump -e --master-data=1 --single-transaction $DATABASE | ssh -C user@slave 'mysql $DATABASE'
在从属设备上开始复制
从机> mysql '从机启动'
--master-data=1
导致 mysqldumpCHANGE MASTER TO ...
在转储顶部发出设置以将复制 binlog 和偏移量设置为进行转储时主 binlog 中的确切点-e
使用扩展输出格式,基本上每个插入语句多组值,这在线路上和应用于从站时都更有效。--single-transation
告诉 mysql 在整个转储上打开一个事务,而不是使用LOCK TABLES
.您可以从远程主机转储 mysql 数据库,只需将 --host 或 -h 参数与 mysqldump 一起使用
您显然可以跳过转储到磁盘,但导入往往比转储慢。如果您在 server2 上的 CPU 是一个瓶颈并且您的磁盘速度很快,那么您可能希望跳过 gzip 步骤,以便最大限度地减少主服务器上的停机时间。
显然,我的回答跳过了与记录复制细节有关的细节,并确保你有一个一致的复制转储,因为这些在 MySQL 手册中都有处理。
显然NFS,如果服务器之间没有防火墙。如果您有防火墙,您可能需要重新配置它以允许 NFS 工作的一些额外流量。
类似的解决方案,稍微复杂一点,是在 server1 上使用 smbmount,在 server2 上使用 smbd。
如果您不想弄乱防火墙(或者您不想在服务器之间发送未加密的数据),我会推荐 sshfs。
如果您使用严格的 myisam 表,请关闭 mysql 并将数据文件从 server1 cp 到 server2。您还可以保持 mysql 启动并使用全局读取锁定将其置于只读状态,然后将表 cp 结束。
为清晰起见进行编辑并添加:
您还可以将 server1 上的表 mysqldump 到 stdout 并通过管道连接到连接到 server2 的 mysql。但是对于 100gb 表,这可能需要一些时间并且如果您想要任何一致性,仍然需要您将其设置为只读。
如果复制不是一个选项并且本地服务器没有足够的磁盘空间,那么最好的选择是忍受停机时间并从实时数据库文件进行完全同步。
根据网络连接的速度,这可能会导致比安装新磁盘更少的停机时间。
或者,考虑将临时 USB 大容量存储设备添加到服务器并使用它来获取完整的数据库转储。这应该导致零停机时间。
如果这些盒子彼此之间的物理距离在合理的范围内,您可以连接一个 USB 驱动器并在那里进行数据库转储。
如果它在 nix-box 上运行,另一种选择可能是 ssh/pipes,尽管取决于您用于存储的后端,如果试图让 mysqlprocess 运行,表锁对于大表可能会很痛苦。
从 mysqlbox2,类似: