Làm thế nào để thực hiện một mysqldump mà không có dấu nhắc mật khẩu?


229

Tôi muốn biết lệnh để thực hiện một mysqldump của cơ sở dữ liệu mà không cần nhắc mật khẩu.

LÝ DO: Tôi muốn chạy một công việc định kỳ, một công việc cần một cơ sở dữ liệu một lần mỗi ngày. Do đó, tôi sẽ không thể chèn mật khẩu khi được nhắc.

Làm thế nào tôi có thể giải quyết điều này?

Câu trả lời:


412

Vì bạn đang sử dụng Ubuntu, tất cả những gì bạn cần làm chỉ là thêm một tệp trong thư mục chính của bạn và nó sẽ vô hiệu hóa lời nhắc mật khẩu mysqldump. Điều này được thực hiện bằng cách tạo tệp ~/.my.cnf(quyền cần phải là 600).

Thêm phần này vào tập tin .my.cnf

[mysqldump]
user=mysqluser
password=secret

Điều này cho phép bạn kết nối như một người dùng MySQL yêu cầu mật khẩu mà không cần phải nhập mật khẩu. Bạn thậm chí không cần -p hoặc --password.

Rất thuận tiện cho việc tạo kịch bản lệnh mysql & mysqldump.

Các bước để đạt được điều này có thể được tìm thấy trong liên kết này .

Ngoài ra, bạn có thể sử dụng lệnh sau:

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

nhưng lưu ý rằng nó vốn không an toàn, vì toàn bộ lệnh (bao gồm cả mật khẩu) có thể được xem bởi bất kỳ người dùng nào khác trên hệ thống trong khi kết xuất đang chạy, với một ps axlệnh đơn giản .


55
hạ cấp các câu trả lời khác đi qua -p trên dòng lệnh, vì bất kỳ người dùng nào cũng có thể ps để xem mật khẩu của người dùng hoặc root. Sử dụng đề xuất tệp ở trên là an toàn nhất
Eddie

19
Nếu cài đặt chung không phải là một tùy chọn (trong trường hợp bạn không chỉ có một phiên bản mysql để kết nối), bạn có thể đặt tệp cấu hình thông qua --defaults-file. Giống như `mysqldump --defaults-file = my_other.cnf --print-defaults`
dennis

3
@kante: an toàn. Nó chỉ có sẵn cho người dùng mà tập tin .my.cnf thuộc về.
Yann Sagon

7
Trên Windows, tệp cấu hình không có tại ~/.my.cnf. Xem stackoverflow.com/a/14653239/470749 . MySql dự kiến ​​của tôi sẽ ở c:\wamp\bin\mysql\mysql5.5.24\my.cnf. Vì vậy, tôi đã tạo ra một tập tin ở đó. Khởi động lại Mysql là không cần thiết; nó hoạt động ngay lập tức cho mysqldump tiếp theo của tôi.
Ryan

6
để thêm một mức độ bảo mật, bạn nên sử dụng một người dùng chuyên dụng, không có cơ sở dữ liệu cụ thể, người dùng chỉ đọc và trong mọi trường hợp là người dùng root. Nó có thể được thực hiện như thế này:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou

86

Thêm vào câu trả lời của @ Frankline:

Các -ptùy chọn phải được loại trừ khỏi các lệnh để sử dụng mật khẩu trong tập tin cấu hình.

Chính xác:
mysqldump –u my_username my_db > my_db.sql

Sai lầm:
mysqldump –u my_username -p my_db > my_db.sql



.my.cnf có thể bỏ qua tên người dùng.

[mysqldump]
password=my_password

Nếu .my.cnftệp của bạn không ở vị trí mặc địnhmysqldumpkhông nhìn thấy nó, hãy chỉ định nó bằng cách sử dụng --defaults-file.

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


Chết tiệt, rất nhiều hướng dẫn XAMPP bao gồm -p mà không giải thích nó. Nó không hoạt động để bỏ qua một mật khẩu trống ...
Nelson

47

Một vài câu trả lời đề cập đến việc đặt mật khẩu trong một tập tin cấu hình.

Ngoài ra, từ kịch bản của bạn, bạn có thể export MYSQL_PWD=yourverysecretpassword.

Mặt trái của phương pháp này khi sử dụng tệp cấu hình là bạn không cần tệp cấu hình riêng để giữ đồng bộ với tập lệnh của mình. Bạn chỉ có kịch bản để duy trì.

Không có nhược điểm của phương pháp này.

Mật khẩu không hiển thị cho những người dùng khác trên hệ thống (nó sẽ hiển thị nếu nó nằm trên dòng lệnh). Các biến môi trường chỉ hiển thị cho người dùng đang chạy lệnh mysql và root.

Mật khẩu cũng sẽ hiển thị cho bất cứ ai có thể đọc chính tập lệnh, vì vậy hãy đảm bảo rằng tập lệnh được bảo vệ. Điều này không có gì khác với việc bảo vệ một tệp cấu hình. Bạn vẫn có thể lấy mật khẩu từ một tệp riêng nếu bạn muốn tập lệnh có thể đọc được công khai ( export MYSQL_PWD=$(cat /root/mysql_password)ví dụ). Vẫn dễ xuất một biến hơn là xây dựng tệp cấu hình.

Ví dụ,

$ 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 */;

Mặc dù câu trả lời này không thực sự "không chính xác", nhưng nó vẫn chưa an toàn, các biến môi trường được xuất vẫn dễ dàng nhìn thấy khi chương trình đang chạy ...
MatheusOl

4
@MeditusOl: Các biến môi trường chỉ hiển thị với root và chính người dùng - chính những người dùng có quyền truy cập vào tệp cấu hình đang giữ mật khẩu.
chutz

1
@mniess Bạn sai rồi. Các export MYSQL_PWD=...không không hiển thị trong danh sách quá trình. Thậm chí không trong một giây. Điều này là do exportlệnh là (và phải là) một vỏ dựng sẵn. Do đó, shell không fork / thực thi một tiến trình với đối số của lệnh nếu bạn thực thi nó trong shell của mình.
maxschlepzig

1
@maxschlepzig bạn nói đúng. Trong trường hợp này, điều đó không thành vấn đề bởi vì việc đặt mật khẩu trong ENV sẽ khiến người dùng khác nhìn thấy nó (như được cảnh báo trong tài liệu mysql)
kể từ

2
@mniess Như tôi đã nói tài liệu mysql rất kém và sai lệch. 'phải được coi là cực kỳ không an toàn và không nên được sử dụng' đơn giản là lời khuyên sai và xấu khi sử dụng Linux và các hệ thống khác. Và điều này không hỗ trợ cho khiếu nại của bạn, đó là: 'bởi vì việc đặt mật khẩu vào ENV sẽ khiến nó hiển thị cho người dùng khác'. Lưu ý bên lề: buồn cười mặc dù Oracle không phản đối việc truyền mật khẩu trên dòng lệnh mà thực tế không an toàn.
maxschlepzig

42

Để sử dụng tệp ở bất kỳ đâu trong HĐH, hãy sử dụng, --defaults-extra-filevd:

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

Lưu ý: .sqlpwdchỉ là một tên tệp ví dụ. Bạn có thể sử dụng bất cứ điều gì bạn muốn.

Lưu ý: MySQL sẽ tự động kiểm tra ~/.my.cnfcái nào có thể được sử dụng thay vì--defaults-extra-file

Nếu bạn sử dụng CRON như tôi, hãy thử điều này!

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

Giấy phép cần thiết và quyền sở hữu được đề xuất

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

.sqlpwd nội dung:

[mysqldump]
user=username
password=password

Các ví dụ khác để vượt qua .cnfhoặc.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

Nếu bạn muốn đăng nhập vào cơ sở dữ liệu tự động, bạn sẽ cần [mysql]mục nhập chẳng hạn.

Bây giờ bạn có thể tạo một bí danh tự động kết nối bạn với DB

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

Bạn cũng chỉ có thể đặt mật khẩu bên trong .sqlpwdvà chuyển tên người dùng thông qua tập lệnh / cli. Tôi không chắc liệu điều này có cải thiện bảo mật hay không, đó sẽ là một câu hỏi hoàn toàn khác.

Để hoàn thiện, tôi sẽ nói bạn có thể làm như sau, nhưng cực kỳ không an toàn và không bao giờ nên được sử dụng trong môi trường sản xuất:

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

Lưu ý: KHÔNG CÓ KHÔNG GIAN giữa -p và mật khẩu.

Ví dụ -pPassWordlà đúng trong khi -p Passwordkhông chính xác.


2
Đây là câu trả lời tốt nhất, đặc biệt là khi xem xét nhiều cơ sở dữ liệu và người dùng / mật khẩu.
Hazok

BTW, các tùy chọn dài (ví dụ: --defaults-file) nên được đặt trước các tùy chọn ngắn (như -u). Đã thử nghiệm trên phiên bản mysqldump 5.7.17.
Sysadmin

@Sysadmin Một đối số tùy chọn bắt đầu bằng một dấu gạch ngang hoặc hai dấu gạch ngang, tùy thuộc vào đó là dạng ngắn hay dạng dài của tên tùy chọn. Nhiều lựa chọn có cả hình thức ngắn và dài. Ví dụ, -? và --help là các hình thức ngắn và dài của tùy chọn hướng dẫn chương trình MySQL hiển thị thông báo trợ giúp của nó. dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers

29

Vâng, nó rất dễ dàng .... chỉ trong một dòng lệnh ma thuật không còn nữa

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

và thực hiện :)


33
Cảnh báo: Sử dụng mật khẩu trên giao diện dòng lệnh có thể không an toàn.
93196.93

6
@Yottatron Có thể không an toàn, đặc biệt là vào thời điểm mà các hệ thống Unix cổ đại dễ dàng có 10-15 người đăng nhập trong phần lớn thời gian trong ngày và vi phạm. Trên một VPS hiện đại, trong khi bạn có thể có từ 10 - 15 người tham gia và sử dụng IRC, thì thông thường chỉ có (các) quản trị viên mới có quyền truy cập shell.
Christos Hayward

3
Cảm ơn vì điều này, tôi chỉ sử dụng nó trong devbox Docker. Vì vậy, an ninh không phải là một vấn đề.
MikeiLL

7

Đối với tôi, sử dụng MariaDB tôi phải làm điều này: Thêm tệp ~/.my.cnfvà thay đổi quyền bằng cách thực hiện chmod 600 ~/.my.cnf. Sau đó thêm thông tin của bạn vào tập tin. Phần ma thuật tôi bị thiếu là mật khẩu cần phải nằm dưới khối máy khách (ref: docs ), như vậy:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

Nếu bạn tình cờ đến đây để tìm cách thực hiện một mysqldump với MariaDB. Đặt mật khẩu dưới khối [client] và sau đó người dùng trong khối [mysqldump].


Tôi cũng đang sử dụng MariaDB (cụ thể là 10,4) và tôi chỉ cần đặt mật khẩu bên dưới [mysqldump]phần này và nó hoạt động mà không gặp vấn đề gì. Ubuntu 18.04 LTS
Paul Davis

3

Đây là một giải pháp cho Docker trong tập lệnh / 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'

Thay thế [MYSQL_CONTAINER_NAME]và chắc chắn rằng biến môi trường MYSQL_ROOT_PASSWORDđược đặt trong thùng chứa của bạn.

Hy vọng nó sẽ giúp bạn như nó có thể giúp tôi!


0

Tôi có những điều sau đây.

/ etc / mysqlpwd

[mysql]
user=root
password=password

Với bí danh sau.

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

Để thực hiện khôi phục tôi chỉ cần sử dụng:

mysql -p [database] [file.sql]

-2

những gì về --password = "" đã làm việc cho tôi chạy trên 5.1.51

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

bao gồm --password=xxxtrên dòng lệnh sẽ làm cho mật khẩu hiển thị cho bất kỳ ai có khả năng đọc Proc (hoặc thực hiện đầy đủ ps) - khá mặc định.
Rafa

-11

Chắc chắn tôi nghĩ sẽ tốt hơn và an toàn hơn khi đặt dòng cmd đầy đủ trong crontab gốc, với các thông báo. Ít nhất là chỉnh sửa crontab bị hạn chế (có thể đọc được) đối với người đã biết mật khẩu .. vì vậy không phải lo lắng khi hiển thị nó trong văn bản thuần túy ...

Nếu cần nhiều hơn một mysqldump đơn giản ... chỉ cần đặt một tập lệnh bash chấp nhận tín dụng là thông số và thực hiện tất cả các tiện nghi bên trong ...

Các tập tin cơ bản trong đơn giản

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

Trong Crontab:

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

3
Không, sẽ không an toàn hơn, khi bạn thêm mật khẩu vào dòng lệnh, bất kỳ ai cũng có khả năng đọc Proc (hoặc thực hiện đầy đủ ps) - điều này khá mặc định. Khi bạn thêm tệp .my.cnf và đặt 600 quyền, nó chỉ hiển thị với BẠN.
rombarcz

-21

Bạn có thể chỉ định mật khẩu trên dòng lệnh như sau:

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

Các tùy chọn cho mysqldump là Case Sensitive!


Không, nó không hoạt động, tôi không nghĩ nó hiểu rằng -p là mật khẩu
Prakash Raman

1
Không chắc làm thế nào điều này có được 1 phiếu bầu, tôi đang đánh giá thấp điều này. Như đã thấy trong các câu trả lời khác ở đây, không nên có khoảng trắng giữa -p và mật khẩu đã cho. Ngoài ra, bạn nên chuyển hướng đầu ra thành dumpfile, không chỉ định nó như bạn đang làm, hoặc nó sẽ được coi là một tên bảng. @buzypi nói nó hay nhất.
Neek

nó nên hoạt động (mặc dù không an toàn ở chỗ người dùng khác dễ dàng nhìn thấy mật khẩu), bạn chỉ cần đảm bảo không có khoảng trống giữa -p và mật khẩu, ví dụ:mysqldump -u root -pmypassword
jx12345
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.