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

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

이유 : 나는 매일 crond 데이터베이스를 mysqldump하는 작업을 실행하고 싶습니다. 따라서 프롬프트가 표시되면 비밀번호를 삽입 할 수 없습니다.

어떻게 해결할 수 있습니까?



답변

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명령으로 전체 명령 (암호 포함)을 시스템의 다른 사용자가 볼 수 있으므로 본질적으로 안전하지 않습니다 .


답변

@ 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


답변

몇 가지 답변은 구성 파일에 비밀번호를 넣는 것에 대한 언급입니다.

또는 스크립트에서을 수행 할 수 있습니다 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 */;


답변

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않습니다.


답변

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

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

그리고 완료 🙂


답변

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

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

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


답변

다음은 스크립트 / 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가 컨테이너에 설정되어 있는지 확인하십시오 .

그것이 나를 도울 수있는 것처럼 당신을 도울 수 있기를 바랍니다!