Ba tình huống cứ liên tục lặp lại:
- Dựng một schema cho staging hoặc CI — bạn muốn cấu trúc bảng rỗng để các bài kiểm thử chạy trên cột, index và ràng buộc thật, nhưng tuyệt đối không muốn đổ hàng gigabyte dòng production vào một môi trường dùng-một-lần.
- Chỉ dữ liệu mồi — schema đã tồn tại trong cơ sở dữ liệu đích, và bạn chỉ cần các dòng INSERT để lấp đầy nó, không có lệnh CREATE gây xung đột với những gì đã có sẵn.
- Loại bỏ nhiễu — dump phình to bởi các bảng
logs,sessions,audit_trailhaycachevới hàng chục triệu dòng bạn chẳng bao giờ muốn import.
Vì sao mysqldump --no-data là chưa đủ
Lời khuyên kinh điển là mysqldump --no-data (chỉ cấu trúc) hoặc mysqldump --no-create-info (chỉ dữ liệu). Cả hai đều là cờ export: chúng thay đổi nội dung của một dump mới từ một cơ sở dữ liệu đang chạy. Chúng không làm được gì cho một dump bạn đã có sẵn nằm trên đĩa dưới dạng file .sql.
Trên thực tế, file thường đến từ người khác, hoặc từ một job sao lưu, hoặc từ một máy chủ bạn không còn quyền truy cập trực tiếp. Bạn không thể chạy lại mysqldump trên một cơ sở dữ liệu không kết nối được — thông tin đăng nhập đã mất, máy chủ đã ngừng hoạt động, hoặc file đơn giản là tất cả những gì bạn được trao. Đến lúc đó thì các cờ vô dụng, và bạn còn lại việc chỉnh sửa chính cái file.
Cách làm thủ công
Nước đi hiển nhiên là loại các dòng bằng grep hoặc sed. Để giữ cấu trúc và bỏ dữ liệu:
# giữ mọi thứ trừ các dòng INSERT grep -v '^INSERT INTO' dump.sql > schema.sql # hoặc chỉ giữ các dòng INSERT cho một file chỉ-dữ-liệu grep '^INSERT INTO' dump.sql > data.sql
Cách này trông ổn trên một dump nhỏ, gọn gàng — rồi hỏng trên một dump thật:
- INSERT nhiều dòng. Một lệnh
INSERT INTO … VALUEScó thể trải dài hàng nghìn dòng.grepkhớp dòng đầu tiên và bỏ lại phần giá trị còn lại mồ côi, tạo ra một file hỏng. - Extended insert. mysqldump gộp nhiều dòng vào một lệnh khổng lồ duy nhất. Các bộ lọc theo dòng không thể biết một lệnh như vậy kết thúc ở đâu.
- Chú thích và khối. Các khối điều kiện
/*! … */,LOCK TABLES, và các chú thích--xen kẽ với dữ liệu, nên một bộ lọc ngây thơ hoặc giữ lại rác hoặc cắt mất thứ mà quá trình import cần. - Chỉ-dữ-liệu còn tệ hơn. Một
grep '^INSERT'thuần túy vứt bỏ các lệnhSETvàLOCKmà các dòng phụ thuộc vào, và bất kỳ INSERT nào không bắt đầu đúng ở cột số không đều lặng lẽ biến mất.
Bạn kết cục đi gỡ lỗi cho bộ lọc của chính mình thay vì lấy được schema.
Chỉ-cấu-trúc hoặc chỉ-dữ-liệu với DumpCleaner
DumpCleaner hiểu các lệnh SQL thay vì khớp theo dòng, nên nó tách cấu trúc khỏi dữ liệu một cách đáng tin cậy — trên file kích thước bất kỳ:
- Kéo file
.sqlcủa bạn vào DumpCleaner (MySQL, MariaDB hoặc PostgreSQL). Nó phân tích file theo luồng, nên một dump nhiều gigabyte nạp vào với bộ nhớ không đổi. - Bật/tắt các loại lệnh bạn muốn: CREATE TABLE, CREATE INDEX, INSERT INTO, ALTER, DROP, LOCK, SET. Bỏ tích INSERT INTO là bạn có chỉ-cấu-trúc; bỏ tích CREATE TABLE / CREATE INDEX là bạn có chỉ-dữ-liệu.
- Hoặc chọn một preset — Chỉ cấu trúc hoặc Chỉ dữ liệu — để đặt mọi công tắc trong một bước, rồi tinh chỉnh theo từng bảng nếu bạn muốn.
- Export. Bạn có một file schema tinh gọn cho staging hay CI, hoặc một dump chỉ-dữ-liệu sạch sẽ để mồi dữ liệu.
Vì bộ lọc nhận biết theo lệnh, một extended INSERT nhiều dòng được giữ hoặc bỏ như một khối trọn vẹn — không bao giờ bị cắt giữa chừng.
Sức mạnh thực sự là việc lọc hoạt động theo từng loại lệnh và theo từng bảng, và hai điều đó kết hợp với nhau. Bạn có thể giữ cấu trúc của mọi bảng nhưng chỉ bao gồm dữ liệu INSERT cho ba bảng bạn thực sự cần — để lại bảng logs 89 triệu dòng như một cái vỏ rỗng. Đó là điều không một cờ --no-data nào diễn tả được.
Tách cấu trúc khỏi dữ liệu trong vài giây
DumpCleaner lọc một dump có sẵn theo loại lệnh và theo bảng — chỉ cấu trúc, chỉ dữ liệu, hay bất kỳ kết hợp nào — xử lý theo luồng, với bộ nhớ không đổi. Ứng dụng macOS & iPadOS gốc, mua một lần.
Tải trên App StoreCâu hỏi thường gặp
Tôi có thể export dữ liệu mà không có schema không?
Có. Tắt CREATE TABLE và CREATE INDEX (hoặc chọn preset Chỉ dữ liệu) và giữ INSERT INTO. DumpCleaner chỉ export các dòng, sẵn sàng nạp vào một schema đã tồn tại.
Bản export chỉ-cấu-trúc có giữ index và khóa ngoại không?
Có. Chỉ cấu trúc giữ CREATE TABLE, CREATE INDEX, ALTER TABLE và các định nghĩa khóa ngoại — mọi thứ định nghĩa cơ sở dữ liệu. Chỉ các dòng dữ liệu INSERT bị loại bỏ.
Tôi có thể kết hợp — cấu trúc cho mọi bảng, dữ liệu cho một số bảng — không?
Có. Việc lọc là theo từng loại lệnh và theo từng bảng, và cả hai kết hợp được. Giữ cấu trúc của mọi bảng nhưng chỉ bao gồm dữ liệu INSERT cho vài bảng bạn thực sự cần.
Cách này có dùng được với PostgreSQL không?
Có. DumpCleaner đọc các dump MySQL, MariaDB và PostgreSQL và nhận diện định dạng tự động, nên export chỉ-cấu-trúc và chỉ-dữ-liệu hoạt động y như nhau cho các file pg_dump.
Schema không có dữ liệu — hoặc dữ liệu không có schema
Kéo, bật/tắt các loại lệnh, export. DumpCleaner tách bất kỳ dump nào thành đúng phần bạn cần.
Tải trên App Store