2015-09-30 12 views
6

Tôi muốn viết một tập lệnh * .sh để thực hiện nhiều lệnh MySQL.Cách tốt hơn để thực thi nhiều lệnh MySQL bằng cách sử dụng kịch bản lệnh shell

Hiện nay, những gì tôi có thể làm là một cái gì đó như sau

mysql -h$host -u$user -p$password -e "drop database $dbname;" 
mysql -h$host -u$user -p$password -e "create database $dbname;" 
mysql -h$host -u$user -p$password -e "another MySQL command" 
... 

Có một cách để tránh gõ "mysql -h $ host -u $ user -p $ password -e" mỗi khi tôi muốn thế nào để thực hiện một lệnh MySQL?

Trả lời

13

Tôi nghĩ bạn có thể thực hiện báo cáo MySQL từ một tập tin văn bản, ví dụ

đây là file cmds.txt chứa MySQL lệnh:

select colA from TableA; 
select colB from TableB; 
select colC from TableC; 

Để thực hiện chúng sử dụng kịch bản shell, gõ

mysql -h$host -u$user -p$password db_dbname < cmds.txt 

Bằng cách này, bạn tách các lệnh MySQL khỏi tập lệnh shell của mình.

Bạn có thể muốn tập lệnh hiển thị thông tin tiến trình cho bạn. Đối với điều này, bạn có thể gọi mysql với tùy chọn "--verbose".

Để biết thêm thông tin, xem https://dev.mysql.com/doc/refman/5.6/en/mysql-batch-commands.html

+0

Tất cả các câu trả lời của bạn đều tuyệt vời. Tôi chọn câu trả lời của EricWang bởi vì tôi nghĩ đây là cách có cấu trúc nhất để thực hiện công việc này. – Brian

+0

Bạn có thể nói tôi nếu giải pháp này thực hiện từng câu lệnh trong một giao dịch riêng biệt? – Mike

2

Bạn có thể sử dụng một multiquery duy nhất:

mysql -h$host -u$user -p$password -e "drop database $dbname;create database $dbname;another MySQL command;" 

Đơn giản chỉ cần viết tất cả các truy vấn của bạn tách bởi ;. Chúng sẽ chạy sau cái kia.

+0

Tất cả các câu trả lời của bạn đều tuyệt vời. Tôi chọn câu trả lời của EricWang bởi vì tôi nghĩ đây là cách có cấu trúc nhất để thực hiện công việc này. – Brian

6

Có nhiều cách, trong linux bạn có:

Từ mysql cli:

mysql> source mycmds.sql 

Sử dụng ống:

echo "SELECT ..; INSERT ..;" | mysql ... 

Thực thi lệnh từ một tập tin sử dụng ống dẫn hoặc chuyển hướng:

cat file.sql | mysql ... OR mysql .. < file.sql 
+0

Tất cả các câu trả lời của bạn đều tuyệt vời. Tôi chọn câu trả lời của EricWang bởi vì tôi nghĩ đây là cách có cấu trúc nhất để thực hiện công việc này. – Brian

+0

Câu trả lời hoàn chỉnh nhất. (Nó chứa câu trả lời của EricWang ngoài '--version' cho thông tin tiến trình.) Cũng sử dụng' .sql' như là kết thúc cho SQL nên được ưu tiên hơn '.txt' chung để tránh mất thông tin (trừ khi phát hiện định dạng động được hỗ trợ). – Radagast

2

Lưu ý rằng bạn cũng có thể sử dụng một doc ĐÂY để có các truy vấn trong cùng một kịch bản:

mysql -h$host -u$user -p$password db_dbname <<'EOF' 
select colA from TableA; 
select colB from TableB; 
select colC from TableC; 
EOF 

Lưu ý rằng tôi đã sử dụng 'EOF' hơn EOF trong dòng đầu tiên để ngăn chặn nội dung của tập lệnh để vô hiệu hóa thay thế tham số (đặc biệt là ` có thể có vấn đề)

Cũng lưu ý rằng nên có không có bất kỳ khoảng trắng trước trận chung kết EOF (trừ khi bạn sử dụng <<- hơn << - trong đó ký tự tab trường hợp hàng đầu đang tước):

mysql -h$host -u$user -p$password db_dbname <<- 'EOF' 
↠select colA from TableA; 
↠select colB from TableB; 
↠select colC from TableC; 
↠EOF 

(Thay thế với một ký tự tab).

Để biết thêm thông tin về cú pháp doc ở đây, hãy xem the bash documentation.

Các vấn đề liên quan