Os comandos do Crontab terão todas as ocorrências sem escape de % substituídas por novas linhas. Isto é de o manual crontab(5) no meu sistema:
The command field (the rest of the line) is the command to be run. The entire command portion of the line, up to a newline or
%character, will be executed by/bin/shor by the shell specified in theSHELLvariable of the crontab. Percent signs (%) in the command, unless escaped with a backslash (\), will be changed into newline characters, and all data after the first%will be sent to the command as standard input.
Seu comando crontab deve se parecer com
mysql -N -ubackup -pt -e 'show databases' | while read dbname; do mysqldump -ubackup -p123 --complete-insert -N "$dbname" > /home/test/sqlbackups/"$(date +"\%Y-\%m-\%d")-$dbname".sql;done
Aqui, eu também corrigi o $(...) que estava com aspas simples (e, portanto, não expandido pelo shell).
Em geral, é melhor colocar todos os cron jobs não triviais em seus próprios scripts e, em seguida, programá-los. Dessa forma, você tem mais controle sobre coisas como essa e também é capaz de escolher o intérprete correto para qualquer tarefa específica (por exemplo, ksh ou bash em vez de sh ). Além disso, qualquer linha de assunto nos e-mails enviados para você a partir do daemon do cron é mais legível.