mysql - xmalloc : cannot allocate 16 bytes copying mysql database from 1 remote to another

标签 mysql bash ssh

我在堡垒服务器后面有 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/

相关文章:

linux - 如何在脚本化的 ssh 命令中使用单引号和双引号

mysql - MySql 获取玩家最近几场比赛的总分

bash - 检查 URL 是否转到包含文本 "404"的页面

linux - 如何让 echo 只打印已删除的文件路径?

ssh - 无法让 SSH ProxyCommand 工作(ssh_exchange_identification : Connection closed by remote host)

amazon-web-services - 我失去了从主服务器到从服务器(AWS EC2 Hadoop)的 ssh 连接能力

Java登录错误

php - cUrl 打开多个 URL

html - 如何在netbeans中编写更新、删除和搜索代码

ssh - 如何在腻子中定义与远程桌面的隧道连接?