AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 106595
Accepted
pygorex1
pygorex1
Asked: 2010-01-27 15:15:10 +0800 CST2010-01-27 15:15:10 +0800 CST 2010-01-27 15:15:10 +0800 CST

mysqldump 到 tar.gz

  • 772

通常在使用命令转储 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'ing到另一台服务器):

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

我在 debian 上运行 bash。

mysql debian bash gzip tar
  • 9 9 个回答
  • 170331 Views

9 个回答

  • Voted
  1. Best Answer
    James
    2010-01-27T15:24:59+08:002010-01-27T15:24:59+08:00
    mysqldump --opt <database> | gzip -c | ssh user@wherever 'cat > /tmp/yourfile.sql.gz'
    

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

    • 112
  2. Dax
    2012-03-01T02:28:18+08:002012-03-01T02:28:18+08:00

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

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

    (编辑:固定 -c 键)

    • 51
  3. Jon Haddad
    2010-02-04T09:27:00+08:002010-02-04T09:27:00+08:00

    使用命名管道。

    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
  4. Tony Dillon
    2011-06-19T07:52:22+08:002011-06-19T07:52:22+08:00

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

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

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

    希望它可以帮助某人。

    • 18
  5. New Alexandria
    2012-08-21T15:08:19+08:002012-08-21T15:08:19+08:00

    使用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
  6. Charlie Candergart
    2017-04-16T13:08:07+08:002017-04-16T13:08:07+08:00

    尝试这个:

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

    请不要说我不擅长这些事情,我只是将网络上的 2 个选项合二为一。

    以其他方式可能会更好,但这是对我有用的单线。

    但是ssh.keys,如果您想在脚本等中使用它,则需要安装并接受它crontab。

    • 4
  7. Min He
    2011-03-11T00:45:57+08:002011-03-11T00:45:57+08:00

    你可以这样做:

    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
  8. Fernando Fabreti
    2013-04-03T17:33:20+08:002013-04-03T17:33:20+08:00

    我一直在研究下面的这个bash 脚本,它试图将我在使用 mysql 转储/恢复时看到的所有好的建议放在一起。它针对远程操作。

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

    特点是:

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

    需要改进的地方:

    • 您需要传递表格列表(不能转储所有表格)
    • 源和目标的 MySQL 密码相同
    • 您需要手动授予权限(看起来 MySQL 不允许远程操作)
    • 你需要安装 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
  9. linstar
    2019-09-19T17:21:38+08:002019-09-19T17:21:38+08:00

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

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

    配置文件可能如下所示:

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

相关问题

  • 为什么 redhat 在企业界似乎如此受欢迎?[关闭]

  • 您如何跟踪和调试 mySQL 性能问题?

  • 我应该如何将 debian/xen 机器从 etch 升级到 lenny

  • 在 Linux Xen VPS 上优化 Apache 和 MySQL

  • 如何选择 MySQL 数据库引擎

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve