我正在写一条单行命令,将所有数据库备份到各自的名称中,而不是用一个sql来转储。
例如:db1保存到db1.sql,db2保存到db2.sql。
到目前为止,我收集了以下命令来检索所有的数据库。
mysql -uuname -ppwd -e 'show databases' | grep -v 'Database'
我打算用awk来管它做一些类似于
awk '{mysqldump -uuname -ppwd $1 > $1.sql}'
但这是行不通的。
我是bash新手,所以我的思路可能是错的。我应该怎么做才能让它以各自的名字导出db?
更新一下。好了,终于根据下面的提示让它工作了。这是最终的脚本
# replace [] with your own config
# replace own dir to save
# echo doesn't work. hmm...
mysql -u[uname] -p'[pwd]' -e "show databases" \
| grep -Ev 'Database|information_schema' \
| while read dbname; \
do \
echo 'Dumping $dbname' \
mysqldump -u[uanme] -p'[pwd]' $dbname > ~/db_backup/$dbname.sql;\
done
不过呼应的部分没有工作。
mysql -uroot -N -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done
每一个数据库建立备份确实效率高了很多。不仅一旦需要时更容易恢复,而且我的经验是,对整个数据库做备份,万一有一张表坏了corrupt,就会坏掉。而通过每个数据库创建备份,只会对该数据库进行破损,其他数据库仍然有效。
我们创建的备份mysql数据库的oneliner是。
mysql -s -r -u bupuser -pSecret -e 'show databases' | while read db; do mysqldump -u bupuser -pSecret $db -r /var/db-bup/${db}.sql; [[ $? -eq 0 ]] && gzip /var/db-bup/${db}.sql; done
最好创建一个新的只读 mysql用户 "bupuser",密码为 "Secret"(改!)。它将首先检索数据库的列表。然后循环,为每个数据库创建一个dump.sql文件到vardb-bup(可以改)。而且只有在没有遇到错误的时候,那么也会对文件进行压缩,这样真的会大大的节省存储空间。当一些数据库遇到错误时,那么你会看到.sql文件,而不是.sql.qz文件。
这里有一个简单的脚本,将。
SCHEMA_NAME.sql.gz
文件: Dump_all.sh
如何使用。 .Dump_all.sh -> 将转储所有DB .Dump_all.sh SCHEMA_NAME -> 将转储SCHEMA_NAME DB
#!/bin/bash
MYSQL_USER="root"
MYSQL_PASS="YOUR_PASS"
echo "-- START --"
echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > tmp_sqlhead.sql
echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;" > tmp_sqlend.sql
if [ -z "$1" ]
then
echo "-- Dumping all DB ..."
for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names);
do
if [ "$I" = information_schema ] || [ "$I" = mysql ] || [ "$I" = phpmyadmin ] || [ "$I" = performance_schema ] # exclude this DB
then
echo "-- Skip $I ..."
continue
fi
echo "-- Dumping $I ..."
# Pipe compress and concat the head/end with the stoutput of mysqlump ( '-' cat argument)
mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz"
done
else
I=$1;
echo "-- Dumping $I ..."
# Pipe compress and concat the head/end with the stoutput of mysqlump ( '-' cat argument)
mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz"
fi
# remove tmp files
rm tmp_sqlhead.sql
rm tmp_sqlend.sql
echo "-- FINISH --"
以下是对我有效的方法
mysql -s -r -uroot -e 'show databases' -N | while read dbname; do
mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql;
done
不是你的问题的答案,但可以看一下。自动MySQL备份 项目,而不是重新发明轮子。它能满足你的需求,并在上面提供了大量的附加功能,包括压缩、加密、旋转和电子邮件通知。我前段时间用过它,效果非常好。
它看起来很好。 目前我唯一能找到的问题(没有测试)是,你在后面的 显示表格.
在寻找可用的包的AutoMySQLBackup项目由@Jeshurun建议,我遇到了。荷兰.
被这个名字所吸引(我住在比利时到荷兰南部,有时--或者更好的一些部分--被称为 "荷兰"),我决定去看看。 也许它可以帮助你,以及。
这是我使用的,它是非常简单的,对我来说,工作得很好。
mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname"> "$(date +%Y%m%d)-$dbname".sql; done
有压缩选项。
mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname" | gzip> /tmp/"$(date +%Y%m%d)-$dbname".sql.gz; done
如果你没有在命令中加入密码 你需要输入密码加上你所拥有的数据库的总数: