2011-01-16 70 views
38

Tôi có một thư mục với một bó các tệp .sql rằng mysql dumps của mỗi cơ sở dữ liệu trên máy chủ của tôi.Nhập Nhiều tệp .sql dump vào cơ sở dữ liệu mysql từ shell

ví dụ:

database1-2011-01-15.sql 
database2-2011-01-15.sql 
... 

Có rất nhiều trong số đó thực sự.

Tôi cần tạo tập lệnh shell hoặc một dòng có thể sẽ nhập từng cơ sở dữ liệu.

Tôi đang chạy trên máy Linux Debian.

Tôi nghĩ đó là một số cách để ống trong các kết quả của một ls vào một số lệnh find hoặc một cái gì đó ..

bất kỳ sự giúp đỡ và giáo dục được nhiều đánh giá cao.

EDIT

Vì vậy, cuối cùng tôi muốn tự động nhập khẩu một tập tin tại một thời điểm vào cơ sở dữ liệu.

Ví dụ: nếu tôi đã làm nó bằng tay trên một nó sẽ là:

mysql -u root -ppassword < database1-2011-01-15.sql 

Trả lời

73

cat *.sql | mysql? Bạn có cần chúng theo bất kỳ thứ tự cụ thể nào không?

Nếu bạn có quá nhiều để xử lý theo cách này, sau đó thử một cái gì đó như:

find . -name '*.sql' | awk '{ print "source",$0 }' | mysql --batch 

này cũng được xung quanh một số vấn đề với đi qua kịch bản đầu vào thông qua một đường ống dẫn mặc dù bạn không nên có bất kỳ vấn đề với chế biến đường ống dưới Linux. Điều tốt đẹp về phương pháp này là tiện ích mysql đọc trong mỗi tệp thay vì đọc từ stdin.

+0

Cuối cùng tôi đã sử dụng con mèo \ * .sql nhưng đã phá vỡ nó xuống bằng thư để không có quá nhiều thông tin. ví dụ. mèo a \ *. sql | mysql -u root -ppass –

+9

Tôi đã sử dụng 'ls -1 * .sql | awk '{print "source", $ 0}' | mysql --batch -u {username} -p {mật khẩu} {dbname} 'như tôi đã đặt tên tệp sql của tôi theo tuần tự và muốn thực hiện theo thứ tự đó – Luracast

+0

@Luracast tôi đã sử dụng' ls -1 * .sql | awk '{print "source", $ 0}' | mysql --batch -u {username} -p {dbname} 'để làm cho nó hoạt động. Mật khẩu cần phải được nhập vào giao diện điều khiển khi nó thực sự nhắc cho nó, không phải trong chính lệnh đó. MySQL không chấp nhận mật khẩu trong lệnh. –

2

Tôi không nhớ cú pháp của mysqldump nhưng nó sẽ là một cái gì đó như thế này

find . -name '*.sql'|xargs mysql ... 
+0

từ thực hiện một chút nghiên cứu cũng là những gì tôi đang đề cập đến. ví dụ. tìm thấy . -name '* .sql' | xargs mysql -u root -ppassword Điều đó có hiệu quả không? –

+0

và -h máy chủ nếu bạn đang ở trên máy chủ từ xa và có thể cũng cần chỉ định tên cơ sở dữ liệu – Navi

+0

cơ sở dữ liệu được tham chiếu trong mỗi tệp sao lưu sao cho dòng duy nhất ở trên hoạt động và đó là localhost –

17

One-liner để đọc trong tất cả .sql tập tin và nhập khẩu chúng:

for SQL in *.sql; do DB=${SQL/\.sql/}; echo importing $DB; mysql $DB < $SQL; done 

Bí quyết duy nhất là sự thay thế bash substring để loại bỏ các .sql để có được tên cơ sở dữ liệu.

+0

Giống như một sự quyến rũ, cảm ơn vì điều này! Làm việc tốt hơn câu trả lời được chấp nhận cho tôi. – Swader

3

Tôi đã tạo một tập lệnh một thời gian trước đây để thực hiện chính xác điều này, mà tôi gọi (hoàn toàn không có chủ ý) "tải trọng". Nó tải các tệp SQL vào MySQL.

Here it is on GitHub

Thật đơn giản và dễ hiểu; cho phép bạn chỉ định các tham số kết nối mysql và sẽ giải nén các tệp sql gzip'ed một cách nhanh chóng. Nó giả sử bạn có một tệp cho mỗi cơ sở dữ liệu và cơ sở của tên tệp là tên cơ sở dữ liệu mong muốn.

Vì vậy:

myload foo.sql bar.sql.gz 

sẽ tạo (nếu không tồn tại) cơ sở dữ liệu được gọi là "foo" và "thanh", và nhập khẩu các tập tin sql vào mỗi.

Đối với phía bên kia của quy trình, tôi đã viết this script (mydumpall) tạo tệp sql (hoặc sql.gz) tương ứng cho mỗi cơ sở dữ liệu (hoặc một số tập hợp con được chỉ định theo tên hoặc regex).

7

Có một tập lệnh nhỏ tuyệt vời tại số http://kedar.nitty-witty.com/blog/mydumpsplitter-extract-tables-from-mysql-dump-shell-script sẽ lấy một tệp lớn mysqldump và chia thành một tệp duy nhất cho mỗi bảng. Sau đó, bạn có thể chạy kịch bản này rất đơn giản để tải cơ sở dữ liệu từ các tập tin:

for i in *.sql 
do 
    echo "file=$i" 
    mysql -u admin_privileged_user --password=whatever your_database_here < $i 
done 

mydumpsplitter thậm chí hoạt động trên các tập tin gz, nhưng nó là nhiều, chậm hơn nhiều so với gunzipping trước, sau đó chạy nó trên các tập tin nén.

Tôi nói lớn, nhưng tôi đoán mọi thứ đều tương đối. Mất khoảng 6-8 phút để tách một tệp kết xuất 2000 bảng, 200MB cho tôi.

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