mysqldump với INSERT Ngày TRÊN DUPLICATE


21

Tôi muốn hợp nhất dữ liệu từ cơ sở dữ liệu này sang cơ sở dữ liệu khác. Vì vậy, tôi tạo kết xuất với mysqldumpvà sau đó nhập nó vào cơ sở dữ liệu khác (có cùng cấu trúc bảng). Tôi không có bất kỳ vấn đề nào (chẳng hạn như các mục trùng lặp hoặc một cái gì đó khác) trong trường hợp này.

Nhưng tôi thực hiện một số hợp nhất cho mục đích thử nghiệm và tôi sẽ thực hiện hợp nhất cuối cùng sau này. Vì vậy, tôi muốn thực hiện hợp nhất (dữ liệu có thể được thay đổi) một vài lần. Lưu ý, các hàng trong bảng của tôi không bao giờ xóa, chỉ có thể được chèn hoặc cập nhật.

Tôi có thể tạo mysqldump với tùy chọn ON DUPLICATE không? Hoặc có thể tôi có thể hợp nhất bãi chứa chèn dữ liệu mới và cập nhật dữ liệu đã sửa đổi?

Chắc chắn, tôi có thể chèn ON DUPLICATEvào kết xuất thủ công, nhưng tôi muốn tự động hóa quá trình hợp nhất.

Câu trả lời:


34

Có các tùy chọn để giúp bạn trong việc này:

  --insert-ignore     Insert rows with INSERT IGNORE.
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -t, --no-create-info
                      Don't write table creation info.

Giữ cho mô hình này trong tâm trí

  • mysqldump mọi thứ từ DB1 vào DUMP1
  • tải DUMP1 vào DB3
  • mysqldump mọi thứ từ DB2 bằng cách sử dụng --replace (hoặc --insert-ign) và --no-tạo-thông tin vào DUMP2
  • tải DUMP2 vào DB3

1
Đợi một chút: sử dụng --replace có nghĩa là dữ liệu DB2 sẽ ghi đè lên dữ liệu DB1 và ​​sử dụng --insert-bỏ qua có nghĩa là dữ liệu DB1 chiếm ưu thế. Câu hỏi dường như hỏi làm thế nào để CẬP NHẬT trong trường hợp khóa trùng lặp. Trong mọi trường hợp, tôi muốn biết.
Edward Newell

@EdwardNewell Xin lưu ý rằng --replacetương đương với việc thực hiện ON DUPLICATE UPDATEtrên mỗi cột. Thật không may, mysqldump không được thiết kế để cập nhật các cột cụ thể do tính chất tải và đổ hàng loạt của mysqldump. Câu trả lời của tôi chỉ đơn giản tiết lộ những gì mysqldump có khả năng làm. Bạn sẽ phải viết mã tùy chỉnh, ngoài mysqldump, để làm ON DUPLICATE UPDATE.
RolandoMySQLDBA

Miễn là DB1 và ​​2 có cùng một lược đồ, bạn đã đúng. Nhưng giả sử DB1 có thêm các trường. Sau đó --replace sẽ khiến các trường bổ sung hoàn nguyên về mặc định (hoặc lỗi nếu không có mặc định) thay vì chỉ cập nhật các trường được chia sẻ. Tôi nhận ra tình hình của OP là dành cho hai cơ sở dữ liệu với các lược đồ giống nhau, nhưng chỉ cần chỉ ra rằng có một sự khác biệt, và nó sẽ là hữu ích để có một bản cập nhật kiểu bãi đúng trong một số trường hợp (tôi phải đối mặt ngay bây giờ!)
Edward Newell

1
Lưu ý rằng nếu có các khóa ngoại trỏ vào bản ghi đang được cập nhật, việc sử dụng REPLACE INTOcó thể không thành công vì bản ghi không thể bị xóa khi cắt đứt các mối quan hệ đó. Nếu bạn có ON DELETE CASCADE, thì bạn sẽ loại bỏ các bảng phụ thuộc vào bảng được cập nhật. REPLACE INTOlà một hoạt động khá nguy hiểm.
Christopher Schultz

1
@RolandoMySQLDBA Đồng ý. Tôi chỉ muốn bình luận để bất cứ ai đọc câu trả lời này đều hiểu rằng các tùy chọn này (đặc biệt REPLACE INTO) có thể nguy hiểm và có tác dụng "đáng ngạc nhiên". Câu trả lời tốt - chỉ muốn thêm một lời cảnh báo.
Christopher Schultz
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.