Làm cách nào tôi có thể theo dõi tiến trình nhập tệp .sql lớn?


204

Tôi đang nhập 7 GB foobar.sqlđể khôi phục bảng trong cơ sở dữ liệu cục bộ.

$ mysql -h localhost -u root 'my_data' < foobar.sql

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.12 Distrib 5.0.96, for apple-darwin9.8.0 (i386) using readline 5.1

Làm thế nào tôi có thể theo dõi tiến trình của nó?


1
Các câu trả lời cho câu hỏi này cho thấy đây là một thiếu sót rõ ràng của ứng dụng khách mysql
William Entriken

Câu trả lời:


267

Nếu bạn chỉ nhập từ tệp kết xuất từ ​​CLI trên * nix, vd

mysql -uxxx -pxxx dbname < /sqlfile.sql

sau đó trước tiên cài đặt trình xem ống trên hệ điều hành của bạn, sau đó thử một cái gì đó như thế này:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

sẽ hiển thị một thanh tiến trình khi chương trình chạy.

Nó rất hữu ích và bạn cũng có thể sử dụng nó để có được ước tính cho tiến trình mysqldump.

pv vứt bỏ sqlfile.sqlvà chuyển chúng cho mysql (vì toán tử đường ống). Trong khi nó đang bán phá giá, nó cho thấy sự tiến bộ. Điều thú vị là mysql chỉ lấy dữ liệu nhanh nhất có thể để tiến triển nó, vì vậy pv có thể hiển thị tiến trình nhập. Tôi không có bằng chứng. Nhưng có vẻ như vậy. Tôi đoán có một số bộ đệm được sử dụng, nhưng tại một số điểm tôi nghĩ rằng mysqlkhông đọc thêm bất kỳ dữ liệu nào khi nó vẫn đang bận xử lý.

Ảnh chụp màn hình ống xem


1
Tôi đoán rằng mysql có thể có một bộ đệm, trong đó một số dữ liệu có thể được đưa vào, mà không được "xử lý" đầy đủ (nghĩa là nếu nó bị lỗi, pv có thể đã báo cáo quá mức những gì thực sự có được). Nhưng nói chung, đây là cách làm việc của đường ống. Đó là cùng một lý do bạn có thể làm sudo hd /dev/sda1 | lessvà không có toàn bộ phân vùng hệ thống của bạn trong bộ nhớ.
snapfractalpop

2
@snapfractalpop pvsẽ không quá chính xác trong nhiều trường hợp vì một số đoạn SQL sẽ mất nhiều thời gian để xử lý hơn các phần khác. Ví dụ, một dòng tạo thành một chèn đơn giản sẽ chạy nhanh hơn rất nhiều so với một dòng tạo trên chỉ mục trên một bảng đã có nhiều hàng chẳng hạn. Nhưng một ý tưởng sơ bộ về tiến trình đầu ra sẽ hữu ích trừ khi bộ đệm đọc được sử dụng mysqlđặc biệt lớn (đối với đầu vào 7Gb, bộ đệm sẽ cần rất lớn để khiến pvđầu ra không hữu ích chút nào.
David Spillett

1
@DavidSpillett thực sự. Nhận xét của bạn phản ánh tình cảm của tôi. Về cơ bản, pv là thô, nhưng hiệu quả. Điều tôi thích nhất về nó là nó nói chung như thế nào. Đó là vẻ đẹp của ống unix (cảm ơn McIlroy).
snapfractalpop

1
@rob Đây là anh chàng tuyệt vời, bạn cũng có thể cung cấp một ví dụ với mysqldump?
Josue Alexander Ibarra

Giải pháp rất hay! Nếu mật khẩu là thủ công, pv không đợi nó hiển thị tiến trình của nó
Pierre de LESPINAY

26

Nếu bạn đã bắt đầu nhập, bạn có thể thực thi lệnh này trong một cửa sổ khác để xem kích thước hiện tại của cơ sở dữ liệu của bạn. Điều này có thể hữu ích nếu bạn biết tổng kích thước của tệp .sql bạn đang nhập.

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MiB" 
FROM information_schema.TABLES GROUP BY table_schema;  

Tín dụng vào: http://forums.mysql.com/read.php?108,201578,201578


Các MySQL 8.0 Reference tiểu bang sau đây về tính chính xác:

DATA_LENGTH

Đối với MyISAM, DATA_LENGTH là độ dài của tệp dữ liệu, tính bằng byte.

Đối với InnoDB, DATA_LENGTH là lượng bộ nhớ xấp xỉ được phân bổ cho chỉ mục được nhóm, tính bằng byte. Cụ thể, đó là kích thước chỉ mục được nhóm, theo trang, nhân với kích thước trang InnoDB.

 

INDEX_LENGTH

Đối với MyISAM, INDEX_LENGTH là độ dài của tệp chỉ mục, tính bằng byte.

Đối với InnoDB, INDEX_LENGTH là lượng bộ nhớ xấp xỉ được phân bổ cho các chỉ mục không được phân cụm, tính bằng byte. Cụ thể, đó là tổng kích thước chỉ mục không được nhóm, tính theo trang, nhân với kích thước trang InnoDB.


Bảng của tôi hiện ở mức 12 GiB theo các lệnh từ câu trả lời này và vẫn đang nhập. Tập tin sqldump của tôi chỉ có 5 GiB. Tôi sẽ quan tâm đến một lời giải thích cho sự khác biệt này
lucidbrot

17

Khi bạn thực hiện một mysqldump của một cơ sở dữ liệu, tất cả các bảng được kết xuất theo thứ tự bảng chữ cái.

Đương nhiên, việc tải lại mysqldump vào cơ sở dữ liệu cũng sẽ theo thứ tự bảng chữ cái.

Bạn chỉ có thể làm một QUY TRÌNH HIỂN THỊ; và tìm ra kết nối DB chạy mysqldump. Khi kết xuất được tải lại, Kết nối DB sẽ biến mất.

Nếu bạn muốn biết những bảng nào trong dumpfile, hãy chạy nó với foobar.sql

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

CẬP NHẬT 2012-05 / 02 13:53 EDT

Xin lỗi vì đã không nhận thấy rằng chỉ có một bảng.

Nếu bảng là MyISAM, cách duy nhất để giám sát là từ quan điểm của hệ điều hành. Nguyên nhân? Bảng được ghi khóa trong suốt quá trình tải lại. Bạn đang tìm kiếm gì? Kích thước của .MYD.MYItập tin. Tất nhiên, bạn cần so sánh với kích thước bảng trước đó trên máy chủ DB khác mà bạn đã nhập.

Nếu bảng là InnoDB và bạn đã bật innodb_file_per_table , cách duy nhất để giám sát là theo quan điểm của HĐH. Nguyên nhân? Bảng được ghi khóa trong suốt quá trình tải lại. Bạn đang tìm kiếm gì? Kích thước của .ibdtập tin. Tất nhiên, bạn cần so sánh với kích thước bảng trước đó trên máy chủ DB khác mà bạn đã nhập.

Nếu bảng là InnoDB và bạn đã vô hiệu hóa innodb_file_per_table , thì ngay cả quan điểm hệ điều hành cũng không thể giúp được.

CẬP NHẬT 2012-05 / 02 13:56 EDT

Tôi đã giải quyết một cái gì đó như thế này năm ngoái: Làm thế nào để tôi có được% tiến trình cho "gõ db.sql | mysql"

CẬP NHẬT 2012-05 / 02 14:09 EDT

Vì một mysqldump tiêu chuẩn ghi khóa bảng như thế này:

LOCK TABLES `a` WRITE;
/*!40000 ALTER TABLE `a` DISABLE KEYS */;
INSERT INTO `a` VALUES (123),(451),(199),(0),(23);
/*!40000 ALTER TABLE `a` ENABLE KEYS */;
UNLOCK TABLES;

sau đó, không có cách nào để có được một tiến trình với mysql cho đến khi khóa bảng được phát hành.

Nếu bạn có thể nhận được LOCK TABLESUNLOCK TABLESnhận xét ra khỏi bãi rác ...

  • nếu bảng là MyISAM, CHỌN COUNT (*) sẽ hoạt động
  • nếu bảng là InnoDB, CHỌN COUNT (*) có thể sẽ làm chậm / tạm dừng tải cho đến khi đếm xong

Điều đó đã làm việc. Cảm ơn. Một câu hỏi cuối cùng là, theo kinh nghiệm, bạn có biết thời gian nhập có gần như tuyến tính đối với kích thước .MYD.MYItệp không?
qazwsx

1
Bảng tải lại là tuyến tính. Xây dựng lại chỉ số là tuyến tính. Những năm trước đây, nó không như tôi mạo hiểm này như một câu hỏi để MySQL ( lists.mysql.com/mysql/202489 ) và tôi đề cập đến nó trong DBA StackExchange ( dba.stackexchange.com/a/2697/877 )
RolandoMySQLDBA

8

Cứ sau 2 giây bạn sẽ thấy các tiến trình đang chạy.

watch 'echo "show processlist;" | mysql -uuser -ppassword';

Nếu bạn muốn nó ít thường xuyên hơn thì thêm vào -n xđó x là số giây. 5 giây sẽ là:

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';

Bạn có thể gửi một ví dụ đầu ra? Ngoài ra, nó chỉ hiển thị quá trình hay nó thực sự chỉ ra tiến trình nhập khẩu, điều mà tôi thực sự yêu cầu?
qazwsx

Đây là một mã hữu ích. Thankyou
NarayaN

6

Nếu bạn chỉ muốn kiểm tra nếu nó bị đình trệ, bạn có thể truy vấn

show processlist; 

và xem những gì đang được thực hiện.


5

Là một giải pháp cho ai đó không thể khiến pv làm việc hoặc pv nói dối với ai. Bạn có thể theo dõi kích thước của tệp ibdata1 trong / var / lib / mysql chứa dữ liệu. Điều này sẽ kết thúc cùng kích thước (hoặc khoảng đó) của kích thước tệp trong máy chủ nguồn của bạn.

Nếu có nhiều bảng, bạn cũng có thể xem chúng xuất hiện từng cái một trong / var / lib / mysql / <tên cơ sở dữ liệu>.

Tôi tình cờ sử dụng thực tế này gần đây khi một cơ sở dữ liệu dài hạn đã xây dựng một tệp nhật ký khoảng 20G trong khoảng thời gian ba hoặc bốn năm. Tôi nhận thấy việc chuyển tiền đã mất nhiều thời gian và sử dụng kỹ thuật này để theo dõi tiến trình.

Tôi nghĩ rằng rất khó có khả năng ngày sẽ bình minh khi cơ sở dữ liệu không liên quan đến tệp ở đâu đó. Trong khi đó, bạn có thể theo dõi tệp để xem quá trình chuyển tiền đang diễn ra như thế nào. Phương pháp tôi đề xuất là một cái gì đó bạn có thể làm ở dạng này hay dạng khác kể từ khi cơ sở dữ liệu sql đầu tiên được viết. Tôi chưa bao giờ có ý định đề xuất rằng đó là bất kỳ loại kỹ thuật "chính thức" nào mà một tay đua thủ công có thể sử dụng lại. Nó giả định mức độ thành thạo chung với máy tính nói chung và unix nói riêng.


2

Nếu DB của bạn yên lặng (nghĩa là không có người dùng khác hoạt động) và bạn muốn xem hoạt động đọc / ghi tại sao không làm điều gì đó như:

mysqladmin -h<host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'

Bạn sẽ thấy số lần đọc / ghi / chèn / chờ / cập nhật.

Nếu bạn đang chèn ví dụ, bạn sẽ thấy một cái gì đó như:

Innodb_rows_inserted                          | 28958 

Trong đó 28958 là số lượng hàng được chèn cho khoảng thời gian của bạn (10 giây trong trường hợp của tôi).


1

Đối với ai đó đang tìm kiếm ví dụ về trình xem đường ống bằng cách sử dụng mysqldumpbạn sẽ chỉ cần làm một cái gì đó như thế này:

mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql

Các -Wlá cờ chỉ nói với pv chờ byte đầu tiên đến trước khi hiển thị tiến độ (sau dấu nhắc)


0

Bạn có thể theo dõi một Nhập trong thư mục \ Msql \ Data [Tên DB]


0

Ok, một công việc khác xung quanh. Nhưng đó có thể là lựa chọn tồi tệ nhất và không chính xác.

Điều đó nói rằng, đây là giải pháp của tôi cho Windows:

Mở Trình quản lý tác vụ nhấn

CTRL + SHIFT + ESC

Sao chép tốc độ giá trị đĩa "mysqld.exe"

e.g. 11mb/s

Đặt nó trong một máy tính như thế này: https : // Techi INTERNets.com/copy_calc?do

Ước tính ETA. Trường hợp của tôi là:

Speed: 8 MB/s
Size: 4.9 GB
0 Hours, 11 Minutes and 29 Seconds

Các kết quả:

Beg -> 11:19
ETA -> 11:31
End -> 11:39

-1

Tôi rất ngạc nhiên khi không ai chỉ đăng 'mysql -v' dưới dạng tùy chọn. Nếu nó bị kẹt, đầu ra sẽ dừng lại.


3
"Giám sát tiến độ" thường có nghĩa là cố gắng ước tính quá trình đã tiến triển bao xa hoặc khi nào nó hoàn thành, điều mysql -vnày sẽ không cung cấp. Ngoài ra, việc phun 7 GB dữ liệu vào thiết bị đầu cuối sẽ làm chậm đáng kể quá trình khôi phục.
mustaccio

tôi hiểu rồi, cảm ơn vì lời giải thích Điều đó đúng, đầu ra 7 GB sẽ không tốt khi xuất vào thiết bị đầu cuối. Tôi đoán tôi sử dụng -v chỉ dành cho một trường hợp thử nghiệm cục bộ nhỏ mà db của tôi sẽ bị kẹt.
dtc

2
Đề xuất này đã giúp tôi xác định chính xác một vấn đề, tuy nhiên không thực tế nó có thể được sử dụng với các tệp lớn. (Của tôi là nhỏ).
Casey Perkins
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.