mysqldump omits routines and triggers unless you ask

The default dump contains tables and data and none of the stored programs, so a restore produces a database that looks complete and behaves differently.

mysqldump --single-transaction --routines --triggers --events 
          --hex-blob --set-gtid-purged=OFF shop | gzip > shop.sql.gz

# and the marker that distinguishes a complete dump from a truncated one
zcat shop.sql.gz | tail -1 | grep -q 'Dump completed'

--single-transaction gives a consistent snapshot on InnoDB without locking, and it silently does nothing for MyISAM tables — which a legacy schema will have exactly one of. The trailing marker check is what catches a dump truncated by a disk filling halfway through, and a truncated dump restores without complaint right up to where the data stops. Both checks are one line each and both have caught real problems.