암호 프롬프트없이 mysqldump를 수행하는 방법은 무엇입니까?


229

암호를 묻지 않고 데이터베이스의 mysqldump를 수행하는 명령을 알고 싶습니다.

이유 : 나는 매일 crond 데이터베이스를 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
모든 사용자가 ps aux를 사용하여 루트 또는 사용자의 비밀번호를 볼 수 있으므로 명령 줄에서 -p를 전달하는 다른 답변을 downvoted했습니다. 위의 파일 제안을 사용하는 것이 가장 안전합니다
Eddie

19
전역 설정이 옵션이 아닌 경우 (연결할 mysql 인스턴스가 하나 뿐인 경우)를 통해 구성 파일을 설정할 수 있습니다 --defaults-file. `mysqldump --defaults-file = my_other.cnf --print-defaults`와 같이
dennis

3
@ 칸테 : 안전합니다. .my.cnf 파일이 속한 사용자 만 사용할 수 있습니다.
Yann Sagon

7
Windows에서 구성 파일이에 없습니다 ~/.my.cnf. stackoverflow.com/a/14653239/470749를 참조하십시오 . MySql은에있을 것으로 예상했습니다 c:\wamp\bin\mysql\mysql5.5.24\my.cnf. 그래서 거기에 파일을 만들었습니다. MySQL을 다시 시작할 필요는 없습니다. 다음 mysqldump에서 즉시 작동했습니다.
Ryan

6
보안 수준을 추가하려면 데이터베이스에 의존하지 않는 전용 읽기 전용 사용자를 사용하고 루트 사용자는 사용하지 않아야합니다. 그것은 다음과 같이 수행 할 수 있습니다 :GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou

86

@ Frankline의 답변에 추가 :

-p옵션은 제외해야한다 config 파일에 암호를 사용하기 위해 명령에서.

옳은:
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


Damnit, 많은 XAMPP 튜토리얼은 설명하지 않고 -p를 포함합니다. 빈 암호를 우회하는 데는 작동하지 않습니다 ...
Nelson

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 : 환경 변수는 루트와 사용자 만 볼 수 있습니다. 어쨌든 암호를 보유한 구성 파일에 액세스 할 수있는 동일한 사용자입니다.
chutz

1
@mniess 당신이 틀 렸습니다. 는 export MYSQL_PWD=...않습니다 하지 프로세스 목록에 표시됩니다. 한 순간도 아닙니다. 이는 export명령이 쉘 내장 (및 내장)이어야하기 때문입니다. 따라서 쉘에서 명령을 실행하면 쉘은 명령의 인수로 프로세스를 포크 / 실행하지 않습니다.
maxschlepzig

1
@maxschlepzig 당신이 맞습니다. 이 경우 ENV에 비밀번호를 입력하면 다른 사용자가 비밀번호를 볼 수 있기 때문에 중요하지 않습니다 (mysql 문서에서 경고)
mniess

2
@mniess 내가 말했듯이 mysql 문서는 매우 가난하고 오해의 소지가 있습니다. 리눅스와 다른 시스템을 사용할 때 '매우 안전하지 않아야하며 사용해서는 안된다'는 것은 단순히 잘못되고 나쁜 조언이다. 그리고 이것은 'ENV에 암호를 넣으면 다른 사용자가 볼 수 있기 때문에'이라는 귀하의 주장을지지하지 않습니다. 참고 사항 : 오라클이 명령 줄에서 암호를 전달하는 것을 더 이상 사용하지 않는 것이 재미 있지만 실제로 매우 안전하지 않습니다.
maxschlepzig

42

OS 내부에있는 파일을 사용하려면 다음을 사용하십시오 --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]예를 들어 항목 이 필요합니다 .

이제 자동으로 DB에 연결되는 별칭을 만들 수 있습니다

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

또한 비밀번호를 내부에 넣고 .sqlpwd스크립트 / cli를 통해 사용자 이름을 전달할 수도 있습니다 . 이것이 보안을 향상 시킬지 여부는 확실하지 않습니다. 전체적으로 다른 질문 일 것입니다.

완전성을 위해 다음을 수행 할 수 있다고 말하지만 매우 안전하지 않으며 프로덕션 환경에서 사용해서는 안됩니다.

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

참고 : -p와 비밀번호 사이에는 SPACE가 없습니다.

예를 들어 -pPassWord정확하지는 -p Password않습니다.


2
특히 여러 데이터베이스와 사용자 / 암호를 고려할 때 가장 좋은 대답입니다.
Hazok

BTW, 긴 옵션 (예 : --defaults-file)은 짧은 옵션 (-u와 같은) 앞에 배치해야합니다. mysqldump 버전 5.7.17에서 테스트되었습니다.
Sysadmin 2016 년

@Sysadmin 옵션 인수는 옵션 이름의 짧은 형식인지 긴 형식인지에 따라 하나의 대시 또는 두 개의 대시로 시작합니다. 많은 옵션에는 짧은 형식과 긴 형식이 있습니다. 예를 들어-? --help는 짧고 긴 형태의 옵션으로 MySQL 프로그램에 도움말 메시지를 표시하도록 지시합니다. dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers

29

예, 매우 쉽습니다 .... 하나의 마법 명령 줄에 더 이상

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

그리고 완료 :)


33
경고 : 명령 행 인터페이스에서 비밀번호를 사용하면 안전하지 않을 수 있습니다.
93196.93

6
@Yottatron 특히 고대 유닉스 시스템이 10-15 명 정도의 사람들이 하루 동안 대부분 로그인하여 vi가 쇠약해진 날에 안전하지 않을 수 있습니다. 최신 VPS에서는 10-15 명의 사용자가 셸을 사용하여 IRC를 사용할 수 있지만 관리자 만 셸 액세스를하는 것이 일반적입니다.
Christos Hayward

3
고마워, Docker devbox에서 사용하고 있습니다. 따라서 보안은 문제가되지 않습니다.
MikeiLL

7

나를 위해 MariaDB를 사용하여 이렇게해야했습니다. 파일을 추가하고을 수행하여 ~/.my.cnf권한을 변경 하십시오 chmod 600 ~/.my.cnf. 그런 다음 자격 증명을 파일에 추가하십시오. 내가 놓친 마술은 암호가 클라이언트 블록 (ref : docs ) 아래에 있어야한다는 것입니다 .

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

여기에 와서 MariaDB로 mysqldump를 수행하는 방법을 찾으십시오. 비밀번호를 [client] 블록 아래에두고 사용자를 [mysqldump] 블록 아래에 두십시오.


MariaDB도 사용하고 있는데 (구체적으로 10.4) [mysqldump]섹션 아래에 비밀번호를 입력 하면 문제없이 작동합니다. 우분투 18.04 LTS
Paul Davis

3

다음은 스크립트 / bin / sh의 Docker 솔루션입니다.

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

나는 다음을 가지고있다.

/ etc / mysqlpwd

[mysql]
user=root
password=password

다음 별명으로.

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

복원을 수행하려면 다음을 사용하십시오.

mysql -p [database] [file.sql]

-2

5.1.51에서 나를 위해 일한 --password = ""는 어떻습니까?

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

--password=xxx명령 행에 포함 시키면 proc를 읽을 수있는 (또는 전체 ps를 수행 할 수있는) 모든 사람
라파

-11

확실히 나는 전체 cmd 라인을 루트 crontab에 credentails로 배치하는 것이 더 좋고 안전하다고 생각합니다. 적어도 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을 읽을 수있는 모든 사람이 볼 수 있습니다 (또는 전체 ps를 수행하십시오). .my.cnf 파일을 추가하고 600 권한을 설정하면 본인에게만 표시됩니다.
rombarcz

-21

다음과 같이 명령 행에서 비밀번호를 지정할 수 있습니다.

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

mysqldump의 옵션은 대소 문자를 구분합니다!


아니, 그것은 작동하지 않습니다, 나는 그것이 -p가 암호임을 이해하지 않는다고 생각합니다
Prakash Raman

1
이것이 어떻게 1 표를 얻었는지 잘 모르겠습니다. 다른 답변에서 볼 수 있듯이 -p와 주어진 암호 사이에는 공백이 없어야합니다. 또한 출력을 덤프 파일로 경로 재지 정하고 수행중인대로 지정하지 마십시오. 그렇지 않으면 테이블 이름으로 간주됩니다. @buzypi가 가장 잘 말했습니다.
Neek

작동해야합니다 (다른 사용자가 암호를 쉽게 볼 수 있다는 점에서 안전하지는 않지만) -p와 암호 사이에 공백이 없는지 확인해야합니다. 예 :mysqldump -u root -pmypassword
jx12345
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.