Назад | Перейти на главную страницу

mysqldump в удаленную базу данных mysql с помощью gzip

Я пытаюсь передать данные с одного сервера MySQL на другой с помощью сжатия gzip. На данный момент у меня есть:

mysqldump -u [user] -p[pwd] --no-create-db --no-create-info [db] [table] | gzip -c | mysql -h [host] -u [user] -p[pwd]

Конечно, это не работает, потому что сжатые данные импортируются в удаленную БД. Как мне распаковать данные на удаленном сервере перед импортом - или это не сработает, и мне нужно использовать SSH?

Спасибо

Используя параметр --compress, Клиент MySQL может отправлять сжатые данные на удаленный сервер. Итак, командную строку передачи можно изменить на:

mysqldump -u [user] -p[pwd] --no-create-db --no-create-info [db] [table] | \
 mysql --compress -h [host] -u [user] -p[pwd]

Обратите внимание, что данные будут отправляться по сети в незашифрованном виде. Если вас это беспокоит, лучше выбрать конвейерную передачу дампа через SSH.

Да, вам нужно будет использовать какое-то удаленное выполнение, чтобы удаленная сторона выполнила декомпрессию:

mysqldump -u [user] -p[pwd] --no-create-db --no-create-info [db] [table] | gzip -c | ssh [host] "gunzip | mysql -h localhost -u [user] -p[pwd]"

Однако имейте в виду, что по умолчанию ssh выполняет сжатие прозрачно - шаги g (un) zip не нужны.

mysqldump -u [user] -p[pwd] --no-create-db --no-create-info [db] [table] | ssh [host] mysql -h localhost -u [user] -p[pwd] должно быть достаточно

Вы можете - через несколько каналов SSH.

Например:

ssh user@host1 "mysqldump -u [user] -p[pwd] --no-create-db --no-create-info [db] [table] | gzip -c" | ssh user@host2 "gzip -c -d | mysql -h [host] -u [user] -p[pwd]"

Немного разбив это, у вас есть две команды SSH, переданные друг другу:

  • Первый запускает mysqldump, затем передаёт результат в gzip, который, в свою очередь, отправляет результат в STDOUT.
  • Вторая команда берет STDIN и распаковывает его, а затем направляет его в mysql команда.

Когда вы объединяете две команды, вы можете передавать данные между двумя хостами напрямую, используя SSH.

Пример из практики ниже:

cwatson@zeus:~$ ssh tyr

cwatson@tyr:~$ echo stuff123tyr > testfile.txt
cwatson@tyr:~$ cat testfile.txt
stuff123tyr
cwatson@tyr:~$ logout

ssh tyr "cat ~/testfile.txt | gzip -c" | ssh thor "gzip -c -d > ~/testfile.txt"

cwatson@zeus:~$ ssh thor
Last login: Fri Feb 26 17:28:01 2016 from host217-44-218-9.range217-44.btcentralplus.com
cwatson@thor:~$ cat testfile.txt
stuff123tyr

Предварительный запрос

  • создать базу данных отправителей, если она не существует
  • создать базу данных получателя, если она не существует
  • файл будет сохранен в домашнем каталоге, если путь не изменился
  • убедитесь, что вы используете правильные учетные данные
  • Чтобы получить пользователя-приемник, введите это в командной строке (ctrl + alt + t) ---> whoami
  • Чтобы получить IP-адрес приемника, введите это в командной строке (ctrl + alt + t) ---> ifconfig |grep "inet addr"|head -1

mysqldump -u{sender dbuser} -p{sender dbpassword} {sender database name} | gzip -cf | ssh {receiver user}@{receiver ip address} ' cat >/home/myfilename.gz | gzip -dc < myfilenamegz |mysql -u{receiver username} -p{receiver dbuser} {receiver dbname} '

  • удалять { } из команды и вставьте свои значения