Como executar um número de linhas usando xargs

1

Eu tenho um grande dump sql que tem 1 instrução de inserção por linha. Eu quero ser capaz de canalizar isso para xargs para que eu possa retardar as gravações. Basicamente eu quero executar um número de linhas, dormir, depois continuar a executar e assim por diante.

Eu tenho isso:

cat file.sql | xargs -n50 -d "\n" sh -c '(echo "$@" | mysql db_name); sleep 10'

Mas o problema é que acredito que, em algum lugar do arquivo, haja um \n que está causando a quebra do sql. Estou usando INSERT IGNORE e isso está resultando em linhas ausentes.

Eu não quero passar pelo arquivo e corrigir o \n . Existe uma maneira de usar a linha em vez de \n ?

Eu tentei:

cat file.sql | xargs -L 50 sh -c '(echo "$@" | mysql db_name); sleep 10'

mas estou recebendo:

xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
    
por gerky 11.03.2015 / 14:20

1 resposta

1

Eu iria apenas modificar o SQL. O MySQL possui uma função SLEEP da qual você pode selecionar. O seguinte irá injetar um retardo de 10 segundos a cada 50 linhas ... E então canalizar isso no comando mysql .

awk '{print} NR%50==0 {print "SELECT SLEEP(10);"}' file.sql | mysql db_name
    
por Oli 11.03.2015 / 14:48