Bagaimana saya bisa menjalankan perintah SQL melalui skrip shell sehingga saya bisa membuatnya otomatis?
Saya ingin mengembalikan data yang saya kumpulkan dalam file SQL menggunakan skrip shell. Saya ingin terhubung ke server dan mengembalikan data. Perintah ini berfungsi ketika dijalankan secara terpisah melalui baris perintah SSH.
Ini adalah perintah yang saya gunakan:
mysql -h "server-name" -u root "password" "database-name" < "filename.sql"
Ini adalah kode skrip shell yang membuat file ds_fbids.sql
dan mengirimkannya ke mysql.
perl fb_apps_frm_fb.pl
perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql
mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql
Apa cara yang benar untuk melakukan ini?
+ mysql -h dbservername -u user-name -ppassword dbname</br> : No such file or directoryids.sql</br> + $'\r' : command not found2:
Ini adalah pesan kesalahan yang saya dapatkan-p
jika kata sandi adalah null atau string kosong, mungkin Anda dapat memperbarui posting Anda? :)Gunakan sintaks ini:
sumber
"command1;command2;....;commandn"
bagian dari jawaban ini tidak akan berhasil. Menggunakannya untuk menggantikan penggunaan file yang diarahkan pada sintaks OP dapat bekerja. Saya telah membahas masalah itu dalam jawaban saya untuk pertanyaan ini.Semua jawaban sebelumnya sangat bagus. Jika sederhana, perintah satu baris sql yang ingin Anda jalankan, Anda juga bisa menggunakan opsi -e.
sumber
Cara menjalankan skrip SQL, gunakan sintaks ini:
Jika Anda menggunakan host sebagai localhost, Anda tidak perlu menyebutkannya. Anda bisa menggunakan ini:
Ini seharusnya berfungsi untuk Windows dan Linux.
Jika konten kata sandi berisi
!
(tanda seru) Anda harus menambahkan\
(garis miring terbalik) di depannya.sumber
Inti dari pertanyaan telah dijawab beberapa kali, saya hanya berpikir saya akan menambahkan bahwa backticks (`s) telah mengupas baik skrip shell dan SQL. Jika Anda perlu menggunakannya dalam SQL untuk menentukan tabel atau nama database, Anda harus menghindarinya dalam skrip shell seperti:
Tentu saja, menghasilkan SQL melalui input pengguna gabungan (argumen yang disahkan) tidak boleh dilakukan kecuali Anda memercayai input pengguna. Akan jauh lebih aman untuk meletakkannya dalam bahasa skrip lain dengan dukungan untuk parameter / dengan benar lolos dari string untuk dimasukkan ke dalam MySQL.
sumber
(gunakan jalur lengkap untuk
sql_script_file
jika diperlukan)Jika Anda ingin mengarahkan keluar put ke file
sumber
Anda lupa
-p
atau--password=
(yang terakhir lebih baik dibaca):(Kutipan tidak perlu jika Anda yakin bahwa kredensial / nama Anda tidak mengandung spasi atau karakter khusus shell.)
Perhatikan bahwa halaman manual juga mengatakan bahwa memberikan kredensial pada baris perintah tidak aman. Jadi, ikuti saran Bill tentang my.cnf.
sumber
Seperti yang dinyatakan sebelumnya, Anda dapat menggunakan -p untuk meneruskan kata sandi ke server.
Tetapi saya merekomendasikan ini:
Perhatikan kata sandinya tidak ada. Maka akan meminta kata sandi Anda. KEMUDIAN saya akan mengetiknya. Agar kata sandi Anda tidak masuk ke riwayat baris perintah server.
Ini adalah langkah pengamanan dasar.
Jika keamanan tidak menjadi masalah, saya hanya akan menghapus sementara kata sandi dari pengguna basis data. Kemudian setelah impor - tambahkan kembali.
Dengan cara ini, akun lain yang mungkin Anda miliki yang memiliki kata sandi yang sama tidak akan dikompromikan.
Tampaknya juga dalam skrip shell Anda, Anda tidak menunggu / memeriksa untuk melihat apakah file yang Anda coba impor benar-benar ada. Script perl mungkin belum selesai.
sumber
perl fb_apps_frm_fb.pl
</br> perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql` </br>mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql
Menggunakan
sumber
Untuk "mengotomatisasi" proses mengimpor
.sql
file yang dihasilkan , sambil menghindari semua jebakan yang dapat disembunyikan dalam mencoba untuk melewati filestdin
danstdout
, katakan saja pada MySQL untuk mengeksekusi.sql
file yang dihasilkan menggunakanSOURCE
perintah di MySQL.Sintaks dalam jangka pendek, tetapi sangat baik, jawaban , dari Kshitij Sood , memberikan yang terbaik titik awal. Singkatnya, modifikasi perintah OP sesuai dengan sintaks Kshitij Sood dan ganti perintah di dalamnya dengan
SOURCE
perintah:Jika nama database termasuk dalam
.sql
file yang dihasilkan , itu bisa dihapus dari perintah.Anggapan di sini adalah bahwa file yang dihasilkan valid sebagai
.sql
file sendiri. Dengan tidak memiliki file yang dialihkan, disalurkan, atau dengan cara lain ditangani oleh shell, tidak ada masalah dengan kebutuhan untuk melarikan diri dari salah satu karakter dalam output yang dihasilkan karena shell. Aturan berkenaan dengan apa yang perlu diloloskan dalam.sql
file, tentu saja, masih berlaku.Bagaimana menangani masalah keamanan di sekitar kata sandi pada baris perintah, atau dalam
my.cnf
file, dll., Telah ditangani dengan baik dalam jawaban lain, dengan beberapa saran yang sangat baik. Jawaban favorit saya , dari Danny , mencakup hal itu, termasuk bagaimana menangani masalah ketika berhadapan dengancron
pekerjaan, atau apa pun.Untuk menjawab komentar (pertanyaan?) Pada jawaban singkat yang saya sebutkan: Tidak, itu tidak dapat digunakan dengan sintaks HEREDOC, karena perintah shell diberikan. HEREDOC dapat digunakan dalam sintaks versi redirection , (tanpa
-Bse
opsi), karena I / O redirection adalah apa yang dibangun oleh HEREDOC. Jika Anda memerlukan fungsionalitas HEREDOC, akan lebih baik untuk menggunakannya dalam pembuatan.sql
file, meskipun itu hanya sementara, dan gunakan file itu sebagai "perintah" untuk mengeksekusi dengan baris batch MySQL.Ingatlah bahwa karena ekspansi shell Anda dapat menggunakan variabel shell dan lingkungan di dalam HEREDOC. Sisi buruknya adalah Anda harus melarikan diri dari setiap backtick. MySQL menggunakannya sebagai pembatas untuk pengidentifikasi tetapi shell, yang mendapatkan string pertama, menggunakannya sebagai pembatas perintah yang dapat dieksekusi. Kehilangan jalan keluar dengan satu backtick dari perintah MySQL, dan semuanya meledak dengan kesalahan. Seluruh masalah dapat diselesaikan dengan menggunakan LimitString yang dikutip untuk HEREDOC:
Menghapus ekspansi shell dengan cara itu menghilangkan kebutuhan untuk keluar dari backticks, dan karakter khusus shell lainnya. Ini juga menghilangkan kemampuan untuk menggunakan variabel shell dan lingkungan di dalamnya. Itu cukup banyak menghilangkan manfaat menggunakan HEREDOC di dalam skrip shell untuk memulai.
Opsi lainnya adalah menggunakan string yang dikutip multi-baris yang diizinkan dalam Bash dengan versi sintaks batch (dengan
-Bse
). Saya tidak tahu cangkang lain, jadi saya tidak bisa mengatakan jika mereka bekerja di sana juga. Anda perlu menggunakan ini untuk mengeksekusi lebih dari satu.sql
file denganSOURCE
perintah, karena itu tidak dihentikan oleh;
seperti perintah MySQL lainnya, dan hanya satu yang diperbolehkan per baris. String multi-line dapat berupa tanda kutip tunggal atau ganda, dengan efek normal pada ekspansi shell. Ini juga memiliki peringatan yang sama seperti menggunakan sintaks HEREDOC untuk backticks, dll.Solusi yang berpotensi lebih baik adalah dengan menggunakan bahasa scripting, Perl, Python, dll., Untuk membuat
.sql
file, seperti yang dilakukan OP, danSOURCE
file itu menggunakan sintaks perintah sederhana di atas. Bahasa scripting jauh lebih baik dalam manipulasi string daripada shell, dan sebagian besar memiliki prosedur bawaan untuk menangani penawaran dan pelarian yang diperlukan ketika berhadapan dengan MySQL.sumber
Pertimbangan penting untuk mengakses mysql dari skrip shell yang digunakan dalam cron, adalah bahwa mysql melihat pengguna yang login untuk menentukan .my.cnf yang akan dimuat.
Itu tidak bekerja dengan cron. Itu juga bisa membingungkan jika Anda menggunakan su / sudo karena pengguna yang masuk mungkin bukan pengguna yang Anda jalankan.
Saya menggunakan sesuatu seperti:
Pastikan bahwa kepemilikan dan izin pengguna dan grup diatur dengan benar dan erat pada file .my.cnf.
sumber
sumber
Bagaimana cara mengeksekusi baris perintah dengan kata sandi yang aman ?? gunakan editor konfigurasi !!!
Pada mysql 5.6.6 Anda dapat menyimpan kata sandi dalam file config dan kemudian menjalankan perintah cli seperti ini ....
--login-path menggantikan variabel ... host, pengguna DAN kata sandi. sangat bagus!
sumber
Saya telah menulis skrip shell yang akan membaca data dari file properti dan kemudian menjalankan skrip mysql pada skrip shell. berbagi ini dapat membantu orang lain.
sumber