在1个文件中备份MySQL数据库,但每个数据库分隔.tar.gz

我现在在cron中使用这个来备份1个sql.gz文件中的所有数据库

0 0 * * * root mysqldump -u root -pPASSWORD --all-databases | gzip > /home/backup/db/`date +\%G-\%m-\%d`_db.sql.gz 

我想有一个.tar.gz文件,其中有X个其他档案,我有多less个数据库..这可能吗?

像这样的东西可能工作。 它没有经过testing,但与我在系统上进行备份时使用的略有不同。

 # define common vars OPTIONS="--verbose --lock-tables --flush-logs --force --quick --single-transaction" AUTHFILE="/etc/mysql/rootauth.cnf" BACKUPDIR="/srv/backup/mysql/" BACKUPDATE=`date +"%y%m%d%H"` # create temp folder (this isn't entirely safe, but be sure only root or backup user has # write access here, you might want to use mktemp) mkdir ${BACKUPDIR}/tmp/ # get a list of all the databases on the system DBSQL="SELECT SCHEMA_NAME FROM information_schema.SCHEMATA where SCHEMA_NAME!='information_schema' \ AND SCHEMA_NAME!='performance_schema' order by SCHEMA_NAME" DBS=`/usr/bin/mysql --defaults-extra-file=${AUTHFILE} --batch \ --skip-column-names --execute "$DBSQL"` DBS=`echo $DBS | tr -d '\n' | sed -e "s/ \+/ /g"` for DB in $DBS; do # perform a per-database dump BACKUPDIRDB="${BACKUPDIR}/tmp/${DB}" mkdir -p ${BACKUPDIRDB} /usr/bin/mysqldump --defaults-extra-file=${AUTHFILE} \ ${OPTIONS} $DB > ${BACKUPDIRDB}/backup_${BACKUPDATE} done # create archive of everything tar -czvf ${BACKUPDIR}/backup_${BACKUPDATE}.tar.gz ${BACKUPDIR}/tmp/ #remove temp files rm -rf ${BACKUPDIR}/tmp/ 

像这样创build一个脚本来并行地mysqldump所有的数据库

 DBLIST=`mysql -uroot -pPASSWORD -ANe"SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','performance_schema')" | sed 's/,/ /g'` MYSQLDUMP_OPTIONS="-uroot -pPASSWORD --single-transaction --routines --triggers" BACKUP_DEST=/home/backup/db/`date +\%G-\%m-\%d` mkdir ${BACKUP_DEST} for DB in `echo "${DBLIST}"` do mysqldump ${MYSQLDUMP_OPTIONS} ${DB} | gzip > ${BACKUP_DEST}/${DB}.sql.gz & done wait 

然后把这个脚本放在crontab中

如果有太多的数据库,可以像这样一次转储5个数据库

 DBLIST=`mysql -uroot -pPASSWORD -ANe"SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','performance_schema')" | sed 's/,/ /g'` MYSQLDUMP_OPTIONS="-uroot -pPASSWORD --single-transaction --routines --triggers" BACKUP_DEST=/home/backup/db/`date +\%G-\%m-\%d` mkdir ${BACKUP_DEST} COMMIT_COUNT=0 COMMIT_LIMIT=5 for DB in `echo "${DBLIST}"` do mysqldump ${MYSQLDUMP_OPTIONS} ${DB} | gzip > ${BACKUP_DEST}/${DB}.sql.gz & (( COMMIT_COUNT++ )) if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ] then COMMIT_COUNT=0 wait fi done if [ ${COMMIT_COUNT} -gt 0 ] then wait fi 

然后,您可以将tar命令添加到脚本

我可以说,你可以通过从cron运行脚本来完成它,它执行每个数据库的转储,然后脚本的最终操作将所有文件一起归档为一个.tar.gz

所以在你的实例中,你将删除--all-databases选项,并把--all-databases的名字。 然后为所有的数据库重复该行。 然后,在所有转储完成之后,创build一个包含所有这些文件的tar文件并将其压缩。 最后但并非最不重要的是,执行任何必要的清理。 把所有这些放到脚本中,然后从cron运行脚本。