Şifre istemi olmadan mysqldump nasıl yapılır?


229

Parola sormadan bir veritabanı mysqldump gerçekleştirmek için komut bilmek istiyorum.

NEDEN: Ben her gün bir kez veritabanı mysqldump alır bir cron işi çalıştırmak istiyorum. Bu nedenle, istendiğinde parolayı ekleyemeyeceğim.

Bunu nasıl çözebilirim?

Yanıtlar:


412

Ubuntu kullandığınız için, yapmanız gereken tek şey ana dizininize bir dosya eklemek ve mysqldump şifre istemini devre dışı bırakacak. Bu, dosya oluşturularak yapılır ~/.my.cnf(izinlerin 600 olması gerekir).

Bunu .my.cnf dosyasına ekleyin

[mysqldump]
user=mysqluser
password=secret

Bu, gerçekten şifreyi girmek zorunda kalmadan şifre gerektiren bir MySQL kullanıcısı olarak bağlanmanızı sağlar. -P veya --parola bile gerekmez.

Mysql ve mysqldump komutları için çok kullanışlıdır.

Bunu başarmaya yönelik adımlar bu bağlantıda bulunabilir .

Alternatif olarak, aşağıdaki komutu kullanabilirsiniz:

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

ancak komutun tamamı (şifre dahil) basit bir ps axkomutla sistemdeki herhangi bir kullanıcı tarafından görüntülenebildiğinden, bunun doğal olarak güvensiz olduğunu unutmayın .


55
herhangi bir kullanıcı kök veya kullanıcının şifresini görmek için ps aux olabilir gibi, komut satırında -p geçen diğer cevapları reddetti. Yukarıdaki dosya önerisini kullanmak en güvenli
Eddie

19
Genel ayar bir seçenek değilse (bağlanmak için yalnızca bir mysql örneğiniz yoksa), config dosyasını aracılığıyla ayarlayabilirsiniz --defaults-file. `Mysqldump - defaults-file = my_other.cnf --print-defaults`
dennis

3
@kante: güvende. Yalnızca .my.cnf dosyasının ait olduğu kullanıcılar tarafından kullanılabilir.
Yann Sagon

7
Windows'ta yapılandırma dosyası şu konumda değildir ~/.my.cnf. Bkz. Stackoverflow.com/a/14653239/470749 . MySql benimkinin olmasını bekliyordu c:\wamp\bin\mysql\mysql5.5.24\my.cnf. Orada bir dosya oluşturdum. Mysql'i yeniden başlatmak gerekli değildi; hemen bir sonraki mysqldump için çalıştı.
Ryan

7
güvenlik düzeyi eklemek için, veritabanına özgü, salt okunur bir kullanıcı ve hiçbir durumda kök kullanıcı kullanmanız gerekir. Bu şekilde yapılabilir:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou

86

@ Frankline'ın cevabına ekleniyor:

-pSeçenek ekarte edilmelidir yapılandırma dosyasında şifreyi kullanmak için komutundan.

Doğru:
mysqldump –u my_username my_db > my_db.sql

Yanlış:
mysqldump –u my_username -p my_db > my_db.sql



.my.cnf kullanıcı adını atlayabilir.

[mysqldump]
password=my_password

Senin Eğer .my.cnfdosya bir değil varsayılan konum ve mysqldumpgörmüyor kullanarak belirtin --defaults-file.

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


Damnit, XAMPP öğreticilerinin çoğunu açıklamadan -p içerir. Boş bir parola atlamak için işe yaramaz ...
Nelson

47

Birkaç yanıt, parolayı bir yapılandırma dosyasına yerleştirmekten bahseder.

Alternatif olarak, betiğinizden de yapabilirsiniz export MYSQL_PWD=yourverysecretpassword.

Bir yapılandırma dosyası kullanmada bu yöntemin üst kısmı, komut dosyanızla senkronize olmak için ayrı bir yapılandırma dosyasına ihtiyacınız olmamasıdır. Sadece senaryonuz var.

Orada hiçbir olumsuz bu yönteme.

Şifredir değil sistemde diğer kullanıcılar tarafından görülebilir (bu komut satırında ise görünür olacaktır). Ortam değişkenleri yalnızca mysql komutunu ve kökü çalıştıran kullanıcı tarafından görülebilir.

Parola ayrıca komut dosyasının kendisini okuyabilen herkes tarafından da görülebilir, bu nedenle komut dosyasının kendisinin korunduğundan emin olun. Bu hiçbir şekilde bir yapılandırma dosyasını korumaktan farklı değildir. Komut dosyasının herkes tarafından okunmasını istiyorsanız, şifreyi yine de ayrı bir dosyadan alabilirsiniz export MYSQL_PWD=$(cat /root/mysql_password). Bir değişkeni dışa aktarmak, bir yapılandırma dosyası oluşturmaktan daha kolaydır.

Örneğin,

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

Bu cevap gerçekten "yanlış" olmasa da, henüz güvenli değildir, dışa aktarılan ortam değişkenleri program çalışırken hala kolayca görülebilir ...
MatheusOl

4
@MatheusOl: Ortam değişkenleri yalnızca root ve kullanıcının kendisi tarafından görülebilir - yine de şifreyi tutan bir yapılandırma dosyasına erişebilecek kullanıcılar.
chutz

1
Mniess Yanılıyorsunuz. export MYSQL_PWD=...Yok değil süreç listede görünür. Bir an bile değil. Bunun nedeni, exportkomutun bir kabuk yerleşik olmasıdır (ve olması gerekir). Bu nedenle kabuk, kabuğunuzda yürütürseniz komutun argümanıyla bir işlemi çatallamaz / yürütmez.
maxschlepzig

1
@maxschlepzig haklısın. Bu durumda önemli değildir, çünkü şifreyi
ENV'ye

2
@mniess Dediğim gibi mysql belgeleri çok kötü ve yanıltıcı. Linux ve diğer sistemleri kullanırken 'son derece güvensiz ve kullanılmamalıdır' basit ve yanlış bir tavsiye. Bu da şu iddiayı desteklemiyor: 'çünkü şifreyi ENV'ye koymak yine de diğer kullanıcılar tarafından görülebilir'. Yan Not: Oracle aslında komut satırında parola geçen kullanımdan kaldırmak değil nasıl olsa komik olduğunu son derece güvensiz.
maxschlepzig

42

İşletim sistemi içinde herhangi bir yerde bulunan bir dosyayı kullanmak için --defaults-extra-fileörneğin:

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

Not: .sqlpwdsadece örnek bir dosya adıdır. İstediğiniz her şeyi kullanabilirsiniz.

Not: MySQL otomatik olarak ~/.my.cnfhangisinin kullanılabileceğini kontrol eder--defaults-extra-file

Benim gibi CRON kullanıyorsanız bunu deneyin!

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

Gerekli İzin ve Tavsiye Edilen Mülkiyet

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

.sqlpwd içeriği:

[mysqldump]
user=username
password=password

Aktarılacak diğer örnekler .cnfveya.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

Bir veritabanında otomatik olarak oturum açmak isterseniz, [mysql]örneğin bu girişe ihtiyacınız olacaktır .

Artık sizi otomatik olarak DB'ye bağlayan bir takma ad yapabilirsiniz

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

Ayrıca, parolayı yalnızca içine koyabilir .sqlpwdve kullanıcı adını script / cli aracılığıyla iletebilirsiniz. Bunun güvenliği geliştirip iyileştirmeyeceğinden emin değilim, bu hep birlikte farklı bir soru olurdu.

Tamlık uğruna aşağıdakileri yapabileceğinizi söyleyeceğim, ancak son derece güvensizdir ve asla bir üretim ortamında kullanılmamalıdır:

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

Not: -p ve parola arasında boşluk yoktur.

Örneğin -pPassWorddoğru -p Password, yanlışken.


2
Bu, özellikle birden çok veritabanı ve kullanıcı / parola düşünülürken en iyi yanıttır.
Hazok

BTW, uzun seçenekler (örn. --Defaults-file) kısa seçeneklerden önce (-u gibi) yerleştirilmelidir. Mysqldump 5.7.17 sürümünde test edildi.
Sysadmin

@Sysadmin Seçenek bağımsız değişkeni, seçenek adının kısa veya uzun biçimine bağlı olarak bir tire veya iki tire ile başlar. Birçok seçeneğin hem kısa hem de uzun formları vardır. Örneğin, -? ve --help, bir MySQL programına yardım mesajını görüntülemesini bildiren seçeneğin kısa ve uzun formlarıdır. dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers

29

Evet çok kolay .... sadece bir büyülü komut satırında artık yok

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

ve bitti :)


33
Uyarı: Komut satırı arabiriminde bir parola kullanmak güvenli olmayabilir.
93196.93

6
@Yottatron Özellikle antik Unix sistemlerinde günün çoğu için 10-15 kişinin kolayca oturum açtığı ve vi'nin bataklık yaptığı günlerde güvensiz olabilir. Modern bir VPS'de, 10-15 kişinin IRC'ye girip kullanabilmesine rağmen, yalnızca yöneticilerin kabuk erişimine sahip olması yaygındır.
Christos Hayward

3
Bunun için teşekkürler, sadece bir Docker geliştirici kutusunda kullanıyorum. Yani güvenlik bir sorun değil.
MikeiLL

7

Benim için MariaDB kullanarak bunu yapmak zorunda kaldı: Dosyayı ekleyin ~/.my.cnfve yaparak izinleri değiştirin chmod 600 ~/.my.cnf. Ardından kimlik bilgilerinizi dosyaya ekleyin. Eksik olduğum sihirli parça, şifrenin istemci bloğunun (ref: docs ) altında olması gerektiğiydi, şöyle :

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

Buraya geliyorsanız MariaDB ile nasıl mysqldump yapacağımı arıyorsunuz. Parolayı bir [client] bloğunun altına ve ardından kullanıcıyı bir [mysqldump] bloğunun altına yerleştirin.


Ben de MariaDB kullanıyorum (spesifik olarak 10.4) ve ben sadece [mysqldump]bölümün altına şifre koymak ve herhangi bir sorun olmadan çalıştı. Ubuntu 18.04 LTS
Paul Davis

3

İşte bir script / bin / sh içindeki Docker için bir çözüm:

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'

Değiştirin [MYSQL_CONTAINER_NAME]ve ortam değişkeninin MYSQL_ROOT_PASSWORDkabınızda ayarlandığından emin olun .

Umarım bana yardımcı olabilir gibi yardımcı olacaktır!


0

Aşağıdakilere sahibim.

/ Etc / mysqlpwd

[mysql]
user=root
password=password

Aşağıdaki takma adla.

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

Geri yükleme yapmak için şunu kullanıyorum:

mysql -p [database] [file.sql]

-2

5.1pass1 üzerinde çalışan --password = "" benim için çalıştı

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

--password=xxxKomut satırına dahil olmak , parolayı proc okuma (veya tam ps yapma) yeteneğine sahip herkes için görünür
Rafa

-11

Kesinlikle credentails ile kök crontab tam cmd hattı yerleştirmek daha iyi ve daha güvenli olacağını düşünüyorum. En azından crontab düzenlemesi, şifreyi zaten bilen biriyle sınırlıdır (okunabilir) .. bu yüzden düz metinde göstermekten endişe etmeyin ...

Gerekirse basit bir mysqldump'tan daha fazlası ... sadece credentails'i params olarak kabul eden ve içindeki tüm olanakları yerine getiren bir bash betiği yerleştirin ...

Basitçe bas dosyası

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

Crontab'da:

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

3
Hayır, daha güvenli olmayacaktır, komut satırına şifre eklediğinizde, proc okuma (veya tam ps) yapma yeteneğine sahip herkes tarafından görülebilir - oldukça varsayılan. .My.cnf dosyasını eklediğinizde ve 600 hak ayarladığınızda, bu dosya yalnızca SİZE görünür.
rombarcz

-21

Parolayı komut satırında aşağıdaki gibi belirleyebilirsiniz:

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

MySQL için seçenekler büyük / küçük harf duyarlıdır!


hayır, işe yaramazsa, -p'nin şifre olduğunu anladığını sanmıyorum
Prakash Raman

1
Bunun nasıl 1 oy aldığından emin değilim. Buradaki diğer cevaplarda da görüldüğü gibi, -p ve verilen parola arasında boşluk olmamalıdır. Ayrıca, çıktıyı dump dosyasına yeniden yönlendirmeli, yaptığınız gibi belirtmemeli veya tablo adı olduğu varsayılacaktır. @buzypi en iyisini söyledi.
Neek

Çalışmalıdır (diğer kullanıcıların parolayı görmesi oldukça kolay olmamasına rağmen) sadece -p ve parola arasında boşluk olmadığından emin olmanız gerekir, örn.mysqldump -u root -pmypassword
jx12345
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.