35

我正在编写一个单行命令,将所有数据库备份到它们各自的名称中,而不是使用一个 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

的回声部分不起作用。

4

8 回答 8

46
mysql -uroot -N -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done
于 2012-06-03T02:54:06.090 回答
17

为每个数据库创建备份确实效率更高。不仅在需要时更容易恢复,而且我还经历过,如果一个表损坏/损坏,对整个数据库进行备份会损坏。并且通过为每个数据库创建备份,它只会中断该数据库,其余的仍然有效。

我们为备份 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

最好使用密码“Secret”(更改!)创建一个新的只读 mysql 用户“bupuser”。它将首先检索数据库列表。然后循环并为每个数据库创建一个 dump.sql 文件到 /var/db-bup (您可以更改)。并且只有在没有遇到错误时才 gzip 文件,这将真正大大节省存储空间。当某些数据库遇到错误时,您将看到 .sql 文件而不是 .sql.qz 文件。

于 2012-06-19T07:06:43.773 回答
12

这是一个简单的脚本,它将:

  • 转储所有数据库并压缩输出->SCHEMA_NAME.sql.gz
  • 使用 [autocommit/unique_checks/foreign_key_checks] 加速导入
  • 排除默认模式

文件:dump_all.sh

如何使用:
./Dump_all.sh -> 将转储所有数据库
./Dump_all.sh SCHEMA_NAME -> 将转储 SCHEMA_NAME 数据库

#!/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 --"
于 2014-10-10T05:13:11.590 回答
1

这对我有用

mysql -s -r -uroot -e 'show databases' -N | while read dbname; do 
    mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql; 
done
于 2016-10-31T09:31:01.060 回答
0

不是您的问题的答案,而是看一下 Sourceforge 上的AutoMySQLBackup项目,而不是重新发明轮子。它可以满足您的需求,并提供大量附加功能,包括压缩、加密、轮换和电子邮件通知。我前一阵子用过,效果很好。

于 2012-06-03T02:52:48.933 回答
0

在寻找 @Jeshurun 建议的 AutoMySQLBackup 项目的可用软件包时,我来到了荷兰

对这个名字很感兴趣(我住在荷兰南部的比利时,有时——或者更好的一些地方——被称为“荷兰”),我决定去看看。也许它也可以帮助你。

于 2012-06-03T09:03:37.573 回答
0

看起来不错。目前我唯一能找到的(未经测试)是你在Show Tables之后缺少一个分号。

于 2012-06-03T02:53:05.177 回答
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

如果您没有在命令中添加密码,则需要输入密码加上您拥有的数据库总数。

于 2016-08-29T18:51:54.107 回答