パスワードプロンプトなしでmysqldumpを実行する方法


229

パスワードのプロンプトなしでデータベースのmysqldumpを実行するコマンドを知りたいのですが。

理由:データベースのmysqldumpを毎日1回取得するcronジョブを実行したいと考えています。したがって、プロンプトが表示されたときにパスワードを挿入することはできません。

どうすればこれを解決できますか?

回答:


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インスタンスが1つだけではない場合)、を介して構成ファイルを設定できます--defaults-file。mysqldump --defaults-ファイル= my_other.cnf --print-defaults` `のような
デニス・

3
@kante:安全です。.my.cnfファイルが属するユーザーのみが使用できます。
Yann Sagon

7
Windowsでは、構成ファイルはにありません~/.my.cnfstackoverflow.com/a/14653239/470749を参照してください。MySqlはにいると予想していましたc:\wamp\bin\mysql\mysql5.5.24\my.cnf。そこでファイルを作成しました。Mysqlを再起動する必要はありませんでした。それは私の次のmysqldumpですぐに機能しました。
ライアン

6
セキュリティのレベルを追加するには、専用のデータベース非固有の読み取り専用ユーザーを使用し、ルートユーザーは使用しないでください。:それはこのように行うことができますGRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou

86

@フランクラインの答えに追加:

構成ファイルでパスワードを使用するには、-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


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:環境変数はrootとユーザー自身にのみ表示されます-とにかくパスワードを保持している設定ファイルにアクセスできる同じユーザー。
チャッツ2016

1
@mniessあなたは間違っている。export MYSQL_PWD=...ではないプロセスリストに表示されます。一瞬でもです。これは、exportコマンドがシェル組み込みである(そしてそうでなければならない)ためです。したがって、シェルで実行した場合、シェルはコマンドの引数を持つプロセスをfork / execしません。
maxschlepzig

1
@maxschlepzigあなたは正しいです。この場合、パスワードをENVに入れると、他のユーザーに見えるようになるため、問題ではありません(mysqlのドキュメントで警告されています)
mniess

2
@mniess前述したように、mysqlのドキュメントは非常に貧弱で誤解を招くものです。Linuxやその他のシステムを使用する場合、「非常に安全であると見なさなければならず、使用すべきではありません」は単に間違っており、悪いアドバイスです。そして、これはあなたの主張をサポートしません:「ENVにパスワードを入れると、とにかく他のユーザーがそれを見ることができるからです」。補足:実際に非常に安全でないコマンドラインでのパスワードの受け渡しをOracleが非推奨にしていないのはおかしいです。
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とパスワードの間にスペースはありません。

たとえば、-pPassWordが正しくない間は正しい-p Passwordです。


2
これは、特に複数のデータベースとユーザー/パスワードを検討する場合に最適です。
Hazok

ところで、長いオプション(--defaults-fileなど)は、短いオプション(-uなど)の前に配置する必要があります。mysqldumpバージョン5.7.17でテスト済み。
Sysadmin

@Sysadminオプション引数は、オプション名の短い形式か長い形式かに応じて、1つのダッシュまたは2つのダッシュで始まります。多くのオプションには、短い形式と長い形式の両方があります。例えば、 -?および--helpは、MySQLプログラムにヘルプメッセージを表示するように指示するオプションの短い形式と長い形式です。dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers

29

うん、それはちょうどに....非常に簡単ではありません1つの魔法のコマンドラインこれ以上

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

そして完了:)


33
警告:コマンドラインインターフェイスでパスワードを使用すると、安全でない場合があります。
93196.93 2015年

6
@Yottatronそれは、特に古代のUnixシステムが1日のほとんどの間10から15人のユーザーを簡単にログインさせ、viが行き詰まっていた日に、安全ではない可能性があります。最近のVPSでは、IRCを使用して10〜15人をシェル化することができますが、シェルアクセスを許可するのは管理者のみです。
クリストスヘイワード

3
このおかげで、私はDocker devboxで使用しています。したがって、セキュリティは問題ではありません。
MikeiLL 2017

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]。セクションの下にパスワードを入力するだけで、問題なく動作しました。Ubuntu 18.04 LTS
ポールデイビス

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に配置する方が安全です。少なくともcrontabの編集は、すでにパスワードを知っている人に制限(読み取り)できるので、プレーンテキストで表示する心配はありません...

単純なmysqldumpよりも必要な場合... credentailsをパラメーターとして受け入れ、内部ですべての機能を実行するbashスクリプトを配置するだけです...

シンプルなbasファイル

#!/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 14年

-21

次のようにコマンドラインでパスワードを指定できます。

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

mysqldumpのオプションでは大文字と小文字が区別されます。


いいえ、機能しません。-pがパスワードであることを理解しているとは思いません
Prakash Raman

1
これが1票を獲得したかわかりません。私はこれに反対票を投じています。ここの他の回答で見られるように、-pと指定されたパスワードの間にスペースがあってはなりません。また、出力をdumpfileにリダイレクトする必要があります。現在のように指定しないでください。そうしないと、テーブル名と見なされます。@buzypiはそれを最もよく言った。
Neek

動作するはずです(他のユーザーがパスワードを見るのは簡単なので安全ではありません)mysqldump -u root -pmypassword
。-
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.