Linux 需要帮助-获取错误:xrealloc:subst.c:4072:无法重新分配1073741824字节(已分配0字节)

Linux 需要帮助-获取错误:xrealloc:subst.c:4072:无法重新分配1073741824字节(已分配0字节),linux,bash,variables,unix,limit,Linux,Bash,Variables,Unix,Limit,检查是否有其他人有类似问题 shell脚本中的代码: ## Convert file into Unix format first. ## THIS is IMPORTANT. ##################### dos2unix "${file}" "${file}"; ##################### ## Actual DB Change db_change_run_op="$(ssh -qn ${db_ssh_user}@${dbserve

检查是否有其他人有类似问题

shell脚本中的代码:

  ## Convert file into Unix format first.
  ## THIS is IMPORTANT.
  #####################
  dos2unix "${file}" "${file}";
  #####################

  ## Actual DB Change
  db_change_run_op="$(ssh -qn ${db_ssh_user}@${dbserver} "sqlplus $dbuser/${pswd}@${dbname} <<ENDSQL
@${file}
ENDSQL
")";
4.现在,我面临的问题是: 让我们假设我有一个.sql文件,其中一个表中的select命令有几十万行,最多可达1500万行

select * from database321;
假设以上生成了上述bullet 4条件

在本例中,我得到了源服务器上运行的shell脚本抛出的以下错误消息

错误: *./db\u change\u load.sh:xrealloc:subst.c:4072:无法重新分配1073741824字节0已分配字节*

我的问题是: 1..sql脚本完成了吗?我想是的。但是,如何直接获取在目标服务器上生成的.sql文件的输出日志文件。如果可以做到这一点,那么我就不需要这个变量来保存整个ssh会话sqlplus命令的输出,然后通过[echo${db\u change\u run\u op}>sql.${file}.log]方式在源服务器上创建一个日志文件。

我假设该错误是由于ssh会话(即sqlplus)生成的输出或行数太大,无法满足Unix/Linux BASH变量的限制,从而导致xrealloc错误。 请就以上两个问题提出建议,如果您有任何经验,或者我如何解决这个问题。


我假设,在确定之后不久,我将尝试使用| tee/path/on.target.ssh.server/sql.${file}.log。让它工作起来。不再在var中存储内容,然后将$var回送到文件

幸运的是,我在源服务器和目标服务器上都有一个相同的挂载点,即如果我在源服务器和目标服务器上转到/scm,挂载df-kvh。显示共享/NAS装载值的相同输出

已使用的文件系统大小和装载的可用容量 服务器NAS02:/vol/vol1/scm 700G 560G 140G 81%/scm

现在,我所做的只是使用以下代码在远程服务器上创建一个文件,而不是使用变量来存储调用sqlplus会话的ssh会话的整个输出

  ## Actual DB Change
  #db_change_run_op="$(ssh -qn ${pdt_usshu_dbs}@${dbs} "sqlplus $dbu/${pswd}@$dbn <<ENDSQL | tee "${sql_run_output_file}".ssh.log
#set echo off
#set echo on
#set timing on
#set time on
#set serveroutput on size unlimited
#@${file}
#ENDSQL
#")";



ssh -qn ${pdt_usshu_dbs}@${dbs} "sqlplus $dbu/${pswd}@$dbn <<ENDSQL | tee "${sql_run_output_file}".ssh.log
set echo off
set echo on
set timing on
set time on
set serveroutput on size 1000000
@${file}
ENDSQL
"
似乎unlimited在11g中不起作用,所以我不得不使用1000000值这些小型sql CMD帮助显示命令及其输出,显示每个输出行的时钟时间等等

但基本上,在上面的代码中,我直接调用ssh命令,而不使用变量=$。。。。。方法那之后呢<
即使我没有同样的坐骑,我可以将输出设置为远程服务器路径上的一个文件,该路径在源服务器上不可用,但至少我可以看到.sql命令完成或生成的输出达到了什么级别,因为现在输出将直接发送到远程服务器上的一个文件,并且Unix/Linux在没有空间之前不太关心文件大小。

您似乎是这样做的对问题的基本知识有很好的理解。xrealloc错误几乎可以肯定是返回的“太大”结果集的结果。给定您包含的错误消息的确切文本。对于这个问题,如果这个变量存在,你真的不想让数百万行返回存储,是吗?那么问题是什么,如何获取合理的stat msg,或者如何获取所有数据并存储到变量中?您是否在for循环中重用该代码,执行sql cmd列表?如果是这样的话,你将不得不做2+个diff循环,1个处理普通,2+处理特殊情况来回答你的问题:我一般不想要数以百万计的行,但我试着在这种情况下,我可以达到sql输出的行数,这可能会影响shell脚本如何使用db_change_。。变量我没有在for循环中使用这个变量,所以它不是var=$var-$newvar等的情况。顺便说一句,下面的内容可以帮你挽回一些人的笑容。使用-o ServerAliveInterval=60选项运行SSH命令,否则,连接将重置,向远程服务器调用SSH的自动脚本将永远不会完成。SSH-o ServerAliveInterval=60username@domain.comIf如果您使用的是SunOS,那么您可能没有OpenSSH。查看ssh-v显示的版本。顺便说一句,使用nohup运行ssh会话将有助于避免从源服务器连接到目标/远程服务器的连接重置问题。我仍然看到连接重置。我将使用ssh从源代码调用目标服务器上的脚本,并等待该脚本的PID在目标服务器上运行sqlplus,而不是从srouce到目标服务器运行ssh
  ## Actual DB Change
  #db_change_run_op="$(ssh -qn ${pdt_usshu_dbs}@${dbs} "sqlplus $dbu/${pswd}@$dbn <<ENDSQL | tee "${sql_run_output_file}".ssh.log
#set echo off
#set echo on
#set timing on
#set time on
#set serveroutput on size unlimited
#@${file}
#ENDSQL
#")";



ssh -qn ${pdt_usshu_dbs}@${dbs} "sqlplus $dbu/${pswd}@$dbn <<ENDSQL | tee "${sql_run_output_file}".ssh.log
set echo off
set echo on
set timing on
set time on
set serveroutput on size 1000000
@${file}
ENDSQL
"