通常在使用mysqldump命令转储MySQL数据库后,我会立即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


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

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


/>我正在debian上运行bash。

#1 楼

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


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

评论


您不需要tar是正确的,但是如果需要的话,可以在管道中使用mysqldump |。焦油cf-| gzip -c | ssh ...'cat> file.tgz'

–达伦·张伯伦(Darren Chamberlain)
2010-1-27的0:15



这真的有效吗?我很确定tar需要使用文件名列表。

–詹姆斯
2010年1月27日10:25

我将其更新为可在本地工作(不在远程ssh服务器上),噢,由于原始的发帖人和答录者,我根据日期使用了动态名称! mysqldump --opt <数据库> | gzip -c | cat> $(日期+%Y-%m-%d-%H.%M.%S).sql.gz

– Electricblake
2011年4月11日13:41

@electblake:如果是本地猫,则无需使用“猫”。只是gzip -c> $(date +%Y-%m-%d-%H.%M.%S).sql.gz

–詹姆斯
2012年1月3日18:58



只是为了好玩,您可以使用netcat代替管道来连接ssh。如果ssh的加密开销是通过安全网络传输的(或者您不关心安全性),则可以节省ssh的加密开销。如今,您可能还考虑使用xz代替gzip。

–詹姆斯
2012年11月5日在2:10



#2 楼

如果您在本地运行此文件,则只需使用以下命令备份数据库并使用gzip对其进行压缩:

评论


是的,这是最简单的解决方案。我也用

–罗马Snitko
2012年8月9日13:53

应该是gzip -c,对吧?

–pilsetnieks
2014年5月13日在9:24

很好...但是如何在此命令中重定向stderr?如果我追加2> / dev / null,它将不再起作用。并且2> / dev / null之前管道也不起作用。

–尼尔森·特谢拉(Nelson Teixeira)
2015年4月10日在2:11



mysqldump -u用户名-p(passwordPrompt)yourDatabaseName 2> / var / log / dump-errors | gzip -v> output.gz

–不确定
16 Mar 20 '16在13:03

我使用类似mysqldump -u root -p databasename --routines | gzip -v> myfile.sql.gz ...我得到了一部分.gz文件,我无法下载

– Sushivam
16年11月29日在8:59

#3 楼

使用命名管道。

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

评论


詹姆斯在1行中做同样的事情。

–乔恩·哈达德(Jon Haddad)
2010-2-3在17:28

..但是了解命名管道是值得的:-)

– TomaszZieliński
2011-2-15在15:34

mkfifo mysql_pipe; gzip -9 -c name_of_dump.gz&; mysqldump数据库> mysql_pipe; rm mysql_pipe那里,一行。当然,我会一直使用管道,并且每次都使用它。

– d34dh0r53
2012年7月21日在7:20



#4 楼

我编写了一个快速脚本来删除远程mysql数据库。它使用mysql压缩,gzip和ssh压缩。

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


另一个好处是,它不需要源数据库服务器上的可用空间,因此您可以使用它来在进行数据修剪之前,先将可用磁盘空间为零的服务器上的数据库备份。

希望对别人有帮助。

评论


我创建了一个简单的shell脚本:#!/ bin / bash if [-z“ $ 1”];然后回显“用法:$ {0} [主机] [用户] [数据库] [outputFile]”,如果[-z“ $ 2”],则退出HOST = $ 1 fi;然后回显“用法:$ {0} $ {1} [user] [database] [outputFile]”,如果[-z“ $ 3”],则退出else USER = $ 2 fi;然后回显“用法:$ {0} $ {1} $ {2} [数据库] [outputFile]”,如果[-z“ $ 4”],则退出,否则DB = $ 3 fi;然后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)
2011-09-12 18:52



其中两种压缩方式没有用:mysqldump的选项压缩服务器进程中的数据,然后立即将其解压缩(如果mysqldump在数据库服务器本身上运行)。 ssh的-C选项激活gzip压缩,这将浪费更多的CPU周期,因为此时数据已被压缩。

–马蒂亚斯·温克尔曼(Matthias Winkelmann)
17年1月10日,19:11



#5 楼

使用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


#6 楼

试试这个:

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


请不要因为我对这些事情都不擅长,我只是将Web上的2个选项组合为一个。

以其他方式可能会更好,但这是一种单行代码,对我有用。或ssh.keys或类似名称。

评论


欢迎使用ServerFault。在我看来,这完全合理。

–小鸡
17-4-16在1:04



#7 楼

您可以这样做:

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

#8 楼

我一直在下面的bash脚本上进行尝试,该脚本试图将我在使用mysql转储/还原时看到的所有好的建议汇总在一起。它针对远程操作。

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

功能包括:


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

需要什么改进:


您需要传递表列表(不能转储所有表)
源和目标的MySQL密码相同
您需要授予特权手动(看起来像MySQL不允许远程操作)
您需要安装sshpass
一些innodb巨大的压缩表转储很慢(可能是mysqldump的错误)

我分享希望此脚本可以为社区所完善。
(最好使用nano或其他edi观看)为代码加色的代码)

---------------------------------在此处剪切- ---------------------------------

#!/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


#9 楼

您还可以将密码存储在配置文件中,并使用此选项--defaults-extra-file:

mysqldump --defaults-extra-file=mysqldump.cnf DataBaseName | gzip -c > DBOutputName.sql.gz


配置文件如下所示:

[mysqldump]
host = localhost
user = username
password = "password"