我正在编写一个单行命令,它将所有数据库备份到各自的名称中,而不是使用在一个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的新手,所以我的想法可能是错的 我该怎么做才能让它以各自的名义导出数据库?
更新:
好的,必须最终设法从下面的提示中得到它
这是最后的脚本
# 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
虽然回声部分不起作用。
答案 0 :(得分:38)
mysql -uroot -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done
答案 1 :(得分:16)
为每个数据库创建备份确实更有效。一旦需要,不仅更容易恢复,而且我也经历过,如果一个表被破坏/损坏,那么备份整个数据库就会中断。通过为每个数据库创建备份,它只会中断该数据库,其余的仍然有效。
我们为备份我们的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
最好用passsword'Secret'创建一个新的只读mysql用户'bupuser'(更改!)。它将首先检索数据库列表。然后循环并为每个数据库创建一个dump.sql文件到/ var / db-bup(您可以更改)。并且只有在没有遇到错误的情况下,才会gzip文件,这将真正大大节省存储空间。当某些数据库遇到错误时,您将看到.sql文件而不是.sql.qz文件。
答案 2 :(得分:10)
这是一个简单的脚本:
SCHEMA_NAME.sql.gz
文件:Dump_all.sh
使用方法:
./Dump_all.sh - >将转储所有数据库
./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 --"
答案 3 :(得分:1)
这对我有用
mysql -s -r -uroot -e 'show databases' -N | while read dbname; do
mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql;
done
答案 4 :(得分:0)
不是您的问题的答案,但请查看Sourceforge上的AutoMySQLBackup项目,而不是重新发明轮子。它可以满足您的需求,并提供大量额外功能,包括压缩,加密,轮换和电子邮件通知。我曾经使用它一段时间,它的效果非常好。
答案 5 :(得分:0)
看起来很好。我现在唯一能找到的(未经测试)是你在显示表之后缺少一个半分号。
答案 6 :(得分:0)
在寻找@Jeshurun建议的AutoMySQLBackup项目的可用包时,我遇到了Holland。
这个名字很吸引人(我住在比利时的荷兰南部,有时 - 或者更好的部分 - 被称为" Holland"),我决定检查一下。也许它也可以帮助你。
答案 7 :(得分:0)
这就是我正在使用的,它非常简单,对我来说很好。
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
如果您没有在命令中添加密码,则需要输入一个加上您拥有的数据库总数。