Bagaimana cara melakukan mysqldump tanpa prompt kata sandi?

229

Saya ingin tahu perintah untuk melakukan mysqldump dari basis data tanpa konfirmasi kata sandi.

ALASAN: Saya ingin menjalankan pekerjaan cron, yang mengambil mysqldump dari database sekali sehari. Karenanya, saya tidak dapat memasukkan kata sandi saat diminta.

Bagaimana saya bisa menyelesaikan ini?

Prakash Raman
sumber

Jawaban:

412

Karena Anda menggunakan Ubuntu, yang perlu Anda lakukan hanyalah menambahkan file di direktori home Anda dan itu akan menonaktifkan prompt kata sandi mysqldump. Ini dilakukan dengan membuat file ~/.my.cnf(izin harus 600).

Tambahkan ini ke file .my.cnf

[mysqldump]
user=mysqluser
password=secret

Ini memungkinkan Anda terhubung sebagai pengguna MySQL yang membutuhkan kata sandi tanpa harus benar-benar memasukkan kata sandi. Anda bahkan tidak memerlukan -p atau --password.

Sangat berguna untuk scripting perintah mysql & mysqldump.

Langkah-langkah untuk mencapai ini dapat ditemukan di tautan ini .

Atau, Anda dapat menggunakan perintah berikut:

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

tetapi perlu diketahui bahwa itu inheren tidak aman, karena seluruh perintah (termasuk kata sandi) dapat dilihat oleh pengguna lain pada sistem saat dump sedang berjalan, dengan ps axperintah sederhana .

Frankline
sumber
55
downvoted jawaban lain lewat -p pada baris perintah, karena setiap pengguna dapat meminta untuk melihat root atau kata sandi pengguna. Menggunakan saran file di atas adalah yang paling aman
Eddie
19
Jika pengaturan global bukan opsi (jika Anda tidak hanya memiliki satu instance mysql untuk terhubung), Anda dapat mengatur file konfigurasi melalui --defaults-file. Seperti `mysqldump --defaults-file = my_other.cnf --print-defaults`
dennis
3
@kante: aman. Ini hanya tersedia untuk pengguna yang memiliki file .my.cnf.
Yann Sagon
7
Di Windows, file konfigurasi tidak di ~/.my.cnf. Lihat stackoverflow.com/a/14653239/470749 . MySql mengharapkan milik saya berada di c:\wamp\bin\mysql\mysql5.5.24\my.cnf. Jadi saya membuat file di sana. Restart Mysql tidak diperlukan; itu bekerja segera untuk mysqldump saya berikutnya.
Ryan
6
untuk menambah tingkat keamanan, Anda harus menggunakan pengguna yang khusus, bukan basis data, hanya baca, dan tidak dalam hal pengguna root. Ini dapat dilakukan seperti ini:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou
86

Menambahkan ke jawaban @ Frankline:

The -ppilihan harus dikeluarkan dari perintah untuk menggunakan password pada file konfigurasi.

Benar:
mysqldump –u my_username my_db > my_db.sql

Salah:
mysqldump –u my_username -p my_db > my_db.sql



.my.cnf dapat menghilangkan nama pengguna.

[mysqldump]
password=my_password

Jika .my.cnffile Anda tidak di lokasi default dan mysqldumptidak melihatnya, tentukan dengan menggunakan --defaults-file.

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

Nelu
sumber
Sial, banyak tutorial XAMPP menyertakan -p tanpa menjelaskannya. Ini TIDAK berfungsi untuk mem-bypass password kosong ...
Nelson
47

Beberapa jawaban menyebutkan meletakkan kata sandi dalam file konfigurasi.

Atau, dari skrip Anda, Anda bisa export MYSQL_PWD=yourverysecretpassword.

Kelebihan metode ini dalam menggunakan file konfigurasi adalah Anda tidak perlu file konfigurasi terpisah untuk tetap sinkron dengan skrip Anda. Anda hanya memiliki skrip untuk dipelihara.

Tidak ada kerugian untuk metode ini.

Kata sandi tidak terlihat oleh pengguna lain di sistem (itu akan terlihat jika ada di baris perintah). Variabel lingkungan hanya terlihat oleh pengguna yang menjalankan perintah mysql, dan root.

Kata sandi juga akan terlihat oleh siapa saja yang dapat membaca skrip itu sendiri, jadi pastikan skrip itu sendiri terlindungi. Ini sama sekali tidak berbeda dengan melindungi file konfigurasi. Anda masih dapat sumber kata sandi dari file terpisah jika Anda ingin agar skrip dapat dibaca export MYSQL_PWD=$(cat /root/mysql_password)untuk umum ( misalnya). Masih lebih mudah untuk mengekspor variabel daripada membangun file konfigurasi.

Misalnya,

$ 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 */;
chutz
sumber
Meskipun jawaban ini tidak benar-benar "salah", itu belum aman, variabel lingkungan yang diekspor masih mudah terlihat ketika program sedang berjalan ...
MatheusOl
4
@MatheusOl: Variabel lingkungan hanya terlihat untuk di-root dan pengguna itu sendiri - pengguna yang sama yang akan memiliki akses ke file konfigurasi yang menahan kata sandi.
chutz
1
@ Nyonya Anda salah. The export MYSQL_PWD=...tidak tidak muncul dalam daftar proses. Bahkan untuk sepersekian detik. Ini karena exportperintahnya adalah (dan harus) shell builtin. Dengan demikian shell tidak melakukan proses dengan argumen perintah jika Anda menjalankannya di shell Anda.
maxschlepzig
1
@maxschlepzig Anda benar. Dalam hal ini tidak masalah karena memasukkan kata sandi ke dalam ENV membuatnya dapat dilihat oleh pengguna lain (seperti yang diperingatkan dalam dokumentasi mysql)
mniess
2
@mniess Seperti yang saya katakan dokumentasi mysql sangat buruk dan menyesatkan. 'harus dianggap sangat tidak aman dan tidak boleh digunakan' adalah saran yang salah dan buruk ketika menggunakan Linux dan sistem lainnya. Dan ini tidak mendukung klaim Anda yaitu: 'karena memasukkan kata sandi ke dalam ENV membuatnya dapat dilihat oleh pengguna lain'. Catatan: lucu meskipun bagaimana Oracle tidak mencela melewati password pada baris perintah yang sebenarnya adalah sangat tidak aman.
maxschlepzig
42

Untuk menggunakan file yang ada di mana saja di dalam OS, gunakan --defaults-extra-filemisalnya:

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

Catatan: .sqlpwdhanya nama file contoh. Anda dapat menggunakan apa pun yang Anda inginkan.

Catatan: MySQL akan secara otomatis memeriksa ~/.my.cnfmana yang dapat digunakan--defaults-extra-file

Jika Anda menggunakan CRON seperti saya, coba ini!

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

Izin yang Diperlukan dan Kepemilikan yang Disarankan

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

.sqlpwd isi:

[mysqldump]
user=username
password=password

Contoh lain untuk masuk .cnfatau.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

Jika Anda ingin masuk ke database secara otomatis, Anda perlu [mysql]entri misalnya.

Anda sekarang dapat membuat alias yang secara otomatis menghubungkan Anda ke DB

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

Anda juga hanya bisa memasukkan kata sandi di dalam .sqlpwddan meneruskan nama pengguna melalui skrip / cli. Saya tidak yakin apakah ini akan meningkatkan keamanan atau tidak, itu akan menjadi pertanyaan yang berbeda secara bersamaan.

Demi kelengkapan saya akan menyatakan Anda dapat melakukan hal berikut, tetapi sangat tidak aman dan tidak boleh digunakan dalam lingkungan produksi:

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

Catatan: TIDAK ADA RUANG antara -p dan kata sandi.

Misalnya -pPassWordbenar sementara -p Passwordsalah.

FreeSoftwareServers
sumber
2
Ini adalah jawaban terbaik, terutama ketika mempertimbangkan banyak basis data dan pengguna / kata sandi.
Hazok
BTW, opsi panjang (mis. --Defaults-file) harus ditempatkan sebelum opsi pendek (seperti -u). Diuji pada versi mysqldump 5.7.17.
Sysadmin
@Sysadmin Argumen opsi dimulai dengan satu tanda hubung atau dua tanda hubung, tergantung pada apakah itu bentuk pendek atau panjang dari nama opsi. Banyak opsi memiliki bentuk pendek dan panjang. Sebagai contoh, -? dan --help adalah bentuk pendek dan panjang dari opsi yang menginstruksikan program MySQL untuk menampilkan pesan bantuannya. dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers
29

Ya itu sangat mudah .... hanya dalam satu baris perintah magis tidak ada lagi

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

dan selesai :)

Tarek Kalaji
sumber
33
Peringatan: Menggunakan kata sandi pada antarmuka baris perintah dapat menjadi tidak aman.
93196,93
6
@Yottatron Ini bisa jadi tidak aman, terutama pada hari ketika sistem Unix kuno dengan mudah memiliki 10-15 orang masuk untuk sebagian besar hari dan vi macet. Pada VPS modern, walaupun Anda dapat membuat 10-15 orang di-shell dan menggunakan IRC, biasanya hanya administrator yang memiliki akses shell.
Christos Hayward
3
Terima kasih untuk ini, saya hanya menggunakannya di devbox Docker. Jadi keamanan bukan masalah.
MikeiLL
7

Bagi saya, menggunakan MariaDB saya harus melakukan ini: Tambahkan file ~/.my.cnfdan ubah izin dengan melakukan chmod 600 ~/.my.cnf. Kemudian tambahkan kredensial Anda ke file. Bagian ajaib yang saya lewatkan adalah bahwa kata sandi harus berada di bawah blok klien (ref: docs ), seperti:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

Jika Anda datang ke sini mencari cara melakukan mysqldump dengan MariaDB. Tempatkan kata sandi di bawah blok [klien], dan kemudian pengguna di bawah blok [mysqldump].

Michael Johansen
sumber
Saya menggunakan MariaDB juga (10,4 untuk lebih spesifik) dan saya cukup memasukkan kata sandi di [mysqldump]bagian dan itu bekerja tanpa masalah. Ubuntu 18,04 LTS
Paul Davis
3

Berikut ini adalah solusi untuk Docker dalam skrip / 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'

Ganti [MYSQL_CONTAINER_NAME]dan pastikan variabel lingkungan MYSQL_ROOT_PASSWORDdiatur dalam wadah Anda.

Semoga ini akan membantu Anda seperti itu bisa membantu saya!

program pcman
sumber
0

Saya punya yang berikut ini.

/ etc / mysqlpwd

[mysql]
user=root
password=password

Dengan alias berikut ini.

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

Untuk melakukan pemulihan saya cukup menggunakan:

mysql -p [database] [file.sql]
hawx
sumber
-2

bagaimana dengan --password = "" bekerja untuk saya yang berjalan pada 5.1.51

mysqldump -h localhost -u <user> --password="<password>"
Joe Velez
sumber
termasuk --password=xxxpada baris perintah akan membuat kata sandi terlihat oleh siapa pun yang memiliki kemampuan untuk membaca proc (atau melakukan ps penuh) - yang cukup standar.
Rafa
-11

Jelas saya pikir akan lebih baik dan lebih aman untuk menempatkan baris cmd penuh di crontab root, dengan kredensial. Setidaknya hasil edit crontab dibatasi (dapat dibaca) oleh seseorang yang sudah mengetahui kata sandi .. jadi jangan khawatir untuk menampilkannya dalam teks biasa ...

Jika diperlukan lebih dari mysqldump sederhana ... cukup tempatkan skrip bash yang menerima kredensial sebagai params dan lakukan semua fasilitas di dalamnya ...

File bas sederhana

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

Di dalam Crontab:

0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log
kante
sumber
3
Tidak, itu tidak akan lebih aman, ketika Anda menambahkan kata sandi ke commandline itu terlihat oleh siapa pun dengan kemampuan untuk membaca proc (atau melakukan ps penuh) - yang cukup standar. Saat Anda menambahkan file .my.cnf dan menetapkan 600 hak, file hanya dapat dilihat oleh ANDA.
rombarcz
-21

Anda dapat menentukan kata sandi pada baris perintah sebagai berikut:

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

Opsi untuk mysqldump adalah Case Sensitive!

jx12345
sumber
tidak, itu tidak berfungsi, saya tidak berpikir itu mengerti bahwa -p adalah kata sandi
Prakash Raman
1
Tidak yakin bagaimana ini mendapat 1 suara, saya downvoting ini. Seperti yang terlihat dalam jawaban lain di sini, seharusnya tidak ada ruang antara -p dan kata sandi yang diberikan. Anda juga harus mengarahkan output ke dumpfile, tidak menentukannya seperti yang Anda lakukan, atau itu akan dianggap sebagai nama tabel. @ buzypi mengatakannya dengan terbaik.
Neek
itu harus bekerja (meskipun tidak aman karena cukup mudah bagi pengguna lain untuk melihat kata sandi) Anda hanya perlu memastikan tidak ada ruang antara -p dan kata sandi misalnyamysqldump -u root -pmypassword
jx12345