我现在在 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 个其他档案,用于我有多少个数据库。这可能吗?
答案1
类似这样的方法可能会有用。它尚未经过测试,但与我系统上用于备份的方法略有不同。
# 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/
答案2
创建类似这样的脚本来并行 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 命令添加到脚本中
答案3
我想说,你可以通过制作一个从 cron 运行的脚本来实现它,该脚本执行每个数据库的转储,然后脚本的最终操作将所有文件一起存档为一个 .tar.gz
因此,在您的实例中,您将删除该--all-databases
选项并将数据库的名称放在那里。然后对您拥有的所有数据库重复该行。然后在完成所有转储后,创建一个包含所有这些文件的 tar 文件并将其压缩。最后但并非最不重要的是,执行任何必要的清理。将所有这些放入脚本中,然后从 cron 运行该脚本。