Giới hạn số lượng hồ sơ từ mysqldump?


137

Tôi đang cố gắng tải một mẫu hồ sơ nhỏ từ cơ sở dữ liệu lớn vào cơ sở dữ liệu thử nghiệm.

Làm thế nào để bạn nói với mysqldump chỉ cung cấp cho bạn n hồ sơ trong số 8 triệu?

Cảm ơn

Câu trả lời:


212

Như skaffman nói, sử dụng --tại đó lựa chọn:

mysqldump --opt --where="1 limit 1000000" database

Tất nhiên, điều đó sẽ cung cấp cho bạn hàng triệu hàng đầu tiên từ mỗi bảng.


15
"1" trước giới hạn làm gì?
Phob

31
@Phob: Tùy chọn --where về cơ bản được thêm vào truy vấn của biểu mẫu SELECT * from table WHERE , vì vậy trong trường hợp này bạn sẽ nhận được SELECT * from table WHERE 1 limit 1000000. Nếu không có 1, bạn sẽ có một truy vấn không hợp lệ. Chỉ định 1 cho mệnh đề where (vì 1 luôn luôn đúng) chỉ cần chọn tất cả các bản ghi.
Adam Bellaire

24
Wow, thật là một hack. Vì vậy, về cơ bản bạn có thể tự tiêm SQL theo cách này.
Phob

6
Điều này có duy trì tất cả các tích hợp khóa ngoại? Nếu không, có cách nào để làm điều đó?
keithxm23

4
Cảm ơn! Ngoài ra, bạn có thể sử dụng: mysqldump --opt --where="1 limit 1000000 offset 1000000" --no-create-info database để có được trang thứ hai của 1 triệu bản ghi. Đảm bảo sử dụng cờ --no-tạo-thông tin trên các trang không phải là trang đầu tiên để chỉ xóa dữ liệu và bỏ qua phần tạo bảng .
pfuri

59

Nếu bạn muốn lấy nbản ghi từ một bảng cụ thể, bạn có thể làm một cái gì đó như thế này:

mysqldump --opt --where="1 limit 1000000" database table > dump.sql

Điều này sẽ kết xuất các 1000000hàng đầu tiên từ bảng có tên tablevào tệp dump.sql.


9

mysqldump có thể được cung cấp một truy vấn SQL để thực thi, từ đó nó sẽ lấy dữ liệu cho kết xuất. Sau đó, bạn có thể sử dụng mệnh đề "giới hạn X" trong truy vấn của mình để hạn chế số lượng hàng.


6

Vì thứ tự mặc định là ASC hiếm khi bạn muốn trong tình huống này, bạn cần phải có một thiết kế cơ sở dữ liệu phù hợp để làm cho DESC hoạt động tốt. Nếu tất cả các bảng của bạn có MỘT cột khóa chính có cùng tên (tự nhiên hoặc thay thế), bạn có thể dễ dàng kết xuất n bản ghi mới nhất bằng cách sử dụng:

mysqldump --opt --where="1 ORDER BY id DESC limit 1000000" --all-databases > dump.sql

Đây là một lý do hoàn hảo cho lý do tại sao bạn phải luôn đặt tên cho id của PK và tránh các PK tổng hợp, ngay cả trong các bảng kết hợp (thay vào đó sử dụng các khóa thay thế).


1
Làm điều này (tên id và tránh PK tổng hợp) và bạn sẽ cần bỏ qua lý thuyết cơ sở dữ liệu quan hệ.
mpoletto

1
Trên thực tế, nếu bạn thiết kế cơ sở dữ liệu của mình theo các thực tiễn tốt nhất của cơ sở dữ liệu quan hệ, xác định PK của bạn dựa trên dữ liệu và thực thể, bạn có thể sử dụng --option --where = "1 LIMIT 10000" chẳng hạn. Nếu không có thứ tự BY, điều này sẽ hoạt động vì MySQL sẽ sắp xếp theo cách tự nhiên, điều tương đương để nói rằng nó sẽ tuân theo thứ tự chỉ mục của PK. Sau đó, tất cả FK của các bảng có liên quan sẽ chỉ có dữ liệu tồn tại trong bảng tham chiếu của chúng vì thứ tự sẽ giống nhau.
mpoletto

Việc sử dụng ID là một tai họa thực sự của nhiều nhà phát triển. Có ID giống như PK là giống như không có PK. Tính toàn vẹn của bạn đã bị lỗ vì trong hầu hết các trường hợp, số gia tăng tự động không liên quan gì đến dữ liệu thực thể.
mpoletto

@mpoletto --where = "1 LIMIT 10000" sẽ chỉ chọn 10000 mục đầu tiên. Toàn bộ câu trả lời của tôi là chỉ ra cách bạn sẽ giải quyết việc nhận các mục X mới nhất, thường là những gì bạn muốn. Tôi cũng không hiểu các quy ước đặt tên có liên quan gì đến việc "bỏ qua lý thuyết cơ sở dữ liệu quan hệ", tôi nghĩ rằng bạn đã hiểu sai câu trả lời của tôi. Hầu hết các ORM phổ biến như EF, Django ORM, v.v. mặc định và khuyên "id" cho các cột PK, vì nó là dư thừa để nói users.user_id thay vì chỉ users.id.
Andreas Bergström

khi bạn nói rằng có một "lý do hoàn hảo cho lý do tại sao bạn phải luôn đặt tên cho id của PK và tránh PK tổng hợp", bạn đang bỏ qua lý thuyết cơ sở dữ liệu quan hệ. Đối số của bạn về "ORM phổ biến nhất" không hợp lệ vì ORM này cần các bảng có ID để hoạt động.
mpoletto
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.