2008-09-19 26 views
10

Bảng1: Mọi thứ kể cả bồn rửa nhà bếp. Ngày ở định dạng sai (năm cuối cùng để bạn không thể sắp xếp trên cột đó), Số được lưu trữ dưới dạng VARCHAR, địa chỉ đầy đủ trong cột 'đường phố', firstname và lastname trong cột firstname, thành phố trong cột lastname, địa chỉ không đầy đủ, Hàng cập nhật trước các hàng bằng cách di chuyển dữ liệu từ trường này sang trường khác dựa trên một số quy tắc đã thay đổi qua nhiều năm, bản ghi trùng lặp, hồ sơ không đầy đủ, bản ghi rác ... bạn đặt tên cho nó ... oh và tất nhiên không phải là dấu thời gian hoặc CHÍNH KEY cột trong tầm nhìn.Cơn ác mộng cơ sở dữ liệu di sản MySQL cuối cùng

Bảng2: Bất kỳ hy vọng bình thường hóa nào đã được mở ra ngoài cửa sổ khi bẻ khóa em bé này. Chúng tôi có một hàng cho mỗi mục nhập và cập nhật các hàng trong bảng một. Vì vậy, bản sao như không có ngày mai (800MB giá trị) và các cột như Phone1 Phone2 Phone3 Phone4 ... Phone15 (họ không được gọi là điện thoại. Tôi sử dụng này để minh hoạ) Khóa foriegn là .. cũng đoán. Có ba ứng cử viên tùy thuộc vào loại dữ liệu nào trong hàng trong bảng1

Bảng 3: Có thể nào tệ hơn không. Ồ vâng. Các phím có tên là KHÔNG CÓ tương quan với dữ liệu bên trong chúng, và bắt buộc Phone1 Phone2 Phone3 Phone4 ... Phone15. Có các cột Duplicated from Table1 và không phải là cột TIMESTAMP hoặc PRIMARY KEY trong tầm nhìn. progess và có thể thay đổi bất cứ lúc nào.Đó là essentailly simlar cho những người khác

Ở gần 1m hàng này là một mớ hỗn độn lớn. May mắn thay nó không phải là mớ hỗn độn lớn của tôi.Không may mắn tôi phải rút ra khỏi nó một composit kỷ lục cho mỗi "khách hàng".

Ban đầu tôi đã tạo ra bản dịch bốn bước của Table1 thêm một khóa CHÍNH và chuyển đổi tất cả các ngày thành định dạng có thể sắp xếp. Sau đó, thêm một vài bước truy vấn đã trả về dữ liệu đã lọc cho đến khi tôi có Table1 đến nơi tôi có thể sử dụng nó để kéo từ các bảng khác để tạo thành composit. Sau nhiều tuần làm việc, tôi đã thực hiện điều này bằng một số thủ thuật. Vì vậy, bây giờ tôi có thể trỏ ứng dụng của tôi vào mớ hỗn độn và kéo ra một bảng dữ liệu tổng hợp tốt đẹp. May mắn thay, tôi chỉ cần một trong những số điện thoại cho mục đích của tôi để bình thường hóa bảng của tôi không phải là một vấn đề. Tuy nhiên đây là nơi mà nhiệm vụ thực sự bắt đầu, bởi vì mỗi ngày hàng trăm nhân viên thêm/cập nhật/xóa cơ sở dữ liệu này theo cách bạn không muốn tưởng tượng và mỗi đêm tôi phải lấy các hàng mới.

Vì các hàng hiện có trong bất kỳ bảng nào có thể được thay đổi và vì không có cột CẬP NHẬT CẬP NHẬT, tôi sẽ phải sử dụng nhật ký để biết điều gì đã xảy ra. Tất nhiên điều này giả định rằng có một bản ghi nhị phân, mà không có!

Giới thiệu khái niệm đã đi xuống như quả bóng dẫn. Tôi cũng có thể nói với họ rằng con cái của họ sẽ phải trải qua phẫu thuật thử nghiệm. Chúng không chính xác là công nghệ cao ... trong trường hợp bạn không thu thập được ...

Tình huống này hơi tinh tế vì chúng có một số thông tin giá trị mà công ty tôi muốn. Tôi đã được gửi xuống bởi quản lý cấp cao của một tập đoàn lớn (bạn biết họ thế nào) để "làm cho nó xảy ra".

Tôi không thể nghĩ ra cách nào khác để xử lý cập nhật hàng đêm, hơn là phân tích cú pháp tệp nhật ký bin với ứng dụng khác, để tìm hiểu những gì họ đã làm cho cơ sở dữ liệu đó trong ngày và sau đó tổng hợp bảng của tôi cho phù hợp. Tôi thực sự chỉ cần nhìn vào table1 của họ để tìm ra những gì cần làm cho bảng của tôi.Các bảng khác chỉ cung cấp các trường để xóa bỏ bản ghi. (Sử dụng MASTER SLAVE sẽ không giúp đỡ vì tôi sẽ có một bản sao của mớ hỗn độn.)

Cách khác là tạo một băm duy nhất cho mỗi hàng trong bảng 1 của chúng và xây dựng một bảng băm. Sau đó, tôi sẽ đi qua cơ sở dữ liệu ENTIRE mỗi đêm để kiểm tra xem các băm có phù hợp hay không. Nếu không thì tôi sẽ đọc bản ghi đó và kiểm tra xem nó có tồn tại trong cơ sở dữ liệu của tôi không, nếu có thì tôi sẽ cập nhật nó trong cơ sở dữ liệu của tôi, nếu nó không phải là bản ghi mới của nó và tôi sẽ INSERT nó. Điều này là xấu xí và không nhanh, nhưng phân tích cú pháp tệp nhật ký nhị phân cũng không đẹp.

Tôi đã viết thư này để giúp giải thích rõ vấn đề. thường nói với người khác giúp làm rõ vấn đề làm cho một giải pháp rõ ràng hơn. Trong trường hợp này tôi chỉ có một cơn đau đầu lớn hơn!

Suy nghĩ của bạn sẽ được đánh giá cao.

Trả lời

1

Tệp nhật ký (nhật ký nhị phân) cũng là ý kiến ​​đầu tiên của tôi. Nếu bạn biết làm thế nào họ đã làm những điều bạn sẽ rùng mình. Đối với mỗi hàng có nhiều mục nhập trong nhật ký khi các phần được thêm vào và thay đổi. Nó chỉ HUGE! Bây giờ tôi đã định cư theo phương pháp Hash. Với một số phân trang bộ nhớ thông minh, điều này khá nhanh.

1

Bạn không thể sử dụng mã hiện có truy cập cơ sở dữ liệu này và điều chỉnh nó theo nhu cầu của bạn? Tất nhiên, mã phải là khủng khiếp, nhưng nó có thể xử lý cấu trúc cơ sở dữ liệu cho bạn, phải không? Bạn có thể hy vọng tập trung vào việc hoàn thành công việc của mình thay vì chơi khảo cổ học.

0

bạn có thể sử dụng công cụ đồng bộ hóa mk-bảng maatkit để đồng bộ hóa cơ sở dữ liệu dàn dựng (cơ sở dữ liệu của bạn chỉ rất nhỏ, sau khi tất cả). Điều này sẽ "nhân đôi mớ hỗn độn"

Sau đó, bạn có thể viết một cái gì đó, sau khi đồng bộ, thực hiện các truy vấn khác nhau để tạo một tập hợp các bảng lành mạnh hơn mà bạn có thể báo cáo.

Tôi tưởng tượng rằng điều này có thể được thực hiện hàng ngày mà không có vấn đề về hiệu suất.

Thực hiện tất cả từ một máy chủ khác sẽ tránh tác động đến cơ sở dữ liệu gốc.

Vấn đề duy nhất tôi có thể thấy là nếu một số bảng không có khóa chính.

+0

* Vấn đề duy nhất tôi có thể thấy là nếu một số bảng không có khóa chính. * - Chúng không ... Sau nhiều cuộc đàm phán ngày hôm nay họ đã nói với tôi rằng "hiếm khi" cập nhật/xóa bản ghi. .. bất cứ điều gì tha nghĩa. Khi nói chuyện với một nhà phát triển cơ sở dữ liệu khác có vẻ là cách tốt nhất (chỉ) để làm điều này đúng, là băm từng hàng darn và lưu giữ băm trong bảng. Sau đó, mỗi đêm đọc lại cơ sở dữ liệu ENTIRE tạo một băm cho mỗi hàng và chỉ cần so sánh đơn giản. Tôi chỉ không thể nhìn thấy một cách xung quanh nó. Cố gắng giải mã các tệp nhật ký nhị phân sẽ chỉ đầy nguy hiểm. –

2

Tôi không phải là người MySQL, vì vậy điều này sắp ra khỏi lĩnh vực bên trái.

Nhưng tôi nghĩ rằng các tệp nhật ký có thể là câu trả lời.

Rất may, bạn thực sự chỉ cần biết 2 điều từ nhật ký.

Bạn cần bản ghi/hàng, và bạn cần thao tác.

Trong hầu hết các DB, và tôi giả sử MySQL, có một cột tiềm ẩn trên mỗi hàng, giống như một rowid hoặc recordid, hoặc bất cứ điều gì. Đó là số hàng nội bộ được cơ sở dữ liệu sử dụng. Đây là khóa chính "miễn phí" của bạn.

Tiếp theo, bạn cần thao tác. Đáng chú ý cho dù đó là một hoạt động chèn, cập nhật hoặc xóa trên hàng.

Bạn hợp nhất tất cả thông tin này, theo thứ tự thời gian và sau đó chạy qua nó.

Đối với mỗi lần chèn/cập nhật, bạn chọn hàng từ DB ban đầu và chèn/cập nhật hàng đó trong DB đích của bạn. Nếu đó là xóa, thì bạn xóa hàng.

Bạn không quan tâm đến giá trị trường, chúng không quan trọng. Làm toàn bộ hàng.Bạn hy vọng không cần phải "phân tích cú pháp" các tệp nhật ký nhị phân, MySQL đã phải có thói quen để làm điều đó, bạn chỉ cần tìm và tìm ra cách sử dụng chúng (thậm chí có thể có một số "bản ghi kết xuất" tiện dụng) tiện ích mà bạn có thể sử dụng).

Điều này cho phép bạn giữ cho hệ thống khá đơn giản và chỉ phụ thuộc vào hoạt động thực tế của bạn trong ngày, thay vì tổng kích thước DB. Cuối cùng, sau này bạn có thể tối ưu hóa nó bằng cách làm cho nó "thông minh hơn". Ví dụ, có lẽ họ chèn một hàng, sau đó cập nhật nó, sau đó xóa nó. Bạn sẽ biết bạn chỉ có thể bỏ qua hàng đó hoàn toàn trong replay của bạn.

Rõ ràng điều này cần một chút kiến ​​thức phức tạp để thực sự đọc các tệp nhật ký, nhưng phần còn lại phải đơn giản. Tôi muốn nghĩ rằng các tệp nhật ký cũng được định thời gian, vì vậy bạn có thể biết để làm việc trên các hàng "từ hôm nay" hoặc bất kỳ phạm vi ngày nào bạn muốn.

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