mysqldump与db在一个单独的文件中

res*_*ing 26 bash backup awk mysqldump

我正在编写一个单行命令,它将所有数据库备份到各自的名称中,而不是使用在一个sql中转储所有数据库.

例如:db1保存到db1.sql,db2保存到db2.sql

到目前为止,我收集了以下命令来检索所有数据库.

mysql -uuname -ppwd -e 'show databases' | grep -v 'Database'
Run Code Online (Sandbox Code Playgroud)

我打算用awk来管它做类似的事情

awk '{mysqldump -uuname -ppwd $1 > $1.sql}'
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

我是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
Run Code Online (Sandbox Code Playgroud)

回声部分虽然不起作用.

zia*_*aab 38

mysql -uroot -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done
Run Code Online (Sandbox Code Playgroud)

  • 将`-N`传递给`mysql`将省略列标题'Database'. (7认同)

Bob*_*kes 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
Run Code Online (Sandbox Code Playgroud)

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

  • 不需要具有SQL强大功能的grep.只需将第一部分更改为``mysql -s -r -N -u bupuser -pSecret -e'显示数据库,其中`Database`不在("information_schema"',"performance_schema","phpmyadmin")``的反引号需要列数据库,因为它是一个保留的单词.选项-N将跳过列名.where允许排除数据库.虽然我更愿意也备份系统数据库本身. (3认同)

Won*_*and 10

这里有一个简单的脚本:

  • 转储所有DB压缩输出 - > SCHEMA_NAME.sql.gz
  • 使用[autocommit/unique_checks/foreign_key_checks]加速导入
  • 排除默认架构

文件:Dump_all.sh

如何使用:
./ Roll_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 --"
Run Code Online (Sandbox Code Playgroud)


Jes*_*run 0

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