mysqldump до tar.gz


88

Зазвичай після демпінгу бази даних 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

Або ще краще (оскільки я зазвичай скапую дамп-файл на інший сервер):

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

Я запускаю bash на debian.

Відповіді:


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

Ви не можете використовувати смолу в такій трубі, і вона вам не потрібна, оскільки виводить лише один файл. tar корисний лише в тому випадку, якщо у вас є кілька файлів.


6
Ви маєте рацію про те, що вам не потрібен дьоготь, але ви можете використовувати його в трубопроводі, якщо це зробите, зmysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz'
Даррен Чемберлен

Це насправді працює? Я впевнений, що Тар потребує переліку імен файлів, щоб працювати над цим.
Джеймс

2
Я оновив це для роботи на локальному рівні (не на віддаленому сервері ssh) ой, і я використовую динамічне ім’я на основі дати, завдяки оригінальному плакату та відповідальнику! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
electblake

4
@electblake: вам не потрібно використовувати "cat", якщо він локальний. Простоgzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
Джеймс

Просто для розваги, ви можете використовувати netcatзамість трубопроводу до ssh. Ви хочете трохи заощадити на шифруванні ssh, якщо він передається через захищену мережу (або ви не піклуєтесь про безпеку). Сьогодні ви можете також розглянути можливість використання xzзамість gzip.
Джеймс

45

Якщо ви запускаєте цю локальну програму, просто скористайтеся такою командою, щоб створити резервну копію вашої бази даних та скопіювати її за допомогою gzip:

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

(Редагувати: фіксована клавіша -c)


2
Так, це найпростіше рішення. Я також його використовую.
Роман Снітко

2
Мабуть, так і має бути gzip -c, правда?
pilsetnieks

приємно ... але як я перенаправляю stderr в цій команді? Якщо я додаю 2> / dev / null, він більше не працює. І 2> / dev / null перед трубою також не працює.
Нельсон Тейшейра

mysqldump -u userName -p (passwordPrompt) yourDatabaseName 2> / var / log / dump-помилки | gzip -v> output.gz
undefine

я використовую як mysqldump -u root -p ім'я бази даних --програми | gzip -v> myfile.sql.gz ... я отримую частину .gz файл, який я не в змозі завантажити
Sushivam

18

Використовуйте названу трубу.

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


6
Джеймс робить те ж саме в 1 рядку.
Джон Хаддад

15
..а ось дізнатися про названі труби варто того :-)
Томаш Зелінський

mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipeтам, одна лінія. Звичайно, я б тримав трубу і використовував її кожен раз.
d34dh0r53

15

Я написав швидкий сценарій, щоб витягнути віддалену базу даних mysql. Він використовує стиснення mysql, стиснення gzip та ssh. Висмоктав базу даних з декількома ГБ неймовірно.

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

Побічна перевага полягає в тому, що він не вимагає вільного місця на сервері вихідної бази даних, тому ви можете використовувати його для резервного копіювання бази даних на сервері з нульовим вільним дисковим простором, перш ніж проводити обрізку даних.

Сподіваюся, це комусь допоможе.


Я створив простий скрипт оболонки: #! / Bin / bash if [-z "$ 1"]; потім відлуння "Використання: $ {0} [хост] [користувач] [база даних] [вихідFile]" вийти ще HOST = $ 1 fi, якщо [-z "$ 2"]; потім відлуння "Використання: $ {0} $ {1} [користувач] [база даних] [вихідFile]" вийти ще USER = $ 2 fi, якщо [-z "$ 3"]; потім відлунюйте "Використання: $ {0} $ {1} $ {2} [база даних] [вихідFile]" вийдіть ще DB = $ 3 fi, якщо [-z "$ 4"]; то OUTFILE = "$ {DB} .sql.gz" else OUTFILE = $ 4 fi COMMAND = "ssh -C $ {USER} @ $ {HOST} \" mysqldump --opt $ {DB} | GZIP -9 -c \ "> $ {OUTFILE}" SSH -C $ {USER} @ $ {HOST} "туздИшпр --opt $ {DB} | GZIP -9 -c"> $ {OUTFILE}
Тоні Dillon

Дві з цих компресій є марними: опція mysqldump стискає дані в серверному процесі і негайно декомпресується знову (якщо mysqldump запускається на самому сервері БД). Опція -C для ssh активує стиснення gzip, що втратить подальші цикли процесора, оскільки в цій точці дані вже gzip.
Метт.

5

Використовуйте pvта стежте за швидкістю!

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

Або якщо ви знаєте розмір (3 Гб), отримайте точну оцінку:

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

4

Спробуйте це:

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

Будь ласка, не кажучи, що я ні в чому не добрий у цих речах, я просто поєднав два варіанти в Інтернеті в один.

Це може бути краще в інший спосіб, але це один-лайнер, який працює для мене.

Однак він вимагає ssh.keysвстановлення та прийняття, якщо ви хочете використовувати його в сценаріях crontabчи подібних.


1
Ласкаво просимо до ServerFault. Мені це здається абсолютно розумним.
пташенята

2

Ви можете робити так:

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


1

Я працюю над цим сценарієм bash нижче, який намагається зібрати всі хороші поради, які я бачив, коли справа доходить до скидання / відновлення за допомогою mysql. Він орієнтований на віддалені операції.

Просто переконфігуруйте vars і спробуйте. :)

Особливості:

  • Ви можете передати список таблиць для демпінгу (вибірковий дамп)
  • вас можуть запропонувати ввести паролі (MySQL / SSH) або встановити їх у змінних
  • передача мережі gzipped
  • ви можете вибрати збереження gzipped дампа на віддалений сервер
  • ви можете повторно імпортувати дамп на віддалений сервер на ходу (немає тимчасових файлів на локальному / віддаленому сервері)
  • у вас є візуальний відгук про те, що відбувається (завдяки відлунню та відео)
  • Ви можете встановити змінні mysql до та після процесу скидання

Що потребує вдосконалення:

  • вам потрібно передати список таблиць (не можете скинути всі таблиці)
  • Пароль MySQL однаковий для джерела та цілі
  • вам потрібно ВИДАЛИТИ ПРИВИЛЕГИ вручну (схоже, MySQL не дозволяє це робити віддалено)
  • вам потрібно встановити sshpass
  • деякі величезні стислі таблиці innodb повільно скидаються (можливо, помилка mysqldump)

Я ділюсь цим сценарієм, сподіваючись, що його може вдосконалити громада. (найкраще переглядати нано чи інший редактор, який забарвлює код)

--------------------------------- відрізати тут --------------- -------------------

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

0

Ви також можете зберігати свій пароль у конфігураційному файлі та використовувати цей параметр - default-extra-file:

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

Конфігураційний файл може виглядати так:

[mysqldump]
host = localhost
user = username
password = "password"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.