我在堡垒服务器后面有 2 台远程服务器,我正在尝试将 1 个 MySQL 数据库克隆到另一个。我在一个堡垒服务器上有一个脚本将数据发送到另一个堡垒服务器上的另一个脚本,它似乎内存不足。数据库大约2.7G,这些服务器有2G RAM。看起来它正在将整个数据库加载到内存中,但我不确定为什么。这些脚本中是否有将整个数据库加载到内存中的东西?以下是脚本:
migrateToRemote.sh(在堡垒 1 上)
#!/bin/bash
ssh -i ~/.ssh/key.pem ubuntu@<ipaddress> "mysqldump -h <db host> -u <db user> -p<db password> <orig db name>" | ssh -i ~/.ssh/key.pem ubuntu@<ipaddress> "/home/ubuntu/forwardDbMigration.sh"
forwardDbMigration.sh(在堡垒 2 上)
#!/bin/bash
ssh -i ~/.ssh/key.pem ubuntu@<ip address> "mysql -h <db host> -u <db user> -p<db password> <new db name>" < $(< /dev/stdin)
最佳答案
mysql ... < $(< /dev/stdin)
我认为这并不像您认为的那样。 bash 中的 $( )
替换不仅仅是 I/O 重定向。它运行一个命令。
您的用法读取/dev/stdin,然后尝试将该内容作为命令执行。这可能是内存不足的地方,它试图形成一个 2.7GB 长的命令。
这是我的意思的演示:
echo date | $(</dev/stdin)
Tue Nov 19 07:34:14 PST 2019
这是从/dev/stdin 读取字符串“date”,然后执行命令 date
。输出不是字符串“date”——它是执行 date
的结果,因为它包含在 $( )
中。
另一个演示:
echo "hello world" | $(</dev/stdin)
-bash: hello: command not found
看到了吗?从标准输入读取后,它试图执行“hello world”作为命令。
你不想执行你的mysqldump的内容,它不是一系列的shell命令。您只想将该内容作为输入传递给 mysql
。
如果你想让forwardDbMigration.sh
把它的stdin传递给mysql
,我想你只需要这样做:
ssh -i ~/.ssh/key.pem ubuntu@<ip address> "mysql -h <db host> -u <db user> -p<db password> <new db name>"
我也不确定为什么您的 forwardDbMigration.sh
包含一个 ssh 命令,因为您已经通过 ssh 连接到堡垒主机来运行它。
关于mysql - xmalloc : cannot allocate 16 bytes copying mysql database from 1 remote to another,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58937417/