服务器#1 是在 Debian 上运行的 MySQL 数据库服务器,它包含许多表和一个超过 100GB 的特定表。
服务器#2 用作 MySQL 复制的从属服务器,但是由于出现的问题,现在需要重置它并重新初始化复制。
目前,服务器 #1 的硬盘空间不足以进行完整的数据库转储(即可用空间不足 100GB)。除了升级硬件(这需要停机)之外,还有什么最佳方法可以将数据库转储从服务器 #1 完整无损地传输到服务器 #2,不会造成损坏,也不会在此过程中填满服务器 #1 的硬盘?
答案1
您无需中间文件即可执行此操作,也可以在此过程中重置复制指针,这样您就不会错过任何更新(并且必须再次重新同步)
停止从属复制
从属> mysql'从属停止;'
--master-data=1
使用标志将主服务器转储到从服务器主> mysqldump -e --master-data = 1 --single-transaction $DATABASE | ssh -C user @slave'mysql $DATABASE'
在从属设备上启动复制
从服务器> mysql‘从服务器启动’
--master-data=1
CHANGE MASTER TO ...
导致 mysqldump在转储顶部发出设置,以将复制 binlog 和偏移量设置为转储时主 binlog 中的精确点
-e
使用扩展的输出格式,基本上每个插入语句有多组值,这无论是在线上还是在应用于从属时都更有效率。
--single-transation
告诉 mysql 在整个转储上打开一个事务,而不是使用LOCK TABLES
。
答案2
快速而肮脏的方法(从服务器#1开始):
mysqldump -u root -p bigdb | bzip2 -c | ssh -T user@server2 "cat > backup.sql.bz2"
答案3
您可以从远程主机转储 mysql 数据库,只需使用 mysqldump 的 --host 或 -h 参数即可
server2# mysqldump -h server1 -u root -p --opt | gzip > database.sql.gz
server2# zcat database.sql.gz | mysql -u root -p
显然,您可以跳过转储到磁盘的步骤,但导入往往比转储慢。如果服务器 2 上的 CPU 是瓶颈,而磁盘速度很快,那么您可能希望跳过 gzip 步骤,这样可以最大限度地减少主服务器上的停机时间。
显然,我的回答跳过了与记录复制细节和确保您具有一致的复制转储有关的细节,因为这些是在 MySQL 手册中处理的。
答案4
如果无法进行复制并且本地服务器没有足够的磁盘空间,那么最好的办法就是忍受停机时间并从实时数据库文件进行完全同步。
- 正常关闭 MySQL
- 将 MySQL 分区重新挂载为只读(如果您搞砸了任何事情,这会有所帮助)
- 使用 rsync、wget 或类似工具获取数据集的完整副本并将其传输到第二台服务器
- 将 MySQL 分区重新挂载为读写
- 重启 MySQL
根据网络连接速度,这可能比安装新磁盘导致的停机时间更少。
或者,考虑在服务器上添加一个临时的 USB 大容量存储设备,并使用它来获取完整的数据库转储。这应该会导致零停机时间。