题 mysqldump到tar.gz


通常在转储MySQL数据库之后 mysqldump 命令我立即tar / gzip生成的文件。我正在寻找一种方法在一个命令中执行此操作:

所以从这个:

mysqldump dbname -u root -p > dbname.sql
tar czvf dbname.sql.tgz dbname.sql
rm dbname.sql

对于这样的事情:

mysqldump dbname -u root -p > some wizardry > dbname.sql.tgz

甚至更好(因为我通常将转储文件scp到另一台服务器):

mysqldump dbname -u root -p > send dbname.sql.tgz to user@host

我在debian上运行bash。


80
2018-01-26 23:15






答案:


mysqldump --opt <database> | gzip -c | ssh user@wherever 'cat > /tmp/yourfile.sql.gz'

你不能在这样的管道中使用tar,你也不需要它,因为你只输出一个文件。 tar仅在您有多个文件时才有用。


97
2018-01-26 23:24



你是不是需要tar,但你可以在管道中使用它,如果你这样做的话 mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz' - Darren Chamberlain
这实际上有用吗?我很确定tar需要一个文件名列表来处理。 - James
我更新了这个在本地工作(不是在远程ssh服务器上)哦,我使用基于日期的动态名称,感谢原创海报和回答者! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - electblake
@electblake:如果它是本地的,你不需要使用'cat'。只是 gzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - James
只是为了好玩,你可以使用 netcat 而不是管道到ssh。如果通过安全网络传输(或者您不关心安全性),您可以节省ssh的加密开销。现在你也可以考虑使用 xz 代替 gzip。 - James


如果您在本地运行它,只需使用以下命令备份数据库并使用gzip压缩它:

mysqldump -u userName -p (passwordPrompt) yourDatabaseName | gzip -c > output.gz 

(编辑:固定-c键)


37
2018-02-29 10:28



是的,这是最简单的解决方案。我也用它。 - Roman Snitko
简单易用!谢谢! - SPRBRN
它可能应该是 gzip -c, 对? - pilsetnieks
很好......但是如何在此命令中重定向stderr?如果我追加2> / dev / null它就不再起作用了。在管道不起作用之前2> / dev / null。 - Nelson Teixeira
mysqldump -u userName -p(passwordPrompt)yourDatabaseName 2> / var / log / dump-errors | gzip -v> output.gz - undefine


使用命名管道。

mkfifo mysql_pipe
gzip -9 -c < mysql_pipe > name_of_dump.gz &
mysqldump database > mysql_pipe 
rm mysql_pipe

我一直都在使用它,它真棒。

http://en.wikipedia.org/wiki/Named_pipe


18
2018-02-03 17:27



詹姆斯在一线做同样的事情。 - Jon Haddad
..但了解命名管道是值得的:-) - Tomasz Zieliński
mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipe 那里,一行。当然,我会保持管道并且每次都使用它。 - d34dh0r53


我写了一个快速脚本来吸取远程mysql数据库。它使用mysql压缩,gzip和ssh压缩。以令人难以置信的速度读取多GB数据库。

    ssh -C user@host "mysqldump --opt --compress database <table> | gzip -9 -c" > outputfile.sql.gz

另一个好处是它不需要源数据库服务器上的可用空间,因此您可以使用它来备份具有零可用磁盘空间的服务器上的数据库,然后再修剪数据。

希望它对某人有帮助。


15
2018-06-18 15:52



我创建了一个简单的shell脚本:#!/ bin / bash if [-z“$ 1”];然后回显“用法:$ {0} [主机] [用户] [数据库] [outputFile]”退出其他主机= $ 1 fi如果[-z“$ 2”];然后回显“用法:$ {0} $ {1} [用户] [数据库] [outputFile]”退出其他USER = $ 2 fi if [-z“$ 3”];然后回显“用法:$ {0} $ {1} $ {2} [数据库] [outputFile]”退出其他DB = $ 3 fi如果[-z“$ 4”];然后OUTFILE =“$ {DB} .sql.gz”否则OUTFILE = $ 4 fi COMMAND =“ssh -C $ {USER} @ $ {HOST} \”mysqldump --opt $ {DB} | gzip -9 -c \“> $ {OUTFILE}”ssh -C $ {USER} @ $ {HOST}“mysqldump --opt $ {DB} | gzip -9 -c”> $ {OUTFILE} - Tony Dillon
其中两个压缩是无用的:mysqldump的选项压缩服务器进程中的数据并立即再次解压缩(如果mysqldump在DB服务器本身上运行)。 ssh的-C选项激活gzip压缩,这将浪费更多的CPU周期,因为数据已经在此时被gzip压缩。 - MattW.


使用 pv 和监控率!

mysqldump prod_db -h dbslave | pv | gzip -c > prod_2012_08_20.dump.tgz

或者,如果您知道尺寸(3GB),请获得准确的估计:

mysqldump prod_db -h dbslave | pv -s 3g | gzip -c > prod_2012_08_20.dump.tgz

5
2017-08-20 23:08





试试这个:

mysqldump --all-databases --password=dbpassword | gzip -c | ssh user@servername "cat >/tmp/filename_of_your_choice.gz"

请注意,我并不擅长这些事情,我只是将网络上的两个选项合二为一。

在某些其他方面它可能会更好,但这是一个适合我的单线程。

但它确实需要 ssh.keys 要安装和接受,如果你想在脚本或脚本中使用它 crontab 或者一样的。


3
2018-04-15 21:08



欢迎使用ServerFault。这看起来非常合理。 - chicks


你可以这样做:

mysqldump --add-drop-table -h dbhost -u dbuser -p dbname (tablename tablename ... ) | gzip -c > wp.sql.gz

例如

mysqldump --add-drop-table -h localhost -u root -p wordpress | gzip -c > wp.sql.gz


2
2018-03-10 08:45





我一直在努力 bash脚本 下面试图汇总我在使用mysql转储/恢复时看到的所有好建议。它针对远程操作。

只需重新配置vars并尝试一下。 :)

特点是:

  • 你可以传递一个表的列表转储(选择性转储)
  • 系统会提示您输入密码(MySQL / SSH)或将其设置为变量
  • 网络传输是gzip压缩的
  • 您可以选择将gzipped转储保存到远程服务器
  • 您可以即时重新导入转储到远程服务器(本地/远程服务器上没有临时文件)
  • 你有关于正在发生的事情的视觉反馈(感谢echo和pv)
  • 您可以在转储过程之前和之后设置mysql变量

需要改进的地方: 

  • 你需要传递一个表列表(不能转储所有表)
  • 源密码和目标的MySQL密码相同
  • 你需要手动GRANT PRIVILEGES(看起来像MySQL不要让它做remotelly)
  • 你需要安装sshpass
  • 一些innodb巨大的压缩表转储速度很慢(可能是mysqldump的错)

我在这里分享这个脚本,希望它可以被社区改进。 (最好用nano或其他编辑器查看代码的颜色)

- - - - - - - - - - - - - - - - - 剪这里 - - - - - - - - -------------------

#!/bin/bash
#set -x

#REQUIRED VARS
SOURCE_USER=root   #MySQL user
SOURCE_HOST=localhost
SOURCE_PASSWORD=yourmysqlpass  #optional
SOURCE_DBNAME=yourdbname
TARGET_HOST=192.168.1.2
TARGET_DBNAME=yourdbname
TARGET_SSHUSER=root
TARGET_SSHPASSWORD=yoursshpass  #optional
TABLES='table1 table2 table3 table4'
TARGET_DIR="/data/dumpfiles"
EXEC_ACTION_TEXT[0]='Reimport TABLES directly into remote MySQL database'
EXEC_ACTION_TEXT[1]='Backup gzipped data to TARGED_DIR on remote TARGET_HOST'
EXEC_ACTION=0

#print config
echo "---------------------------------"
echo " SOURCE_USER:    $SOURCE_USER (MySQL)"
if [ "SOURCE_PASSWORD" != "" ]; then
echo " SOURCE_PASSWORD:<present>        "; else
echo " SOURCE_PASSWORD:<to be asked>    "
fi
echo " SOURCE_HOST:    $SOURCE_HOST     "
echo " SOURCE_DBNAME:  $SOURCE_DBNAME   "
echo " TARGET_HOST:    $TARGET_HOST     "
echo " TARGET_DBNAME:  $TARGET_DBNAME   "
echo " TARGET_SSHUSER: $TARGET_SSHUSER  "
if [ "TARGET_SSHPASSWORD" != "" ]; then
echo " TARGET_SSHPASS: <present>     "; else
echo " TARGET_SSHPASS: <to be asked>    "
fi
echo " TABLES:         $TABLES          "
echo " EXEC_ACTION:    $EXEC_ACTION - ${EXEC_ACTION_TEXT[$EXEC_ACTION]}"
echo " TARGET_DIR:     $TARGET_DIR (only for action 1)"
echo "---------------------------------"
echo "PRESS <ENTER> to continue...";  read;  echo

#read the mysql password from command-line (SOURCE and TARGET uses the same password)
if [ "$SOURCE_PASSWORD" == "" ]; then
     echo -n "Type $SOURCE_USER password for MySQL servers: "; read -s SOURCE_PASSWORD; echo
fi
echo "Creating database $TARGET_DBNAME on $TARGET_HOST if not exists ... "
mysql \
--user=$SOURCE_USER \
--password=$SOURCE_PASSWORD \
--host=$TARGET_HOST \
--execute "create database if not exists $TARGET_DBNAME;"

echo '--------------------------------------------------------------------------------------'
echo "**** ATTENTION ****: execute this command on mysql server at  $TARGET_HOST :"
echo "GRANT ALL PRIVILEGES ON $TARGET_DBNAME.* TO '$SOURCE_USER'@'%' IDENTIFIED BY 'yourpass';"
echo '--------------------------------------------------------------------------------------'
echo "PRESS <ENTER> to continue...";  read;  echo

#read the password from command-line
if [ "$TARGET_SSHPASSWORD" == "" ]; then
     echo -n "Type the password for remote SSH Server (TARGET) ['$TARGET_SSHUSER'@'$TARGET_HOST']: "; read -s TARGET_SSHPASSWORD; echo
fi

for thistable in $TABLES
do
     case "$EXEC_ACTION" in
         0)
         thisaction="gunzip | mysql --user=$SOURCE_USER --password=$SOURCE_PASSWORD -D $TARGET_DBNAME"
         endmessage='remote reimporting has finished'
         ;;
         1)
         thisaction="cat > $TARGET_DIR/`date +%Y.%m.%d`-"$thistable".gz"
         endmessage="$thisaction has finished"
         ;;
         *)   echo "EXEC_ACTION=$EXEC_ACTION not supported" && exit 1
     esac

     echo "---------------------------------------------------------------------"
     echo "-- table $thistable"
     echo "---------------------------------------------------------------------"
     (
       echo -n "-- setting variables... " > /dev/stderr  #talk to user via stderr
       echo "SET AUTOCOMMIT=0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;"
       echo -n "starting mysqldump... " > /dev/stderr
       mysqldump --opt --user=$SOURCE_USER --password=$SOURCE_PASSWORD --host=$SOURCE_HOST $SOURCE_DBNAME $thistable
       echo -n "done mysqldump, reseting variables... " > /dev/stderr
       echo "SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; SET AUTOCOMMIT=1;"
       echo -n "commiting... " > /dev/stderr
       echo "COMMIT;"
       echo "done!" > /dev/stderr
     ) | \
     gzip -c -2 | \
     pv | \
     sshpass -p $TARGET_SSHPASSWORD ssh $TARGET_SSHUSER'@'$TARGET_HOST $thisaction
     echo $endmessage ' with exit status '$?
done

1
2018-04-03 01:33