Как выполнить mysqldump без запроса пароля?


229

Я хотел бы знать команду для выполнения mysqldump базы данных без запроса пароля.

ПРИЧИНА: Я хотел бы запустить задание cron, которое каждый раз принимает mysqldump базы данных. Поэтому я не смогу ввести пароль при появлении запроса.

Как я мог решить это?

Ответы:


412

Поскольку вы используете Ubuntu, все, что вам нужно сделать, это просто добавить файл в ваш домашний каталог, и он отключит запрос пароля mysqldump. Это делается путем создания файла ~/.my.cnf(разрешения должны быть 600).

Добавьте это в файл .my.cnf

[mysqldump]
user=mysqluser
password=secret

Это позволяет вам подключаться как пользователь MySQL, которому требуется пароль без необходимости его ввода. Вам даже не нужен ключ -p или --password.

Очень удобно для написания сценариев команд mysql и mysqldump.

Шаги для достижения этой цели можно найти по этой ссылке .

В качестве альтернативы вы можете использовать следующую команду:

mysqldump -u [user name] -p[password] [database name] > [dump file]

но имейте в виду, что это по своей сути небезопасно, поскольку вся команда (включая пароль) может быть просмотрена любым другим пользователем в системе во время выполнения дампа с помощью простой ps axкоманды.


55
отклонил остальные ответы, передав в командной строке -p, так как любой пользователь может ps aux увидеть пароль пользователя root или пользователя. Использование предложенного файла является наиболее безопасным
Eddie

19
Если глобальная настройка не является опцией (если у вас есть не только один экземпляр mysql для подключения), вы можете установить файл конфигурации через --defaults-file. Например, `mysqldump --defaults-file = my_other.cnf --print-defaults`
Деннис

3
@kante: это безопасно. Он доступен только пользователям, которым принадлежит файл .my.cnf.
Янн Сагон

7
В Windows файл конфигурации отсутствует ~/.my.cnf. См. Stackoverflow.com/a/14653239/470749 . MySql ожидал, что мой будет на c:\wamp\bin\mysql\mysql5.5.24\my.cnf. Поэтому я создал файл там. Перезапуск Mysql не был необходим; это немедленно сработало для моего следующего mysqldump.
Райан

6
Чтобы добавить уровень безопасности, вы должны использовать выделенного, не зависящего от базы данных, пользователя только для чтения и ни в коем случае не пользователя root. Это можно сделать так:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou

86

Добавление к ответу @ Frankline:

Эта -pопция должна быть исключена из команды, чтобы использовать пароль в файле конфигурации.

Верный:
mysqldump –u my_username my_db > my_db.sql

Неправильно:
mysqldump –u my_username -p my_db > my_db.sql



.my.cnf может опустить имя пользователя.

[mysqldump]
password=my_password

Если ваш .my.cnfфайл не находится в расположении по умолчанию и mysqldumpне видит его, укажите его, используя --defaults-file.

mysqldump --defaults-file=/path-to-file/.my.cnf –u my_username my_db > my_db.sql


Черт, многие учебники по XAMPP включают -p без объяснения этого. Это не работает для обхода пустого пароля ...
Нельсон

47

В нескольких ответах упоминается установка пароля в файле конфигурации.

В качестве альтернативы, из вашего сценария вы можете export MYSQL_PWD=yourverysecretpassword.

Преимуществом этого метода по сравнению с использованием файла конфигурации является то, что вам не нужен отдельный файл конфигурации для синхронизации с вашим сценарием. У вас есть только сценарий для поддержки.

У этого метода нет недостатков .

Пароль не виден другим пользователям в системе (он будет виден, если он находится в командной строке). Переменные среды видны только пользователю, выполняющему команду mysql и root.

Пароль также будет виден любому, кто может прочитать сам скрипт, поэтому убедитесь, что сам скрипт защищен. Это ничем не отличается от защиты файла конфигурации. Вы все еще можете получить пароль из отдельного файла, если вы хотите, чтобы скрипт был общедоступным ( export MYSQL_PWD=$(cat /root/mysql_password)например). Все еще проще экспортировать переменную, чем создавать файл конфигурации.

Например,

$ export MYSQL_PWD=$(>&2 read -s -p "Input password (will not echo): "; echo "$REPLY")
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

Хотя этот ответ на самом деле не является «неправильным», он еще не безопасен, экспортированные переменные среды по-прежнему легко видны при запуске программы ...
MatheusOl

4
@MatheusOl: переменные среды видны только пользователю root и самому пользователю - тем же пользователям, которые в любом случае имели бы доступ к файлу конфигурации, содержащему пароль.
Chutz

1
@mniess Вы не правы. export MYSQL_PWD=...Никак не отображается в списке процессов. Даже на долю секунды. Это потому, что exportкоманда является (и должна быть) встроенной оболочкой. Таким образом, оболочка не запускает / выполняет процесс с аргументом команды, если вы выполняете его в своей оболочке.
maxschlepzig

1
@maxschlepzig вы правы. В этом случае это не имеет значения, потому что установка пароля в ENV в любом случае делает его видимым для других пользователей (как об этом
сказано в

2
@mniess Как я уже сказал, документация mysql очень плохая и вводит в заблуждение. «должен считаться крайне небезопасным и не должен использоваться» - это просто неправильный и плохой совет при использовании Linux и других систем. И это не поддерживает ваше утверждение, которое заключалось в следующем: «потому что размещение пароля в ENV делает его видимым для других пользователей». Примечание стороны: смешно , хотя , как Oracle не принизить передавая пароль в командной строке , которая на самом деле является крайне небезопасно.
maxschlepzig

42

Чтобы использовать файл, который находится где-нибудь внутри ОС, используйте, --defaults-extra-fileнапример:

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > [desiredoutput].sql

Примечание: .sqlpwdэто просто пример имени файла. Вы можете использовать все, что пожелаете.

Примечание: MySQL автоматически проверит, ~/.my.cnfкакой из них можно использовать вместо--defaults-extra-file

Если вы используете CRON, как я, попробуйте это!

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > "$(date '+%F').sql"

Требуемое разрешение и рекомендуемая собственность

sudo chmod 600 /path/.sqlpwd && sudo chown $USER:nogroup /path/.sqlpwd

.sqlpwd содержание:

[mysqldump]
user=username
password=password

Другие примеры для передачи .cnfили.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

Если вы хотите войти в базу данных автоматически, вам потребуется, [mysql]например, запись.

Теперь вы можете создать псевдоним, который автоматически соединяет вас с БД

alias whateveryouwant="mysql --defaults-extra-file=/path/.sqlpwd [database]"

Вы также можете только ввести пароль внутрь .sqlpwdи передать имя пользователя через скрипт / cli. Я не уверен, улучшит ли это безопасность или нет, это был бы совсем другой вопрос.

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

mysqldump -u [user_name] -p[password] [database] > [desiredoutput].sql

Примечание: между -p и паролем нет пробела.

Например -pPassWord, правильно, а -p Passwordнеправильно.


2
Это лучший ответ, особенно при рассмотрении нескольких баз данных и пользователей / паролей.
Hazok

Кстати, длинные опции (например, --defaults-file) должны быть помещены перед короткими (например, -u). Протестировано на mysqldump версии 5.7.17.
Сисадмин

@Sysadmin Аргумент опции начинается с одной или двух черточек, в зависимости от того, является ли это краткой или длинной формой имени опции. Многие варианты имеют как короткие, так и длинные формы. Например, -? и --help - краткая и длинная формы опции, которая инструктирует программу MySQL отображать свое справочное сообщение. dev.mysql.com/doc/refman/8.0/ru/command-line-options.html
FreeSoftwareServers

29

Да, это очень легко .... только в одной волшебной командной строке не более

mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql

и сделано :)


33
Предупреждение. Использование пароля в интерфейсе командной строки может быть небезопасным.
93196,93

6
@Yottatron Это может быть небезопасно, особенно в то время, когда в древних системах Unix в течение большей части дня входило 10-15 человек, а vi завязли. На современном VPS, хотя в IRC могут находиться 10-15 человек, но только администраторы имеют доступ к оболочке.
Христос Хейворд,

3
Спасибо за это, я просто использую его в Devbox Devbox. Так что безопасность не проблема.
MikeiLL

7

Для меня, используя MariaDB, я должен был сделать это: Добавить файл ~/.my.cnf и изменить разрешения, выполнив chmod 600 ~/.my.cnf. Затем добавьте свои учетные данные в файл. Волшебная часть, которую я пропустил, заключалась в том, что пароль должен находиться под клиентским блоком (ref: docs ), вот так:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

Если вы пришли сюда в поисках, как сделать mysqldump с MariaDB. Поместите пароль в блок [client], а затем пользователя в блок [mysqldump].


Я также использую MariaDB (10.4, если быть точным), и я просто ввел пароль в [mysqldump]разделе, и он работал без каких-либо проблем. Ubuntu 18.04 LTS
Пол Дэвис

3

Вот решение для Docker в сценарии / bin / sh:

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client]" > /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user=root" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "password=$MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec mysqldump --defaults-extra-file=/root/mysql-credentials.cnf --all-databases'

Замените [MYSQL_CONTAINER_NAME]и убедитесь, что переменная окружения MYSQL_ROOT_PASSWORDустановлена ​​в вашем контейнере.

Надеюсь, это поможет вам, как это может помочь мне!


0

У меня есть следующее.

/ И т.д. / mysqlpwd

[mysql]
user=root
password=password

Со следующим псевдонимом.

alias 'mysql -p'='mysql --defaults-extra-file=/etc/mysqlpwd'

Для восстановления я просто использую:

mysql -p [database] [file.sql]

-2

что насчет --password = "" у меня сработало на 5.1.51

mysqldump -h localhost -u <user> --password="<password>"

включение --password=xxxв командную строку сделает пароль видимым для любого, кто может читать proc (или делать полные пс) - что довольно по умолчанию.
Рафа

-11

Определенно, я думаю, что было бы лучше и безопаснее поместить полную строку cmd в корневой файл crontatails. По крайней мере, редактирование crontab ограничено (доступно для чтения) тем, кто уже знает пароль .. поэтому не стоит беспокоиться, чтобы показать его в виде обычного текста ...

Если нужно больше, чем простой mysqldump ... просто поместите скрипт bash, который принимает учетные данные в качестве параметров и выполняет все удобства внутри ...

Базовый файл в простом

#!/bin/bash
mysqldump -u$1 -p$2 yourdbname > /your/path/save.sql

В Crontab:

0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log

3
Нет, это не будет безопаснее, когда вы добавляете пароль в командную строку, он виден всем, у кого есть возможность читать proc (или делать полные пс) - что довольно по умолчанию. Когда вы добавляете файл .my.cnf и устанавливаете 600 прав, он виден только вам.
Ромбарч

-21

Вы можете указать пароль в командной строке следующим образом:

mysqldump -h <host> -u <user> -p<password> dumpfile

Опции для mysqldump чувствительны к регистру!


Нет, это не работает, я не думаю, что он понимает, что -p это пароль
Пракаш Раман

1
Не уверен, как это получило 1 голос, я это голосую. Как видно из других ответов, между -p и данным паролем не должно быть пробела. Также вы должны перенаправить вывод в dumpfile, а не указывать его, как вы это делаете, иначе это будет имя таблицы. @buzypi сказал это лучше всего.
Neek

он должен работать (хотя он небезопасен в том смысле, что другим пользователям довольно легко увидеть пароль), вам просто нужно убедиться, что между -p и паролем нет пробела, напримерmysqldump -u root -pmypassword
jx12345
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.