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

问题描述 投票:28回答:8

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

不过呼应的部分没有工作。

bash awk backup mysqldump
8个回答
41
投票
mysql -uroot -N -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done

16
投票

每一个数据库建立备份确实效率高了很多。不仅一旦需要时更容易恢复,而且我的经验是,对整个数据库做备份,万一有一张表坏了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文件。


11
投票

这里有一个简单的脚本,将。

  • dump所有的DB压缩输出 -> SCHEMA_NAME.sql.gz
  • 使用[autocommitunique_checksforeign_key_checks]来加快导入速度。
  • 排除默认模式

文件: 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 --"

1
投票

以下是对我有效的方法

mysql -s -r -uroot -e 'show databases' -N | while read dbname; do 
    mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql; 
done

0
投票

不是你的问题的答案,但可以看一下。自动MySQL备份 项目,而不是重新发明轮子。它能满足你的需求,并在上面提供了大量的附加功能,包括压缩、加密、旋转和电子邮件通知。我前段时间用过它,效果非常好。


0
投票

它看起来很好。 目前我唯一能找到的问题(没有测试)是,你在后面的 显示表格.


0
投票

在寻找可用的包的AutoMySQLBackup项目由@Jeshurun建议,我遇到了。荷兰.

被这个名字所吸引(我住在比利时到荷兰南部,有时--或者更好的一些部分--被称为 "荷兰"),我决定去看看。 也许它可以帮助你,以及。


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

如果你没有在命令中加入密码 你需要输入密码加上你所拥有的数据库的总数:

© www.soinside.com 2019 - 2024. All rights reserved.